wok view syslinux/stuff/iso2exe/taziso @ rev 18155

syslinux/taziso/floppyset: fix cmdline
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Jun 21 11:12:00 2015 +0200 (2015-06-21)
parents 0a22c10d35b2
children 37202ba4d7cd
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
202 mkdir -p $mnt/slitaz/boot $mnt/slitaz/mnt/dos
203 [ "$useposixovl" ] &&
204 if ! mount.posixovl -F $mnt/slitaz -- \
205 -oallow_other -odefault_permissions -osuid; then
206 echo "Can't install SliTaz. Abort."
207 sleep 5
208 return 1
209 fi
210 dotwait "Install root filesystem in /slitaz.."
211 if [ "$1" ]; then
212 ls_r /media/cdrom/boot/rootfs*gz | \
213 xargs cat > $mnt/slitaz/boot/rootfs.gz
214 tazusbinitfs $mnt/slitaz/boot/rootfs.gz $useposixovl
215 initrd=rootfs.gz
216 extraargs="/home=$(getuuid)/slitaz rdinit=/init1"
217 else
218 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
219 uncpio $i $mnt/slitaz
220 done
221 for i in $packages_list; do
222 tazpkg get-install $i --root=$mnt/slitaz
223 done
224 for i in $packages_dir/*.tazpkg; do
225 [ -s "$i" ] &&
226 tazpkg install $i --root=$mnt/slitaz
227 done
228 cp -a /etc/locale.conf $mnt/slitaz/etc 2> /dev/null
229 cp -a /etc/keymap.conf $mnt/slitaz/etc 2> /dev/null
230 mkinitrd $mnt/slitaz/boot/initrd $mnt/slitaz $useposixovl
231 initrd=initrd
232 extraargs="mount=$(getuuid) subroot=slitaz"
233 fi
234 echo -en "\nInstall boot files..."
235 for i in /media/cdrom/boot/bzImage /media/cdrom/boot/*pxe* \
236 /media/cdrom/boot/isolinux/he* /media/cdrom/boot/isolinux/opt* \
237 /media/cdrom/README /media/cdrom/boot/memtest* ; do
238 [ -s $i ] && cp $i $mnt/slitaz/boot
239 done
240 for i in $mnt/slitaz/boot/memtest $mnt/slitaz/boot/*pxe* ; do
241 [ $(get 0 $i 2> /dev/null || echo 0) -eq 23117 ] &&
242 mv $i $i.exe
243 done
244 gettazboot $mnt/slitaz/boot/tazboot.exe
245 unix2dos > $mnt/slitaz/boot/tazboot.cmd <<EOT
246 kernel=/slitaz/boot/bzimage
247 initrd=/slitaz/boot/$initrd
248 rw root=/dev/null $extraargs autologin
249 EOT
250 unix2dos $mnt/slitaz/boot/he* $mnt/slitaz/boot/opt* \
251 $mnt/slitaz/boot/README
252 [ -d $mnt/slitaz/usr/sbin -a ! -x $mnt/slitaz/usr/sbin/mount.posixovl ] &&
253 cp $(which mount.posixovl) $mnt/slitaz/usr/sbin
254 if "$useposixovl" && grep -qs " $mnt " /proc/mounts &&
255 [ ! -d $mnt/boot/grub ]; then
256 mkdir -p $mnt/boot/grub
257 echo -en "\nInstall grub in /boot/grub..."
258 cp -a /usr/lib/grub/*/* $mnt/boot/grub
259 cat > $mnt/boot/grub/menu.lst <<EOT
260 # /boot/grub/menu.lst: GRUB boot loader configuration.
262 # By default, boot the first entry.
263 default 0
265 # Boot automatically after 8 secs.
266 timeout 8
268 title Microsoft Windows
269 chainloader +1
271 EOT
272 dev=$(grep " $mnt " /proc/mounts | awk '{ print $1 }')
273 base=${dev//[0-9]/}
274 dd if=$base bs=32k count=1 of=$mnt/boot/grub/$(basename $base)
275 cat > $mnt/boot/grub/uninstall-grub.sh <<EOT
276 #!/bin/sh
278 [ -s /boot/grub/$(basename $base) ] &&
279 dd if=/boot/grub/$(basename $base) of=$base
280 EOT
281 grub-install --no-floppy --root-directory=$mnt $base
282 fi
283 if [ -s $mnt/boot/grub/menu.lst ] &&
284 ! grep -q /slitaz/boot/bzimage $mnt/boot/grub/menu.lst; then
285 echo -en "\nUpdate /boot/grub/menu/lst..."
286 cat >> $mnt/boot/grub/menu.lst <<EOT
287 title SliTaz GNU/Linux $(cat $mnt/slitaz/etc/slitaz-release)
288 kernel /slitaz/boot/bzimage rw root=/dev/null $extraargs autologin
289 initrd /slitaz/boot/$initrd
291 EOT
292 fi
293 rm -f /tmp/wait
294 [ "$useposixovl" ] && umount $mnt/slitaz
295 return 0
296 }
298 windev()
299 {
300 if [ -b "$1" ]; then
301 device=$1
302 elif [ "$1" ]; then
303 echo "Invalid Linux/Windows partition"
304 return 1
305 else
306 DEV="$(blkid | grep -iE "(msdos|vfat|ntfs|ext[234]|xfs|btrfs)" | sed 's/:.*//;s|/dev/||')"
307 [ "$DEV" ] || return
308 cat > /tmp/dialog$$ <<EOT
309 $DIALOG --clear \
310 --title " Select your Linux/Windows partition " \
311 --menu "\nPlease select the Linux/Windows partition according to its known size.
312 The data will be kept untouched.\n" \
313 17 70 8 \
314 $(for i in $DEV ; do
315 label="$(blkid | sed "/$i:/!d;s/.*://;s/[^ ]*UUID=[^ ]* //g;s/LABEL=//")"
316 echo -n "/dev/$i \"$(($(cat /sys/block/*/$i/size)/2048))MB $label\" "
317 done)
318 EOT
319 exec 3>&1
320 [ $? -eq 0 ] || return
321 device=$(. /tmp/dialog$$ 2>&1 1>&3)
322 exec 3>&-
323 rm -f /tmp/dialog$$
324 fi
325 mnt=/tmp/mnt$$
326 mkdir -p $mnt && mount $device $mnt
327 }
329 extra_packages()
330 {
331 packages_list=
332 packages_dir=
333 $DIALOG --clear \
334 --title " Extra packages " \
335 --defaultno --yesno \
336 "
337 Do you want to add extra packages ?
338 " 7 70
339 [ $? -eq 0 ] || return
340 [ -s /var/lib/tazpkg/packages.txt ] || tazpkg recharge
341 if [ -s /media/cdrom/boot/vmlinuz-$(uname -r) ]; then
342 cat > /tmp/dialog$$ <<EOT
343 $DIALOG --clear \
344 --title " Select the packages " \
345 --separate-output \
346 --cancel-label "Skip" \
347 --checklist "Please select the packages you want to install. Try with the first letter." \
348 23 78 20 \\
349 EOT
350 awk -F\| '{ printf "%s \"%s\" off ",$1,$3 }' \
351 /var/lib/tazpkg/packages.desc >> /tmp/dialog$$
352 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
353 [ $? -eq 0 ] && packages_list="$(cat /tmp/dialog.out$$)"
354 fi
355 cat > /tmp/dialog$$ <<EOT
356 $DIALOG --clear \
357 --title "Please select the directory with every custom package to install." \
358 --cancel-label "Skip" \
359 --dselect $PWD 13 78
360 EOT
361 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
362 [ $? -eq 0 ] && packages_dir="$(cat /tmp/dialog.out$$)"
363 rm -f /tmp/dialog$$ /tmp/dialog.out$$
364 }
366 _install()
367 {
368 extra_packages
369 $DIALOG --clear \
370 --title " SliTaz UMSDOS way installation " \
371 --yes-label "Install" --yesno \
372 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
373 Linux/DOS/Windows partition. You can see your files from /mnt/dos.\n\n
374 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
375 To uninstall SliTaz, you have only to remove this directory.
376 The file \\boot.ini or \\config.sys may be modified too.\n\n
377 SliTaz may run slowly on 'UMSDOS way' installation due to the
378 posixovl filesystem. The 'TAZUSB way' installation runs faster.\n\n
379 To do a traditional installation with disk partitioning,
380 start SliTaz Live with 'SliTaz RAM boot' menu.\n
381 " 19 70
382 [ $? -eq 0 ] || return
383 doinstall
384 }
386 readtazbootconf()
387 {
388 kernel="$(sed '/^kernel=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
389 initrd="$(sed '/^initrd=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
390 cmdline="$(sed '/^kernel=/d;/^initrd=/d' $mnt/slitaz/boot/tazboot.cmd)"
391 }
393 bootinstalled()
394 {
395 [ "$(which kexec)" ] || return
396 [ -x $mnt/slitaz$1 ] || return
397 [ -s $mnt/slitaz/boot/tazboot.cmd ] || return
398 readtazbootconf
399 kexec -l $kernel --initrd $initrd --command-line "$cmdline" || return
400 umount $mnt
401 rm -rf $mnt
402 umount -d /media/cdrom
403 kexec -e
404 }
406 mkzip()
407 {
408 device=
409 packages_list=
410 packages_dir=
411 mnt=/tmp/mnt$$
412 mkdir -p $mnt
413 $1 $2 || return
414 for i in bootlace.com grubinst.exe grldr ; do
415 wget -O $mnt/slitaz/boot/$i http://mirror.slitaz.org/boot/$i
416 done
417 readtazbootconf
418 cat > $mnt/slitaz/boot/menu.lst <<EOT
419 title SliTaz
420 kernel $kernel $cmdline
421 initrd $initrd
423 EOT
424 while read file title; do
425 file=$(ls $mnt/slitaz/boot/*$file* 2> /dev/null)
426 [ -s "$file" ] && cat >> $mnt/slitaz/boot/menu.lst <<EOT
427 title $title
428 kernel ${file#$mnt}
430 EOT
431 done <<EOT
432 memtest MemTest
433 pxe Web boot
434 EOT
435 unix2dos $mnt/slitaz/boot/menu.lst
436 unix2dos > $mnt/slitaz/boot/install.txt <<EOT
437 For DOS users (real mode only):
439 Start SliTaz with \\slitaz\\boot\\tazboot.exe
442 For NT/2000/XP users:
444 1- Move the files grldr and menu.lst into the root directory
446 C:\\> copy \\slitaz\\boot\\grldr \\
447 C:\\> copy \\slitaz\\boot\\menu.lst \\
449 2- Remove boot.ini attributes
451 C:\\> attrib -r -h -s boot.ini
453 3- Append the following line to boot.init
455 C:\\grldr="slitaz"
457 4- Restore boot.ini attributes
459 C:\\> attrib +r +h +s boot.ini
461 See http://diddy.boot-land.net/grub4dos/files/README_GRUB4DOS.txt
462 and http://xpt.sourceforge.net/techdocs/nix/disk/boot/boot07-GrubForDosInfo/ar01s03.html
463 EOT
464 ( cd $mnt ; echo 'See \slitaz\boot\install.txt to launch SliTaz.' | \
465 zip -zr9 $(basename $ISO .iso).zip slitaz )
466 [ "$(which advzip)" ] && advzip -z4 $mnt/*.zip
467 mv $mnt/*.zip .
468 ls -l $PWD/$(basename $ISO .iso).zip
469 umount $mnt
470 rm -rf $mnt
471 }
473 install()
474 {
475 windev $1 || return
476 packages_list=
477 packages_dir=
478 if [ "$1" ]; then
479 doinstall
480 else
481 _install && bootinstalled /sbin/init
482 fi
483 umount $mnt
484 rm -rf $mnt
485 }
487 inst2zip()
488 {
489 if [ "$1" ]; then
490 mkzip doinstall
491 else
492 mkzip _install
493 fi
494 }
496 _installtaz()
497 {
498 $DIALOG --clear \
499 --title " SliTaz TAZUSB way installation " \
500 --yes-label "Install" --yesno \
501 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
502 Linux/DOS/Windows partition. You can see your files from /mnt/dos.\n\n
503 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
504 To uninstall SliTaz, you have only to remove this directory.
505 The file \\boot.ini or \\config.sys may be modified too.\n\n
506 The filesystem is loaded entirely into memory upon boot to
507 increase responsiveness. Only /home lands on hard disk.\n\n
508 To do a traditional installation with disk partitioning,
509 start SliTaz Live with 'SliTaz RAM boot' menu.\n
510 " 19 70
511 [ $? -eq 0 ] || return
512 doinstall tazusblike
513 }
515 installtaz()
516 {
517 windev $1 || return
518 packages_list=
519 packages_dir=
520 if [ "$1" ]; then
521 doinstall tazusblike
522 else
523 _installtaz && bootinstalled /boot/bzimage
524 fi
525 umount $mnt
526 rm -rf $mnt
527 }
529 insttaz2zip()
530 {
531 if [ "$1" ]; then
532 mkzip doinstall tazusblike
533 else
534 mkzip _installtaz
535 fi
536 }
538 bootiso()
539 {
540 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
541 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
542 cat $i
543 n=$((4 - ($(stat -c %s $i) % 4)))
544 [ $n -eq 4 ] || dd if=/dev/zero bs=1 count=$n
545 done > /tmp/initrd$$
546 kernel=/media/cdrom/boot/bzImage
547 grep -q ' lm ' /proc/cpuinfo && [ -s ${kernel}64 ] && kernel=${kernel}64
548 . /etc/locale.conf
549 kexec -l $kernel --initrd /tmp/initrd$$ --command-line \
550 "root=/dev/null autologin lang=$LANG kmap=$(cat /etc/keymap.conf)" &&
551 umount -d /media/cdrom
552 rm -f /tmp/initrd$$
553 kexec -e
554 }
556 tazboot()
557 {
558 if [ -z "$1" ]; then
559 $DIALOG --clear \
560 --title " SliTaz bootloader for DOS " \
561 --yes-label "Install" --yesno \
562 "\nThe file TAZBOOT.EXE will be created in the top directory. It supports
563 any linux kernel, multiple initramfs, a kernel command line and
564 an ISO image file loopback (retrieves files from an ISO file).\n\n
565 Usage: tazboot.exe [[@commands]|[kernel=<bzimage>]
566 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] cmdline args ...]\n\n
567 Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\
568 Examples for tazboot.cmd:\n\n\
569 bootfrom=\\isos\\slitaz-4.0.iso\n\
570 kernel=boot/bzImage\n\
571 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
572 rw root=/dev/null autologin\n\n\
573 kernel=\\slitaz\\vmlinuz root=/dev/sda5 ro\n\n
574 Unlike GRUB4DOS, it doesn't require unfragmented ISO image files.\n
575 " 24 78
576 [ $? -eq 0 ] || return
577 fi
578 gettazboot tazboot.exe
579 ls -l $PWD/tazboot.exe
580 }
582 md5()
583 {
584 dotwait "Checking files"
585 ( cd /media/cdrom ; ${md5sum:-md5sum -c md5sum*} | sort ) > /tmp/data
586 unset md5sum
587 rm -f /tmp/wait
588 if [ "$1" ]; then
589 cat /tmp/data
590 else
591 $DIALOG --clear \
592 --title " Checked files " \
593 --textbox /tmp/data 24 78
594 fi
595 rm -f /tmp/data
596 }
598 gotcdfile()
599 {
600 for i in "/media/cdrom/$1" "/media/cdrom/*/$1" \
601 "/media/cdrom/*/isolinux/$1" ; do
602 file=$(ls $i 2> /dev/null | sed q)
603 [ -s "$file" ] && break
604 done
605 }
607 sha()
608 {
609 gotcdfile 'sha*sum*'
610 sha=$(basename $file)
611 md5sum="${sha%sum*}sum -c ${file#/media/cdrom/}"
612 md5 $@
613 }
615 readme()
616 {
617 gotcdfile 'README*'
618 if [ "$1" ]; then
619 cat $file
620 else
621 $DIALOG --clear \
622 --title " Readme " \
623 --textbox $file 24 78
624 fi
625 }
627 bzimage()
628 {
629 if [ -z "$1" ]; then
630 $DIALOG --clear \
631 --title " Create linux.exe ? " \
632 --yes-label "Install" --yesno \
633 "\nLinux.exe launches the linux kernel under DOS (in real mode only).
634 The cmdline arguments are supported except initrd=,
635 vga= (you can try 'rdev -v') and mem= (partially).
636 \nExample:\nC:\\> linux.exe root=/dev/hda2 ro panic=60\n
637 " 12 70
638 [ $? -eq 0 ] || return
639 fi
640 cp /media/cdrom/boot/bzImage linux.exe
641 ls -l $PWD/linux.exe
642 }
644 memtest()
645 {
646 if [ -z "$1" ]; then
647 $DIALOG --clear \
648 --title " Create memtest.exe ? " \
649 --yes-label "Install" --yesno \
650 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
651 computers. BIOS based memory tests are a quick, cursory check and often
652 miss many of the failures that are detected by Memtest86.\n
653 " 12 70
654 [ $? -eq 0 ] || return
655 fi
656 gotcdfile 'memtest*' && cp $file memtest.exe
657 ls -l $PWD/memtest.exe
658 }
660 mkfat12()
661 {
662 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return
663 J=$(($(get 3 $1 1) + 0x02))
664 R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32))
665 [ $R -lt 2500 ] || return
666 [ $((($(get 500 $1)-1) & 31)) -lt 30 ] &&
667 ddq if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0
668 G="18 0 2 0 0 0 0 0"
669 [ $J -gt 25 ] || G=""
670 F=0
671 for i in 1 2 3; do
672 F=$((((2880-$R-$F-$F)*3+1023)/1024))
673 done
674 bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \
675 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \
676 $G | ddq bs=1 of=/dev/fd0
677 ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0
678 for i in $R $(($R+$F)) ; do
679 bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0
680 done
681 echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0
682 }
684 mkfloppy()
685 {
686 dotwait "Create a $(basename $1) boot floppy"
687 ddq if=$1 of=/dev/fd0
688 mkfat12 $1
689 rm -f /tmp/wait
690 }
692 fdmemtest()
693 {
694 if [ -z "$1" ]; then
695 $DIALOG --clear \
696 --title " Create a Memtest86 boot floppy " \
697 --yes-label "Create floppy" --yesno \
698 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
699 computers. BIOS based memory tests are a quick, cursory check and often
700 miss many of the failures that are detected by Memtest86.\n\n
701 Please insert a blank disk in floppy drive.\n
702 " 12 70
703 [ $? -eq 0 ] || return
704 fi
705 gotcdfile 'memtest*' && mkfloppy $file
706 }
708 pxe()
709 {
710 gotcdfile '?pxe'
711 if [ -z "$1" ]; then
712 $DIALOG --clear \
713 --title " Create $(basename $file).exe ? " \
714 --yes-label "Install" --yesno \
715 "\nBoot your operating system from the internet and enjoy a full system
716 working entirely in RAM with speed and stability in mind. The Linux Kernel
717 and the complete SliTaz compressed root filesystem will be loaded into RAM
718 from the Web using PXE and HTTP protocols.\n
719 " 12 70
720 [ $? -eq 0 ] || return
721 fi
722 cp $file $(basename $file).exe
723 ls -l $PWD/$(basename $file).exe
724 }
726 fdpxe()
727 {
728 if [ -z "$1" ]; then
729 $DIALOG --clear \
730 --title " Create a SliTaz Web boot floppy " \
731 --yes-label "Create floppy" --yesno \
732 "\nBoot your operating system from the internet and enjoy a full system
733 working entirely in RAM with speed and stability in mind. The Linux Kernel
734 and the complete SliTaz compressed root filesystem will be loaded into RAM
735 from the Web using PXE and HTTP protocols.\n\n
736 Please insert a blank disk in floppy drive.\n
737 " 12 70
738 [ $? -eq 0 ] || return
739 fi
740 gotcdfile '?pxe' && mkfloppy $file
741 }
743 menuitem()
744 {
745 [ "$3" ] && shift
746 echo -en "\"$1\" \"$2\""
747 }
749 gotposixovl()
750 {
751 mount.posixovl 2>&1 | grep -qi usage && menuitem "$@"
752 }
754 gotposixovlzip()
755 {
756 [ "$(which zip)" ] && gotposixovl "$1" "$2"
757 }
759 xfile()
760 {
761 [ "$(which $1)" ] && menuitem "$@"
762 }
764 cdfile()
765 {
766 gotcdfile "$1" && menuitem "$@"
767 }
769 isbzImage()
770 {
771 [ $(get 514 $file 4) -eq 1400005704 ] &&
772 [ $(($(get 529 $file 1) & 1)) -eq 1 ]
773 }
775 cdfilex()
776 {
777 gotcdfile "$1" && [ "$(which kexec)" ] && isbzImage && menuitem "$@"
778 }
780 cdfilef()
781 {
782 [ -e /sys/block/fd0 ] && cdfile "$@"
783 }
785 cdexe()
786 {
787 gotcdfile "$1" &&
788 [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] &&
789 menuitem "$@"
790 }
792 misspkg()
793 {
794 for i in zip kexec-tools posixovl cdrkit ; do
795 [ -d /var/lib/tazpkg/installed/$i/ ] && continue
796 [ "$1" != "install" ] && menuitem "$@" && return
797 tazpkg get-install $i
798 done
799 }
801 missing()
802 {
803 misspkg install
804 }
806 ishybrid()
807 {
808 [ $(get 510 $ISO) -eq 43605 ] || return
809 C=$((2048*$(get $(((17*2048) + 71)) $ISO 4)))
810 [ $(get $C $ISO 4) -eq 1 ] || return
811 [ $(get $(($C+30)) $ISO 4) -eq $((0x88AA55)) ] || return
812 C=$((2048*$(get $(($C+40)) $ISO 4)))
813 [ $(get $(($C+64)) $ISO 4) -eq 1886961915 ] && menuitem "$@"
814 }
816 isiso()
817 {
818 [ $(get 32769 $ISO 4) -eq 808469571 ] && menuitem "$@"
819 }
821 hastazboot()
822 {
823 [ $(get 0 $ISO) -eq 23117 ] && menuitem "$@"
824 }
826 burnable()
827 {
828 [ "$(sed '/Can wr.*1$/!d' /proc/sys/dev/cdrom/info)" ] && menuitem "$@"
829 }
831 blankable()
832 {
833 [ "$(sed '/Can wr.*RW.*1$/!d' /proc/sys/dev/cdrom/info)" ] && menuitem "$@"
834 }
836 burniso()
837 {
838 wodim -v speed=$(fgrep "drive speed" /proc/sys/dev/cdrom/info | cut -f3) \
839 -eject -multi "$ISO"
840 }
842 blankcd()
843 {
844 wodim -v -blank=fast
845 }
847 gotisomd5()
848 {
849 [ "$(which md5sum 2> /dev/null)" ] &&
850 [ $(get 0 $ISO) -eq 23117 ] &&
851 [ $(get 18 $ISO) -ne 0 ] && menuitem "$@"
852 }
854 isomd5()
855 {
856 dotwait "Checking iso image"
857 [ "$(ddq if=$ISO bs=2k skip=16 \
858 count=$(echo $(get 32848 $ISO 4)) | md5sum)" == \
859 "$(ddq if=$ISO bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
860 sed 's/ //g') -" ] && echo "OK" || echo "ERROR"
861 echo -en "\rChecking iso hybrid boot..."
862 n=$(($(get 2 $ISO)-1+($(get 4 $ISO)-1)*512))
863 if [ $n -lt 40000 -a $n -gt 32768 ]; then
864 s=$(get 0 $ISO 2 $n | awk '{ i+= $0 } END { print i }')
865 [ $(((1+$s+$(get $(($n+1)) $ISO 1)) % 65536)) -eq 0 ] &&
866 echo "OK" || echo "ERROR"
867 fi
868 rm -f /tmp/wait
869 [ "$1" ] && return 0
870 echo -e "\rPress RETURN to continue."
871 read n
872 }
874 usbdev()
875 {
876 dotwait "Wait 5 seconds for USB devices"
877 sleep 5
878 rm -f /tmp/wait
879 DEV="$(grep -l 1 /sys/block/*/removable | \
880 sed 's|/sys/block/\(.*\)/removable|\1|')"
881 grep -qs 1 /sys/block/$DEV/ro && return
882 [ "$DEV" ] || return
883 cat > /tmp/dialog$$ <<EOT
884 $DIALOG --clear \
885 --title " Select your USB key " \
886 --menu "\nPlease select the USB key according to its known size.\n\n" \
887 14 70 4 \
888 $(for i in $DEV ; do
889 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
890 done) \
892 EOT
893 exec 3>&1
894 device=$(. /tmp/dialog$$ 2>&1 1>&3)
895 rm -f /tmp/dialog$$
896 retval=$?
897 exec 3>&-
898 rm -f /tmp/dialog$$
899 [ $retval -eq 0 ]
900 }
902 tazusbmsg()
903 {
904 [ "$(which tazusb 2> /dev/null)" ] || return
905 echo "You should choose 'USB key read/write installation' to be
906 able to save the package updates or your own configuration and data files.\n\n"
907 }
909 usbbootkey()
910 {
911 if [ -b "$1" ]; then
912 device=$1
913 elif [ "$1" ]; then
914 echo "Invalid USB key device"
915 return 1
916 else
917 $DIALOG --clear \
918 --title " Create a USB boot key " \
919 --yes-label "Continue" --yesno \
920 "\nThe USB key will be used like a CD-ROM. You will not be able to write
921 any data on the boot partition.\n\n
922 An extra FAT32 partition will be created with the remaining free space.\n\n
923 $(tazusbmsg)Please plug your USB stick in now.\n
924 " 16 70
925 [ $? -eq 0 ] || return
926 usbdev || return
928 # perform dd in progress bar
929 max=$(($(stat -c %s $ISO)/2048))
930 i=0; ddq if=$ISO bs=1024k | (
931 while ddq bs=1024k count=1 ; do
932 i=$(($i + 1))
933 [ $i -gt $max ] && break
934 echo $((($i*100)/$max)) | dialog --gauge \
935 " The ISO image transfer can be long. Please wait..." \
936 6 70 0 > /dev/tty 2>&1
937 done ) > $device
938 fi
940 # partition + fat32 format for the remaining space
941 for p in 0 16; do
942 get $((450+$p)) $device 2 12 | xargs echo | {
943 read dx cx ol oh ll lh
944 [ $dx -eq $((0x3F17)) ] || continue
945 cx=$(($cx & 0xFF00))
946 ofs=$(($ll+($lh<<16)))
947 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
948 m=$(($cx+($n/8)))
949 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
950 m=$((($m & 0xFF00)+(($m>>16)<<6)))
951 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
952 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
953 ddq bs=1 seek=$((462-$p)) of=$device
954 if [ "$(which mkdosfs 2> /dev/null)" ]; then
955 losetup -o $((512*$ofs)) /dev/loop2 $device
956 mkdosfs -n "SLITAZ BOOT" /dev/loop2
957 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
958 ddq bs=1 seek=28 of=/dev/loop2
959 sync
960 losetup -d /dev/loop2
961 fi
962 }
963 done
964 }
966 usbkey()
967 {
968 $DIALOG --clear \
969 --title " Create a SliTaz USB key " \
970 --yes-label "Continue" --yesno \
971 "\nUnlike a hard drive install, the filesystem is kept in a compressed
972 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
973 This should increase responsiveness, protect the filesystem against
974 accidental corruption and reduce read/writes to the USB drive.
975 Once setup, the tazusb utility can rewrite the root filesystem
976 with any changes you have made since booting up,
977 giving the effective benefits of a hard drive install.\n\n
978 /home is mounted on boot using the UUID of your particular flash drive.
979 Unlike a device name, the UUID has the benefit of never changing from machine
980 to machine.\n\n
981 Please plug your USB stick in now.\n
982 " 19 70
983 [ $? -eq 0 ] || return
984 usbdev || return
985 exec 3>&1
986 format=`$DIALOG --clear \
987 --title " Select the filesystem " \
988 --radiolist "\nPlease select the filesystem type to create.\n\n\
989 The filesystem creation will erase all the data \
990 in the USB key." 14 70 4 \
991 "none" "Do not erase the USB key" on \
992 "ext3" "Ext3 journaling filesystem" off \
993 "ext2" "Ext2 filesystem" off \
994 "fat32" "Windows FAT32 filesystem" off \
995 2>&1 1>&3`
996 retval=$?
997 exec 3>&-
998 [ $retval -eq 0 ] || return
999 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
1000 tazusb gen-iso2usb $ISO $device
1003 dokexec()
1005 kexec -l $file || return
1006 umount -d /media/cdrom
1007 kexec -e
1010 runmemtest()
1012 gotcdfile 'memtest*' && dokexec
1015 runpxe()
1017 gotcdfile '?pxe' && dokexec
1020 flavdata()
1022 [ $(get 1024 $ISO) -eq 35615 ] && n=2 || n=$((1+$(get 417 $ISO 1)))
1023 dd if=$ISO bs=512 skip=$n count=20 2>/dev/null | zcat 2>/dev/null
1026 hasflavinfo()
1028 [ "$(flavdata | dd bs=1 count=8 2> /dev/null | strings)" == \
1029 "07070100" ] && menuitem "$@"
1032 showfavinfo()
1034 mkdir -p /tmp/data
1035 flavdata | ( cd /tmp/data ; cpio -i )
1036 file=/tmp/data/info
1037 cat /tmp/data/*desc > $file
1038 for i in /tmp/data/*list* ; do
1039 echo "=== extra ${i#*list} files"
1040 cat $i
1041 done >> $file
1042 if [ "$1" ]; then
1043 cat $file
1044 else
1045 $DIALOG --clear \
1046 --title " Flavor info " \
1047 --textbox $file 24 78
1048 fi
1049 rm -rf /tmp/data
1052 if [ "$1" == "--build" ]; then #install-begin
1053 uuencode -m - < ifmem.bin | sed -e '/^ifmemcode$/r/dev/stdin' \
1054 -e '/^ifmemcode$/d' -i $0
1055 uuencode -m - < bootloader.bin | sed -e '/^bootloader$/r/dev/stdin' \
1056 -e '/^bootloader$/d' -e '/install-begin$/,/install-end$/d' -i $0
1057 exit
1058 fi #install-end
1059 parse_isolinux()
1061 awk 'BEGIN { IGNORECASE=1 }
1062 function multi(n)
1064 auto=$n
1065 for (--n; n < NF; n+=2) {
1066 s=$n
1067 if (s ~ /M$/) s = substr(s,0,length(s)-1)
1068 else s /= 1024
1069 sizes=int(s) " " sizes
1071 next
1074 if ($1 == "LABEL") {
1075 label=$2
1076 if (auto == "") auto=label
1078 if ($1 == "KERNEL" || $1 == "COM32") kernel[label]=$2
1079 if ($1 == "INITRD") initrd[label]=$2
1080 if ($1 == "APPEND") {
1081 i=2
1082 if (kernel[label] ~ "ifmem.c32") multi(3)
1083 if (kernel[label] ~ "c32box.c32") {
1084 if ($2 == "linux") { kernel[label]=$3; i=4 }
1085 if ($2 == "ifmem") multi(4)
1087 if (kernel[label] ~ "ifcpu64.c32") { auto=$4; next }
1088 while (i <= NF) {
1089 if ($i ~ "^initrd=") initrd[label]=substr($i,8)
1090 else cmdline[label]=cmdline[label] " " $i
1091 i++
1095 END {
1096 print "KERNEL=\"" kernel[auto] "\""
1097 print "INITRD=\"" initrd[auto] "\""
1098 print "CMDLINE=\"" substr(cmdline[auto],2) "\""
1099 print "SIZES=\"" sizes "\""
1100 }'
1103 locase()
1105 echo "$1" | tr [A-Z] [a-z]
1108 ifmemcode()
1110 uudecode <<EOT
1111 ifmemcode
1112 EOT
1115 floppyset()
1117 gotcdfile isolinux.cfg
1118 parse_isolinux < $file > /tmp/var$$
1119 . /tmp/var$$
1120 rm -f /tmp/var$$
1121 [ -e /media/cdrom/$KERNEL ] || KERNEL=$(locase $KERNEL)
1122 [ $(get 514 /media/cdrom/$KERNEL 4) -eq 1400005704 ] || return
1123 n=$(($(get 497 /media/cdrom/$KERNEL 1)+1))
1124 ddq bs=512 count=$n if=/media/cdrom/$KERNEL of=/tmp/fd$$
1125 uudecode <<EOT | ddq of=/tmp/fd$$ conv=notrunc
1126 bootloader
1127 EOT
1128 pos=$(($n*512))
1129 if [ -n "$CMDLINE" ]; then
1130 echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> /tmp/fd$$
1131 bytes2bin $n | ddq conv=notrunc \
1132 bs=1 seek=497 count=1 of=/tmp/fd$$
1133 words2bin $pos | ddq conv=notrunc \
1134 bs=1 seek=34 count=2 of=/tmp/fd$$
1135 [ $(get 518 /media/cdrom/$KERNEL 4) -ge 514 ] &&
1136 words2bin 32768 9 | ddq conv=notrunc \
1137 bs=1 seek=552 count=4 of=/tmp/fd$$
1138 fi
1139 syssize=$(echo $(get 500 /tmp/fd$$ 4))
1140 ddq bs=512 skip=$n if=/media/cdrom/$KERNEL | cat - /dev/zero | \
1141 ddq bs=512 count=$((($syssize+31)/32)) conv=sync >> /tmp/fd$$
1142 base=$(stat -c %s /tmp/fd$$)
1143 len=
1144 if [ "$INITRD" ]; then
1145 l=0
1146 for i in ${INITRD//,/ }; do
1147 [ -e /media/cdrom/$i ] || i=$(locase $i)
1148 ddq if=/media/cdrom/$i >> /tmp/fd$$
1149 l=$(($l+$(stat -c %s /media/cdrom/$i)))
1150 r=$((4 - ($l % 4)))
1151 if [ $r -ne 4 ]; then
1152 ddq if=/dev/zero bs=1 count=$r >> /tmp/fd$$
1153 l=$(($l + $r))
1154 fi
1155 case "$i:$INITRD" in
1156 *rootfs.gz:*rootfs.gz,*) continue # loram
1157 esac
1158 len="$len $l"; l=0
1159 done
1160 rdadrs=${RDADRS:-$(((($syssize*16)+0x1F0000) & -4096))}
1161 words2bin $(($rdadrs & 0xFFFF)) $(($rdadrs >> 16)) | ddq \
1162 conv=notrunc bs=1 seek=536 count=4 of=/tmp/fd$$
1163 fi
1164 n=$(echo $len | wc -w)
1165 if [ $((494 - $(get 494 /tmp/fd$$))) -ge $(($n * 4)) ]; then
1166 i=$(($(get 494 /tmp/fd$$)))
1167 bytes2bin $(($i + ($n*4) - 256)) | ddq bs=1 conv=notrunc \
1168 seek=496 count=1 of=/tmp/fd$$
1169 else
1170 i=$(($pos + 0x1FC - ($n*4)))
1171 bytes2bin $(($i % 256)) $((i / 256)) 252 | ddq bs=1 \
1172 conv=notrunc seek=494 count=3 of=/tmp/fd$$
1173 s=$(($i - 2*$(echo "$SIZES" | wc -w)))
1174 p=$(($s - $(ifmemcode | wc -c)))
1175 ifmemcode | ddq bs=1 conv=notrunc seek=$p of=/tmp/fd$$
1176 words2bin $SIZES | ddq bs=1 conv=notrunc seek=$s of=/tmp/fd$$
1177 bytes2bin 154 $(($p%256)) $(($p/256)) 0 144 | \
1178 ddq bs=1 conv=notrunc seek=60 of=/tmp/fd$$
1179 fi
1180 for r in $len ; do
1181 words2bin $(($r & 0xFFFF)) $(($r >> 16)) | ddq conv=notrunc \
1182 bs=1 seek=$i count=4 of=/tmp/fd$$
1183 i=$(($i + 4))
1184 done
1185 split -b 1440k /tmp/fd$$ fd$$
1186 rm -f /tmp/fd$$
1187 n=1; i=0; r=0
1188 set -- $len
1189 ls fd$$* | while read file ; do
1190 if [ $i -gt $(($1+$base)) ]; then
1191 shift
1192 r=$(($r+100)); n=0; i=0; base=0
1193 fi
1194 ddq of=$file bs=18k seek=80 count=0
1195 i=$(($i+1474560))
1196 printf "mv %s fd%03d.img\n" $file $(($r+$n))
1197 n=$(($n+1))
1198 done | sh
1199 ls fd???.img
1202 quit()
1204 umount -d /media/cdrom
1205 exit
1208 ISO="${1:-/dev/null}"
1209 [ -z "$(isiso 2> /dev/null)" ] && echo "Usage : $0 file.iso" && exit 1
1210 mount -o loop,ro $ISO /media/cdrom
1212 if [ "$2" == "list" ]; then
1213 sed '/^\$(.*") \\/!d;s/^\$(\(.*\)").*/\1"/' $0 | while read line; do
1214 eval $line
1215 echo
1216 done | sed '/^$/d;/"usbkey"/d'
1217 quit
1218 fi
1219 if grep -q "^$2()" $0; then
1220 exe=$2
1221 shift 2
1222 if [ -n "$(eval $(grep "\"$exe\"" $0 | sed \
1223 '/^\$/!d;s/.(\(.*\)[\t ]*".*"[\t ]*".*/\1/'))" ]; then
1224 grep "\"$exe\"" $0 | sed '/^\$/!d;s/.*"[\t ]*"\(.*\)".*/\1/'
1225 echo ----
1226 $exe "$@"
1227 fi
1228 quit
1229 fi
1231 while true; do
1232 cat > /tmp/dialog$$ <<EOT
1233 $DIALOG --clear \
1234 --title " SliTaz ISO tool " \
1235 --menu "" 23 70 17 \
1236 $(cdfile 'README*' "readme" "Show the README file") \
1237 $(gotisomd5 "isomd5" "Check the ISO image") \
1238 $(cdfile 'md5sum*' "md5" "Check the ISO files") \
1239 $(cdfile 'sha*sum*' "sha" "Check the ISO files") \
1240 $(cdfilex boot/bzImage "bootiso" "Boot the ISO image") \
1241 $(burnable "burniso" "Burn the ISO image") \
1242 $(blankable "blankcd" "Blank the CD/DVD") \
1243 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
1244 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
1245 $(gotposixovlzip "inst2zip" "ZIP installation archive (UMSDOS way)") \
1246 $(gotposixovlzip "insttaz2zip" "ZIP installation archive (TAZUSB way)") \
1247 $(xfile tazusb "usbkey" "USB key read/write installation") \
1248 $(ishybrid "usbbootkey" "USB boot key (read only)") \
1249 $(hasflavinfo "showfavinfo" "Show flavor extra info") \
1250 $(cdfile isolinux.cfg "floppyset" "Boot floppy set") \
1251 $(hastazboot "tazboot" "Get tazboot.exe Linux loader") \
1252 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
1253 $(cdexe 'memtest*' "memtest" "Get Memtest86 DOS/EXE file") \
1254 $(cdfilef 'memtest*' "fdmemtest" "Create a Memtest86 boot floppy") \
1255 $(cdfilex 'memtest*' "runmemtest" "Start Memtest86") \
1256 $(cdexe '?pxe' "pxe" "Get SliTaz Web boot DOS/EXE utility") \
1257 $(cdfilef '?pxe' "fdpxe" "Create a SliTaz Web boot floppy") \
1258 $(cdfilex '?pxe' "runpxe" "Start the SliTaz Web boot utility") \
1259 $(misspkg "missing" "Install packages to get more options") \
1260 $(menuitem "quit" "Quit this utility")
1261 EOT
1262 exec 3>&1
1263 value=$(. /tmp/dialog$$ 2>&1 1>&3)
1264 retval=$?
1265 exec 3>&-
1266 rm -f /tmp/dialog$$
1267 [ $retval -eq 0 ] || break
1268 $value
1269 done