wok diff syslinux/stuff/iso2exe/init @ rev 18771

iso2exe: update /init
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 31 15:49:20 2015 +0100 (2015-12-31)
parents db66c997923a
children 816d2bd9090b
line diff
     1.1 --- a/syslinux/stuff/iso2exe/init	Fri Aug 14 10:06:48 2015 +0200
     1.2 +++ b/syslinux/stuff/iso2exe/init	Thu Dec 31 15:49:20 2015 +0100
     1.3 @@ -640,7 +640,7 @@
     1.4  fddata()
     1.5  {
     1.6  	[ -e /sys/block/fd0 ] && 
     1.7 -	[ $(get 28 /mnt/$ISO 1 2> /dev/null || echo 0) -ne 0 ] &&
     1.8 +	[ $(get 26 /mnt/$ISO 1 2> /dev/null || echo 0) -ne 0 ] &&
     1.9  	echo -en "\"$1\"	\"$2\""
    1.10  }
    1.11  
    1.12 @@ -678,6 +678,42 @@
    1.13  	wodim -v -blank=fast
    1.14  }
    1.15  
    1.16 +customsector()
    1.17 +{
    1.18 +	echo $(($(get 32848 "/mnt/$ISO" 4)+16))
    1.19 +}
    1.20 +
    1.21 +hascustomconf()
    1.22 +{
    1.23 +	[ "$(ddq bs=2k skip=$(customsector) if="/mnt/$ISO" | ddq bs=1 count=6)" \
    1.24 +	  == "#!boot" ]
    1.25 +}
    1.26 +
    1.27 +gotcustomconf()
    1.28 +{
    1.29 +	hascustomconf && menuitem "$@"
    1.30 +}
    1.31 +
    1.32 +getcustomconf()
    1.33 +{
    1.34 +	cd /mnt
    1.35 +	ddq bs=2k skip=$(customsector) if="$ISO" | while read line; do
    1.36 +		case "$line" in
    1.37 +		\#!boot*) ;;
    1.38 +		append=*) echo ${line#append=} > cmdline && ls -l cmdline ;;
    1.39 +		initrd:*) cnt=${line#initrd:}
    1.40 +			  { ddq bs=512 count=$(($cnt / 512));
    1.41 +			    ddq bs=1 count=$(($cnt % 512)); } > initrd &&
    1.42 +			  ls -l initrd
    1.43 +			  break ;;
    1.44 +		*)	  break ;;	  
    1.45 +		esac
    1.46 +	done
    1.47 +	cd - > /dev/null
    1.48 +	echo -e "\rPress RETURN to continue."
    1.49 +	read n
    1.50 +}
    1.51 +
    1.52  gotisomd5()
    1.53  {
    1.54  	[ "$(which md5sum 2> /dev/null)" ] &&
    1.55 @@ -699,14 +735,188 @@
    1.56  		[ $(((1+$s+$(get $(($n+1)) /mnt/$ISO 1)) % 65536)) -eq 0 ] &&
    1.57  		echo "OK" || echo "ERROR"
    1.58  	fi
    1.59 +	if hascustomconf; then
    1.60 +		echo -en "\rChecking iso custom config..."
    1.61 +		TMP=/tmp/$(basename $0)$$md5
    1.62 +		md5="$(ddq bs=2k skip=$(customsector) if=/mnt/$ISO | while read line; do
    1.63 +			case "$line" in
    1.64 +			\#!boot*) echo ${line#*boot } > $TMP ;;
    1.65 +			append=*) echo $line ;;
    1.66 +			initrd:*) echo $line
    1.67 +				  cnt=${line#initrd:}
    1.68 +				  ddq bs=512 count=$((cnt / 512))
    1.69 +				  ddq bs=1 count=$((cnt % 512))
    1.70 +				  break ;;
    1.71 +			*)	  break ;;	  
    1.72 +			esac
    1.73 +		done | md5sum | cut -c1-32)"
    1.74 +		[ "$md5" == "$(cat $TMP)" ] && echo "OK" || echo "ERROR"
    1.75 +		rm -f $TMP
    1.76 +	fi
    1.77  	rm -f /tmp/wait
    1.78  	echo -e "\rPress RETURN to continue."
    1.79  	read n
    1.80  }
    1.81  
    1.82 +if [ "$1" == "--build" ]; then	#install-begin
    1.83 +	uuencode -m - < ifmem.bin | sed -e '/^ifmemcode$/r/dev/stdin' \
    1.84 +	  -e '/^ifmemcode$/d' -i $0
    1.85 +	uuencode -m - < bootloader.bin | sed -e '/^bootloader$/r/dev/stdin' \
    1.86 +	  -e '/^bootloader$/d' -e '/install-begin$/,/install-end$/d' -i $0
    1.87 +	exit
    1.88 +fi	#install-end
    1.89 +parse_isolinux()
    1.90 +{
    1.91 +	awk 'BEGIN { IGNORECASE=1 }
    1.92 +function multi(n)
    1.93 +{
    1.94 +	auto=$n
    1.95 +	for (--n; n < NF; n+=2) {
    1.96 +		s=$n
    1.97 +		if (s ~ /M$/) s = substr(s,0,length(s)-1)
    1.98 +		else s /= 1024
    1.99 +		sizes=int(s) " " sizes
   1.100 +	}
   1.101 +	next
   1.102 +}
   1.103 +{
   1.104 +	if ($1 == "LABEL") {
   1.105 +		label=$2
   1.106 +		if (auto == "") auto=label
   1.107 +	}
   1.108 +	if ($1 == "KERNEL" || $1 == "COM32") kernel[label]=$2
   1.109 +	if ($1 == "INITRD") initrd[label]=$2
   1.110 +	if ($1 == "APPEND") {
   1.111 +		i=2
   1.112 +		if (kernel[label] ~ "ifmem.c32") multi(3)
   1.113 +		if (kernel[label] ~ "c32box.c32") {
   1.114 +			if ($2 == "linux") { kernel[label]=$3; i=4 }
   1.115 +			if ($2 == "ifmem") multi(4)
   1.116 +		}
   1.117 +		if (kernel[label] ~ "ifcpu64.c32") { auto=$4; next }
   1.118 +		while (i <= NF) {
   1.119 +			if ($i ~ "^initrd=") initrd[label]=substr($i,8)
   1.120 +			else cmdline[label]=cmdline[label] " " $i
   1.121 +			i++
   1.122 +		}
   1.123 +	}
   1.124 +}
   1.125 +END {
   1.126 +	print "KERNEL=\"" kernel[auto] "\""
   1.127 +	print "INITRD=\"" initrd[auto] "\""
   1.128 +	print "CMDLINE=\"" substr(cmdline[auto],2) "\""
   1.129 +	print "SIZES=\"" sizes "\""
   1.130 +}'
   1.131 +}
   1.132 +
   1.133 +locase()
   1.134 +{
   1.135 +	echo "$1" | tr [A-Z] [a-z]
   1.136 +}
   1.137 +
   1.138 +ifmemcode()
   1.139 +{
   1.140 +	uudecode <<EOT
   1.141 +ifmemcode
   1.142 +EOT
   1.143 +}
   1.144 +
   1.145 +floppyset()
   1.146 +{
   1.147 +	gotcdfile isolinux.cfg
   1.148 +	parse_isolinux < $file > /tmp/var$$
   1.149 +	. /tmp/var$$
   1.150 +	for i in $media/$KERNEL $(dirname $file)/$KERNEL $media/$(locase $KERNEL) \
   1.151 +		 $(dirname $file)/$(locase $KERNEL); do
   1.152 +		[ -s $i ] && KERNEL=$i && break
   1.153 +	done
   1.154 +	rm -f /tmp/var$$ 
   1.155 +	[ $(get 514 $KERNEL 4) -eq 1400005704 ] || return
   1.156 +	n=$(($(get 497 $KERNEL 1)+1))
   1.157 +	ddq bs=512 count=$n if=$KERNEL of=/tmp/fd$$
   1.158 +	uudecode <<EOT | ddq of=/tmp/fd$$ conv=notrunc
   1.159 +bootloader
   1.160 +EOT
   1.161 +	pos=$(($n*512))
   1.162 +	if [ -n "$CMDLINE" ]; then
   1.163 +		echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> /tmp/fd$$
   1.164 +		bytes2bin $n | ddq conv=notrunc \
   1.165 +			bs=1 seek=497 count=1 of=/tmp/fd$$
   1.166 +		words2bin $pos | ddq conv=notrunc \
   1.167 +			bs=1 seek=34 count=2 of=/tmp/fd$$
   1.168 +		[ $(get 518 $KERNEL 4) -ge 514 ] &&
   1.169 +		words2bin 32768 9 | ddq conv=notrunc \
   1.170 +			bs=1 seek=552 count=4 of=/tmp/fd$$
   1.171 +	fi
   1.172 +	syssize=$(echo $(get 500 /tmp/fd$$ 4))
   1.173 +	ddq bs=512 skip=$n if=$KERNEL | cat - /dev/zero | \
   1.174 +	ddq bs=512 count=$((($syssize+31)/32)) conv=sync >> /tmp/fd$$
   1.175 +	base=$(stat -c %s /tmp/fd$$)
   1.176 +	len=
   1.177 +	if [ "$INITRD" ]; then
   1.178 +		l=0
   1.179 +		for i in ${INITRD//,/ }; do
   1.180 +			for j in $media/$i $(dirname $KERNEL)/$i $media/$(locase $i) \
   1.181 +				 $(dirname $KERNEL)/$(locase $i); do
   1.182 +				[ -s $j ] && i=$j && break
   1.183 +			done
   1.184 +			ddq if=$i >> /tmp/fd$$
   1.185 +			l=$(($l+$(stat -c %s $i)))
   1.186 +			r=$((4 - ($l % 4)))
   1.187 +			if [ $r -ne 4 ]; then
   1.188 +				ddq if=/dev/zero bs=1 count=$r >> /tmp/fd$$
   1.189 +				l=$(($l + $r))
   1.190 +			fi
   1.191 +			case "$i:$INITRD" in
   1.192 +				*rootfs.gz:*rootfs.gz,*) continue	# loram
   1.193 +			esac
   1.194 +			len="$len $l"; l=0
   1.195 +		done
   1.196 +		rdadrs=${RDADRS:-$(((($syssize*16)+0x1F0000) & -4096))}
   1.197 +		words2bin $(($rdadrs & 0xFFFF)) $(($rdadrs >> 16)) | ddq \
   1.198 +			conv=notrunc bs=1 seek=536 count=4 of=/tmp/fd$$
   1.199 +	fi
   1.200 +	n=$(echo $len | wc -w)
   1.201 +	if [ $((494 - $(get 494 /tmp/fd$$))) -ge $(($n * 4)) ]; then
   1.202 +		i=$(($(get 494 /tmp/fd$$)))
   1.203 +		bytes2bin $(($i + ($n*4) - 256)) | ddq bs=1 conv=notrunc \
   1.204 +			seek=496 count=1 of=/tmp/fd$$
   1.205 +	else
   1.206 +		i=$(($pos + 0x1FC - ($n*4)))
   1.207 +		bytes2bin $(($i % 256)) $((i / 256)) 252 | ddq bs=1 \
   1.208 +			conv=notrunc seek=494 count=3 of=/tmp/fd$$
   1.209 +		s=$(($i - 2*$(echo "$SIZES" | wc -w)))
   1.210 +		p=$(($s - $(ifmemcode | wc -c)))
   1.211 +		ifmemcode | ddq bs=1 conv=notrunc seek=$p of=/tmp/fd$$
   1.212 +		words2bin $SIZES | ddq bs=1 conv=notrunc seek=$s of=/tmp/fd$$
   1.213 +		bytes2bin 154 $(($p%256)) $(($p/256)) 0 144 | \
   1.214 +		ddq bs=1 conv=notrunc seek=60 of=/tmp/fd$$
   1.215 +	fi
   1.216 +	for r in $len ; do
   1.217 +		words2bin $(($r & 0xFFFF)) $(($r >> 16)) | ddq conv=notrunc \
   1.218 +			bs=1 seek=$i count=4 of=/tmp/fd$$
   1.219 +		i=$(($i + 4))
   1.220 +	done
   1.221 +	split -b 1440k /tmp/fd$$ fd$$
   1.222 +	rm -f /tmp/fd$$
   1.223 +	n=1; i=0; r=0
   1.224 +	set -- $len
   1.225 +	ls fd$$* | while read file ; do
   1.226 +		if [ $i -gt $(($1+$base)) ]; then
   1.227 +			shift
   1.228 +			r=$(($r+100)); n=0; i=0; base=0
   1.229 +		fi
   1.230 +		ddq of=$file bs=18k seek=80 count=0
   1.231 +		i=$(($i+1474560))
   1.232 +		printf "mv %s fd%03d.img\n" $file $(($r+$n))
   1.233 +		n=$(($n+1))
   1.234 +	done | sh
   1.235 +	ls fd???.img
   1.236 +}
   1.237 +
   1.238  fdbootstrap()
   1.239  {
   1.240 -	sz=$((512 * $(echo $(get 28 /mnt/$ISO 1))))
   1.241 +	sz=$((512 * $(echo $(get 26 /mnt/$ISO 1))))
   1.242  	$DIALOG --clear \
   1.243  		--title " Create a floppy bootstrap " \
   1.244  		--yes-label "Continue" --yesno \
   1.245 @@ -954,6 +1164,16 @@
   1.246  	rm -rf /tmp/data
   1.247  }
   1.248  
   1.249 +flavor()
   1.250 +{
   1.251 +	cd /mnt
   1.252 +	name="$(flavdata | cpio -t 2> /dev/null | sed 's/.[a-z]*$//;q')"
   1.253 +	echo "Create ${name:=flavor}.flavor..."
   1.254 +	tazlito iso2flavor "/mnt/$ISO" $name
   1.255 +	ls -l $name.flavor 2> /dev/null || sleep 5
   1.256 +	cd - > /dev/null
   1.257 +}
   1.258 +
   1.259  shell()
   1.260  {
   1.261  	trap text 2 
   1.262 @@ -975,7 +1195,7 @@
   1.263  which $DIALOG 2> /dev/null || DIALOG=tinydialog
   1.264  dmesg > /tmp/dmesg
   1.265  
   1.266 -isotitle="$(basename $ISO)  $(stat -c %y /cdrom/media/. | sed 's/ .*//'\
   1.267 +isotitle="$(basename $ISO)  $(stat -c %y /media/cdrom | sed 's/ .*//'\
   1.268  	  )  $(blkid /mnt/$ISO | sed 's/.*LABEL="\([^"]*\).*/\1/')"
   1.269  while true; do
   1.270  	trap shell 2 
   1.271 @@ -990,6 +1210,7 @@
   1.272  $(cdfile boot/bzImage	"live"		"Linux RAM boot (full desktop)") \
   1.273  			"text"		"Linux RAM boot" \
   1.274  $(cdfile "README*"	"readme"	"Show the README file") \
   1.275 +$(gotcustomconf		"getcustomconf"	"Get custom config") \
   1.276  $(gotisomd5		"isomd5"	"Check the ISO image") \
   1.277  $(cdfile "md5sum*"	"md5"		"Check the ISO files") \
   1.278  $(cdfile "sha*sum*"	"sha"		"Check the ISO files") \
   1.279 @@ -1000,15 +1221,17 @@
   1.280  $(xfile tazusb		"usbkey"	"USB key read/write installation") \
   1.281  $(ishybrid		"usbbootkey"	"USB boot key (read only)") \
   1.282  $(hasflavinfo		"showfavinfo"	"Show flavor extra info") \
   1.283 +$(xfile tazlito		"flavor"	"Get flavor file") \
   1.284  $(fddata		"fdbootstrap"	"Create a floppy bootstrap") \
   1.285 +$(cdfile isolinux.cfg	"floppyset"	"Boot floppy set") \
   1.286  			"tazboot"	"Get tazboot.exe Linux loader" \
   1.287  $(cdexe boot/bzImage	"bzimage"	"Get linux DOS/EXE file") \
   1.288  $(cdexe "memtest*"	"memtest"	"Get Memtest86 DOS/EXE file") \
   1.289  $(cdfilef "memtest*"	"fdmemtest"	"Create a Memtest86 boot floppy") \
   1.290 -$(cdfilex "memtest*"	"runmemtest"	"Start Memtest86") \
   1.291 +$(:||cdfilex "memtest*"	"runmemtest"	"Start Memtest86") \
   1.292  $(cdexe "?pxe"		"pxe"		"Get SliTaz Web boot DOS/EXE utility") \
   1.293  $(cdfilef "?pxe"	"fdpxe"		"Create a SliTaz Web boot floppy") \
   1.294 -$(cdfilex "?pxe"	"runpxe"	"Start the SliTaz Web boot utility") \
   1.295 +$(:||cdfilex "?pxe"	"runpxe"	"Start the SliTaz Web boot utility") \
   1.296  $(xfile reboot		"restart"	"Restart the computer") \
   1.297  $(xfile poweroff	"stop"		"Power off") \
   1.298  			"bootlog"	"Linux boot messages" \