From: Alberto Planas <[email protected]>

openSUSE RPMs are compressing the RPM payload using zstd, that
correspond to the magic ID 0x28, 0xb5, 0x2f.

This patch update the script to the last version from the rpm project,
and add support to this compression format, and extract the cpio payload
using the "unzstd" binary.

Signed-off-by: Alberto Planas <[email protected]>
---
 scripts/rpm2cpio.sh | 30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/scripts/rpm2cpio.sh b/scripts/rpm2cpio.sh
index 2034373fe4..8199b43784 100755
--- a/scripts/rpm2cpio.sh
+++ b/scripts/rpm2cpio.sh
@@ -7,7 +7,7 @@ fatal() {
 }
 
 pkg="$1"
-[ -n "$pkg" -a -e "$pkg" ] ||
+[ -n "$pkg" ] && [ -e "$pkg" ] ||
        fatal "No package supplied"
 
 _dd() {
@@ -16,14 +16,23 @@ _dd() {
 }
 
 calcsize() {
+
+       case "$(_dd $1 bs=4 count=1 | tr -d '\0')" in
+               "$(printf '\216\255\350')"*) ;; # '\x8e\xad\xe8'
+               *) fatal "File doesn't look like rpm: $pkg" ;;
+       esac
+
        offset=$(($1 + 8))
 
        local i b b0 b1 b2 b3 b4 b5 b6 b7
 
        i=0
        while [ $i -lt 8 ]; do
-               b=$(_dd $(($offset + $i)) bs=1 count=1; echo X)
-               b=${b%X}
+               # add . to not loose \n
+               # strip \0 as it gets dropped with warning otherwise
+               b="$(_dd $(($offset + $i)) bs=1 count=1 | tr -d '\0' ; echo .)"
+               b=${b%.}    # strip . again
+
                [ -z "$b" ] &&
                        b="0" ||
                        b="$(exec printf '%u\n' "'$b")"
@@ -35,7 +44,7 @@ calcsize() {
        offset=$(($offset + $rsize))
 }
 
-case "$(_dd 0 bs=8 count=1)" in
+case "$(_dd 0 bs=4 count=1 | tr -d '\0')" in
        "$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
        *) fatal "File doesn't look like rpm: $pkg" ;;
 esac
@@ -46,10 +55,11 @@ sigsize=$rsize
 calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
 hdrsize=$rsize
 
-case "$(_dd $offset bs=3 count=1)" in
-       "$(printf '\102\132')"*) _dd $offset | bzip2 -d ;; # '\x42\x5a'
-       "$(printf '\037\213')"*) _dd $offset | gunzip  ;; # '\x1f\x8b'
-       "$(printf '\375\067')"*) _dd $offset | xzcat   ;; # '\xfd\x37'
-       "$(printf '\135\000')"*) _dd $offset | unlzma  ;; # '\x5d\x00'
-       *) fatal "Unrecognized rpm file: $pkg" ;;
+case "$(_dd $offset bs=2 count=1 | tr -d '\0')" in
+       "$(printf '\102\132')") _dd $offset | bunzip2 ;; # '\x42\x5a'
+       "$(printf '\037\213')") _dd $offset | gunzip  ;; # '\x1f\x8b'
+       "$(printf '\375\067')") _dd $offset | xzcat   ;; # '\xfd\x37'
+       "$(printf '\135')") _dd $offset | unlzma      ;; # '\x5d\x00'
+       "$(printf '\050\265')") _dd $offset | unzstd  ;; # '\x28\xb5'
+       *) fatal "Unrecognized payload compression format in rpm file: $pkg" ;;
 esac
-- 
2.41.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#183091): 
https://lists.openembedded.org/g/openembedded-core/message/183091
Mute This Topic: https://lists.openembedded.org/mt/99618666/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

  • [OE-core] [PATCH v3 1/2] rpm2cpi... Alberto Planas via lists.openembedded.org

Reply via email to