#!/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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
eEqrhvv82cmZ
====
EOT
