scripts/coccinelle/api/simple_open.cocci: semantic patch for simple_open()
[linux-2.6.git] / scripts / extract-ikconfig
index be2e579..e186242 100755 (executable)
@@ -1,78 +1,67 @@
 #!/bin/sh
-# extracts .config info from a [b]zImage file
-# uses: binoffset (new), dd, zcat, strings, grep
-# $arg1 is [b]zImage filename
-
-binoffset="./scripts/binoffset"
-test -e $binoffset || cc -o $binoffset ./scripts/binoffset.c || exit 1
-
-IKCFG_ST="0x49 0x4b 0x43 0x46 0x47 0x5f 0x53 0x54"
-IKCFG_ED="0x49 0x4b 0x43 0x46 0x47 0x5f 0x45 0x44"
-function dump_config {
-    typeset file="$1"
-
-    start=`$binoffset $file $IKCFG_ST 2>/dev/null`
-    [ "$?" != "0" ] && start="-1"
-    if [ "$start" -eq "-1" ]; then
-       return
-    fi
-    end=`$binoffset $file $IKCFG_ED 2>/dev/null`
-
-    let start="$start + 8"
-    let size="$end - $start"
-
-    head --bytes="$end" "$file" | tail --bytes="$size" | zcat
-
-    clean_up
-    exit 0
-}
-
-
-usage()
+# ----------------------------------------------------------------------
+# extract-ikconfig - Extract the .config file from a kernel image
+#
+# This will only work when the kernel was compiled with CONFIG_IKCONFIG.
+#
+# 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,2010 Dick Streefland <dick@streefland.net>
+# Licensed under the terms of the GNU General Public License.
+# ----------------------------------------------------------------------
+
+cf1='IKCFG_ST\037\213\010'
+cf2='0123456789'
+
+dump_config()
 {
-       echo "  usage: extract-ikconfig [b]zImage_filename"
+       if      pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"`
+       then
+               pos=${pos%%:*}
+               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
 }
 
-clean_up()
+try_decompress()
 {
-       if [ "$TMPFILE" != "" ]; then
-               rm -f $TMPFILE
-       fi
+       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
 }
 
-if [ $# -lt 1 ]
+# Check invocation:
+me=${0##*/}
+img=$1
+if     [ $# -ne 1 -o ! -s "$img" ]
 then
-       usage
-       exit 1
+       echo "Usage: $me <kernel-image>" >&2
+       exit 2
 fi
 
-TMPFILE=`mktemp -t ikconfig-XXXXXX` || exit 1
-image="$1"
-
-# vmlinux: Attempt to dump the configuration from the file directly
-dump_config "$image"
+# Prepare temp files:
+tmp1=/tmp/ikconfig$$.1
+tmp2=/tmp/ikconfig$$.2
+trap "rm -f $tmp1 $tmp2" 0
 
-GZHDR1="0x1f 0x8b 0x08 0x00"
-GZHDR2="0x1f 0x8b 0x08 0x08"
-
-# vmlinux.gz: Check for a compressed images
-off=`$binoffset "$image" $GZHDR1 2>/dev/null`
-[ "$?" != "0" ] && off="-1"
-if [ "$off" -eq "-1" ]; then
-       off=`$binoffset "$image" $GZHDR2 2>/dev/null`
-       [ "$?" != "0" ] && off="-1"
-fi
-if [ "$off" -eq "0" ]; then
-       zcat <"$image" >"$TMPFILE"
-       dump_config "$TMPFILE"
-elif [ "$off" -ne "-1" ]; then
-       (dd ibs="$off" skip=1 count=0 && dd bs=512k) <"$image" 2>/dev/null | \
-               zcat >"$TMPFILE"
-       dump_config "$TMPFILE"
-fi
+# Initial attempt for uncompressed images or objects:
+dump_config "$img"
 
-echo "ERROR: Unable to extract kernel configuration information."
-echo "       This kernel image may not have the config info."
+# That didn't work, so retry after decompression.
+try_decompress '\037\213\010' xy    gunzip
+try_decompress '\3757zXZ\000' abcde unxz
+try_decompress 'BZh'          xy    bunzip2
+try_decompress '\135\0\0\0'   xxx   unlzma
+try_decompress '\211\114\132' xy    'lzop -d'
 
-clean_up
+# Bail out:
+echo "$me: Cannot find kernel config." >&2
 exit 1