#!/bin/sh

ddq()
{
	dd $@ 2> /dev/null
}

ddn()
{
	ddq $@ conv=notrunc
}

store()
{
	local i
	local n
	n=$2; for i in $(seq 8 8 ${4:-16}); do
		printf '\\\\x%02X' $((n & 255))
		n=$((n >> 8))
	done | xargs echo -en | ddn bs=1 of=$3 seek=$(($1))
}

get()
{
	echo $(od -j $(($1)) -N ${3:-2} -t u${3:-2} -An "$2")
}

compress()
{
	if [ "$1" ]; then
		gzip -9 > $1
		[ "$(which advdef 2> /dev/null)" ] &&
		advdef -z4 -i100 $1 > /dev/null
	elif [ "$(which xz 2> /dev/null)" ]; then
		xz -z -e --format=lzma --lzma1=mode=normal --stdout
	else
		lzma e -si -so
	fi 2> /dev/null
}

add_rootfs()
{
	TMP=/tmp/iso2exe$$
	mkdir -p $TMP/mnt
	mount -o loop,ro $1 $TMP/mnt
	if [ "$2" = "--array" ] || grep -qs rootfs $TMP/mnt/boot/isolinux/isolinux.cfg ; then
		$0 --get rootfs.gz > $TMP/rootfs.gz
		SIZE=$(wc -c < $TMP/rootfs.gz)
		if [ $(get 2048 $1) -eq 19792 -a $SIZE -lt 1912 ]; then
			store 24 $((0 - SIZE)) $1
			OFS2=$(( 0x1000 - SIZE ))
			OFS=$(( 0x7FF0 ))
		else
			store 24 $SIZE $1
			unset OFS2
			OFS=$(( 0x7FF0 - SIZE ))
		fi
		printf "Adding rootfs.gz file at %04X (%d bytes) ...\n" ${OFS2:-$OFS} $SIZE
		ddn if=$TMP/rootfs.gz of=$1 bs=1 seek=${OFS2:-$OFS}
	fi
	umount $TMP/mnt
	rm -rf $TMP
}

add_tazlito_info()
{
	HOLE=$OFS
	[ $(get 0 $2) -eq 35615 ] || return
	zcat $2 | compress /tmp/rezipped$$.gz
	n=$(stat -c %s /tmp/rezipped$$.gz)
	if [ $(get 2048 $1) -eq 19792 -a $n -lt 412 ]; then
		o=$((0x1200-n))
	else
		o=$OFS
		HOLE=$((HOLE+n))
	fi
	printf "Moving tazlito data record at %04X ($n bytes) ...\n" $o
	ddn if=/tmp/rezipped$$.gz bs=1 of=$1 seek=$o
	rm -f /tmp/rezipped$$.gz
	if [ -n "$gpt" ]; then
		store $((0x25E)) $n $1
		store $((0x25C)) $o $1
	fi
}

add_win32exe()
{
	$0 --get bootiso.bin 2> /dev/null > /tmp/bin$$
	SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c)
	n=1536; n0=0; n2=0
	cut=$((0x98+$(get 0x94 /tmp/exe$$)))
	if [ $(get 2048 /tmp/bin$$) -eq 19792 ]; then
		o=$(($(get 584 "$1")*512))
		f=$(($(get $((o+0x20)) "$1" 4)/4))
		l=$((($(get $((o+0x28)) "$1" 4)+1)/4-f))
		store $((0x1008)) $(printf "%08x" $f | sed 's|\(..\)\(..\)\(..\)\(..\)|0x\4\3\2\1|') /tmp/bin$$ 32
		store $((0x1054)) $(printf "%08x" $l | sed 's|\(..\)\(..\)\(..\)\(..\)|0x\4\3\2\1|') /tmp/bin$$ 32
		printf "Adding Apple partition at %04X (2560 bytes) ...\n" 2048
		if [ $(get 0x86 /tmp/exe$$) -eq 3 ]; then
			n0=136; n2=2696
		else
			n=4608
		fi
	fi
	SIZE=$((SIZE+n+n2-n0))
	printf "Adding WIN32 file at %04X (%d bytes) ...\n" 0 $SIZE
	[ -n "$gpt" ] && printf "Adding GPT at %04X (1024 bytes) ...\n" 512
	for i in $(seq 396 40 $((356+$(get 0x86 /tmp/exe$$)*40))); do
		x=$((n + n2 - n0 + $(get $i /tmp/exe$$)))
		store $i $x /tmp/exe$$
	done
	store $((0x94)) $((n + cut - 0x98)) /tmp/exe$$
	ddn if=/tmp/exe$$ of=$1 bs=1 count=$cut
	[ $n2 -ne 0 ] && ddn if=/tmp/exe$$ of=$1 bs=1 skip=$cut seek=$((n+cut)) count=$n0
	ddn if=/tmp/exe$$ of=$1 bs=1 skip=$((n0+cut)) seek=$((n+n2+cut))
	printf "Adding bootiso head at %04X...\n" 0
	store 510 $((0xAA55)) $1
	while read adrs sz rem; do
		ddn if=/tmp/bin$$ of=$1 bs=1 count=$((0x$sz)) seek=$((0x$adrs)) skip=$((0x$adrs))
	done <<EOT
