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