#!/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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
dzSgRmDn1PX+YSww
====
EOT