0000 0080
0178 0040
0270 0190
0600 0178
0800 0088
1000 0088
EOT
	i=$((0x600))
	OFS=$SIZE
	rm -f /tmp/exe$$ /tmp/bin$$
	if [ -z "$RECURSIVE_PARTITION" -a $(get 454 $1 4) -eq 0 ]; then
		store 448 $((1+i/512)) $1 8
		store 454 $((i/512)) $1 32
		store 458 $(($(stat -c %s $1)/512)) $1 32
	fi
	mkdir /tmp/mnt$$	
	mount -o loop,ro $1 /tmp/mnt$$
	if [ -s /tmp/mnt$$/boot/linld.com ]; then
		i=$(($(get 20 $1)-0xC0))
		store $((i-6)) $(($(busybox stat -m /tmp/mnt$$/boot/linld.com | sed q)*2048)) $1 32
		store $((i-2)) $(stat -c %s /tmp/mnt$$/boot/linld.com) $1
		r="$(sed '/rootfs[0-9]/!d;s|.* initrd=||;s|/boot/||g;s| .*||' \
			/tmp/mnt$$/boot/isolinux/isolinux.cfg | tail -n1)"
		if grep -qs rootfs /tmp/mnt$$/boot/isolinux/isolinux.cfg ; then
			echo "image=/boot/bzImage initrd=${r:-rootfs.gz},! autologin rdinit=/init.exe"
		else
			sed '/[kK][eE][rR][nN][eE][lL]/!d;s|^[ \t]*[^ \t]*||;q' /tmp/mnt$$/boot/isolinux/isolinux.cfg
			sed '/[aA][pP][pP][eE][nN][dD]/!d;s|^[ \t]*[^ \t]*||;q' /tmp/mnt$$/boot/isolinux/isolinux.cfg
		fi | xargs | ddn bs=1 of=$1 conv=notrunc seek=$((i-134))
	fi
	umount /tmp/mnt$$	
	rmdir /tmp/mnt$$	
}

add_fdbootstrap()
{
	SIZE=$($0 --get bootfd.bin 2> /dev/null | wc -c)
	if [ $SIZE -ne 0 ]; then
		SIZE=$(( SIZE -  512 ))
		OFS=$(( OFS - SIZE ))
		printf "Adding floppy bootstrap file at %04X (%d bytes) ...\n" $OFS $SIZE
		$0 --get bootfd.bin | \
		ddn of=$1 bs=1 count=512 seek=$OFS
		$0 --get bootfd.bin | \
		ddn of=$1 bs=1 skip=1024 seek=$((512 + OFS))
		store 26 $((SIZE/512)) $1 8
	fi
}

