rpm2cpio.sh 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/bin/sh -efu
  2. #
  3. # This software is a part of ISAR,
  4. # originating from the RPM Package Manager version 4.14
  5. #
  6. # SPDX-License-Identifier: GPL-2.0
  7. fatal() {
  8. echo "$*" >&2
  9. exit 1
  10. }
  11. pkg="$1"
  12. [ -n "$pkg" ] && [ -e "$pkg" ] ||
  13. fatal "No package supplied"
  14. _dd() {
  15. local o="$1"; shift
  16. dd if="$pkg" skip="$o" iflag=skip_bytes status=none "$@"
  17. }
  18. calcsize() {
  19. offset=$(($1 + 8))
  20. local i b b0 b1 b2 b3 b4 b5 b6 b7
  21. i=0
  22. while [ $i -lt 8 ]; do
  23. b="$(_dd $(($offset + $i)) bs=1 count=1)"
  24. [ -z "$b" ] &&
  25. b="0" ||
  26. b="$(exec printf '%u\n' "'$b")"
  27. eval "b$i=\$b"
  28. i=$(($i + 1))
  29. done
  30. rsize=$((8 + ((($b0 << 24) + ($b1 << 16) + ($b2 << 8) + $b3) << 4) + ($b4 << 24) + ($b5 << 16) + ($b6 << 8) + $b7))
  31. offset=$(($offset + $rsize))
  32. }
  33. case "$(_dd 0 bs=8 count=1)" in
  34. "$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
  35. *) fatal "File doesn't look like rpm: $pkg" ;;
  36. esac
  37. calcsize 96
  38. sigsize=$rsize
  39. calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
  40. hdrsize=$rsize
  41. case "$(_dd $offset bs=3 count=1)" in
  42. "$(printf '\102\132')"*) _dd $offset | bunzip2 ;; # '\x42\x5a'
  43. "$(printf '\037\213')"*) _dd $offset | gunzip ;; # '\x1f\x8b'
  44. "$(printf '\375\067')"*) _dd $offset | xzcat ;; # '\xfd\x37'
  45. "$(printf '\135\000')"*) _dd $offset | unlzma ;; # '\x5d\x00'
  46. "$(printf '\050\265')"*) _dd $offset | unzstd ;; # '\x28\xb5'
  47. *) fatal "Unrecognized rpm file: $pkg" ;;
  48. esac