#!/bin/sh

rd()
{
	echo $(od -j $(($1)) -N ${2:-4} -t u${2:-4} -An ${3:-kernel})
}

ds()
{
	dd count=$((($1*${2:-512})/512)) bs=512 2>/dev/null
	dd count=$(((($1*${2:-512})%512)/${2:-512})) bs=${2:-512} 2>/dev/null
}

case "$1" in
extract) (
	ds 1
	ds $(($(rd 0x1F1 1)-1))
	[ $(rd 0x228 2) -le $(($(rd 0x1F1 1)*512)) ] || ds 1
	[ $(rd 0x228) -ne 0 ] && ds 1 >cmdline$$
	ds $(( ($(rd 0x1F4) +31) /32)) ) >kernel
	if [ $(rd 0x21C) -ne 0 ]; then
		ds $(( ($(rd 0x21C) +3) /4)) 4 >rootfs
	elif [ $(rd 0x218) -ne 0 ]; then
		n=$(($(rd 0x1EE 2)%512))
		i=0
		while [ $(($n % 256)) -lt $(rd 0x1F0 1) ]; do
			ds $(( ($(rd $n 4 cmdline$$) +3) /4)) 4 >rootfs$i
			n=$(($n+4))
			i=$(($i+1))
		done
	fi
	if [ -s cmdline$$ ]; then
		strings <cmdline$$ | sed q >cmdline
		rm -f cmdline$$
	fi
	;;
*)	cat <<EOT
usage: cat fd*.img | $0 extract  or
# cat fd0*.img | $0 extract
	creates kernel, rootfs(es) and cmdline files
EOT
	for i in 1 2 3; do
		j=" cat fd$i*.img |"
		echo "#$j cpio -i 2>/dev/null ||$j unlzma | cpio -idmu"
	done
esac