gzsize()
{
	echo $(($(hexdump -C | awk ' {
		for (i = 17; i > 1; i--) if ($i != "00") break;
		if (i == 1) {
			print "0x" $1 " + 1 + 1 - " n
			exit
		}
		n = 17 - i
	}')))
}

fileofs()
{
	[ $(get 1024 "$ISO") -eq 35615 ] && x=1024 ||
	x=$((512*(1+$(get 417 "$ISO" 1))))
	[ $x -gt 32768 ] && x=6656
	stub=$(($(get 20 "$ISO") - 0xC0))
	dosstub=$stub
	[ $stub -lt 30000 ] && stub=$((0x7FF0)) && dosstub=
	c=$(custom_config_sector "$ISO")
	SIZE=0; OFFSET=0
	case "$1" in
	APT)		[ $(get 2048 "$ISO") -eq 19792 ] && OFFSET=2048 && SIZE=2560;;
	GPT)		[ $(get 512 "$ISO") -eq 17989 ] && OFFSET=512 &&
			SIZE=$((512+$(get 592 "$ISO")*$(get 596 "$ISO")));;
	win32.exe)	[ $x -eq 2048 ] &&
			x=$((40*$(get 0x86 "$ISO")+0x98-24+$(get 0x94 "$ISO"))) &&
			x=$(($(get $x "$ISO")+$(get $((x+4)) "$ISO")))
			[ $x -le 1024 ] || SIZE=$x;;
	syslinux.mbr)	[ $x -eq 1024 ] || OFFSET=$((x - 512)); SIZE=336;;
	flavor.info)	[ $(get 22528 "$ISO") -eq 35615 ] && OFFSET=22528
			[ $x -eq 2048 ] && x=$(get 0x25C "$ISO") &&
					   SIZE=$(get 0x25E "$ISO")
			[ $(get $x "$ISO") -eq 35615 ] && OFFSET=$x
			[ $OFFSET -ne 0 ] && [ $SIZE -eq 0 ] &&
			SIZE=$(ddq bs=512 skip=$((OFFSET/512)) if="$ISO" | gzsize);;
	floppy.boot)	SIZE=$(($(get 26 "$ISO" 1)*512))
			OFFSET=$(($(get 64 "$ISO") - 0xC0 - SIZE));;
	rootfs.gz)	SIZE=$(get 24 "$ISO"); OFFSET=$((stub - SIZE))
			[ $SIZE -gt 60000 ] && SIZE=$((0x10000 - SIZE)) && OFFSET=$((0x1000 - SIZE));;
	isoboot.com)	OFFSET=$(($(get 64 "$ISO") - 0xC0))
			SIZE=$((stub - $(get 24 "$ISO") - OFFSET));;
	dosstub)	[ "$dosstub" ] && OFFSET=$stub && SIZE=$((0x7FF0 - OFFSET));;
	boot.md5)	[ $(get 0 "$ISO") -eq 23117 ] &&
			[ $(get 18 "$ISO") -ne 0 ] &&
			OFFSET=$((0x7FF0)) && SIZE=16;;
	fs.iso)		OFFSET=$((0x8000))
			SIZE=$((2048*c - OFFSET));;
	custom.magic)	ddq bs=2k skip=$c if="$ISO" | ddq bs=1 count=6 | \
				grep -q '#!boot' && OFFSET=$((2048*c)) &&
			SIZE=39 ;;
	custom.append)  OFFSET=$((2048*c+47)) &&
			SIZE=$(ddq bs=2k skip=$c if="$ISO" count=1 | \
				sed '/^append=/!d;s/^[^=]*=.//' | wc -c);;
	custom.initrd)  x=$(ddq bs=2k skip=$c if="$ISO" count=1 | \
				sed '/^append=\|^initrd:/!d' | wc -c)
			OFFSET=$((2048*c+x+40))
			SIZE=$(($(ddq bs=2k skip=$c if="$ISO" count=1 | \
				sed '/^initrd:/!d;s/.*://') + 0));;
	esac
}

trailer()
{
	OFFSET=$(stat -c %s "$1")
	[ $OFFSET -gt $HEAP ] &&
	printf "%d free bytes in %04X..%04X\n" $((OFFSET - HEAP)) $HEAP $OFFSET
	if [ $(get 510 "$1") -eq 43605 ]; then
		echo "MBR partitions :"
		for i in 0 1 2 3; do
			SIZE=$(get $((446+12+16*i)) "$1" 4)
			[ $SIZE -eq 0 ] && continue
			OFFSET=$(get $((446+8+16*i)) "$1" 4)
			printf " $i:%08X  %08X  %02X\n" $OFFSET $SIZE \
				$(get $((446+4+16*i)) "$1" 1)
		done
		if [ $(get 450 "$1") -eq 65262 ]; then
			echo "EFI partitions :"
			n=$(get 592 "$1")
			s=$(get 596 "$1")
			o=$(($(get 584 "$1")*512))
			i=0
			while [ $i -lt $n ]; do
				f=$(get $((o+0x20)) "$1" 4)
				l=$(($(get $((o+0x28)) "$1" 4)-f))
				[ $l -eq 0 ] && break
				printf " $i:%08X  %08X  %s\n" $f $((l+1)) \
				"$(od -An -N 72 -w72 -j $((o+0x38)) -t a "$1" \
				 | sed 's/ nul//g;s/   //g;s/ sp//g')"
				o=$((o+s))
				i=$((i+1))
			done
		fi
	fi
	o=2048
	if [ $(get $o "$1") -eq 19792 ]; then
		echo "Apple partitions :"
		i=0
		while [ $(get $o "$1") -eq 19792 ]; do
			f=$((0x$(od -An -N 4 -j $((o+8)) -t x1 "$1" | sed 's/ //g')))
			l=$((0x$(od -An -N 4 -j $((o+0x54)) -t x1 "$1" | sed 's/ //g')))
			printf " $i:%08X  %08X  %s\n" $f $l \
			"$(ddq bs=1 skip=$((o+16)) count=32 if="$1" | strings -n 1)"
			o=$((o+2048))
			i=$((i+1))
		done
	fi
}

