wok diff syslinux/stuff/iso2exe/iso2exe.sh @ rev 13691

syslinux: add iso2exe
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 13 14:33:27 2012 +0100 (2012-12-13)
parents
children 87a217af01ea
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh	Thu Dec 13 14:33:27 2012 +0100
     1.3 @@ -0,0 +1,73 @@
     1.4 +#!/bin/sh
     1.5 +if [ "$1" == "--build" ]; then
     1.6 +	shift
     1.7 +	[ $(tar cf - $@ | wc -c) -gt $((32 * 1024)) ] &&
     1.8 +		echo "The file set $@ is too large (31K max) :" &&
     1.9 +		ls -l $@ && exit 1
    1.10 +	cat >> $0 <<EOM
    1.11 +$(tar cf - $@ | lzma e -si -so | uuencode -m -)
    1.12 +EOT
    1.13 +EOM
    1.14 +	sed -i '/--build/,/^fi/d' $0
    1.15 +	exit
    1.16 +fi
    1.17 +
    1.18 +ddq()
    1.19 +{
    1.20 +	dd $@ 2> /dev/null
    1.21 +}
    1.22 +
    1.23 +store()
    1.24 +{
    1.25 +	n=$2; for i in $(seq 8 8 ${4:-16}); do
    1.26 +		printf '\\\\x%02X' $(($n & 255))
    1.27 +		n=$(($n >> 8))
    1.28 +	done | xargs echo -en | ddq bs=1 conv=notrunc of=$3 seek=$(($1))
    1.29 +}
    1.30 +
    1.31 +main()
    1.32 +{
    1.33 +	case "$1" in
    1.34 +	--get)	shift
    1.35 +		uudecode | unlzma | tar xOf - $@
    1.36 +		exit ;;
    1.37 +	*)	cat > /dev/null
    1.38 +	esac
    1.39 +	
    1.40 +	[ ! -s "$1" ] && echo "usage: $0 image.iso" 1>&2 && exit 1
    1.41 +	case "$(od -N 2 -t x2 -An $1)" in
    1.42 +	*5a4d)	echo "The file $1 is already an EXE file." 1>&2 && exit 1;;
    1.43 +	*0000)	[ -x /usr/bin/isohybrid ] && isohybrid $1
    1.44 +	esac
    1.45 +	[ ! -x /usr/sbin/mount.posixovl ] && 
    1.46 +	echo "No file mount.posixovl. Abort." 1>&2 && exit 1
    1.47 +		
    1.48 +	echo "Move syslinux hybrid boot record..."
    1.49 +	ddq if=$1 bs=512 count=1 | ddq of=$1 bs=512 count=1 seek=1 conv=notrunc 
    1.50 +	
    1.51 +	echo "Insert EXE boot record..."
    1.52 +	$0 --get bootiso.bin | ddq of=$1 conv=notrunc
    1.53 +
    1.54 +	# keep the largest room for the tazlito info file
    1.55 +	TMP=/tmp/iso2exe$$
    1.56 +	mkdir -p $TMP/usr/sbin
    1.57 +	cp /usr/sbin/mount.posixovl $TMP/usr/sbin/mount.posixovl.iso2exe
    1.58 +	$0 --get init > $TMP/init.exe
    1.59 +	chmod +x $TMP/init.exe $TMP/usr/sbin/mount.posixov*
    1.60 +	( cd $TMP ; ls init.exe usr/sbin/mount.posixov* | cpio -o -H newc ) | \
    1.61 +		lzma e $TMP/rootfs.gz -si 2> /dev/null
    1.62 +	SIZE=$(wc -c < $TMP/rootfs.gz)
    1.63 +	store 28 $SIZE $1
    1.64 +	OFS=$(( 0x8000 - $SIZE ))
    1.65 +	printf "Add rootfs.gz file at %04X...\n" $OFS
    1.66 +	cat $TMP/rootfs.gz | ddq of=$1 bs=1 seek=$OFS conv=notrunc
    1.67 +	rm -rf $TMP
    1.68 +	SIZE=$($0 --get lzcom.bin boot.com.lzma | wc -c)
    1.69 +	OFS=$(( $OFS - $SIZE ))
    1.70 +	printf "Add DOS boot file at %04X...\n" $OFS
    1.71 +	$0 --get lzcom.bin boot.com.lzma | ddq of=$1 bs=1 seek=$OFS conv=notrunc
    1.72 +	store 36 $(($OFS+0xE0)) $1
    1.73 +	store 30 ${RANDOM:-0} $1
    1.74 +}
    1.75 +
    1.76 +main $@ <<EOT