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