list()
{
	HEAP=0
	for f in win32.exe GPT syslinux.mbr APT flavor.info floppy.boot isoboot.com \
		 rootfs.gz dosstub boot.md5 fs.iso custom.magic custom.append \
		 custom.initrd; do
		fileofs $f
		[ $SIZE -le 0 ] && continue
		[ "${OFFSET:8}" ] && continue
		[ $OFFSET -lt 0 ] && continue
		[ $(get $OFFSET "$ISO") -eq 0 ] && continue
		[ $OFFSET -gt $HEAP ] && [ $((OFFSET - HEAP)) -gt 16 ] &&
		printf "%d free bytes in %04X..%04X\n" $((OFFSET - HEAP)) $HEAP $OFFSET
		[ $OFFSET -ge $HEAP ] && HEAP=$((OFFSET+SIZE))
		printf "$f at %04X ($SIZE bytes).\n" $OFFSET
	done
	trailer $ISO
}

restore_hybrid_mbr()
{
	[ $(get 0 "$1") -eq 60905 ] &&
		ddn bs=1 if="$1" of="$1" skip=$((0x1BE)) seek=0 count=3
	ddn bs=1 skip=$((0x1BE)) count=66 if="$2" | \
		ddq bs=1 seek=$((0x1BE)) count=66 of="$1"
	if [ -n "$RECURSIVE_PARTITION" ]; then
		for i in 0 1 2 3 ; do
			n=$(get $((0x1C6+16*i)) $1 4)
			[ $n -eq 0 -o $n -gt 64 ] && continue
			store $((0x1C0+16*i)) 1 $1 8
			store $((0x1C6+16*i)) 0 $1 32
			store $((0x1CA+16*i)) $(($(get $((0x1CA+16*i)) $1 4)+n)) $1 32
		done
	fi
}

extract()
{
	for f in $@; do
		fileofs $f
		[ $SIZE -eq 0 ] ||
		ddq bs=1 count=$SIZE skip=$OFFSET if="$ISO" >$f
		[ "$f" = "syslinux.mbr" ] && restore_hybrid_mbr "$f" "$ISO"
	done
}

custom_config_sector()
{
	get 32848 "$1" 4
}

clear_custom_config()
{
	ddq of=$1 bs=2k seek=$start count=$(custom_config_sector $1)
}

main()
{
	[ $(id -u) -ne 0 ] && cmd="$0 $@" && exec su -c "$cmd" < /dev/tty
	append=
	initrd=
		
	while [ "$1" ]; do
		case "${1/--/-}" in
		-get)	shift
			uudecode | unlzma | tar xOf - $@
			exit ;;
		-a*)	append="$2" ; shift 2 ;;
		-i*)	initrd="$2" ; shift 2 ;;
		-r*|-l*)
			ISO="$2" ; shift 2
			[ -z "$1" ] && list || extract $@
			exit ;;
		*)	cat > /dev/null
			break
		esac
	done
	
	[ ! -s "$1" ] && cat 1>&2 <<EOT && exit 1
