162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# ----------------------------------------------------------------------
362306a36Sopenharmony_ci# extract-ikconfig - Extract the .config file from a kernel image
462306a36Sopenharmony_ci#
562306a36Sopenharmony_ci# This will only work when the kernel was compiled with CONFIG_IKCONFIG.
662306a36Sopenharmony_ci#
762306a36Sopenharmony_ci# The obscure use of the "tr" filter is to work around older versions of
862306a36Sopenharmony_ci# "grep" that report the byte offset of the line instead of the pattern.
962306a36Sopenharmony_ci#
1062306a36Sopenharmony_ci# (c) 2009,2010 Dick Streefland <dick@streefland.net>
1162306a36Sopenharmony_ci# Licensed under the terms of the GNU General Public License.
1262306a36Sopenharmony_ci# ----------------------------------------------------------------------
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cicf1='IKCFG_ST\037\213\010'
1562306a36Sopenharmony_cicf2='0123456789'
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cidump_config()
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	if	pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"`
2062306a36Sopenharmony_ci	then
2162306a36Sopenharmony_ci		pos=${pos%%:*}
2262306a36Sopenharmony_ci		tail -c+$(($pos+8)) "$1" | zcat > $tmp1 2> /dev/null
2362306a36Sopenharmony_ci		if	[ $? != 1 ]
2462306a36Sopenharmony_ci		then	# exit status must be 0 or 2 (trailing garbage warning)
2562306a36Sopenharmony_ci			cat $tmp1
2662306a36Sopenharmony_ci			exit 0
2762306a36Sopenharmony_ci		fi
2862306a36Sopenharmony_ci	fi
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_citry_decompress()
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	for	pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
3462306a36Sopenharmony_ci	do
3562306a36Sopenharmony_ci		pos=${pos%%:*}
3662306a36Sopenharmony_ci		tail -c+$pos "$img" | $3 > $tmp2 2> /dev/null
3762306a36Sopenharmony_ci		dump_config $tmp2
3862306a36Sopenharmony_ci	done
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci# Check invocation:
4262306a36Sopenharmony_cime=${0##*/}
4362306a36Sopenharmony_ciimg=$1
4462306a36Sopenharmony_ciif	[ $# -ne 1 -o ! -s "$img" ]
4562306a36Sopenharmony_cithen
4662306a36Sopenharmony_ci	echo "Usage: $me <kernel-image>" >&2
4762306a36Sopenharmony_ci	exit 2
4862306a36Sopenharmony_cifi
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci# Prepare temp files:
5162306a36Sopenharmony_citmp1=/tmp/ikconfig$$.1
5262306a36Sopenharmony_citmp2=/tmp/ikconfig$$.2
5362306a36Sopenharmony_citrap "rm -f $tmp1 $tmp2" 0
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci# Initial attempt for uncompressed images or objects:
5662306a36Sopenharmony_cidump_config "$img"
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci# That didn't work, so retry after decompression.
5962306a36Sopenharmony_citry_decompress '\037\213\010' xy    gunzip
6062306a36Sopenharmony_citry_decompress '\3757zXZ\000' abcde unxz
6162306a36Sopenharmony_citry_decompress 'BZh'          xy    bunzip2
6262306a36Sopenharmony_citry_decompress '\135\0\0\0'   xxx   unlzma
6362306a36Sopenharmony_citry_decompress '\211\114\132' xy    'lzop -d'
6462306a36Sopenharmony_citry_decompress '\002\041\114\030' xyy 'lz4 -d -l'
6562306a36Sopenharmony_citry_decompress '\050\265\057\375' xxx unzstd
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci# Bail out:
6862306a36Sopenharmony_ciecho "$me: Cannot find kernel config." >&2
6962306a36Sopenharmony_ciexit 1
70