scripts/extract-ikconfig: add support for bzip2, lzma and lzo
authorDick Streefland <dick@streefland.net>
Fri, 22 Oct 2010 22:02:44 +0000 (00:02 +0200)
committerMichal Marek <mmarek@suse.cz>
Wed, 27 Oct 2010 22:22:17 +0000 (00:22 +0200)
Add support for kernels compressed with bzip2, lzma or lzo to the
extract-ikconfig script.

Fixes kernel bugzilla #19852:
https://bugzilla.kernel.org/show_bug.cgi?id=19852

Signed-off-by: Dick Streefland <dick@streefland.net>
Tested-by: Justin <jlec@gentoo.org>
Signed-off-by: Michal Marek <mmarek@suse.cz>
scripts/extract-ikconfig

index 37f30d36c944645988c722d81e854744a5a18f39..1512c0a755acea37da3d190c88ae47c04023f883 100755 (executable)
@@ -7,12 +7,10 @@
 # The obscure use of the "tr" filter is to work around older versions of
 # "grep" that report the byte offset of the line instead of the pattern.
 #
-# (c) 2009, Dick Streefland <dick@streefland.net>
+# (c) 2009,2010 Dick Streefland <dick@streefland.net>
 # Licensed under the terms of the GNU General Public License.
 # ----------------------------------------------------------------------
 
-gz1='\037\213\010'
-gz2='01'
 cf1='IKCFG_ST\037\213\010'
 cf2='0123456789'
 
@@ -21,11 +19,25 @@ dump_config()
        if      pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"`
        then
                pos=${pos%%:*}
-               tail -c+$(($pos+8)) "$1" | zcat -q
-               exit 0
+               tail -c+$(($pos+8)) "$1" | zcat > $tmp1 2> /dev/null
+               if      [ $? != 1 ]
+               then    # exit status must be 0 or 2 (trailing garbage warning)
+                       cat $tmp1
+                       exit 0
+               fi
        fi
 }
 
+try_decompress()
+{
+       for     pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
+       do
+               pos=${pos%%:*}
+               tail -c+$pos "$img" | $3 > $tmp2 2> /dev/null
+               dump_config $tmp2
+       done
+}
+
 # Check invocation:
 me=${0##*/}
 img=$1
@@ -35,18 +47,19 @@ then
        exit 2
 fi
 
+# Prepare temp files:
+tmp1=/tmp/ikconfig$$.1
+tmp2=/tmp/ikconfig$$.2
+trap "rm -f $tmp1 $tmp2" 0
+
 # Initial attempt for uncompressed images or objects:
 dump_config "$img"
 
-# That didn't work, so decompress and try again:
-tmp=/tmp/ikconfig$$
-trap "rm -f $tmp" 0
-for    pos in `tr "$gz1\n$gz2" "\n$gz2=" < "$img" | grep -abo "^$gz2"`
-do
-       pos=${pos%%:*}
-       tail -c+$pos "$img" | zcat 2> /dev/null > $tmp
-       dump_config $tmp
-done
+# That didn't work, so retry after decompression.
+try_decompress '\037\213\010' xy  gunzip
+try_decompress 'BZh'          xy  bunzip2
+try_decompress '\135\0\0\0'   xxx unlzma
+try_decompress '\211\114\132' xy  'lzop -d'
 
 # Bail out:
 echo "$me: Cannot find kernel config." >&2