usage: $0 [--list|--read] [--append custom_cmdline ] [ --initrd custom_initrd ] image.iso [--force|--undo|"DOS help message"|filename...]
EOT
	case "${2/--/-}" in
	-u*|-r*|-w*|-f*)
	    case "$(get 0 $1)" in
	    23117)
		b=$(get 417 $1 1)
		n=$(($(get 64 $1) + 0xC0 - ($(get 26 $1 1)*512) - (b+1)*512))
		ddq if=$1 bs=512 count=1 skip=$b of=/tmp/hymbr$$
		restore_hybrid_mbr /tmp/hymbr$$ $1
		ddn if=/tmp/hymbr$$ of=$1
		rm -f /tmp/hymbr$$
		if [ $(get 512 $1) -eq 17989 ]; then
			n=$(($(get 0x25C $1)/512))
			ddn if=$1 bs=512 seek=44 count=20 skip=$n of=$1
			ddn if=/dev/zero bs=512 seek=9 count=35 of=$1
			ddn if=/dev/zero bs=512 seek=3 count=1 of=$1
		else
			ddn if=/dev/zero bs=512 seek=1 count=1 of=$1
			ddn if=$1 bs=512 seek=2 count=30 skip=$((b+1)) of=$1
			ddn if=/dev/zero bs=1 seek=$n count=$((0x8000 - n)) of=$1
		fi ;;
	    *)  ddn if=/dev/zero bs=1k count=32 of=$1 ;;
	    esac
	    case "${2/--/-}" in
	    -f*)
		[ "$append$initrd" ] && clear_custom_config $1
		set -- "$1" "$3" ;;
	    *)
		clear_custom_config $1
		exit 0 ;;
	    esac
	esac
	case "$(get 0 $1)" in
	23117)	echo "The file $1 is already an EXE file." 1>&2 && exit 1;;
	0)	[ -x /usr/bin/isohybrid ] && isohybrid -entry 2 $1;;
	esac

	gpt= ; [ $(get 450 $1) -eq 65262 ] && gpt=1
	echo "Read tazlito data..."
	n=2; [ -n "$gpt" ] && n=44 && echo "GUID Partition Table..."
	ddq if=$1 bs=512 skip=$n count=20 of=/tmp/tazlito$$
	add_win32exe $1
	add_tazlito_info $1 /tmp/tazlito$$
	rm -f /tmp/tazlito$$
	
	# keep the largest room for the tazlito info file
	add_rootfs $1
	add_fdbootstrap $1
	printf "%d free bytes in %04X..%04X\n" $((OFS-HOLE)) $HOLE $OFS
	store 440 $(date +%s) $1 32
	[ "$2" ] && echo "$2               " | \
		ddn bs=1 seek=$((0x7FDE)) count=15 of=$1
	if [ $(stat -c %s $1) -gt 34816 ]; then
		echo "Adding ISO image md5 at 7FF0 (16 bytes) ..."
		echo -en "$(ddq if=$1 bs=2k skip=16 count=$(($(get 32848 "$1" 4)-16)) | \
			md5sum | cut -c-32 | sed 's/\(..\)/\\x\1/g')" | \
			ddn bs=16 seek=2047 of=$1
	fi
	HEAP=$(($(custom_config_sector $1)*2048))
	if [ "$append$initrd" ]; then
		echo -n "Adding custom config... "
		DATA=/tmp/$(basename $0)$$
		rm -f $DATA > /dev/null
		isosz=$(stat -c %s $1)
		[ "$append" ] && echo "append=$append" >> $DATA
		[ -s "$initrd" ] && echo "initrd:$(stat -c %s $initrd)" >> $DATA &&
			cat $initrd >> $DATA
		echo "#!boot $(md5sum $DATA | sed 's/ .*//')" | cat - $DATA | \
		ddq bs=2k seek=$(custom_config_sector $1) of=$1
		newsz=$(stat -c %s $1)
		mb=$((((newsz -1)/1048576)+1))
		HEAP=$((mb*1048576))
		ddq bs=1048576 seek=$mb count=0 of=$1
		h=$(get 417 "$1" 1)
		[ -z "$RECURSIVE_PARTITION" ] || h=0
		for i in 0 1 2 3 ; do
			[ $(get $((0x1BE+16*i)) $1 2) = $((0x0080)) ] || continue
			store $((0x1CA+16*i)) $((mb*2048-h)) $1 32
			store $((0x1C5+16*i)) $((mb-1)) $1 8
		done
		if [ $newsz -gt $isosz ]; then
			echo "$((newsz - isosz)) extra bytes."
		else
			echo "$((isosz - 2048*$(get 32848 $1 4)
				 - $(stat -c %s $DATA) - 24)) bytes free."
		fi
		rm -f $DATA > /dev/null
	fi
	echo -n "Adding boot checksum..."
	if [ $(stat -c %s $1) -gt 32768 ]; then
		n=$(($(get 2 $1) - 1 + ($(get 4 $1) - 1)*512))
		n=$(($(od -v -N $n -t u2 -w2 -An $1 | \
		       awk '{ i+= $0 } END { print (i % 65536) }') \
		     + $(get $((n+1)) $1 1)))
		store 18 $(( (-n -1) % 65536 )) $1
	fi
	echo " done."
	trailer $1
}

main "$@" <<EOT
begin-base64 644 -
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
====
EOT
