wok-next diff syslinux/stuff/iso2exe/init @ rev 17454

syslinux/iso2exe: create a vfat partition in usb bootkey (DOS case only)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 18 11:42:27 2014 +0100 (2014-12-18)
parents a95b0be09647
children 18dc23394a2c
line diff
     1.1 --- a/syslinux/stuff/iso2exe/init	Wed Nov 26 13:45:57 2014 +0100
     1.2 +++ b/syslinux/stuff/iso2exe/init	Thu Dec 18 11:42:27 2014 +0100
     1.3 @@ -2,6 +2,11 @@
     1.4  
     1.5  DIALOG=dialog
     1.6  
     1.7 +ddq()
     1.8 +{
     1.9 +	dd $@ 2> /dev/null
    1.10 +}
    1.11 +
    1.12  get()
    1.13  {
    1.14  	od -j $1 -N ${3:-2} -t u${3:-2} -An $2 2> /dev/null ||
    1.15 @@ -28,6 +33,14 @@
    1.16  	umount /proc
    1.17  }
    1.18  
    1.19 +words2bin()
    1.20 +{
    1.21 +	for i in $@ ; do
    1.22 +		printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255)) | \
    1.23 +			xargs echo -en
    1.24 +	done
    1.25 +}
    1.26 +
    1.27  gettazboot()
    1.28  {
    1.29  	echo "Creating $(basename $1) ..."
    1.30 @@ -36,12 +49,9 @@
    1.31  	S=$((32+$L))
    1.32  	P=$((($S+511)/512))
    1.33  	E=$((4096-(32*$P)))
    1.34 -	for i in 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
    1.35 -			-2 0 256 -16 28 0x6C53 0x5469 0x7A61; do 
    1.36 -		printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255)) | \
    1.37 -			xargs echo -en
    1.38 -	done > $1
    1.39 -	dd bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1 2> /dev/null
    1.40 +	words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
    1.41 +			-2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1
    1.42 +	ddq bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1
    1.43  }
    1.44  
    1.45  checkmagic()
    1.46 @@ -82,7 +92,7 @@
    1.47  tazusbinitfs()
    1.48  {
    1.49  	PAD=$(($(stat -c %s $1) % 4))
    1.50 -	[ $PAD -ne 0 ] && dd if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
    1.51 +	[ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
    1.52  	mkdir -p /tmp/fs/etc /tmp/fs/lib /tmp/fs/home
    1.53  	cp -a /etc/locale.conf /tmp/fs/etc 2> /dev/null
    1.54  	cp -a /etc/keymap.conf /tmp/fs/etc 2> /dev/null
    1.55 @@ -163,7 +173,7 @@
    1.56  arg subroot "Change root to directory"
    1.57  mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid
    1.58  mount --bind /mnt /mnt/\$val/mnt/dos
    1.59 -#mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
    1.60 +mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
    1.61  LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q)
    1.62  export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib
    1.63    [ "$debug" = "true" ] && sh
    1.64 @@ -195,7 +205,7 @@
    1.65  		return 1
    1.66  	fi
    1.67  	echo "Install root filesystem in /slitaz..."
    1.68 -	if [ -n "$1" ]; then
    1.69 +	if [ "$1" ]; then
    1.70  		if [ -d /media/cdrom/fs ]; then
    1.71  			( cd /mnt/slitaz/fs; find | cpio -o -H newc ) | gzip -9
    1.72  		else
    1.73 @@ -308,7 +318,7 @@
    1.74  		cp -a /media/cdrom/fs/. /
    1.75  	else
    1.76  		for i in $(ls_r /media/cdrom/boot/rootfs*); do
    1.77 -			unlzma < $i | (cd / ; cpio -idmu )
    1.78 +			uncpio $i
    1.79  		done
    1.80  	fi
    1.81  	cp /tmp/fs/etc/* /etc
    1.82 @@ -394,7 +404,7 @@
    1.83  Please insert a blank disk in floppy drive.\n
    1.84  " 12 70
    1.85  	[ $? -eq 0 ] || return
    1.86 -	dd if=/media/cdrom/boot/memtest of=/dev/fd0
    1.87 +	ddq if=/media/cdrom/boot/memtest of=/dev/fd0
    1.88  }
    1.89  
    1.90  pxe()
    1.91 @@ -424,7 +434,7 @@
    1.92  Please insert a blank disk in floppy drive.\n
    1.93  " 12 70
    1.94  	[ $? -eq 0 ] || return
    1.95 -	dd if=/media/cdrom/boot/?pxe of=/dev/fd0
    1.96 +	ddq if=/media/cdrom/boot/?pxe of=/dev/fd0
    1.97  }
    1.98  
    1.99  gotposixovl()
   1.100 @@ -435,7 +445,7 @@
   1.101  
   1.102  xfile()
   1.103  {
   1.104 -	[ -n "$(which $1)" ] && echo -en "\"$2\"	\"$3\""
   1.105 +	[ "$(which $1)" ] && echo -en "\"$2\"	\"$3\""
   1.106  }
   1.107  
   1.108  cdfile()
   1.109 @@ -466,19 +476,20 @@
   1.110  Please insert a floppy in drive now.\n 
   1.111  " 10 70
   1.112  	[ $? -eq 0 ] || return
   1.113 -	dd if=/mnt/$ISO of=/dev/fd0 bs=1 count=512 \
   1.114 +	ddq if=/mnt/$ISO of=/dev/fd0 bs=1 count=512 \
   1.115  		skip=$(( $(get 66 /mnt/$ISO) - $sz ))
   1.116 -	echo "$ISO" | dd of=/dev/fd0 bs=512 seek=1 count=1
   1.117 -	dd if=/mnt/$ISO of=/dev/fd0 bs=1 count=$sz seek=2 \
   1.118 +	echo "$ISO" | ddq of=/dev/fd0 bs=512 seek=1 count=1
   1.119 +	ddq if=/mnt/$ISO of=/dev/fd0 bs=1 count=$sz seek=2 \
   1.120  		skip=$(( $(get 66 /mnt/$ISO) - $sz + 512 ))
   1.121  }
   1.122  
   1.123  usbdev()
   1.124  {
   1.125 +	echo "Wait 5 seconds for USB devices..."
   1.126  	sleep 5
   1.127  	DEV="$(grep -l 1 /sys/block/*/removable | \
   1.128  		sed 's|/sys/block/\(.*\)/removable|\1|')"
   1.129 -	[ -n "$DEV" ] || return
   1.130 +	[ "$DEV" ] || return
   1.131  	exec 3>&1
   1.132  	device=`$DIALOG  --clear \
   1.133  	--title " Select your USB key " \
   1.134 @@ -499,14 +510,51 @@
   1.135  		--title " Create a USB boot key " \
   1.136  		--yes-label "Continue" --yesno \
   1.137  "\nThe USB key will be used like a CD-ROM. You will not be able to write
   1.138 -any data on it.\n\n
   1.139 +any data on the boot partition.\n\n
   1.140 +An extra FAT32 partition will be created with the remaining free space.\n\n
   1.141  You should choose 'USB key read/write installation' to be
   1.142  able to save the package updates or your own configuration and data files.\n\n
   1.143  Please plug your USB stick in now.\n 
   1.144 -" 13 70
   1.145 +" 16 70
   1.146  	[ $? -eq 0 ] || return
   1.147  	usbdev || return
   1.148 -	dd if=/mnt/$ISO of=$device
   1.149 +	
   1.150 +	# perform dd in progess bar
   1.151 +	max=$(($(stat -c %s /mnt/$ISO)/1024/1024))
   1.152 +	mkfifo /tmp/fifodd
   1.153 +	dialog --gauge " The ISO image transfer can be long. Please wait..." \
   1.154 +			6 70 0 < /tmp/fifodd &
   1.155 +	i=0; ddq if=/mnt/$ISO bs=1024k | ( 
   1.156 +		while ddq bs=1024k count=1 ; do 
   1.157 +		i=$(($i + 1))
   1.158 +		[ $i -gt $max ] && break
   1.159 +		echo $((($i*100)/$max)) > /tmp/fifodd
   1.160 +	done ) > $device
   1.161 +
   1.162 +	# partition + fat32 format for the remining space
   1.163 +	od -j 466 -N 12 -t u2 -An $device | { read dx cx ol oh ll lh 
   1.164 +	if [ $dx -eq $((0x3F17)) ]; then
   1.165 +		cx=$(($cx & 0xFF00))
   1.166 +		ofs=$(($ll+($lh<<16)))
   1.167 +		n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
   1.168 +		m=$(($cx+($n/8)))
   1.169 +		[ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
   1.170 +		m=$((($m & 0xFF00)+(($m>>16)<<6)))
   1.171 +		words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
   1.172 +			$ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
   1.173 +			ddq bs=1 seek=446 of=$device
   1.174 +		if [ "$(which mkdosfs 2> /dev/null)" ]; then
   1.175 +			losetup -o $((512*$ofs)) /dev/loop0 $device
   1.176 +			mkdosfs -n "SLITAZ BOOT" /dev/loop0
   1.177 +			words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
   1.178 +				ddq bs=1 seek=28 of=/dev/loop0
   1.179 +			losetup -d /dev/loop0
   1.180 +		fi
   1.181 + 	fi ; }
   1.182 + 	
   1.183 + 	# kill dialog --gauge
   1.184 +	sleep 1
   1.185 +	rm /tmp/fifodd
   1.186  }
   1.187  
   1.188  usbkey()
   1.189 @@ -630,7 +678,7 @@
   1.190  	cat > /tmp/dialog <<EOT
   1.191  $DIALOG  --clear \
   1.192  	--title " Welcome to SliTaz " \
   1.193 -	--menu "" 21 70 15 \
   1.194 +	--menu "" 23 70 17 \
   1.195  $(xfile tazkeymap	"tazkeymap"	"Select keyboard ($keymap)") \
   1.196  $(xfile tazlocale	"tazlocale"	"Select locale ($locale)") \
   1.197  $(cdfile boot/bzImage	"live"		"SliTaz RAM boot") \