rpm2cpio.sh 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/bin/sh
  2. # Prevent gawk >= 4.0.x from getting funny ideas wrt UTF in printf()
  3. LANG=C
  4. pkg=$1
  5. if [ "$pkg" = "" -o ! -e "$pkg" ]; then
  6. echo "no package supplied" 1>&2
  7. exit 1
  8. fi
  9. leadsize=96
  10. o=`expr $leadsize + 8`
  11. set `od -j $o -N 8 -t u1 $pkg`
  12. il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
  13. dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
  14. # echo "sig il: $il dl: $dl"
  15. sigsize=`expr 8 + 16 \* $il + $dl`
  16. o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
  17. set `od -j $o -N 8 -t u1 $pkg`
  18. il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
  19. dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
  20. # echo "hdr il: $il dl: $dl"
  21. hdrsize=`expr 8 + 16 \* $il + $dl`
  22. o=`expr $o + $hdrsize`
  23. comp=`dd if="$pkg" ibs=$o skip=1 count=1 2>/dev/null \
  24. | dd bs=3 count=1 2>/dev/null`
  25. gz="`echo . | awk '{ printf("%c%c", 0x1f, 0x8b); }'`"
  26. lzma="`echo . | awk '{ printf("%cLZ", 0xff); }'`"
  27. xz="`echo . | awk '{ printf("%c7z", 0xfd); }'`"
  28. zstd="`echo . | awk '{ printf("%c%c", 0x28, 0xb5); }'`"
  29. case "$comp" in
  30. BZh) dd if="$pkg" ibs=$o skip=1 2>/dev/null | bunzip2 ;;
  31. "$gz"*) dd if="$pkg" ibs=$o skip=1 2>/dev/null | gunzip ;;
  32. "$xz"*) dd if="$pkg" ibs=$o skip=1 2>/dev/null | xzcat ;;
  33. "$lzma"*) dd if="$pkg" ibs=$o skip=1 2>/dev/null | unlzma ;;
  34. "$zstd"*) dd if="$pkg" ibs=$o skip=1 2>/dev/null | unzstd ;;
  35. *) echo "Unrecognized rpm file: $pkg"; exit 1 ;;
  36. esac