drm/drm_crtc: return -EFAULT on copy_to_user errors
[safe/jmp/linux-2.6] / scripts / extract-ikconfig
index be2e579..37f30d3 100755 (executable)
@@ -1,78 +1,53 @@
 #!/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, 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'
+
+dump_config()
 {
-       echo "  usage: extract-ikconfig [b]zImage_filename"
-}
-
-clean_up()
-{
-       if [ "$TMPFILE" != "" ]; then
-               rm -f $TMPFILE
+       if      pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"`
+       then
+               pos=${pos%%:*}
+               tail -c+$(($pos+8)) "$1" | zcat -q
+               exit 0
        fi
 }
 
-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"
-
-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
-
-echo "ERROR: Unable to extract kernel configuration information."
-echo "       This kernel image may not have the config info."
-
-clean_up
+# 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
+
+# Bail out:
+echo "$me: Cannot find kernel config." >&2
 exit 1