File tree 1 file changed +92
-0
lines changed
1 file changed +92
-0
lines changed Original file line number Diff line number Diff line change
1
+ #! /bin/bash
2
+
3
+ trap ' echo error in $BASH_COMMAND >&2; exit 1' ERR
4
+
5
+ MG_CPIO=$' \x71\xc7 '
6
+ MG_CPIO1=070701
7
+ MG_GZ=$' \x1f\x8b '
8
+ MG_GZ1=$' \x1f\x9e '
9
+ MG_BZ=" BZh"
10
+ MG_XZ=$' \xfd 7zXZ'
11
+ MG_LZ4=$' \x02\x21 '
12
+ MG_LZO=$' \x89 LZO'
13
+ MG_ZSTD=$' \x28\xB5\x2F\xFD '
14
+
15
+ check_fmt () {
16
+ case $1 in
17
+ $MG_CPIO * |$MG_CPIO1 )
18
+ echo cpio;;
19
+ $MG_GZ * |$MG_GZ1 * )
20
+ echo gzip;;
21
+ $MG_BZ * )
22
+ echo bz2;;
23
+ $MG_XZ * )
24
+ echo xz;;
25
+ $MG_LZ4 * )
26
+ echo lz4;;
27
+ $MG_LZO * )
28
+ echo lzo;;
29
+ $MG_ZSTD * )
30
+ echo zstd;;
31
+ esac
32
+ }
33
+
34
+ uncomp () {
35
+ case $1 in
36
+ $MG_CPIO * |$MG_CPIO1 )
37
+ cat;;
38
+ $MG_GZ * )
39
+ zcat;;
40
+ $MG_BZ * )
41
+ bzcat;;
42
+ $MG_XZ * )
43
+ xzcat;;
44
+ $MG_LZ4 * )
45
+ lz4 -d -c;;
46
+ $MG_LZO * )
47
+ lzop -d -c;;
48
+ $MG_ZSTD * )
49
+ zstd -d -c;;
50
+ esac
51
+ }
52
+
53
+ check_size () {
54
+ [[ " $SIZE " -gt $1 ]] || {
55
+ echo " $INITRD : file too small, cannot read magic" >&2
56
+ exit 1
57
+ }
58
+ }
59
+
60
+ INITRD=$1
61
+ [[ " $INITRD " && -f " $INITRD " ]] || {
62
+ echo " $INITRD : file not found" >&2
63
+ exit 1
64
+ }
65
+ SIZE=$( stat -L -c %s " $INITRD " )
66
+ check_size 6
67
+
68
+ read -r -d' \0' -n 6 MAGIC < " $INITRD "
69
+ FMT=$( check_fmt " $MAGIC " )
70
+ BYTES=0
71
+ if [[ ! $FMT ]]; then
72
+ echo " $INITRD : unknown format" >&2
73
+ exit 1
74
+ elif [[ " $FMT " = cpio ]]; then
75
+ # check for "early CPIO" image
76
+ TMPFILE=$( mktemp " ${TMPDIR:-/ tmp} /initrd-XXXXXX" )
77
+ EARLY=$( cpio -t early_cpio " kernel/*/microcode/*.bin" \
78
+ < " $INITRD " 2> " $TMPFILE " )
79
+ BLOCKS=$( cut -d" " -f1 " $TMPFILE " )
80
+ rm -f " $TMPFILE "
81
+ if [[ -z " $EARLY " ]]; then
82
+ # just plain uncompressed cpio
83
+ cpio -t < " $INITRD " 2> /dev/null
84
+ exit
85
+ fi
86
+ BYTES=$(( 512 * BLOCKS))
87
+ check_size $(( BYTES + 6 ))
88
+ read -r -d ' \0' -n 6 MAGIC \
89
+ < <( dd if=" $INITRD " bs=1b count=1 skip=$BLOCKS 2> /dev/null)
90
+ fi
91
+
92
+ tail -c +$(( BYTES + 1 )) " $INITRD " | uncomp " $MAGIC " | cpio -t 2> /dev/null
You can’t perform that action at this time.
0 commit comments