2005-04-17 06:20:36 +08:00
|
|
|
#!/bin/sh
|
2009-10-07 04:35:40 +08:00
|
|
|
# ----------------------------------------------------------------------
|
|
|
|
# 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()
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2009-10-07 04:35:40 +08:00
|
|
|
if pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"`
|
|
|
|
then
|
|
|
|
pos=${pos%%:*}
|
|
|
|
tail -c+$(($pos+8)) "$1" | zcat -q
|
|
|
|
exit 0
|
2005-04-17 06:20:36 +08:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2009-10-07 04:35:40 +08:00
|
|
|
# Check invocation:
|
|
|
|
me=${0##*/}
|
|
|
|
img=$1
|
|
|
|
if [ $# -ne 1 -o ! -s "$img" ]
|
2005-04-17 06:20:36 +08:00
|
|
|
then
|
2009-10-07 04:35:40 +08:00
|
|
|
echo "Usage: $me <kernel-image>" >&2
|
|
|
|
exit 2
|
2005-04-17 06:20:36 +08:00
|
|
|
fi
|
|
|
|
|
2009-10-07 04:35:40 +08:00
|
|
|
# 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
|
2005-04-17 06:20:36 +08:00
|
|
|
exit 1
|