wok-current annotate syslinux/stuff/tools/isohybrid.sh @ rev 12242
syslinux: 4.0 string
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Mon Apr 09 17:56:22 2012 +0200 (2012-04-09) |
parents | f25f2e389934 |
children | 2188bfc43e67 |
rev | line source |
---|---|
pascal@4513 | 1 #!/bin/sh |
pascal@4513 | 2 |
pascal@7859 | 3 if [ "$1" == "--build" ]; then |
pascal@7859 | 4 cat >> $0 <<EOM |
pascal@7859 | 5 $(for i in fx fx_f fx_c px px_f px_c ; do |
pascal@7860 | 6 cat mbr/isohdp$i.bin /dev/zero | dd bs=1 count=512 2> /dev/null |
pascal@7859 | 7 done | gzip -9 | uuencode -m -) |
pascal@4513 | 8 EOT |
pascal@4513 | 9 EOM |
pascal@7859 | 10 sed -i '/--build/,/^fi/d' $0 |
pascal@4513 | 11 exit |
pascal@4513 | 12 fi |
pascal@7859 | 13 iso= |
pascal@7859 | 14 heads=64 # zipdrive-style geometry |
pascal@7859 | 15 sectors=32 |
pascal@7859 | 16 partype=23 # "Windows hidden IFS" |
pascal@7859 | 17 entry=1 |
pascal@7859 | 18 id=$(( ($RANDOM <<16) + $RANDOM)) |
pascal@7859 | 19 offset=0 |
pascal@7859 | 20 partok=0 |
pascal@7859 | 21 hd0=0 |
pascal@8974 | 22 always=0 |
pascal@4513 | 23 |
pascal@7859 | 24 while [ -n "$1" ]; do |
pascal@8974 | 25 case "${1/--/-}" in |
pascal@8974 | 26 -a*) always=1;; |
pascal@8974 | 27 -ct*) hd0=2;; |
pascal@8974 | 28 -e*) entry=$2; shift;; |
pascal@8974 | 29 -f*) hd0=1;; |
pascal@8974 | 30 -h) heads=$2; shift;; |
pascal@8974 | 31 -i*) id=$(($2)); shift;; |
pascal@8974 | 32 -noh*) hd0=0;; |
pascal@8974 | 33 -nop*) partok=0;; |
pascal@8974 | 34 -o*) offset=$(($2)); shift;; |
pascal@8974 | 35 -p*) partok=1;; |
pascal@8974 | 36 -s) sectors=$2; shift;; |
pascal@8974 | 37 -t*) partype=$(($2 & 255)); shift;; |
pascal@8974 | 38 *) iso=$1;; |
pascal@7859 | 39 esac |
pascal@7859 | 40 shift |
pascal@7859 | 41 done |
pascal@7859 | 42 |
pascal@7859 | 43 if [ ! -f "$iso" ]; then |
pascal@4513 | 44 cat << EOT |
pascal@8403 | 45 usage: $0 [options] isoimage |
pascal@8403 | 46 options: |
pascal@8403 | 47 -h <X> Number of default geometry heads |
pascal@8403 | 48 -s <X> Number of default geometry sectors |
pascal@8403 | 49 -e --entry Specify partition entry number (1-4) |
pascal@8403 | 50 -o --offset Specify partition offset (default 0) |
pascal@8403 | 51 -t --type Specify partition type (default 0x17) |
pascal@8403 | 52 -i --id Specify MBR ID (default random) |
pascal@8403 | 53 --forcehd0 Assume we are loaded as disk ID 0 |
pascal@8403 | 54 --ctrlhd0 Assume disk ID 0 if the Ctrl key is pressed |
pascal@8403 | 55 --partok Allow booting from within a partition |
pascal@8974 | 56 --always Do not abort on errors |
pascal@4513 | 57 EOT |
pascal@4513 | 58 exit 1 |
pascal@4513 | 59 fi |
pascal@7859 | 60 |
pascal@7859 | 61 ddq() |
pascal@7859 | 62 { |
pascal@7859 | 63 dd "$@" 2> /dev/null |
pascal@7859 | 64 } |
pascal@4513 | 65 |
pascal@4513 | 66 readiso() |
pascal@4513 | 67 { |
pascal@7859 | 68 ddq bs=2k skip=$1 count=1 if=$iso | ddq bs=1 skip=$2 count=$3 |
pascal@4513 | 69 } |
pascal@4513 | 70 |
pascal@4513 | 71 # read a 32 bits data |
pascal@7859 | 72 read32() |
pascal@4513 | 73 { |
pascal@7859 | 74 readiso $1 $2 4 | hexdump -e '"" 1/4 "%d" "\n"' |
pascal@4513 | 75 } |
pascal@4513 | 76 |
pascal@4513 | 77 # write a 32 bits data |
pascal@7859 | 78 store32() |
pascal@4513 | 79 { |
pascal@8974 | 80 n=$2; for i in 1 2 3 4; do |
pascal@8399 | 81 printf '\\\\x%02X' $(($n & 255)) |
pascal@8974 | 82 n=$(($n >> 8)) |
pascal@8399 | 83 done | xargs echo -en | ddq bs=1 conv=notrunc of=$iso seek=$(($1)) |
pascal@4513 | 84 } |
pascal@4513 | 85 |
pascal@7859 | 86 main() |
pascal@4513 | 87 { |
pascal@7859 | 88 uudecode | gunzip | ddq bs=512 count=1 of=$iso conv=notrunc \ |
pascal@7859 | 89 skip=$(( (3*$partok) + $hd0)) |
pascal@7859 | 90 store32 432 $(($lba * 4)) |
pascal@7859 | 91 store32 440 $id |
pascal@8400 | 92 store32 508 0xAA550000 |
pascal@7859 | 93 e=$(( (($entry -1) % 4) *16 +446)) |
pascal@8400 | 94 store32 $e 0x10080 |
pascal@7859 | 95 esect=$(( ($sectors + ((($cylinders -1) & 0x300) >>2)) <<16)) |
pascal@7859 | 96 ecyl=$(( (($cylinders -1) & 0xff) <<24)) |
pascal@7859 | 97 store32 $(($e + 4)) $(($partype + (($heads - 1) <<8) +$esect +$ecyl)) |
pascal@7859 | 98 store32 $(($e + 8)) $offset |
pascal@7859 | 99 store32 $(($e + 12)) $(($cylinders * $heads * $sectors)) |
pascal@4513 | 100 } |
pascal@4513 | 101 |
pascal@7859 | 102 abort() |
pascal@7859 | 103 { |
pascal@7859 | 104 echo "$iso: $1" |
pascal@8974 | 105 [ $always -eq 0 ] && exit 1 |
pascal@7859 | 106 } |
pascal@7859 | 107 |
pascal@7859 | 108 [ "$(readiso 17 7 23)" == "EL TORITO SPECIFICATION" ] || |
pascal@7859 | 109 abort "no boot record found." |
pascal@7859 | 110 cat=$(read32 17 71) |
pascal@7859 | 111 [ $(read32 $cat 0) -eq 1 -a $(read32 $cat 30) -eq $(( 0x88AA55 )) ] || |
pascal@7859 | 112 abort "invalid boot catalog." |
pascal@7859 | 113 lba=$(read32 $cat 40) |
pascal@7859 | 114 [ $(read32 $lba 64) -eq 1886961915 ] || |
pascal@7859 | 115 abort "no isolinux.bin hybrid signature in bootloader." |
pascal@4513 | 116 size=$(stat -c "%s" $iso) |
pascal@7859 | 117 trksz=$(( 512 * $heads * $sectors )) |
pascal@7859 | 118 cylinders=$(( ($size + $trksz - 1) / $trksz )) |
pascal@7859 | 119 pad=$(( (($cylinders * $trksz) - $size) / 512 )) |
pascal@7859 | 120 [ $pad -eq 0 ] || ddq bs=512 count=$pad if=/dev/zero >> $iso |
pascal@4513 | 121 if [ $cylinders -gt 1024 ]; then |
pascal@4513 | 122 cat 1>&2 <<EOT |
pascal@4513 | 123 Warning: more than 1024 cylinders ($cylinders). |
pascal@4513 | 124 Not all BIOSes will be able to boot this device. |
pascal@4513 | 125 EOT |
pascal@4513 | 126 cylinders=1024 |
pascal@4513 | 127 fi |
pascal@4513 | 128 |
pascal@7859 | 129 main <<EOT |