Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
[sfrench/cifs-2.6.git] / scripts / extract-ikconfig
1 #!/bin/sh
2 # ----------------------------------------------------------------------
3 # extract-ikconfig - Extract the .config file from a kernel image
4 #
5 # This will only work when the kernel was compiled with CONFIG_IKCONFIG.
6 #
7 # The obscure use of the "tr" filter is to work around older versions of
8 # "grep" that report the byte offset of the line instead of the pattern.
9 #
10 # (c) 2009, Dick Streefland <dick@streefland.net>
11 # Licensed under the terms of the GNU General Public License.
12 # ----------------------------------------------------------------------
13
14 gz1='\037\213\010'
15 gz2='01'
16 cf1='IKCFG_ST\037\213\010'
17 cf2='0123456789'
18
19 dump_config()
20 {
21         if      pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"`
22         then
23                 pos=${pos%%:*}
24                 tail -c+$(($pos+8)) "$1" | zcat -q
25                 exit 0
26         fi
27 }
28
29 # Check invocation:
30 me=${0##*/}
31 img=$1
32 if      [ $# -ne 1 -o ! -s "$img" ]
33 then
34         echo "Usage: $me <kernel-image>" >&2
35         exit 2
36 fi
37
38 # Initial attempt for uncompressed images or objects:
39 dump_config "$img"
40
41 # That didn't work, so decompress and try again:
42 tmp=/tmp/ikconfig$$
43 trap "rm -f $tmp" 0
44 for     pos in `tr "$gz1\n$gz2" "\n$gz2=" < "$img" | grep -abo "^$gz2"`
45 do
46         pos=${pos%%:*}
47         tail -c+$pos "$img" | zcat 2> /dev/null > $tmp
48         dump_config $tmp
49 done
50
51 # Bail out:
52 echo "$me: Cannot find kernel config." >&2
53 exit 1