#!/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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
9/MoZkKjwIzbeGb/6GSuGg==
====
EOT
