wok-tiny diff linux/stuff/bundle @ rev 151

linux/bundle: multi floppy support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Sep 15 19:49:24 2019 +0200 (2019-09-15)
parents c82d2b7a51b4
children 5e2b41f82f13
line diff
     1.1 --- a/linux/stuff/bundle	Wed Aug 23 12:08:35 2017 +0200
     1.2 +++ b/linux/stuff/bundle	Sun Sep 15 19:49:24 2019 +0200
     1.3 @@ -36,6 +36,7 @@
     1.4  	cat <<EOT
     1.5  Usage: $p kernel [initrd] [@]
     1.6  or: $p menufile "menu title" file1 "menu entry 1" ...
     1.7 +or: cat floppy.* > floppyset ; $p floppyset
     1.8  EOT
     1.9  elif [ -n "$4" ]; then
    1.10  	out="$1"
    1.11 @@ -49,38 +50,36 @@
    1.12  	shift 2
    1.13  	free=$((0x1F1 - 2 - $pos - $crc))
    1.14  	while [ -n "$2" -a $free -ge ${#2} ]; do
    1.15 -		echo "$((($(stat -c "%s" "$1")+511)/512)) $1 $2"
    1.16 +		echo "$((($(stat -Lc "%s" "$1")+511)/512))?$1?$2"
    1.17  		shift 2
    1.18 -	done | awk '
    1.19 -BEGIN { i=0 } { sz[i]=$1; fn[i]=$2; sub(".*"$2,""); me[i++]=$0 }
    1.20 -END {
    1.21 -  for (m=0, l=p=1; m<i; m++) {
    1.22 -    for (s=100000, j=0; j<i; j++) if (!lc[j] && sz[j]<s) s=sz[k=j];
    1.23 -    f2[m]=fn[k]; s2[m]=s; lc[k]=l; l+=s; l2[m]=p; p+=sz[m]
    1.24 -  }
    1.25 -  for (j=0; j<i; j++)
    1.26 -    print sz[j] " " lc[j] " " fn[j] " " s2[j] " " l2[j] " " f2[j] " " me[j]
    1.27 -}' |	while read s p file s2 p2 file2 entry ; do
    1.28 -		[ -z "$SORT_MENU" ] && file2=$file && s2=$s && p=$p2
    1.29 +	done | awk -F? 'BEGIN { nxt=1; i=0 }
    1.30 +{ ofs[i]=$1; nxt+=$1 ; file[i]=$2; name[i]=$3; i++ }
    1.31 +END { for (j = 0; j < i; j++) { nxt-=ofs[j]
    1.32 +print nxt " " ofs[j] " " file[j] " " name[j] }}' | \
    1.33 +	while read p s file name; do
    1.34  		x="$(printf '\\x%02x\\x%02x' $(($p % 256)) $(($p / 256)) )"
    1.35 -		echo -en "$x$entry\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc
    1.36 -		pos=$(($pos+2+${#entry}+1))
    1.37 -		cat "$file2" /dev/zero | ddq bs=512 count=$s2 >> "$out"
    1.38 +		echo -en "$x$name\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc
    1.39 +		pos=$(($pos+2+${#name}+1))
    1.40  		if [ $crc -ne 0 ]; then
    1.41 -			x=$(cat "$file" /dev/zero | ddq bs=512 count=$s | od -v \
    1.42 -			    -t u2 -w2 -An|awk '{i+=$0} END {print (i % 65536)}')
    1.43 -			x="$(printf '\\x%02x\\x%02x' $(($x % 256)) $(($x / 256)) )"
    1.44 +			x=$(cat "$file" /dev/zero | ddq bs=512 count=$s | \
    1.45 +			    od -v -t u2 -w2 -An | awk '{i+=$0} \
    1.46 +						END {print (i % 65536)}')
    1.47 +			x="$(printf '\\x%02x\\x%02x' $(($x%256)) $(($x/256)) )"
    1.48  			echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc
    1.49  			pos=$(($pos+2))
    1.50 -			x="$(printf '\\x%02x\\x%02x' $(($s % 256)) $(($s / 256)) )"
    1.51 +			x="$(printf '\\x%02x\\x%02x' $(($s%256)) $(($s/256)) )"
    1.52  			echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc
    1.53  			pos=$(($pos+2))
    1.54  		fi
    1.55 -		shift 2
    1.56 +		echo "$file $s"
    1.57 +	done | awk 'BEGIN { i=0 } { file[i]=$1; size[i]=$2; i++ } 
    1.58 +		END { while (--i >= 0) print file[i] " " size[i] }' | \
    1.59 +	while read file size; do
    1.60 +		cat "$file" /dev/zero | ddq bs=512 count=$size >> "$out"
    1.61  	done
    1.62  elif [ -s "$2" ]; then
    1.63  	base_initrd=$((0x00300000))
    1.64 -	size_initrd=$(stat -c %s "$2")
    1.65 +	size_initrd=$(stat -Lc %s "$2")
    1.66  	[ $(($base_initrd + $size_initrd)) -gt $((0x1000000)) ] &&
    1.67  	base_initrd=$((0x01400000))
    1.68  	[ "$3" ] && base_initrd=$(($3))
    1.69 @@ -95,16 +94,16 @@
    1.70  		[ $(get $(($menu -3)) "$1" 2) -eq 24937 ] && skip=4 || skip=0
    1.71  		ddq bs=1 skip=$menu count=$((0x1F3 - $menu)) if="$1" | \
    1.72  		od -v -t u1 -w1 -An | awk -vx=$skip '{
    1.73 -	if (--skip >= 0) next
    1.74 +	if (--skip >= 0) next				# crc, len
    1.75  	if (--bytes < 0) {
    1.76 -		if ($1 == 0) {
    1.77 -			if (mul > 0) {
    1.78 +		if ($1 == 0) {				# eos
    1.79 +			if (mul > 0) {			# menu label
    1.80  				if (sector == 0) exit
    1.81  				skip=x; print sector " " s
    1.82  			}
    1.83 -			s=""; sector=0; mul=1; bytes=2
    1.84 +			s=""; sector=0; mul=1; bytes=2	# menu title
    1.85  		}
    1.86 -		else { c=sprintf("%c",$1); s=s c }
    1.87 +		else { c=sprintf("%c",$1); s=s c }	# menu title/label
    1.88  	}
    1.89  	else { sector += $0*mul; mul *= 256 }
    1.90  }' |		while read s name; do
    1.91 @@ -114,11 +113,12 @@
    1.92  			if [ $(get $(($s*512 + 0x202)) "$1" 2) -eq 25672 ]; then
    1.93  				x=$(get $(($s*512 + 0x21C)) "$1")
    1.94  				[ $x -ne 0 ] && x=$(((($cnt+31)/32)*512+$x)) &&
    1.95 -				cnt=$((($x+15)/16))
    1.96 +				cnt=$((($x+15)/16))	# initrd
    1.97  			fi
    1.98  			ddq bs=16 skip=$((32*$s)) count=$cnt if="$1" of="$name"
    1.99  			[ $x -ne 0 ] && ddq bs=1 seek=$x count=0 of="$name"
   1.100 - 			ls -l "$name"
   1.101 +			printf "S%04X %9d " $s $(($cnt*16))
   1.102 + 			ls -l "$name" | cut -c35-
   1.103  		done
   1.104  	else
   1.105  		base_initrd=$(get 0x218 "$1")