wok view syslinux/stuff/iso2exe/taziso @ rev 19877
syslinux/iso2exe: fix floppyset
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Mar 31 18:37:37 2017 +0200 (2017-03-31) |
parents | 2547fda51451 |
children | a686b7799fe9 |
line source
1 #!/bin/sh
3 [ $(id -u) -eq 0 ] || exec su -c "$0 $@"
5 DIALOG=dialog
7 ddq()
8 {
9 dd $@ 2> /dev/null
10 }
12 get()
13 {
14 od -v -j $1 -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An "$2" 2>/dev/null ||
15 hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" "$2"
16 }
18 bytes2bin()
19 {
20 for i in $@ ; do
21 printf '\\\\x%02X' $(($i&255))
22 done | xargs echo -en
23 }
25 words2bin()
26 {
27 for i in $@ ; do
28 printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255))
29 done | xargs echo -en
30 }
32 gettazboot()
33 {
34 echo "Creating $(basename $1) ..."
35 O=$(($(get 64 "$ISO") - 0xC0))
36 L=$(($(get 20 "$ISO") - 0xC0 - $(get 24 "$ISO") - $O))
37 S=$((32+$L))
38 P=$((($S+511)/512))
39 E=$((4096-(32*$P)))
40 words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
41 -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1
42 ddq bs=1 count=$L skip=$(echo $O) if="$ISO" >> $1
43 }
45 uncpio()
46 {
47 [ -s "$1" ] || return
48 echo -en "\n Extracting $(basename $1) ..."
49 case $(get 0 $1) in
50 *35615) ( zcat || gunzip ) ;;
51 *14333) unxz ;;
52 *\ 93) unlzma ;;
53 *) cat ;;
54 esac < $1 | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
55 }
57 dotwait()
58 {
59 echo -n "${1:-Install filesystem}.."
60 touch /tmp/wait
61 [ "$REQUEST_URI" ] && return
62 while [ -e /tmp/wait ]; do
63 echo -n "." > /dev/tty
64 sleep 1
65 done &
66 }
68 getuuid()
69 {
70 dev=$(mount | sed "/ $(echo $mnt | sed 's|/|\\/|g') /!d;s/ .*//;s|/dev/||;q")
71 [ "$dev" ] &&
72 blkid | sed "/$dev:/!d;s/.* UUID=.\\([^ ]*\\)\".*/\\1/" ||
73 echo "/dev/hda1"
74 }
76 tazusbinitfs()
77 {
78 PAD=$(($(stat -c %s $1) % 4))
79 [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
80 mkdir -p /tmp/fs$$/etc /tmp/fs$$/lib /tmp/fs$$/home
81 cp -a /etc/locale.conf /tmp/fs$$/etc 2> /dev/null
82 cp -a /etc/keymap.conf /tmp/fs$$/etc 2> /dev/null
83 cat > /tmp/fs$$/init1 <<EOT
84 #!/bin/sh
85 sed -i 's|sbin/init|init2|' /init
86 exec /init
87 EOT
88 cat > /tmp/fs$$/init2 <<EOT
89 #!/bin/sh
91 mount -t proc /proc /proc
92 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
93 v=\$(sed '/\\/home=/!d;s|.*/home=\\([^ ]*\\).*|\\1|' /proc/cmdline /cmdline 2> /dev/null)
94 mount / -o remount,rw
95 mkdir /mnt/dos
96 rm -f /cmdline 2> /dev/null
97 mount / -o remount,ro
98 mnt=/mnt/dos/\${v#*/}
99 dev=\$( (blkid /dev/[sh]d* || blkid) | grep \${v%%/*} | sed 's/:.*//;q')
100 echo "Mount \$dev in /mnt/dos for \$v..." | tee -a /run/boot.log
101 mount \$dev /mnt/dos
102 if [ ! -d /mnt/dos/slitaz ]; then
103 umount /mnt/dos 2> /dev/null
104 (blkid /dev/[sh]d* || blkid) | while read dev line; do
105 case "\$line" in
106 *ntfs*|*vfat*|*msdos*) ;;
107 *) continue ;;
108 esac
109 mount \${dev%:} /mnt/dos
110 [ -d /mnt/dos/slitaz ] && break
111 umount /mnt/dos
112 done
113 fi
114 $([ "$2" ] || echo '# ')mount.posixovl -F \$mnt -- -oallow_other -odefault_permissions -osuid
115 mount --bind \$mnt /home
116 umount /proc
117 exec /sbin/init
118 EOT
119 chmod 755 /tmp/fs$$/init?
120 ( cd /tmp/fs$$ ; find * | cpio -o -H newc ) | gzip -9 >> $1
121 rm -rf /tmp/fs$$
122 }
124 mkinitrd()
125 {
126 echo -en "\nCreating $(basename $1) "
127 fs=/tmp/fs$$
128 for i in bin lib dev proc tmp mnt etc ; do
129 mkdir -p $fs/$i
130 done
131 for i in /dev/console /dev/null /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 \
132 /dev/fuse /dev/hd* /dev/sd* ; do
133 cp -a $2$i $fs/dev/
134 done
135 for i in /bin/busybox $(which mount.posixovl) $(which blkid); do
136 cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $i | \
137 sed 's|.*=> \(.*/lib/l[^ ]*\).*|\1|;/^\//!d') $fs/lib
138 cp $i $fs/bin
139 done
140 cp -a /lib/ld-* $fs/lib
141 for i in $(busybox | sed '/Current/,$!d'); do
142 [ -e $fs/bin/${i%,} ] || ln -s busybox $fs/bin/${i%,}
143 done
144 ln -s /proc/mounts $fs/etc/mtab
145 sed 's/ .*//' /proc/modules | while read mod ; do
146 find /lib/modules/ | grep $mod.ko | \
147 sed 's|.*|cp & $fs/lib|' | sh
148 done
149 cat > $fs/init <<EOT
150 #!/bin/sh
152 arg()
153 {
154 grep -q \$1 /proc/cmdline &&
155 val="\$(sed "s/.*\$1=\\([^ ]*\\).*/\\1/" < /proc/cmdline)" &&
156 echo "\$2 \$val"
157 }
159 mount -t proc /proc /proc
160 arg debug "shell" && debug=true && set -x
161 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
162 arg mount "Mount device"
163 mount \$( (blkid /dev/[sh]d* || blkid) | grep \$val | sed 's/:.*//;q') /mnt
164 arg subroot "Change root to directory"
165 if [ -d /mnt/\$val ]; then
166 umount /mnt 2> /dev/null
167 (blkid /dev/[sh]d* || blkid) | while read dev line; do
168 case "\$line" in
169 *ntfs*|*vfat*|*msdos*) ;;
170 *) continue ;;
171 esac
172 mount \${dev%:} /mnt
173 [ -d /mnt/\$val ] && break
174 umount /mnt
175 done
176 fi
177 $([ "$3" ] || echo '# ')mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid
178 mount --bind /mnt /mnt/\$val/mnt/dos
179 mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
180 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q)
181 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib
182 [ "$debug" = "true" ] && sh
183 umount /proc
184 exec /bin/switch_root /mnt \${LDSO#/mnt/} \$val/usr/sbin/chroot \$val /sbin/init
185 EOT
186 chmod +x $fs/init
187 ( cd $fs ; find * | cpio -o -H newc ) | lzma e $1 -si 2> /dev/null
188 rm -rf $fs /tmp/wait
189 }
191 ls_r()
192 {
193 ls -r $@ 2> /dev/null || ls $@
194 }
196 doinstall()
197 {
198 unset useposixovl
199 blkid | grep $(df $mnt | sed '$!d;s/ .*/:/') | \
200 grep -qiE "(msdos|vfat|ntfs)" && useposixovl=YES
201 case "$mnt" in
202 *mkzip*) useposixovl=YES
203 esac
204 mkdir -p $mnt/slitaz/boot $mnt/slitaz/mnt/dos
205 [ "$useposixovl" ] &&
206 if ! mount.posixovl -F $mnt/slitaz -- \
207 -oallow_other -odefault_permissions -osuid; then
208 echo "Can't install SliTaz. Abort."
209 sleep 5
210 return 1
211 fi
212 dotwait "Install root filesystem in /slitaz.."
213 if [ "$1" ]; then
214 ls_r $media/boot/rootfs*gz | \
215 xargs cat > $mnt/slitaz/boot/rootfs.gz
216 tazusbinitfs $mnt/slitaz/boot/rootfs.gz $useposixovl
217 initrd=rootfs.gz
218 extraargs="/home=$(getuuid)/slitaz rdinit=/init1"
219 else
220 for i in $(ls_r $media/boot/rootfs*gz); do
221 uncpio $i $mnt/slitaz
222 done
223 for i in $packages_list; do
224 tazpkg get-install $i --root=$mnt/slitaz
225 done
226 for i in $packages_dir/*.tazpkg; do
227 [ -s "$i" ] &&
228 tazpkg install $i --root=$mnt/slitaz
229 done
230 cp -a /etc/locale.conf $mnt/slitaz/etc 2> /dev/null
231 cp -a /etc/keymap.conf $mnt/slitaz/etc 2> /dev/null
232 mkinitrd $mnt/slitaz/boot/initrd $mnt/slitaz $useposixovl
233 initrd=initrd
234 extraargs="mount=$(getuuid) subroot=slitaz"
235 fi
236 echo -en "\nInstall boot files..."
237 for i in $media/boot/bzImage $media/boot/*pxe* \
238 $media/boot/isolinux/he* $media/boot/isolinux/opt* \
239 $media/README $media/boot/memtest* ; do
240 [ -s $i ] && cp $i $mnt/slitaz/boot
241 done
242 for i in $mnt/slitaz/boot/memtest $mnt/slitaz/boot/*pxe* ; do
243 [ $(get 0 $i 2> /dev/null || echo 0) -eq 23117 ] &&
244 mv $i $i.exe
245 done
246 gettazboot $mnt/slitaz/boot/tazboot.exe
247 unix2dos > $mnt/slitaz/boot/tazboot.cmd <<EOT
248 kernel=/slitaz/boot/bzimage
249 initrd=/slitaz/boot/$initrd
250 rw root=/dev/null $extraargs autologin
251 EOT
252 unix2dos $mnt/slitaz/boot/he* $mnt/slitaz/boot/opt* \
253 $mnt/slitaz/boot/README
254 [ -d $mnt/slitaz/usr/sbin -a ! -x $mnt/slitaz/usr/sbin/mount.posixovl ] &&
255 cp $(which mount.posixovl) $mnt/slitaz/usr/sbin
256 if [ "$useposixovl" ] && grep -qs " $mnt " /proc/mounts &&
257 [ ! -d $mnt/boot/grub ]; then
258 mkdir -p $mnt/boot/grub
259 echo -en "\nInstall grub in /boot/grub..."
260 cp -a /usr/lib/grub/*/* $mnt/boot/grub
261 cat > $mnt/boot/grub/menu.lst <<EOT
262 # /boot/grub/menu.lst: GRUB boot loader configuration.
264 # By default, boot the first entry.
265 default 0
267 # Boot automatically after 8 secs.
268 timeout 8
270 title Microsoft Windows
271 chainloader +1
273 EOT
274 dev=$(grep " $mnt " /proc/mounts | awk '{ print $1 }')
275 base=${dev//[0-9]/}
276 dd if=$base bs=32k count=1 of=$mnt/boot/grub/$(basename $base)
277 cat > $mnt/boot/grub/uninstall-grub.sh <<EOT
278 #!/bin/sh
280 [ -s /boot/grub/$(basename $base) ] &&
281 dd if=/boot/grub/$(basename $base) of=$base
282 EOT
283 grub-install --no-floppy --root-directory=$mnt $base
284 fi
285 if [ -s $mnt/boot/grub/menu.lst ] &&
286 ! grep -q /slitaz/boot/bzimage $mnt/boot/grub/menu.lst; then
287 echo -en "\nUpdate /boot/grub/menu/lst..."
288 cat >> $mnt/boot/grub/menu.lst <<EOT
289 title SliTaz GNU/Linux $(cat $mnt/slitaz/etc/slitaz-release)
290 kernel /slitaz/boot/bzimage rw root=/dev/null $extraargs autologin
291 initrd /slitaz/boot/$initrd
293 EOT
294 fi
295 rm -f /tmp/wait
296 [ "$useposixovl" ] && umount $mnt/slitaz
297 return 0
298 }
300 windev()
301 {
302 if [ -b "$1" ]; then
303 device=$1
304 elif [ "$1" ]; then
305 echo "Invalid Linux/Windows partition"
306 return 1
307 else
308 DEV="$(blkid | grep -iE "(msdos|vfat|ntfs|ext[234]|xfs|btrfs)" | sed 's/:.*//;s|/dev/||')"
309 [ "$DEV" ] || return
310 cat > /tmp/dialog$$ <<EOT
311 $DIALOG --clear \
312 --title " Select your Linux/Windows partition " \
313 --menu "\nPlease select the Linux/Windows partition according to its known size.
314 The data will be kept untouched.\n" \
315 17 70 8 \
316 $(for i in $DEV ; do
317 label="$(blkid | sed "/$i:/!d;s/.*://;s/[^ ]*UUID=[^ ]* //g;s/LABEL=//")"
318 echo -n "/dev/$i \"$(($(cat /sys/block/*/$i/size)/2048))MB $label\" "
319 done)
320 EOT
321 exec 3>&1
322 [ $? -eq 0 ] || return
323 device=$(. /tmp/dialog$$ 2>&1 1>&3)
324 exec 3>&-
325 rm -f /tmp/dialog$$
326 fi
327 mnt=/tmp/mnt$$
328 mkdir -p $mnt && mount $device $mnt
329 }
331 extra_packages()
332 {
333 packages_list=
334 packages_dir=
335 $DIALOG --clear \
336 --title " Extra packages " \
337 --defaultno --yesno \
338 "
339 Do you want to add extra packages ?
340 " 7 70
341 [ $? -eq 0 ] || return
342 [ -s /var/lib/tazpkg/packages.txt ] || tazpkg recharge
343 if [ -s $media/boot/vmlinuz-$(uname -r) ]; then
344 cat > /tmp/dialog$$ <<EOT
345 $DIALOG --clear \
346 --title " Select the packages " \
347 --separate-output \
348 --cancel-label "Skip" \
349 --checklist "Please select the packages you want to install. Try with the first letter." \
350 0 0 0 \\
351 EOT
352 awk -F\| '{ printf "%s \"%s\" off ",$1,$3 }' \
353 /var/lib/tazpkg/packages.desc >> /tmp/dialog$$
354 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
355 [ $? -eq 0 ] && packages_list="$(cat /tmp/dialog.out$$)"
356 fi
357 cat > /tmp/dialog$$ <<EOT
358 $DIALOG --clear \
359 --title "Please select the directory with every custom package to install." \
360 --cancel-label "Skip" \
361 --dselect $PWD 13 78
362 EOT
363 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
364 [ $? -eq 0 ] && packages_dir="$(cat /tmp/dialog.out$$)"
365 rm -f /tmp/dialog$$ /tmp/dialog.out$$
366 }
368 _install()
369 {
370 extra_packages
371 $DIALOG --clear \
372 --title " SliTaz UMSDOS way installation " \
373 --yes-label "Install" --yesno \
374 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
375 Linux/DOS/Windows partition. You can see your files from /mnt/dos.\n\n
376 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
377 To uninstall SliTaz, you have only to remove this directory.
378 The file \\boot.ini or \\config.sys may be modified too.\n\n
379 SliTaz may run slowly on the 'UMSDOS way' installation due to the
380 posixovl filesystem. The 'TAZUSB way' installation runs faster.\n\n
381 To do a traditional installation with disk partitioning,
382 start SliTaz Live with the 'SliTaz RAM boot' menu.\n
383 " 19 70
384 [ $? -eq 0 ] || return
385 doinstall
386 }
388 readtazbootconf()
389 {
390 kernel="$(sed '/^kernel=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
391 initrd="$(sed '/^initrd=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
392 cmdline="$(sed '/^kernel=/d;/^initrd=/d' $mnt/slitaz/boot/tazboot.cmd)"
393 }
395 bootinstalled()
396 {
397 [ "$(which kexec)" ] || return
398 [ -x $mnt/slitaz$1 ] || return
399 [ -s $mnt/slitaz/boot/tazboot.cmd ] || return
400 readtazbootconf
401 kexec -l $kernel --initrd $initrd --command-line "$cmdline" || return
402 umount $mnt
403 rm -rf $mnt
404 quit "kexec -e"
405 }
407 mkzip()
408 {
409 device=
410 packages_list=
411 packages_dir=
412 mnt=/tmp/mkzipmnt$$
413 mkdir -p $mnt
414 $1 $2 || return
415 for i in bootlace.com grubinst.exe grldr ; do
416 wget -O $mnt/slitaz/boot/$i http://mirror.slitaz.org/boot/$i
417 done
418 readtazbootconf
419 cat > $mnt/slitaz/boot/menu.lst <<EOT
420 title SliTaz
421 kernel $kernel $cmdline
422 initrd $initrd
424 EOT
425 while read file title; do
426 file=$(ls $mnt/slitaz/boot/*$file* 2> /dev/null)
427 [ -s "$file" ] && cat >> $mnt/slitaz/boot/menu.lst <<EOT
428 title $title
429 kernel ${file#$mnt}
431 EOT
432 done <<EOT
433 memtest MemTest
434 pxe Web boot
435 EOT
436 unix2dos $mnt/slitaz/boot/menu.lst
437 unix2dos > $mnt/slitaz/boot/install.txt <<EOT
438 For DOS users (real mode only):
440 Start SliTaz with \\slitaz\\boot\\tazboot.exe
443 For NT/2000/XP users:
445 1- Move the files grldr and menu.lst into the root directory
447 C:\\> copy \\slitaz\\boot\\grldr \\
448 C:\\> copy \\slitaz\\boot\\menu.lst \\
450 2- Remove boot.ini attributes
452 C:\\> attrib -r -h -s boot.ini
454 3- Append the following line to boot.init
456 C:\\grldr="slitaz"
458 4- Restore boot.ini attributes
460 C:\\> attrib +r +h +s boot.ini
462 See http://diddy.boot-land.net/grub4dos/files/README_GRUB4DOS.txt
463 and http://xpt.sourceforge.net/techdocs/nix/disk/boot/boot07-GrubForDosInfo/ar01s03.html
464 EOT
465 ( cd $mnt ; echo 'See \slitaz\boot\install.txt to launch SliTaz.' | \
466 zip -zr9 $(basename "$ISO" .iso).zip slitaz )
467 [ "$(which advzip)" ] &&
468 echo "Recompressing $(basename "$ISO" .iso).zip ..." &&
469 advzip -z4 $mnt/*.zip
470 mv $mnt/*.zip .
471 du -h $PWD/$(basename "$ISO" .iso).zip
472 umount $mnt
473 rm -rf $mnt
474 }
476 install()
477 {
478 windev $1 || return
479 packages_list=
480 packages_dir=
481 if [ "$1" ]; then
482 doinstall
483 else
484 _install && bootinstalled /sbin/init
485 fi
486 umount $mnt
487 rm -rf $mnt
488 }
490 inst2zip()
491 {
492 if [ "$1" ]; then
493 mkzip doinstall
494 else
495 mkzip _install
496 fi
497 }
499 _installtaz()
500 {
501 $DIALOG --clear \
502 --title " SliTaz TAZUSB way installation " \
503 --yes-label "Install" --yesno \
504 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
505 Linux/DOS/Windows partition. You can see your files from /mnt/dos.\n\n
506 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
507 To uninstall SliTaz, you have only to remove this directory.
508 The file \\boot.ini or \\config.sys may be modified too.\n\n
509 The filesystem is loaded entirely into memory upon boot to
510 increase responsiveness. Only /home lands on the hard disk.\n\n
511 To do a traditional installation with disk partitioning,
512 start SliTaz Live with the 'SliTaz RAM boot' menu.\n
513 " 19 70
514 [ $? -eq 0 ] || return
515 doinstall tazusblike
516 }
518 installtaz()
519 {
520 windev $1 || return
521 packages_list=
522 packages_dir=
523 if [ "$1" ]; then
524 doinstall tazusblike
525 else
526 _installtaz && bootinstalled /boot/bzimage
527 fi
528 umount $mnt
529 rm -rf $mnt
530 }
532 insttaz2zip()
533 {
534 if [ "$1" ]; then
535 mkzip doinstall tazusblike
536 else
537 mkzip _installtaz
538 fi
539 }
541 bootiso()
542 {
543 cd /tmp
544 for i in $(ls_r $media/boot/rootfs*gz); do
545 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
546 cat $i
547 n=$((4 - ($(stat -c %s $i) % 4)))
548 [ $n -eq 4 ] || dd if=/dev/zero bs=1 count=$n
549 done > initrd$$
550 cmdline="root=/dev/null autologin lang=$LANG"
551 [ -s /etc/keymap.conf ] && cmdline="$cmdline kmap=$(cat /etc/keymap.conf)"
552 [ -s /etc/TZ ] && cmdline="$cmdline tz=$(cat /etc/TZ)"
553 rm -f cmdline initrd 2> /dev/null
554 getcustomconf kexec >/dev/null
555 [ -s cmdline ] && cmdline="$cmdline $(cat cmdline)" && rm cmdline
556 [ -s initrd ] && cat initrd >> initrd$$ && rm initrd
557 kernel=$media/boot/bzImage
558 grep -q ' lm ' /proc/cpuinfo && [ -s ${kernel}64 ] && kernel=${kernel}64
559 . /etc/locale.conf
560 kexec -l $kernel --initrd initrd$$ --command-line "$cmdline" &&
561 rm -f initrd$$
562 quit "kexec -e"
563 }
565 tazboot()
566 {
567 if [ -z "$1" ]; then
568 $DIALOG --clear \
569 --title " SliTaz bootloader for DOS " \
570 --yes-label "Install" --yesno \
571 "\nThe file TAZBOOT.EXE will be created in the top directory. It supports
572 any linux kernel, multiple initramfs, a kernel command line and
573 an ISO image file loopback (retrieves files from an ISO file).\n\n
574 Usage: tazboot.exe [[@commands]|[kernel=<bzimage>]
575 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] cmdline args ...]\n\n
576 Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\
577 Examples for tazboot.cmd:\n\n\
578 bootfrom=\\isos\\slitaz-4.0.iso\n\
579 kernel=boot/bzImage\n\
580 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
581 rw root=/dev/null autologin\n\n\
582 kernel=\\slitaz\\vmlinuz root=/dev/sda5 ro\n\n
583 Unlike GRUB4DOS, it doesn't require unfragmented ISO image files.\n
584 " 0 0
585 [ $? -eq 0 ] || return
586 fi
587 gettazboot tazboot.exe
588 du -h $PWD/tazboot.exe
589 }
591 md5()
592 {
593 dotwait "Checking files"
594 ( cd $media ; ${md5sum:-md5sum -c md5sum*} 2>&1 | sort ) > /tmp/data
595 unset md5sum
596 rm -f /tmp/wait
597 if [ "$1" ]; then
598 cat /tmp/data
599 else
600 $DIALOG --clear \
601 --title " Checked files " \
602 --textbox /tmp/data 0 0
603 fi
604 rm -f /tmp/data
605 }
607 gotcdfile()
608 {
609 for i in "$media/$1" "$media/*/$1" "$media/*/isolinux/$1" ; do
610 file=$(ls $i 2> /dev/null | sed q)
611 [ -s "$file" ] && break
612 done
613 }
615 sha()
616 {
617 gotcdfile 'sha*sum*'
618 sha=$(basename $file)
619 md5sum="${sha%sum*}sum -c ${file#$media/}"
620 md5 $@
621 }
623 readme()
624 {
625 gotcdfile 'README*'
626 if [ "$1" ]; then
627 cat $file
628 else
629 $DIALOG --clear \
630 --title " Readme " \
631 --textbox $file 0 0
632 fi
633 }
635 bzimage()
636 {
637 if [ -z "$1" ]; then
638 $DIALOG --clear \
639 --title " Create linux.exe ? " \
640 --yes-label "Install" --yesno \
641 "\nLinux.exe launches the linux kernel under DOS (in real mode only).
642 The cmdline arguments are supported except initrd=,
643 vga= (you can try 'rdev -v') and mem= (partially).
644 \nExample:\nC:\\> linux.exe root=/dev/hda2 ro panic=60\n
645 " 12 70
646 [ $? -eq 0 ] || return
647 fi
648 cp $media/boot/bzImage linux.exe
649 du -h $PWD/linux.exe
650 }
652 memtest()
653 {
654 if [ -z "$1" ]; then
655 $DIALOG --clear \
656 --title " Create memtest.exe ? " \
657 --yes-label "Install" --yesno \
658 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
659 computers. BIOS based memory tests are a quick, cursory check and often
660 miss many of the failures that are detected by Memtest86.\n
661 " 0 0
662 [ $? -eq 0 ] || return
663 fi
664 gotcdfile 'memtest*' && cp $file memtest.exe
665 du -h $PWD/memtest.exe
666 }
668 mkfat12()
669 {
670 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return
671 J=$(($(get 3 $1 1) + 0x02))
672 R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32))
673 [ $R -lt 2500 ] || return
674 [ $((($(get 500 $1)-1) & 31)) -lt 30 ] &&
675 ddq if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0
676 G="18 0 2 0 0 0 0 0"
677 [ $J -gt 25 ] || G=""
678 F=0
679 for i in 1 2 3; do
680 F=$((((2880-$R-$F-$F)*3+1023)/1024))
681 done
682 bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \
683 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \
684 $G | ddq bs=1 of=/dev/fd0
685 ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0
686 for i in $R $(($R+$F)) ; do
687 bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0
688 done
689 echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0
690 }
692 mkfloppy()
693 {
694 dotwait "Create a $(basename $1) boot floppy"
695 ddq if=$1 of=/dev/fd0
696 mkfat12 $1
697 rm -f /tmp/wait
698 }
700 fdmemtest()
701 {
702 if [ -z "$1" ]; then
703 $DIALOG --clear \
704 --title " Create a Memtest86 boot floppy " \
705 --yes-label "Create floppy" --yesno \
706 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
707 computers. BIOS based memory tests are a quick, cursory check and often
708 miss many of the failures that are detected by Memtest86.\n\n
709 Please insert a blank disk in floppy drive.\n
710 " 0 0
711 [ $? -eq 0 ] || return
712 fi
713 gotcdfile 'memtest*' && mkfloppy $file
714 }
716 pxe()
717 {
718 gotcdfile '?pxe'
719 if [ -z "$1" ]; then
720 $DIALOG --clear \
721 --title " Create $(basename $file).exe ? " \
722 --yes-label "Install" --yesno \
723 "\nBoot your operating system from the internet and enjoy a full system
724 working entirely in RAM with speed and stability in mind. The Linux Kernel
725 and the complete SliTaz compressed root filesystem will be loaded into RAM
726 from the Web using PXE and HTTP protocols.\n
727 " 0 0
728 [ $? -eq 0 ] || return
729 fi
730 cp $file $(basename $file).exe
731 du -h $PWD/$(basename $file).exe
732 }
734 fdpxe()
735 {
736 if [ -z "$1" ]; then
737 $DIALOG --clear \
738 --title " Create a SliTaz Web boot floppy " \
739 --yes-label "Create floppy" --yesno \
740 "\nBoot your operating system from the internet and enjoy a full system
741 working entirely in RAM with speed and stability in mind. The Linux Kernel
742 and the complete SliTaz compressed root filesystem will be loaded into RAM
743 from the Web using PXE and HTTP protocols.\n\n
744 Please insert a blank disk in floppy drive.\n
745 " 0 0
746 [ $? -eq 0 ] || return
747 fi
748 gotcdfile '?pxe' && mkfloppy $file
749 }
751 menuitem()
752 {
753 [ "$3" ] && shift
754 echo -en "\"$1\" \"$2\""
755 }
757 gotposixovl()
758 {
759 mount.posixovl 2>&1 | grep -qi usage && gotcdfile 'rootfs*.gz' &&
760 menuitem "$@"
761 }
763 gotposixovlzip()
764 {
765 [ "$(which zip)" ] && gotposixovl "$1" "$2"
766 }
768 xfile()
769 {
770 [ "$(which $1)" ] && menuitem "$@"
771 }
773 cdfile()
774 {
775 gotcdfile "$1" && menuitem "$@"
776 }
778 gottazusb()
779 {
780 gotcdfile 'rootfs*.gz' && xfile tazusb "$@"
781 }
783 isbzImage()
784 {
785 [ $(get 514 $file 4) -eq 1400005704 ] &&
786 [ $(($(get 529 $file 1) & 1)) -eq 1 ]
787 }
789 cdfilex()
790 {
791 gotcdfile "$1" && [ "$(which kexec)" ] && isbzImage && menuitem "$@"
792 }
794 cdfilef()
795 {
796 [ -e /sys/block/fd0 ] && cdfile "$@"
797 }
799 cdexe()
800 {
801 gotcdfile "$1" &&
802 [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] &&
803 menuitem "$@"
804 }
806 misspkg()
807 {
808 for i in zip kexec-tools posixovl cdrkit cdrkit-isoinfo ; do
809 [ -d /var/lib/tazpkg/installed/$i/ ] && continue
810 [ "$1" != "install" ] && menuitem "$@" && return
811 tazpkg get-install $i
812 done
813 }
815 missing()
816 {
817 misspkg install
818 }
820 ishybrid()
821 {
822 [ $(get 510 "$ISO") -eq 43605 ] || return
823 C=$((2048*$(get $(((17*2048) + 71)) "$ISO" 4)))
824 [ $(get $C "$ISO" 4) -eq 1 ] || return
825 [ $(get $(($C+30)) "$ISO" 4) -eq $((0x88AA55)) ] || return
826 C=$((2048*$(get $(($C+40)) "$ISO" 4)))
827 [ $(get $(($C+64)) "$ISO" 4) -eq 1886961915 ] && menuitem "$@"
828 }
830 isiso()
831 {
832 [ $(get 32769 "$ISO" 4) -eq 808469571 ] && menuitem "$@"
833 }
835 hastazboot()
836 {
837 [ $(get 0 "$ISO") -eq 23117 ] && menuitem "$@"
838 }
840 burnable()
841 {
842 [ "$(sed '/Can wr.*1$/!d' /proc/sys/dev/cdrom/info 2> /dev/null)" ] &&
843 menuitem "$@"
844 }
846 blankable()
847 {
848 [ "$(sed '/Can wr.*RW.*1$/!d' /proc/sys/dev/cdrom/info 2> /dev/null)" ] &&
849 menuitem "$@"
850 }
852 burniso()
853 {
854 wodim -v speed=$(fgrep "drive speed" /proc/sys/dev/cdrom/info | cut -f3) \
855 -eject -multi "$ISO"
856 }
858 blankcd()
859 {
860 wodim -v -blank=fast
861 }
863 customsector()
864 {
865 local c=$(echo $(get 32848 "$ISO" 4))
866 hascustomconf $(($c+16)) && echo $(($c+16)) || echo $c
867 }
869 hascustomconf()
870 {
871 [ "$(ddq bs=2k skip=${1:-$(customsector)} if="$ISO" | ddq bs=1 count=6)" \
872 == "#!boot" ]
873 }
875 gotcustomconf()
876 {
877 hascustomconf && menuitem "$@"
878 }
880 hasflavor()
881 {
882 [ -x /usr/bin/tazlito ] && [ -s $media/boot/bzImage ] && menuitem "$@"
883 }
885 gotisomd5()
886 {
887 [ "$(which md5sum 2> /dev/null)" ] &&
888 [ $(get 0 "$ISO") -eq 23117 ] &&
889 [ $(get 18 "$ISO") -ne 0 ] && menuitem "$@"
890 }
892 getcustomconf()
893 {
894 ddq bs=2k skip=$(customsector) if="$ISO" | while read line; do
895 case "$line" in
896 \#!boot*) ;;
897 append=*) echo ${line#append=} > cmdline && ls -l $PWD/cmdline ;;
898 initrd:*) cnt=${line#initrd:}
899 { ddq bs=512 count=$(($cnt / 512));
900 ddq bs=1 count=$(($cnt % 512)); } > initrd &&
901 ls -l $PWD/initrd
902 break ;;
903 *) break ;;
904 esac
905 done
906 [ "$1" ] && return 0
907 echo -e "\rPress RETURN to continue."
908 read n
909 }
911 isomd5()
912 {
913 dotwait "Checking iso image"
914 [ "$(ddq if="$ISO" bs=2k skip=16 \
915 count=$(($(get 32848 "$ISO" 4)-16)) | md5sum)" == \
916 "$(ddq if="$ISO" bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
917 sed 's/ //g') -" ] && echo "OK" || echo "ERROR"
918 echo -en "\rChecking iso hybrid boot..."
919 n=$(($(get 2 "$ISO")-1+($(get 4 "$ISO")-1)*512))
920 if [ $n -lt 40000 -a $n -gt 32768 ]; then
921 s=$(get 0 "$ISO" 2 $n | awk '{ i+= $0 } END { print i }')
922 [ $(((1+$s+$(get $(($n+1)) "$ISO" 1)) % 65536)) -eq 0 ] &&
923 echo "OK" || echo "ERROR"
924 fi
925 if hascustomconf; then
926 echo -en "\rChecking iso custom config..."
927 TMP=/tmp/$(basename $0)$$md5
928 md5="$(ddq bs=2k skip=$(customsector) if="$ISO" | while read line; do
929 case "$line" in
930 \#!boot*) echo ${line#*boot } > $TMP ;;
931 append=*) echo $line ;;
932 initrd:*) echo $line
933 cnt=${line#initrd:}
934 ddq bs=512 count=$((cnt / 512))
935 ddq bs=1 count=$((cnt % 512))
936 break ;;
937 *) break ;;
938 esac
939 done | md5sum | cut -c1-32)"
940 [ "$md5" == "$(cat $TMP)" ] && echo "OK" || echo "ERROR"
941 rm -f $TMP
942 fi
943 rm -f /tmp/wait
944 [ "$1" ] && return 0
945 echo -e "\rPress RETURN to continue."
946 read n
947 }
949 usbdev()
950 {
951 dotwait "Wait 5 seconds for USB devices"
952 sleep 5
953 rm -f /tmp/wait
954 DEV="$(grep -l 1 /sys/block/*/removable | \
955 sed 's|/sys/block/\(.*\)/removable|\1|')"
956 grep -qs 1 /sys/block/$DEV/ro && return
957 [ "$DEV" ] || return
958 cat > /tmp/dialog$$ <<EOT
959 $DIALOG --clear \
960 --title " Select your USB key " \
961 --menu "\nPlease select the USB key according to its known size.\n\n" \
962 0 0 0 \
963 $(for i in $DEV ; do
964 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
965 done) \
967 EOT
968 exec 3>&1
969 device=$(. /tmp/dialog$$ 2>&1 1>&3)
970 rm -f /tmp/dialog$$
971 retval=$?
972 exec 3>&-
973 rm -f /tmp/dialog$$
974 [ $retval -eq 0 ]
975 }
977 tazusbmsg()
978 {
979 [ "$(which tazusb 2> /dev/null)" ] || return
980 echo "You should choose 'USB key read/write installation' to be
981 able to save the package updates or your own configuration and data files.\n\n"
982 }
984 usbbootkey()
985 {
986 if [ -b "$1" ]; then
987 device=$1
988 elif [ "$1" ]; then
989 echo "Invalid USB key device"
990 return 1
991 else
992 $DIALOG --clear \
993 --title " Create a USB boot key " \
994 --yes-label "Continue" --yesno \
995 "\nThe USB key will be used like a CD-ROM. You will not be able to write
996 any data on the boot partition.\n\n
997 An extra FAT32 partition will be created with the remaining free space.\n\n
998 $(tazusbmsg)Please plug your USB stick in now.\n
999 " 16 70
1000 [ $? -eq 0 ] || return
1001 usbdev || return
1003 # perform dd in progress bar
1004 max=$(($(stat -c %s "$ISO")/2048))
1005 i=0; ddq if="$ISO" bs=1024k | (
1006 while ddq bs=1024k count=1 ; do
1007 i=$(($i + 1))
1008 [ $i -gt $max ] && break
1009 echo $((($i*100)/$max)) | dialog --gauge \
1010 " The ISO image transfer can be long. Please wait..." \
1011 6 70 0 > /dev/tty 2>&1
1012 done ) > $device
1013 fi
1015 # partition + fat32 format for the remaining space
1016 for p in 0 16; do
1017 get $((450+$p)) $device 2 12 | xargs echo | {
1018 read dx cx ol oh ll lh
1019 [ $dx -eq $((0x3F17)) ] || continue
1020 cx=$(($cx & 0xFF00))
1021 ofs=$(($ll+($lh<<16)))
1022 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
1023 m=$(($cx+($n/8)))
1024 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
1025 m=$((($m & 0xFF00)+(($m>>16)<<6)))
1026 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
1027 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
1028 ddq bs=1 seek=$((462-$p)) of=$device
1029 if [ "$(which mkdosfs 2> /dev/null)" ]; then
1030 losetup -o $((512*$ofs)) /dev/loop2 $device
1031 mkdosfs -n "SLITAZ BOOT" /dev/loop2
1032 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
1033 ddq bs=1 seek=28 of=/dev/loop2
1034 sync
1035 losetup -d /dev/loop2
1036 fi
1037 }
1038 done
1039 }
1041 usbkey()
1042 {
1043 $DIALOG --clear \
1044 --title " Create a SliTaz USB key " \
1045 --yes-label "Continue" --yesno \
1046 "\nUnlike a hard drive install, the filesystem is kept in a compressed
1047 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
1048 This should increase responsiveness, protect the filesystem against
1049 accidental corruption and reduce read/writes to the USB drive.
1050 Once setup, the tazusb utility can rewrite the root filesystem
1051 with any changes you have made since booting up,
1052 giving the effective benefits of a hard drive install.\n\n
1053 /home is mounted on boot using the UUID of your particular flash drive.
1054 Unlike a device name, the UUID has the benefit of never changing from machine
1055 to machine.\n\n
1056 Please plug your USB stick in now.\n
1057 " 19 70
1058 [ $? -eq 0 ] || return
1059 usbdev || return
1060 exec 3>&1
1061 format=`$DIALOG --clear \
1062 --title " Select the filesystem " \
1063 --radiolist "\nPlease select the filesystem type to create.\n\n\
1064 The filesystem creation will erase all the data \
1065 in the USB key." 14 70 4 \
1066 "none" "Do not erase the USB key" on \
1067 "ext3" "Ext3 journaling filesystem" off \
1068 "ext2" "Ext2 filesystem" off \
1069 "fat32" "Windows FAT32 filesystem" off \
1070 2>&1 1>&3`
1071 retval=$?
1072 exec 3>&-
1073 [ $retval -eq 0 ] || return
1074 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
1075 tazusb gen-iso2usb "$ISO" $device
1076 }
1078 dokexec()
1079 {
1080 kexec -l $file || return
1081 quit "kexec -e"
1082 }
1084 runmemtest()
1085 {
1086 gotcdfile 'memtest*' && dokexec
1087 }
1089 runpxe()
1090 {
1091 gotcdfile '?pxe' && dokexec
1092 }
1094 flavdata()
1095 {
1096 [ $(get 1024 "$ISO") -eq 35615 ] && n=2 || n=$((1+$(get 417 "$ISO" 1)))
1097 [ $n -eq 4 ] && n=20
1098 ddq if="$ISO" bs=512 skip=$n count=20 | zcat 2>/dev/null
1099 }
1101 hasflavinfo()
1102 {
1103 [ "$(flavdata | ddq bs=1 count=8 | strings)" == \
1104 "07070100" ] && menuitem "$@"
1105 }
1107 showfavinfo()
1108 {
1109 mkdir -p /tmp/data
1110 flavdata | ( cd /tmp/data ; cpio -i )
1111 file=/tmp/data/info
1112 cat /tmp/data/*desc > $file
1113 if [ -s /tmp/data/*receipt ]; then
1114 echo "=== receipt ==="
1115 cat /tmp/data/*receipt
1116 fi >> $file
1117 for i in /tmp/data/*list* ; do
1118 echo "=== extra ${i#*list} files"
1119 cat $i
1120 done >> $file
1121 if [ "$1" ]; then
1122 cat $file
1123 else
1124 $DIALOG --clear \
1125 --title " Flavor info " \
1126 --textbox $file 0 0
1127 fi
1128 rm -rf /tmp/data
1129 }
1131 flavor()
1132 {
1133 name="$(flavdata | cpio -t 2> /dev/null | sed 's/.[a-z]*$//;q')"
1134 echo "Create ${name:=flavor}.flavor..."
1135 tazlito iso2flavor "$ISO" $name
1136 ls -l $name.flavor 2> /dev/null && return
1137 sleep 5
1138 [ "$1" ] && return
1139 echo -e "\rPress RETURN to continue."
1140 read n
1141 }
1143 if [ "$1" == "--build" ]; then #install-begin
1144 uuencode -m - < ifmem.bin | sed -e '/^ifmemcode$/r/dev/stdin' \
1145 -e '/^ifmemcode$/d' -i $0
1146 uuencode -m - < bootloader.bin | sed -e '/^bootloader$/r/dev/stdin' \
1147 -e '/^bootloader$/d' -e '/install-begin$/,/install-end$/d' -i $0
1148 exit
1149 fi #install-end
1150 parse_isolinux()
1151 {
1152 awk 'BEGIN { IGNORECASE=1 }
1153 function multi(n)
1154 {
1155 auto=$n
1156 for (--n; n < NF; n+=2) {
1157 s=$n
1158 if (s ~ /M$/) s = substr(s,0,length(s)-1)
1159 else s /= 1024
1160 sizes=int(s) " " sizes
1161 }
1162 next
1163 }
1164 {
1165 if ($1 == "LABEL") {
1166 label=$2
1167 if (auto == "") auto=label
1168 }
1169 if ($1 == "KERNEL" || $1 == "COM32") kernel[label]=$2
1170 if ($1 == "INITRD") initrd[label]=$2
1171 if ($1 == "APPEND") {
1172 i=2
1173 if (kernel[label] ~ "ifmem.c32") multi(3)
1174 if (kernel[label] ~ "c32box.c32") {
1175 if ($2 == "linux") { kernel[label]=$3; i=4 }
1176 if ($2 == "ifmem") multi(4)
1177 }
1178 if (kernel[label] ~ "ifcpu64.c32") { auto=$4; next }
1179 while (i <= NF) {
1180 if ($i ~ "^initrd=") initrd[label]=substr($i,8)
1181 else cmdline[label]=cmdline[label] " " $i
1182 i++
1183 }
1184 }
1185 }
1186 END {
1187 print "KERNEL=\"" kernel[auto] "\""
1188 print "INITRD=\"" initrd[auto] "\""
1189 print "CMDLINE=\"" substr(cmdline[auto],2) "\""
1190 print "SIZES=\"" sizes "\""
1191 }'
1192 }
1194 locase()
1195 {
1196 echo "$1" | tr [A-Z] [a-z]
1197 }
1199 ifmemcode()
1200 {
1201 uudecode <<EOT
1202 ifmemcode
1203 EOT
1204 }
1206 floppyset()
1207 {
1208 gotcdfile 'isolinux.cfg'
1209 $0 include $file | parse_isolinux > /tmp/var$$
1210 . /tmp/var$$
1211 [ -z "$KERNEL" ] && echo "Can't parse isolinux.cfg" && return
1212 for i in $media/$KERNEL $(dirname $file)/$KERNEL $media/$(locase $KERNEL) \
1213 $(dirname $file)/$(locase $KERNEL); do
1214 i="$(ls $i* | sed q)"
1215 [ -n "$i" ] && KERNEL=$i && break
1216 done
1217 rm -f /tmp/var$$
1218 [ $(get 514 $KERNEL 4) -eq 1400005704 ] || return
1219 n=$(($(get 497 $KERNEL 1)+1))
1220 ddq bs=512 count=$n if=$KERNEL of=/tmp/fd$$
1221 uudecode <<EOT | ddq of=/tmp/fd$$ conv=notrunc
1222 bootloader
1223 EOT
1224 pos=$(($n*512))
1225 if [ -n "$CMDLINE" ]; then
1226 echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> /tmp/fd$$
1227 bytes2bin $n | ddq conv=notrunc \
1228 bs=1 seek=497 count=1 of=/tmp/fd$$
1229 words2bin $pos | ddq conv=notrunc \
1230 bs=1 seek=34 count=2 of=/tmp/fd$$
1231 [ $(get 518 $KERNEL 4) -ge 514 ] &&
1232 words2bin 32768 9 | ddq conv=notrunc \
1233 bs=1 seek=552 count=4 of=/tmp/fd$$
1234 fi
1235 syssize=$(echo $(get 500 /tmp/fd$$ 4))
1236 ddq bs=512 skip=$n if=$KERNEL | cat - /dev/zero | \
1237 ddq bs=512 count=$((($syssize+31)/32)) conv=sync >> /tmp/fd$$
1238 base=$(stat -c %s /tmp/fd$$)
1239 len=
1240 if [ "$INITRD" ]; then
1241 l=0
1242 for i in ${INITRD//,/ }; do
1243 for j in $media/$i $(dirname $KERNEL)/$i $media/$(locase $i) \
1244 $(dirname $KERNEL)/$(locase $i); do
1245 j="$(ls $j* | sed q)"
1246 [ -n "$j" ] && i=$j && break
1247 done
1248 ddq if=$i >> /tmp/fd$$
1249 l=$(($l+$(stat -c %s $i)))
1250 r=$((4 - ($l % 4)))
1251 if [ $r -ne 4 ]; then
1252 ddq if=/dev/zero bs=1 count=$r >> /tmp/fd$$
1253 l=$(($l + $r))
1254 fi
1255 case "$i:$INITRD" in
1256 *rootfs.gz:*rootfs.gz,*) continue # loram
1257 esac
1258 len="$len $l"; l=0
1259 done
1260 rdadrs=${RDADRS:-$(((($syssize*16)+0x1F0000) & -4096))}
1261 words2bin $(($rdadrs & 0xFFFF)) $(($rdadrs >> 16)) | ddq \
1262 conv=notrunc bs=1 seek=536 count=4 of=/tmp/fd$$
1263 fi
1264 n=$(echo $len | wc -w)
1265 if [ $((494 - $(get 494 /tmp/fd$$))) -ge $(($n * 4)) ]; then
1266 i=$(($(get 494 /tmp/fd$$)))
1267 bytes2bin $(($i + ($n*4) - 256)) | ddq bs=1 conv=notrunc \
1268 seek=496 count=1 of=/tmp/fd$$
1269 else
1270 i=$(($pos + 0x1FC - ($n*4)))
1271 bytes2bin $(($i % 256)) $((i / 256)) 252 | ddq bs=1 \
1272 conv=notrunc seek=494 count=3 of=/tmp/fd$$
1273 s=$(($i - 2*$(echo "$SIZES" | wc -w)))
1274 p=$(($s - $(ifmemcode | wc -c)))
1275 ifmemcode | ddq bs=1 conv=notrunc seek=$p of=/tmp/fd$$
1276 words2bin $SIZES | ddq bs=1 conv=notrunc seek=$s of=/tmp/fd$$
1277 bytes2bin 154 $(($p%256)) $(($p/256)) 0 144 | \
1278 ddq bs=1 conv=notrunc seek=60 of=/tmp/fd$$
1279 fi
1280 for r in $len ; do
1281 words2bin $(($r & 0xFFFF)) $(($r >> 16)) | ddq conv=notrunc \
1282 bs=1 seek=$i count=4 of=/tmp/fd$$
1283 i=$(($i + 4))
1284 done
1285 split -b 1440k /tmp/fd$$ fd$$
1286 rm -f /tmp/fd$$
1287 n=1; i=0; r=0
1288 set -- $len
1289 ls fd$$* | while read file ; do
1290 if [ $i -gt $(($1+$base)) ]; then
1291 shift
1292 r=$(($r+100)); n=0; i=0; base=0
1293 fi
1294 ddq of=$file bs=18k seek=80 count=0
1295 i=$(($i+1474560))
1296 printf "mv %s fd%03d.img\n" $file $(($r+$n))
1297 n=$(($n+1))
1298 done | sh
1299 du -ch $PWD/fd???.img
1300 }
1302 quit()
1303 {
1304 umount -d $media
1305 rmdir $media
1306 ${1:-exit}
1307 }
1309 infoiso()
1310 {
1311 isoinfo -d -i "$ISO" > /tmp/isoinfo$$
1312 if [ -x "$(which iso2exe)" ]; then
1313 echo "----"
1314 iso2exe -l "$ISO"
1315 fi >> /tmp/isoinfo$$
1316 if [ "$1" ]; then
1317 cat /tmp/isoinfo$$
1318 else
1319 $DIALOG --clear \
1320 --title " Info ISO " \
1321 --textbox /tmp/isoinfo$$ 0 0
1322 fi
1323 rm -f /tmp/isoinfo$$
1324 }
1326 isotitle()
1327 {
1328 echo "$(blkid "$ISO" | sed 's/.*LABEL="\([^"]*\).*/\1/') $(stat \
1329 -c %y $media/.|sed 's/ .*//') $(basename "$ISO")"
1330 }
1332 if [ "$1" == "include" ]; then
1333 [ -s "$2" ] && cd $(dirname "$2") && awk -v exe=$0 \
1334 '{ if ($1 == "include") system(exe " include " $2); else print }' <"$2"
1335 exit
1336 fi
1337 ISO="${1:-/dev/null}"
1338 [ -z "$(isiso 2> /dev/null)" ] && echo "Usage : $0 file.iso" && exit 1
1339 media=/tmp/media$$
1340 mkdir -p $media
1341 mount -o loop,ro "$ISO" $media
1343 if [ "$2" == "list" ]; then
1344 sed '/^\$(.*") \\/!d;s/^\$(\(.*\)").*/\1"/' $0 | while read line; do
1345 eval $line
1346 echo
1347 done | sed '/^$/d;/"usbkey"/d'
1348 quit
1349 fi
1350 if grep -q "^$2()" $0; then
1351 exe=$2
1352 shift 2
1353 if [ -n "$(eval $(grep "\"$exe\"" $0 | sed \
1354 '/^\$/!d;s/.(\(.*\)[\t ]*".*"[\t ]*".*/\1/'))" ]; then
1355 isotitle
1356 grep "\"$exe\"" $0 | sed '/^\$/!d;s/.*"[\t ]*"\(.*\)".*/\1/'
1357 echo ----
1358 $exe "$@"
1359 fi
1360 quit
1361 fi
1363 while true; do
1364 cat > /tmp/dialog$$ <<EOT
1365 $DIALOG --clear \
1366 --title " $(isotitle) " \
1367 --menu "" -2 70 0 \
1368 $(cdfile 'README*' "readme" "Show the README file") \
1369 $(gotcustomconf "getcustomconf" "Get custom config") \
1370 $(gotisomd5 "isomd5" "Check the ISO image") \
1371 $(cdfile 'md5sum*' "md5" "Check the ISO files") \
1372 $(cdfile 'sha*sum*' "sha" "Check the ISO files") \
1373 $(xfile isoinfo "infoiso" "ISO image info") \
1374 $(cdfilex boot/bzImage "bootiso" "Boot the ISO image") \
1375 $(burnable "burniso" "Burn the ISO image") \
1376 $(blankable "blankcd" "Blank the CD/DVD") \
1377 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
1378 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
1379 $(gotposixovlzip "inst2zip" "ZIP installation archive (UMSDOS way)") \
1380 $(gotposixovlzip "insttaz2zip" "ZIP installation archive (TAZUSB way)") \
1381 $(gottazusb "usbkey" "USB key read/write installation") \
1382 $(ishybrid "usbbootkey" "USB boot key (read only)") \
1383 $(hasflavinfo "showfavinfo" "Show flavor extra info") \
1384 $(hasflavor "flavor" "Get flavor file") \
1385 $(cdfile isolinux.cfg "floppyset" "Boot floppy set") \
1386 $(hastazboot "tazboot" "Get tazboot.exe Linux loader") \
1387 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
1388 $(cdexe 'memtest*' "memtest" "Get Memtest86 DOS/EXE file") \
1389 $(cdfilef 'memtest*' "fdmemtest" "Create a Memtest86 boot floppy") \
1390 $(cdfilex 'memtest*' "runmemtest" "Start Memtest86") \
1391 $(cdexe '?pxe' "pxe" "Get SliTaz Web boot DOS/EXE utility") \
1392 $(cdfilef '?pxe' "fdpxe" "Create a SliTaz Web boot floppy") \
1393 $(cdfilex '?pxe' "runpxe" "Start the SliTaz Web boot utility") \
1394 $(misspkg "missing" "Install packages to get more options") \
1395 $(menuitem "quit" "Quit this utility")
1396 EOT
1397 exec 3>&1
1398 value=$(. /tmp/dialog$$ 2>&1 1>&3)
1399 retval=$?
1400 exec 3>&-
1401 rm -f /tmp/dialog$$
1402 [ $retval -eq 0 ] || quit
1403 $value
1404 done