wok annotate syslinux/stuff/tools/isohybrid.sh @ rev 17315

Up: tazweb (1.10)
author Aleksej Bobylev <al.bobylev@gmail.com>
date Mon Nov 03 00:55:32 2014 +0200 (2014-11-03)
parents 940b5937e496
children 31e215a4b9bb
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@13660 74 readiso $1 $2 4 | od -N 4 -t u4 -An
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