[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#790095: getinitramfs code



Hi,

Here is the getinitramfs script itself for testing just in case patch is
inconvenient for testing.

Osamu
#!/bin/sh

set -eu

usage()
{
	echo "Usage: $(basename $0) [-l] <initramfs file>"
}

if [ "$#" -eq 0 ] ; then
	usage >&2
	exit 1
fi

OPTIONS=`getopt -o h --long help -n "$0" -- "$@"`
# Check for non-GNU getopt
if [ $? != 0 ] ; then echo "W: non-GNU getopt" >&2 ; exit 1 ; fi

eval set -- "$OPTIONS"

while true; do
        case "$1" in
        -h|--help)
		usage
		exit 0
	;;
	--)
		shift
		break
	;;
	*)
		echo "Internal error!" >&2
		exit 1
	esac
done

# Read bytes out of a file, checking that they are valid hex digits
readhex()
{
	dd < "$1" bs=1 skip="$2" count="$3" 2> /dev/null | \
		LANG=C grep -E "^[0-9A-Fa-f]{$3}\$"
}

# Check for a zero byte in a file
checkzero()
{
	dd < "$1" bs=1 skip="$2" count=1 2> /dev/null | \
		LANG=C grep -q -z '^$'
}

for initramfs in "$@" ; do
	if ! [ -r "${initramfs}" ] ; then
		echo "Specified file could not be read." >&2
		exit 1
	else
		echo "${initramfs}"

		# There may be a prepended uncompressed archive.  cpio
		# won't tell us the true size of this so we have to
		# parse the headers and padding ourselves.  This is
		# very roughly based on linux/lib/earlycpio.c
		offset=0
		while true; do
			if checkzero "$initramfs" $offset; then
				offset=$((offset + 4))
				continue
			fi
			magic="$(readhex "$initramfs" $offset 6)" || break
			test $magic = 070701 || test $magic = 070702 || break
			namesize=0x$(readhex "$initramfs" $((offset + 94)) 8)
			filesize=0x$(readhex "$initramfs" $((offset + 54)) 8)
			offset=$(((offset + 110)))
			offset=$(((offset + $namesize + 3) & ~3))
			offset=$(((offset + $filesize + 3) & ~3))
		done

		if [ $offset -ne 0 ]; then
			# Extract main archive
			echo "Multi-segmented initramfs image: $initramfs"
			dd < "$initramfs" bs="$offset" skip=1 2> /dev/null \
				> $initramfs.main
			echo " ==> Extracted main initramfs image: $initramfs.main"
		else
			echo "Simple initramfs image: $initramfs"
		fi

	fi
done

Reply to: