xref: /openbmc/openbmc/poky/scripts/rpm2cpio.sh (revision 520786cc)
1eb8dc403SDave Cobbley#!/bin/sh -efu
2eb8dc403SDave Cobbley# This file comes from rpm 4.x distribution
3eb8dc403SDave Cobbley
4eb8dc403SDave Cobbleyfatal() {
5eb8dc403SDave Cobbley	echo "$*" >&2
6eb8dc403SDave Cobbley	exit 1
7eb8dc403SDave Cobbley}
8eb8dc403SDave Cobbley
9eb8dc403SDave Cobbleypkg="$1"
10*520786ccSPatrick Williams[ -n "$pkg" ] && [ -e "$pkg" ] ||
11eb8dc403SDave Cobbley	fatal "No package supplied"
12eb8dc403SDave Cobbley
13eb8dc403SDave Cobbley_dd() {
14eb8dc403SDave Cobbley	local o="$1"; shift
15eb8dc403SDave Cobbley	dd if="$pkg" skip="$o" iflag=skip_bytes status=none $*
16eb8dc403SDave Cobbley}
17eb8dc403SDave Cobbley
18eb8dc403SDave Cobbleycalcsize() {
19*520786ccSPatrick Williams
20*520786ccSPatrick Williams	case "$(_dd $1 bs=4 count=1 | tr -d '\0')" in
21*520786ccSPatrick Williams		"$(printf '\216\255\350')"*) ;; # '\x8e\xad\xe8'
22*520786ccSPatrick Williams		*) fatal "File doesn't look like rpm: $pkg" ;;
23*520786ccSPatrick Williams	esac
24*520786ccSPatrick Williams
25eb8dc403SDave Cobbley	offset=$(($1 + 8))
26eb8dc403SDave Cobbley
27eb8dc403SDave Cobbley	local i b b0 b1 b2 b3 b4 b5 b6 b7
28eb8dc403SDave Cobbley
29eb8dc403SDave Cobbley	i=0
30eb8dc403SDave Cobbley	while [ $i -lt 8 ]; do
31*520786ccSPatrick Williams		# add . to not loose \n
32*520786ccSPatrick Williams		# strip \0 as it gets dropped with warning otherwise
33*520786ccSPatrick Williams		b="$(_dd $(($offset + $i)) bs=1 count=1 | tr -d '\0' ; echo .)"
34*520786ccSPatrick Williams		b=${b%.}    # strip . again
35*520786ccSPatrick Williams
36eb8dc403SDave Cobbley		[ -z "$b" ] &&
37eb8dc403SDave Cobbley			b="0" ||
38eb8dc403SDave Cobbley			b="$(exec printf '%u\n' "'$b")"
39eb8dc403SDave Cobbley		eval "b$i=\$b"
40eb8dc403SDave Cobbley		i=$(($i + 1))
41eb8dc403SDave Cobbley	done
42eb8dc403SDave Cobbley
43eb8dc403SDave Cobbley	rsize=$((8 + ((($b0 << 24) + ($b1 << 16) + ($b2 << 8) + $b3) << 4) + ($b4 << 24) + ($b5 << 16) + ($b6 << 8) + $b7))
44eb8dc403SDave Cobbley	offset=$(($offset + $rsize))
45eb8dc403SDave Cobbley}
46eb8dc403SDave Cobbley
47*520786ccSPatrick Williamscase "$(_dd 0 bs=4 count=1 | tr -d '\0')" in
48eb8dc403SDave Cobbley	"$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
49eb8dc403SDave Cobbley	*) fatal "File doesn't look like rpm: $pkg" ;;
50eb8dc403SDave Cobbleyesac
51eb8dc403SDave Cobbley
52eb8dc403SDave Cobbleycalcsize 96
53eb8dc403SDave Cobbleysigsize=$rsize
54eb8dc403SDave Cobbley
55eb8dc403SDave Cobbleycalcsize $(($offset + (8 - ($sigsize % 8)) % 8))
56eb8dc403SDave Cobbleyhdrsize=$rsize
57eb8dc403SDave Cobbley
58*520786ccSPatrick Williamscase "$(_dd $offset bs=2 count=1 | tr -d '\0')" in
59*520786ccSPatrick Williams	"$(printf '\102\132')") _dd $offset | bunzip2 ;; # '\x42\x5a'
60*520786ccSPatrick Williams	"$(printf '\037\213')") _dd $offset | gunzip  ;; # '\x1f\x8b'
61*520786ccSPatrick Williams	"$(printf '\375\067')") _dd $offset | xzcat   ;; # '\xfd\x37'
62*520786ccSPatrick Williams	"$(printf '\135')") _dd $offset | unlzma      ;; # '\x5d\x00'
63*520786ccSPatrick Williams	"$(printf '\050\265')") _dd $offset | unzstd  ;; # '\x28\xb5'
64*520786ccSPatrick Williams	*) fatal "Unrecognized payload compression format in rpm file: $pkg" ;;
65eb8dc403SDave Cobbleyesac
66