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

syslinux: add isohybrid.exe
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Mar 04 09:52:12 2013 +0100 (2013-03-04)
parents e487d594117f
children 65b3fd0022ed
line diff
     1.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh	Wed Feb 06 12:05:22 2013 +0100
     1.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh	Mon Mar 04 09:52:12 2013 +0100
     1.3 @@ -1,16 +1,4 @@
     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 @@ -30,28 +18,8 @@
    1.21  	echo $(od -j $(($1)) -N ${3:-2} -t u${3:-2} -An $2)
    1.22  }
    1.23  
    1.24 -main()
    1.25 +add_rootfs()
    1.26  {
    1.27 -	case "$1" in
    1.28 -	--get)	shift
    1.29 -		uudecode | unlzma | tar xOf - $@
    1.30 -		exit ;;
    1.31 -	*)	cat > /dev/null
    1.32 -	esac
    1.33 -	
    1.34 -	[ ! -s "$1" ] && echo "usage: $0 image.iso" 1>&2 && exit 1
    1.35 -	case "$(od -N 2 -t x2 -An $1)" in
    1.36 -	*5a4d)	echo "The file $1 is already an EXE file." 1>&2 && exit 1;;
    1.37 -	*0000)	[ -x /usr/bin/isohybrid ] && isohybrid $1
    1.38 -	esac
    1.39 -		
    1.40 -	echo "Moving syslinux hybrid boot record..."
    1.41 -	ddq if=$1 bs=512 count=1 | ddq of=$1 bs=512 count=1 seek=1 conv=notrunc 
    1.42 -	
    1.43 -	echo "Inserting EXE boot record..."
    1.44 -	$0 --get bootiso.bin | ddq of=$1 conv=notrunc
    1.45 -
    1.46 -	# keep the largest room for the tazlito info file
    1.47  	TMP=/tmp/iso2exe$$
    1.48  	mkdir -p $TMP/bin $TMP/dev
    1.49  	cp -a /dev/?d?* $TMP/dev
    1.50 @@ -67,24 +35,113 @@
    1.51  	printf "Adding rootfs.gz file at %04X...\n" $OFS
    1.52  	cat $TMP/rootfs.gz | ddq of=$1 bs=1 seek=$OFS conv=notrunc
    1.53  	rm -rf $TMP
    1.54 +}
    1.55 +
    1.56 +add_doscom()
    1.57 +{
    1.58  	SIZE=$($0 --get boot.com | wc -c)
    1.59  	OFS=$(( $OFS - $SIZE ))
    1.60  	printf "Adding DOS boot file at %04X...\n" $OFS
    1.61  	$0 --get boot.com | ddq of=$1 bs=1 seek=$OFS conv=notrunc
    1.62  	store 66 $(($OFS+0xC0)) $1
    1.63 +}
    1.64 +
    1.65 +add_win32exe()
    1.66 +{
    1.67  	SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c)
    1.68  	if [ $SIZE -ne 0 ]; then
    1.69  		OFS=$(( 128 + ( ($OFS - $SIZE + 128) & 0xFE00 ) ))
    1.70  		printf "Adding WIN32 file at %04X...\n" $OFS
    1.71  		LOC=$((0xAC+$(get 0x94 /tmp/exe$$)))
    1.72  		for i in $(seq 1 $(get 0x86 /tmp/exe$$)); do
    1.73 -			store $LOC $(($(get $LOC /tmp/exe$$)+$OFS-128)) /tmp/exe$$
    1.74 +			CUR=$(get $LOC /tmp/exe$$)
    1.75 +			[ $CUR -eq 0 ] || store $LOC $(($CUR+$OFS-128)) /tmp/exe$$
    1.76  			LOC=$(($LOC+40))
    1.77  		done
    1.78  		ddq if=/tmp/exe$$ of=$1 bs=1 skip=128 seek=$OFS conv=notrunc
    1.79  	fi
    1.80  	rm -f /tmp/exe$$ 
    1.81  	store 60 $OFS $1
    1.82 +}
    1.83 +case "$1" in
    1.84 +--build)
    1.85 +	shift
    1.86 +	[ $(tar cf - $@ | wc -c) -gt $((32 * 1024)) ] &&
    1.87 +		echo "The file set $@ is too large (31K max) :" &&
    1.88 +		ls -l $@ && exit 1
    1.89 +	cat >> $0 <<EOM
    1.90 +$(tar cf - $@ | lzma e -si -so | uuencode -m -)
    1.91 +EOT
    1.92 +EOM
    1.93 +	sed -i '/^case/,/^esac/d' $0
    1.94 +	exit ;;
    1.95 +--get)
    1.96 +	cat $2
    1.97 +	exit ;;
    1.98 +--array)
    1.99 +	DATA=/tmp/dataiso$$
   1.100 +	ddq if=/dev/zero bs=32k count=1 of=$DATA
   1.101 +	ddq if=bootiso.bin of=$DATA conv=notrunc
   1.102 +	ddq if=$2 of=$DATA bs=512 seek=1 conv=notrunc
   1.103 +	add_rootfs $DATA > /dev/null
   1.104 +	add_doscom $DATA > /dev/null
   1.105 +	add_win32exe $DATA > /dev/null
   1.106 +	cat <<EOT
   1.107 +
   1.108 +#define BOOTISOSZ $((0x8400 - $OFS))
   1.109 +
   1.110 +#ifdef WIN32
   1.111 +static char bootiso[] = {
   1.112 +$(hexdump -v -n 1024 -e '"    " 16/1 "0x%02X, "' -e '"  // %04.4_ax |" 16/1 "%_p" "| \n"' $DATA | sed 's/ 0x  ,/      /g')
   1.113 +$(hexdump -v -s $OFS -e '"    " 16/1 "0x%02X, "' -e '"  // %04.4_ax |" 16/1 "%_p" "| \n"' $DATA | sed 's/ 0x  ,/      /g')
   1.114 +};
   1.115 +#endif
   1.116 +EOT
   1.117 +	rm -rf $DATA
   1.118 +	exit ;;
   1.119 +--exe)
   1.120 +	# --exe mvcom.bin x.com y.exe > xy.exe
   1.121 +	cat $4 $3 > /tmp/exe$$
   1.122 +	S=$(stat -c %s /tmp/exe$$)
   1.123 +	store 2 $(($S%512)) /tmp/exe$$
   1.124 +	store 4 $((($S+511)/512)) /tmp/exe$$
   1.125 +	store 14 -16 /tmp/exe$$
   1.126 +	store 16 -2 /tmp/exe$$
   1.127 +	store 20 256 /tmp/exe$$
   1.128 +	store 22 -16 /tmp/exe$$
   1.129 +	ddq if=$2 bs=1 seek=64 of=/tmp/exe$$ conv=notrunc
   1.130 +	store 65 $(stat -c %s $3) /tmp/exe$$
   1.131 +	store 68 $((0x100-0x40+$(stat -c %s $4))) /tmp/exe$$
   1.132 +	cat /tmp/exe$$
   1.133 +	rm -f /tmp/exe$$
   1.134 +	exit ;;
   1.135 +esac
   1.136 +
   1.137 +main()
   1.138 +{
   1.139 +	case "$1" in
   1.140 +	--get)	shift
   1.141 +		uudecode | unlzma | tar xOf - $@
   1.142 +		exit ;;
   1.143 +	*)	cat > /dev/null
   1.144 +	esac
   1.145 +	
   1.146 +	[ ! -s "$1" ] && echo "usage: $0 image.iso" 1>&2 && exit 1
   1.147 +	case "$(get 0 $1)" in
   1.148 +	23117)	echo "The file $1 is already an EXE file." 1>&2 && exit 1;;
   1.149 +	0)	[ -x /usr/bin/isohybrid ] && isohybrid $1
   1.150 +	esac
   1.151 +		
   1.152 +	echo "Moving syslinux hybrid boot record..."
   1.153 +	ddq if=$1 bs=512 count=1 | ddq of=$1 bs=512 count=1 seek=1 conv=notrunc 
   1.154 +	
   1.155 +	echo "Inserting EXE boot record..."
   1.156 +	$0 --get bootiso.bin | ddq of=$1 conv=notrunc
   1.157 +
   1.158 +	# keep the largest room for the tazlito info file
   1.159 +	add_rootfs $1
   1.160 +	add_doscom $1
   1.161 +	add_win32exe $1
   1.162  	store 26 ${RANDOM:-0} $1
   1.163  	i=66
   1.164  	n=0