wok view syslinux/stuff/iso2exe/init @ rev 19510

syslinux/taziso: hide some error messages
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Nov 21 13:31:22 2016 +0100 (2016-11-21)
parents 2547fda51451
children f01ec3e34a08
line source
1 #!/bin/sh
3 DIALOG=dialog
5 ddq()
6 {
7 dd $@ 2> /dev/null
8 }
10 get()
11 {
12 od -v -j $1 -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An $2 2>/dev/null ||
13 hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" $2
14 }
16 getarg()
17 {
18 sed "/$1=/!d;s/.*$1=\\([^ ]*\\).*/\\1/" /proc/cmdline
19 }
21 clear()
22 {
23 echo -e "\x1B[1;1H\x1B[J"
24 }
26 xless()
27 {
28 [ $(wc -l < "$1") -gt 22 ] &&
29 sed 's/..3.;4.m/===/g;$s/.*/&\n---\nPress q to continue/' "$1" | less ||
30 { cat "$1"
31 [ "$2" ] || return
32 echo -e "$2"
33 read n
34 }
35 }
37 tinydialog()
38 {
39 clear
40 label=""
41 while [ "$1" ]; do
42 case "$1" in
43 --title) title=" \x1B[30;47m$2\x1B[37;40m\n"
44 echo -e $title; shift ;;
45 --yes-label) label="$2" ; shift ;;
46 --textbox)
47 xless "$2" "\nPress RETURN to continue."
48 break;;
49 --gauge)
50 t=" "
51 echo -e "$t$2\n"
52 while read pct ; do
53 s=" "
54 s="$s$pct%$s"
55 pct=$((($pct*63)/100))
56 echo -en "\r$t\x1B[30;47m$(echo "$s" | cut -c-$pct)\x1B[37;40m$(echo "$s" | cut -c$(($pct+1))-)"
57 done
58 break;;
59 --yesno)
60 while true; do
61 clear
62 echo "$2" | sed 's/\\n\\n/\\n/g;s/\\n/\n/g'
63 echo -en " <- 1:${label:-Yes} 2:Cancel\r"
64 read x
65 case "$x" in
66 ''|Y*|y*|1) return 0;;
67 N*|n*|2|0) return 1;;
68 esac
69 done ;;
70 --menu|--radiolist)
71 [ "$1" == "--menu" ] && shft=2 || shft=3
72 label=""
73 [ "$2" ] && label="\n$2"
74 shift 5
75 echo -e "$title$label\n0 Cancel" > /tmp/data
76 n=1
77 while [ "$1" ]; do
78 eval key_$n='$1'
79 echo "$((n++)) $2"
80 shift $shft
81 done >> /tmp/data
82 while ! grep -q "^$n " /tmp/data ; do
83 clear
84 xless /tmp/data
85 echo -en "\n <- Enter the selection number\r"
86 read n
87 done 2> /dev/null
88 rm -f /tmp/data
89 [ $n -eq 0 ] && return 1
90 eval echo -n \$key_$n 1>&2
91 return 0;;
92 esac
93 shift
94 done
95 }
97 mount_proc()
98 {
99 mount -t proc /proc /proc
100 mount -t sysfs /sys /sys
101 udevd --daemon 2> /dev/null && udevadm trigger && sleep 5
102 }
104 umount_proc()
105 {
106 killall udevd 2> /dev/null
107 umount /sys/fs/fuse/connections 2> /dev/null
108 umount /sys
109 umount /proc
110 }
112 bytes2bin()
113 {
114 for i in $@ ; do
115 printf '\\\\x%02X' $(($i&255))
116 done | xargs echo -en
117 }
119 words2bin()
120 {
121 for i in $@ ; do
122 printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255))
123 done | xargs echo -en
124 }
126 gettazboot()
127 {
128 echo "Creating $(basename $1) ..."
129 O=$(($(get 64 /mnt/$ISO) - 0xC0))
130 L=$(($(get 20 /mnt/$ISO) - 0xC0 - $(get 24 /mnt/$ISO) - $O))
131 S=$((32+$L))
132 P=$((($S+511)/512))
133 E=$((4096-(32*$P)))
134 words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
135 -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1
136 ddq bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1
137 }
139 checkmagic()
140 {
141 [ -s $1 ] && [ $(getarg magic) == $(get 24 $1 4) ]
142 }
144 getiso()
145 {
146 mkdir -p /media/cdrom
147 for dev in /sys/block/?d?/?d??* ; do
148 mount /dev/$(basename $dev) /mnt
149 if checkmagic /mnt/$ISO; then
150 mount -o loop,ro /mnt/$ISO /media/cdrom
151 echo "Found $ISO on $(basename $dev)"
152 return 0
153 fi
154 umount /mnt
155 done 2> /dev/null
156 return 1
157 }
159 uncpio()
160 {
161 [ -s "$1" ] || return
162 echo -en "\n Extracting $(basename $1) ..."
163 case $(get 0 $1) in
164 *35615) ( zcat || gunzip ) ;;
165 *14333) unxz ;;
166 *\ 93) unlzma ;;
167 *) cat ;;
168 esac < $1 | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
169 }
171 dotwait()
172 {
173 echo -n "${1:-Install filesystem}.."
174 touch /tmp/wait
175 while [ -e /tmp/wait ]; do
176 echo -n "." > /dev/tty0
177 sleep 1
178 done &
179 }
181 getuuid()
182 {
183 dev=$(mount | sed '/ \/mnt /!d;s/ .*//;s|/dev/||;q')
184 blkid | sed "/$dev:/!d;s/.* UUID=.\\([^ ]*\\)\".*/\\1/"
185 }
187 tazusbinitfs()
188 {
189 PAD=$(($(stat -c %s $1) % 4))
190 [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
191 mkdir -p /tmp/fs/etc /tmp/fs/lib /tmp/fs/home
192 cp -a /etc/locale.conf /tmp/fs/etc 2> /dev/null
193 cp -a /etc/keymap.conf /tmp/fs/etc 2> /dev/null
194 sed 's/ .*//' /proc/modules | while read mod ; do
195 find /lib/modules/ | grep $mod.ko | \
196 sed 's|.*|cp & /tmp/fs/lib|' | sh
197 done
198 cat > /tmp/fs/init1 <<EOT
199 #!/bin/sh
200 sed -i 's|sbin/init|init2|' /init
201 exec /init
202 EOT
203 cat > /tmp/fs/init2 <<EOT
204 #!/bin/sh
206 mount -t proc /proc /proc
207 grep -q debug /proc/cmdline && debug=true && set -x
208 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
209 v=\$(sed '/\\/home=/!d;s|.*/home=\\([^ ]*\\).*|\\1|' /proc/cmdline /cmdline 2> /dev/null)
210 mount / -o remount,rw
211 mkdir /mnt/dos
212 rm -f /cmdline 2> /dev/null
213 mount / -o remount,ro
214 mnt=/mnt/dos/\${v#*/}
215 dev=\$( (blkid /dev/[sh]d* || blkid) | grep \${v%%/*} | sed 's/:.*//;q')
216 echo "Mount \$dev in /mnt/dos for \$v..." | tee -a /run/boot.log
217 mount \$dev /mnt/dos
218 mount.posixovl -F \$mnt -- -oallow_other -odefault_permissions -osuid
219 mount --bind \$mnt /home
220 [ "\$debug" = "true" ] && sh
221 umount /proc
222 exec /sbin/init
223 EOT
224 chmod 755 /tmp/fs/init?
225 cp -a /tmp/fs/* /
226 ( cd /tmp/fs ; find * | cpio -o -H newc ) | gzip -9 >> $1
227 }
229 mkinitrd()
230 {
231 dotwait "Creating $(basename $1) "
232 for i in bin lib dev proc tmp mnt etc ; do
233 mkdir -p /tmp/fs/$i
234 done
235 for i in /dev/console /dev/null /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 \
236 /dev/fuse /dev/hd* /dev/sd* ; do
237 cp -a $i /tmp/fs$i
238 done
239 for i in /bin/busybox $(which mount.posixovl) $(which blkid); do
240 cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $i | \
241 sed 's|.*=> \(.*/lib/l[^ ]*\).*|\1|;/^\//!d') /tmp/fs/lib
242 cp $i /tmp/fs/bin
243 done
244 cp -a /lib/ld-* /tmp/fs/lib
245 for i in $(busybox | sed '/Current/,$!d'); do
246 [ -e /tmp/fs/bin/${i%,} ] || ln -s busybox /tmp/fs/bin/${i%,}
247 done
248 ln -s /proc/mounts /tmp/fs/etc/mtab
249 sed 's/ .*//' /proc/modules | while read mod ; do
250 find /lib/modules/ | grep $mod.ko | \
251 sed 's|.*|cp & /tmp/fs/lib|' | sh
252 done
253 cat > /tmp/fs/init <<EOT
254 #!/bin/sh
256 arg()
257 {
258 grep -q \$1 /proc/cmdline &&
259 val="\$(sed "s/.*\$1=\\([^ ]*\\).*/\\1/" < /proc/cmdline)" &&
260 echo "\$2 \$val"
261 }
263 mount -t proc /proc /proc
264 arg debug "shell" && debug=true && set -x
265 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
266 arg mount "Mount device"
267 mount \$( (blkid /dev/[sh]d* || blkid) | grep \$val | sed 's/:.*//;q') /mnt
268 arg subroot "Change root to directory"
269 mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid
270 mount --bind /mnt /mnt/\$val/mnt/dos
271 mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
272 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q)
273 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib
274 [ "$debug" = "true" ] && sh
275 umount /proc
276 exec /bin/switch_root /mnt \${LDSO#/mnt/} \$val/usr/sbin/chroot \$val /sbin/init
277 EOT
278 chmod +x /tmp/fs/init
279 ( cd /tmp/fs ; find * | cpio -o -H newc ) | lzma e $1 -si 2> /dev/null
280 rm -rf /tmp/fs /tmp/wait
281 }
283 is_loram()
284 {
285 [ -s /lib/squashfs.ko* ]
286 }
288 ls_r()
289 {
290 ls -r $@ 2> /dev/null || ls $@
291 }
293 doinstall()
294 {
295 mkdir -p /mnt/slitaz/boot /mnt/slitaz/mnt/dos
296 if ! mount.posixovl -F /mnt/slitaz -- \
297 -oallow_other -odefault_permissions -osuid; then
298 echo "Can't install SliTaz. Abort."
299 sleep 5
300 return 1
301 fi
302 dotwait "Install root filesystem in /slitaz.."
303 if [ "$1" ]; then
304 if [ -d /media/cdrom/fs ]; then
305 ( cd /mnt/slitaz/fs; find | cpio -o -H newc ) | gzip -9
306 else
307 ls_r /media/cdrom/boot/rootfs*gz | xargs cat
308 fi > /mnt/slitaz/boot/rootfs.gz
309 tazusbinitfs /mnt/slitaz/boot/rootfs.gz
310 initrd=rootfs.gz
311 extraargs="/home=$(getuuid)/slitaz rdinit=/init1"
312 else
313 if [ -d /media/cdrom/fs ]; then
314 cp -a /media/cdrom/fs/. /mnt/slitaz
315 elif is_loram ; then
316 for i in /media/cdrom/boot/rootfs?*.* ; do
317 [ -s $(basename $i) ] && continue
318 cpio -i $i
319 done
320 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
321 mount -o loop,ro $i /sqfs/mnt
322 cp -a /sqfs/mnt/. /mnt/slitaz
323 umount -d /sqfs/mnt
324 done
325 else
326 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
327 uncpio $i /mnt/slitaz
328 done
329 fi
330 cp -a /etc/locale.conf /mnt/slitaz/etc 2> /dev/null
331 cp -a /etc/keymap.conf /mnt/slitaz/etc 2> /dev/null
332 mkinitrd /mnt/slitaz/boot/initrd
333 initrd=initrd
334 extraargs="mount=$(getuuid) subroot=slitaz"
335 fi
336 echo -en "\nInstall boot files..."
337 for i in /media/cdrom/boot/bzImage /media/cdrom/boot/*pxe* \
338 /media/cdrom/boot/isolinux/he* /media/cdrom/boot/isolinux/opt* \
339 /media/cdrom/README /media/cdrom/boot/memtest* ; do
340 [ -s $i ] && cp $i /mnt/slitaz/boot
341 done
342 for i in /mnt/slitaz/boot/memtest /mnt/slitaz/boot/*pxe* ; do
343 [ $(get 0 $i 2> /dev/null || echo 0) -eq 23117 ] &&
344 mv $i $i.exe
345 done
346 gettazboot /mnt/slitaz/boot/tazboot.exe
347 unix2dos > /mnt/slitaz/boot/tazboot.cmd <<EOT
348 kernel=/slitaz/boot/bzimage
349 initrd=/slitaz/boot/$initrd
350 rw root=/dev/null $extraargs autologin
351 EOT
352 unix2dos /mnt/slitaz/boot/he* /mnt/slitaz/boot/opt* \
353 /mnt/slitaz/boot/README
354 [ -d /mnt/slitaz/usr/sbin -a ! -x /mnt/slitaz/usr/sbin/mount.posixovl ] &&
355 cp $(which mount.posixovl) /mnt/slitaz/usr/sbin
356 rm -f /tmp/wait
357 false &&
358 [ -s /mnt/boot.ini ] && ! grep -qs tazboot /mnt/boot.ini &&
359 echo "Update boot.ini ..." && unix2dos >> /mnt/boot.ini <<EOT
360 C:\\slitaz\\boot\\tazboot.exe="SliTaz"
361 EOT
362 false &&
363 grep -qis menuitem /mnt/config.sys && ! grep -qi tazboot /mnt/config.sys &&
364 echo "Update config.sys ..." &&
365 sed -i 's/menudefault/menuitem SLITAZ, SliTaz\r\n&/' /mnt/config.sys &&
366 unix2dos >> /mnt/config.sys <<EOT
367 [SLITAZ]
368 install=\\slitaz\\boot\\tazboot.exe
369 EOT
370 return 0
371 }
373 install()
374 {
375 $DIALOG --clear \
376 --title " SliTaz UMSDOS way installation " \
377 --yes-label "Install" --yesno \
378 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
379 DOS/Windows partition. You will see your files from /mnt/dos.\n\n
380 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
381 To uninstall SliTaz, you have only to remove this directory.
382 The file \\boot.ini or \\config.sys may be modified too.\n\n
383 SliTaz may run slowly on the 'UMSDOS way' installation due to the
384 posixovl filesystem. The 'TAZUSB way' installation runs faster.\n\n
385 To do a traditional installation with disk partitioning,
386 start SliTaz Live with the 'SliTaz RAM boot' menu.\n
387 " 19 70
388 [ $? -eq 0 ] || return
389 doinstall || return
390 [ -x /mnt/slitaz/sbin/init ] || return
391 umount -d /media/cdrom
392 umount_proc
393 exec chroot /mnt/slitaz /sbin/init
394 }
396 installtaz()
397 {
398 $DIALOG --clear \
399 --title " SliTaz TAZUSB way installation " \
400 --yes-label "Install" --yesno \
401 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
402 DOS/Windows partition. You will see your files from /mnt/dos.\n\n
403 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
404 To uninstall SliTaz, you have only to remove this directory.
405 The file \\boot.ini or \\config.sys may be modified too.\n\n
406 The filesystem is loaded entirely into memory upon boot to
407 increase responsiveness. Only /home lands on the hard disk.\n\n
408 To do a traditional installation with disk partitioning,
409 start SliTaz Live with the 'SliTaz RAM boot' menu.\n
410 " 19 70
411 [ $? -eq 0 ] || return
412 doinstall tazusblike || return
413 dotwait
414 if [ -d /media/cdrom/fs ]; then
415 cp -a /media/cdrom/fs/. /
416 else
417 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
418 uncpio $i
419 done
420 fi
421 cp /tmp/fs/etc/* /etc
422 echo "/home=$(getuuid)/slitaz" > /cmdline
423 rm -f /tmp/wait
424 [ -x /init1 ] || return
425 umount -d /media/cdrom
426 umount /mnt/slitaz
427 rm -f /dev/cdrom
428 umount /mnt
429 mkdir /mnt/dos
430 umount_proc
431 exec /init1
432 }
434 tazboot()
435 {
436 $DIALOG --clear \
437 --title " SliTaz bootloader for DOS " \
438 --yes-label "Install" --yesno \
439 "\nThe file TAZBOOT.EXE will be created in the top directory. It supports
440 any linux kernel, multiple initramfs, a kernel command line and
441 an ISO image file loopback (retrieves files from an ISO file).\n\n
442 Usage: tazboot.exe [[@commands]|[kernel=<bzimage>]
443 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] cmdline args ...]\n\n
444 Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\
445 Examples for tazboot.cmd:\n\n\
446 bootfrom=\\isos\\slitaz-4.0.iso\n\
447 kernel=boot/bzImage\n\
448 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
449 rw root=/dev/null autologin\n\n\
450 kernel=\\slitaz\\vmlinuz root=/dev/sda5 ro\n\n
451 Unlike GRUB4DOS, it doesn't require unfragmented ISO image files.\n
452 " 24 78
453 [ $? -eq 0 ] || return
454 gettazboot /mnt/tazboot.exe
455 }
457 md5()
458 {
459 dotwait "Checking files"
460 ( cd /media/cdrom ; ${1:-md5sum -c md5sum*} | sort ) > /tmp/data
461 rm -f /tmp/wait
462 $DIALOG --clear \
463 --title " Checked files " \
464 --textbox /tmp/data 24 78
465 rm -f /tmp/data
466 }
468 gotcdfile()
469 {
470 for i in "/media/cdrom/$1" "/media/cdrom/*/$1" \
471 "/media/cdrom/*/isolinux/$1" ; do
472 file=$(ls $i 2> /dev/null | sed q)
473 [ -s "$file" ] && break
474 done
475 }
477 sha()
478 {
479 gotcdfile "sha*sum*"
480 sha=$(basename $file)
481 md5 "${sha%sum*}sum -c ${file#/media/cdrom/}"
482 }
484 readme()
485 {
486 gotcdfile "README*"
487 $DIALOG --clear \
488 --title " Readme " \
489 --textbox $file 24 78
490 }
492 bootlog()
493 {
494 $DIALOG --clear \
495 --title " Linux boot messages " \
496 --textbox /tmp/dmesg 24 78
497 }
499 bzimage()
500 {
501 $DIALOG --clear \
502 --title " Create linux.exe ? " \
503 --yes-label "Install" --yesno \
504 "\nLinux.exe launches the linux kernel under DOS (in real mode only).
505 The cmdline arguments are supported except initrd=,
506 vga= (you can try 'rdev -v') and mem= (partially).
507 \nExample:\nC:\\> linux.exe root=/dev/hda2 ro panic=60\n
508 " 12 70
509 [ $? -eq 0 ] || return
510 cp /media/cdrom/boot/bzImage /mnt/linux.exe
511 }
513 memtest()
514 {
515 $DIALOG --clear \
516 --title " Create memtest.exe ? " \
517 --yes-label "Install" --yesno \
518 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
519 computers. BIOS based memory tests are a quick, cursory check and often
520 miss many of the failures that are detected by Memtest86.\n
521 " 12 70
522 [ $? -eq 0 ] && gotcdfile "memtest*" && cp $file /mnt/memtest.exe
523 }
525 mkfat12()
526 {
527 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return
528 J=$(($(get 3 $1 1) + 0x02))
529 R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32))
530 [ $R -lt 2500 ] || return
531 [ $((($(get 500 $1)-1) & 31)) -lt 30 ] &&
532 ddq if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0
533 G="18 0 2 0 0 0 0 0"
534 [ $J -gt 25 ] || G=""
535 F=0
536 for i in 1 2 3; do
537 F=$((((2880-$R-$F-$F)*3+1023)/1024))
538 done
539 bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \
540 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \
541 $G | ddq bs=1 of=/dev/fd0
542 ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0
543 for i in $R $(($R+$F)) ; do
544 bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0
545 done
546 echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0
547 }
549 mkfloppy()
550 {
551 dotwait "Create a $(basename $1) boot floppy"
552 ddq if=$1 of=/dev/fd0
553 mkfat12 $1
554 rm -f /tmp/wait
555 }
557 fdmemtest()
558 {
559 $DIALOG --clear \
560 --title " Create a Memtest86 boot floppy " \
561 --yes-label "Create floppy" --yesno \
562 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
563 computers. BIOS based memory tests are a quick, cursory check and often
564 miss many of the failures that are detected by Memtest86.\n\n
565 Please insert a blank disk in floppy drive.\n
566 " 12 70
567 [ $? -eq 0 ] && gotcdfile "memtest*" && mkfloppy $file
568 }
570 pxe()
571 {
572 gotcdfile "?pxe"
573 $DIALOG --clear \
574 --title " Create $(basename $file).exe ? " \
575 --yes-label "Install" --yesno \
576 "\nBoot your operating system from the internet and enjoy a full system
577 working entirely in RAM with speed and stability in mind. The Linux Kernel
578 and the complete SliTaz compressed root filesystem will be loaded into RAM
579 from the Web using PXE and HTTP protocols.\n
580 " 12 70
581 [ $? -eq 0 ] || return
582 cp $file /mnt/$(basename $file).exe
583 }
585 fdpxe()
586 {
587 $DIALOG --clear \
588 --title " Create a SliTaz Web boot floppy " \
589 --yes-label "Create floppy" --yesno \
590 "\nBoot your operating system from the internet and enjoy a full system
591 working entirely in RAM with speed and stability in mind. The Linux Kernel
592 and the complete SliTaz compressed root filesystem will be loaded into RAM
593 from the Web using PXE and HTTP protocols.\n\n
594 Please insert a blank disk in floppy drive.\n
595 " 12 70
596 [ $? -eq 0 ] && gotcdfile "?pxe" && mkfloppy $file
597 }
599 gotposixovl()
600 {
601 mount.posixovl 2>&1 | grep -qi usage &&
602 echo -en "\"$1\" \"$2\""
603 }
605 xfile()
606 {
607 [ "$(which $1)" ] && echo -en "\"$2\" \"$3\""
608 }
610 cdfile()
611 {
612 gotcdfile "$1" && echo -en "\"$2\" \"$3\""
613 }
615 isbzImage()
616 {
617 [ $(get 514 $file 4) -eq 1400005704 ] &&
618 [ $(($(get 529 $file 1) & 1)) -eq 1 ]
619 }
621 cdfilex()
622 {
623 gotcdfile "$1" &&
624 [ "$(which kexec)" ] &&
625 isbzImage &&
626 echo -en "\"$2\" \"$3\""
627 }
629 cdfilef()
630 {
631 [ -e /sys/block/fd0 ] && cdfile "$@"
632 }
634 cdexe()
635 {
636 gotcdfile "$1" &&
637 [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] &&
638 echo -en "\"$2\" \"$3\""
639 }
641 fddata()
642 {
643 [ -e /sys/block/fd0 ] &&
644 [ $(get 26 /mnt/$ISO 1 2> /dev/null || echo 0) -ne 0 ] &&
645 echo -en "\"$1\" \"$2\""
646 }
648 ishybrid()
649 {
650 [ $(get 510 $ISO 2> /dev/null || echo 0) -eq 43605 ] || return
651 C=$((2048*$(get $(((17*2048) + 71)) /mnt/$ISO 4)))
652 [ $(get $C /mnt/$ISO 4) -eq 1 ] || return
653 [ $(get $(($C+30)) /mnt/$ISO 4) -eq $((0x88AA55)) ] || return
654 C=$((2048*$(get $(($C+40)) /mnt/$ISO 4)))
655 [ $(get $(($C+64)) /mnt/$ISO 4) -eq 1886961915 ] &&
656 echo -en "\"$1\" \"$2\""
657 }
659 burnable()
660 {
661 [ "$(sed '/Can wr.*1$/!d' /proc/sys/dev/cdrom/info 2> /dev/null)" ] &&
662 [ "$(which wodim)" ] && echo -en "\"$1\" \"$2\""
663 }
665 blankable()
666 {
667 [ "$(sed '/Can wr.*RW.*1$/!d' /proc/sys/dev/cdrom/info 2> /dev/null)" ] &&
668 [ "$(which wodim)" ] && echo -en "\"$1\" \"$2\""
669 }
671 burniso()
672 {
673 wodim -v speed=$(fgrep "drive speed" /proc/sys/dev/cdrom/info | cut -f3) \
674 -eject -multi "$ISO"
675 }
677 blankcd()
678 {
679 wodim -v -blank=fast
680 }
682 customsector()
683 {
684 echo $(get 32848 "/mnt/$ISO" 4)
685 }
687 hascustomconf()
688 {
689 [ "$(ddq bs=2k skip=$(customsector) if="/mnt/$ISO" | ddq bs=1 count=6)" \
690 == "#!boot" ]
691 }
693 gotcustomconf()
694 {
695 hascustomconf && echo -en "\"$1\" \"$2\""
696 }
698 getcustomconf()
699 {
700 cd ${1:-/mnt}
701 ddq bs=2k skip=$(customsector) if="/mnt/$ISO" | while read line; do
702 case "$line" in
703 \#!boot*) ;;
704 append=*) echo ${line#append=} > cmdline && ls -l cmdline ;;
705 initrd:*) cnt=${line#initrd:}
706 { ddq bs=512 count=$(($cnt / 512));
707 ddq bs=1 count=$(($cnt % 512)); } > initrd &&
708 ls -l initrd
709 break ;;
710 *) break ;;
711 esac
712 done
713 cd - > /dev/null
714 [ -z "$1" ] && echo -e "\rPress RETURN to continue." && read n
715 }
717 gotisomd5()
718 {
719 [ "$(which md5sum 2> /dev/null)" ] &&
720 [ $(get 0 /mnt/$ISO) -eq 23117 ] &&
721 [ $(get 18 /mnt/$ISO) -ne 0 ] && echo -en "\"$1\" \"$2\""
722 }
724 isomd5()
725 {
726 dotwait "Checking iso image"
727 [ "$(ddq if=/mnt/$ISO bs=2k skip=16 \
728 count=$(($(get 32848 /mnt/$ISO 4)-16)) | md5sum)" == \
729 "$(ddq if=/mnt/$ISO bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
730 sed 's/ //g') -" ] && echo "OK" || echo "ERROR"
731 echo -en "\rChecking iso hybrid boot..."
732 n=$(($(get 2 /mnt/$ISO)-1+($(get 4 /mnt/$ISO)-1)*512))
733 if [ $n -lt 40000 -a $n -gt 32768 ]; then
734 s=$(get 0 /mnt/$ISO 2 $n | awk '{ i+= $0 } END { print i }')
735 [ $(((1+$s+$(get $(($n+1)) /mnt/$ISO 1)) % 65536)) -eq 0 ] &&
736 echo "OK" || echo "ERROR"
737 fi
738 if hascustomconf; then
739 echo -en "\rChecking iso custom config..."
740 TMP=/tmp/$(basename $0)$$md5
741 md5="$(ddq bs=2k skip=$(customsector) if=/mnt/$ISO | while read line; do
742 case "$line" in
743 \#!boot*) echo ${line#*boot } > $TMP ;;
744 append=*) echo $line ;;
745 initrd:*) echo $line
746 cnt=${line#initrd:}
747 ddq bs=512 count=$((cnt / 512))
748 ddq bs=1 count=$((cnt % 512))
749 break ;;
750 *) break ;;
751 esac
752 done | md5sum | cut -c1-32)"
753 [ "$md5" == "$(cat $TMP)" ] && echo "OK" || echo "ERROR"
754 rm -f $TMP
755 fi
756 rm -f /tmp/wait
757 echo -e "\rPress RETURN to continue."
758 read n
759 }
761 if [ "$1" == "--build" ]; then #install-begin
762 uuencode -m - < ifmem.bin | sed -e '/^ifmemcode$/r/dev/stdin' \
763 -e '/^ifmemcode$/d' -i $0
764 uuencode -m - < bootloader.bin | sed -e '/^bootloader$/r/dev/stdin' \
765 -e '/^bootloader$/d' -e '/install-begin$/,/install-end$/d' -i $0
766 exit
767 fi #install-end
768 parse_isolinux()
769 {
770 awk 'BEGIN { IGNORECASE=1 }
771 function multi(n)
772 {
773 auto=$n
774 for (--n; n < NF; n+=2) {
775 s=$n
776 if (s ~ /M$/) s = substr(s,0,length(s)-1)
777 else s /= 1024
778 sizes=int(s) " " sizes
779 }
780 next
781 }
782 {
783 if ($1 == "LABEL") {
784 label=$2
785 if (auto == "") auto=label
786 }
787 if ($1 == "KERNEL" || $1 == "COM32") kernel[label]=$2
788 if ($1 == "INITRD") initrd[label]=$2
789 if ($1 == "APPEND") {
790 i=2
791 if (kernel[label] ~ "ifmem.c32") multi(3)
792 if (kernel[label] ~ "c32box.c32") {
793 if ($2 == "linux") { kernel[label]=$3; i=4 }
794 if ($2 == "ifmem") multi(4)
795 }
796 if (kernel[label] ~ "ifcpu64.c32") { auto=$4; next }
797 while (i <= NF) {
798 if ($i ~ "^initrd=") initrd[label]=substr($i,8)
799 else cmdline[label]=cmdline[label] " " $i
800 i++
801 }
802 }
803 }
804 END {
805 print "KERNEL=\"" kernel[auto] "\""
806 print "INITRD=\"" initrd[auto] "\""
807 print "CMDLINE=\"" substr(cmdline[auto],2) "\""
808 print "SIZES=\"" sizes "\""
809 }'
810 }
812 locase()
813 {
814 echo "$1" | tr [A-Z] [a-z]
815 }
817 ifmemcode()
818 {
819 uudecode <<EOT
820 ifmemcode
821 EOT
822 }
824 floppyset()
825 {
826 gotcdfile isolinux.cfg
827 parse_isolinux < $file > /tmp/var$$
828 . /tmp/var$$
829 for i in $media/$KERNEL $(dirname $file)/$KERNEL $media/$(locase $KERNEL) \
830 $(dirname $file)/$(locase $KERNEL); do
831 [ -s $i ] && KERNEL=$i && break
832 done
833 rm -f /tmp/var$$
834 [ $(get 514 $KERNEL 4) -eq 1400005704 ] || return
835 n=$(($(get 497 $KERNEL 1)+1))
836 ddq bs=512 count=$n if=$KERNEL of=/tmp/fd$$
837 uudecode <<EOT | ddq of=/tmp/fd$$ conv=notrunc
838 bootloader
839 EOT
840 pos=$(($n*512))
841 if [ -n "$CMDLINE" ]; then
842 echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> /tmp/fd$$
843 bytes2bin $n | ddq conv=notrunc \
844 bs=1 seek=497 count=1 of=/tmp/fd$$
845 words2bin $pos | ddq conv=notrunc \
846 bs=1 seek=34 count=2 of=/tmp/fd$$
847 [ $(get 518 $KERNEL 4) -ge 514 ] &&
848 words2bin 32768 9 | ddq conv=notrunc \
849 bs=1 seek=552 count=4 of=/tmp/fd$$
850 fi
851 syssize=$(echo $(get 500 /tmp/fd$$ 4))
852 ddq bs=512 skip=$n if=$KERNEL | cat - /dev/zero | \
853 ddq bs=512 count=$((($syssize+31)/32)) conv=sync >> /tmp/fd$$
854 base=$(stat -c %s /tmp/fd$$)
855 len=
856 if [ "$INITRD" ]; then
857 l=0
858 for i in ${INITRD//,/ }; do
859 for j in $media/$i $(dirname $KERNEL)/$i $media/$(locase $i) \
860 $(dirname $KERNEL)/$(locase $i); do
861 [ -s $j ] && i=$j && break
862 done
863 ddq if=$i >> /tmp/fd$$
864 l=$(($l+$(stat -c %s $i)))
865 r=$((4 - ($l % 4)))
866 if [ $r -ne 4 ]; then
867 ddq if=/dev/zero bs=1 count=$r >> /tmp/fd$$
868 l=$(($l + $r))
869 fi
870 case "$i:$INITRD" in
871 *rootfs.gz:*rootfs.gz,*) continue # loram
872 esac
873 len="$len $l"; l=0
874 done
875 rdadrs=${RDADRS:-$(((($syssize*16)+0x1F0000) & -4096))}
876 words2bin $(($rdadrs & 0xFFFF)) $(($rdadrs >> 16)) | ddq \
877 conv=notrunc bs=1 seek=536 count=4 of=/tmp/fd$$
878 fi
879 n=$(echo $len | wc -w)
880 if [ $((494 - $(get 494 /tmp/fd$$))) -ge $(($n * 4)) ]; then
881 i=$(($(get 494 /tmp/fd$$)))
882 bytes2bin $(($i + ($n*4) - 256)) | ddq bs=1 conv=notrunc \
883 seek=496 count=1 of=/tmp/fd$$
884 else
885 i=$(($pos + 0x1FC - ($n*4)))
886 bytes2bin $(($i % 256)) $((i / 256)) 252 | ddq bs=1 \
887 conv=notrunc seek=494 count=3 of=/tmp/fd$$
888 s=$(($i - 2*$(echo "$SIZES" | wc -w)))
889 p=$(($s - $(ifmemcode | wc -c)))
890 ifmemcode | ddq bs=1 conv=notrunc seek=$p of=/tmp/fd$$
891 words2bin $SIZES | ddq bs=1 conv=notrunc seek=$s of=/tmp/fd$$
892 bytes2bin 154 $(($p%256)) $(($p/256)) 0 144 | \
893 ddq bs=1 conv=notrunc seek=60 of=/tmp/fd$$
894 fi
895 for r in $len ; do
896 words2bin $(($r & 0xFFFF)) $(($r >> 16)) | ddq conv=notrunc \
897 bs=1 seek=$i count=4 of=/tmp/fd$$
898 i=$(($i + 4))
899 done
900 split -b 1440k /tmp/fd$$ fd$$
901 rm -f /tmp/fd$$
902 n=1; i=0; r=0
903 set -- $len
904 ls fd$$* | while read file ; do
905 if [ $i -gt $(($1+$base)) ]; then
906 shift
907 r=$(($r+100)); n=0; i=0; base=0
908 fi
909 ddq of=$file bs=18k seek=80 count=0
910 i=$(($i+1474560))
911 printf "mv %s fd%03d.img\n" $file $(($r+$n))
912 n=$(($n+1))
913 done | sh
914 ls fd???.img
915 }
917 fdbootstrap()
918 {
919 sz=$((512 * $(echo $(get 26 /mnt/$ISO 1))))
920 $DIALOG --clear \
921 --title " Create a floppy bootstrap " \
922 --yes-label "Continue" --yesno \
923 "\nThe floppy will install a driver to access the ISO file
924 on your hard disk and will emulate a CD-ROM during the boot process.\n\n
925 Please insert a floppy in drive now.\n
926 " 10 70
927 [ $? -eq 0 ] || return
928 ddq if=/mnt/$ISO of=/tmp/bootiso bs=1 count=512 \
929 skip=$(( $(get 64 /mnt/$ISO) - $sz ))
930 echo "$ISO" | ddq of=/tmp/bootiso bs=512 seek=1 count=1
931 ddq if=/mnt/$ISO of=/tmp/bootiso bs=1 count=$sz seek=2 \
932 skip=$(( $(get 64 /mnt/$ISO) - $sz + 512 ))
933 mkfloppy /tmp/bootiso
934 rm -f /tmp/bootiso
935 }
937 usbdev()
938 {
939 dotwait "Wait 5 seconds for USB devices"
940 sleep 5
941 rm -f /tmp/wait
942 DEV="$(grep -l 1 /sys/block/*/removable | \
943 sed 's|/sys/block/\(.*\)/removable|\1|')"
944 grep -qs 1 /sys/block/$DEV/ro && return
945 [ "$DEV" ] || return
946 cat > /tmp/dialog <<EOT
947 $DIALOG --clear \
948 --title " Select your USB key " \
949 --menu "\nPlease select the USB key according to its known size.\n\n" \
950 14 70 4 \
951 $(for i in $DEV ; do
952 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
953 done) \
955 EOT
956 exec 3>&1
957 device=$(. /tmp/dialog 2>&1 1>&3)
958 retval=$?
959 exec 3>&-
960 [ $retval -eq 0 ]
961 }
963 tazusbmsg()
964 {
965 [ "$(which tazusb 2> /dev/null)" ] || return
966 echo "You should choose 'USB key read/write installation' to be
967 able to save the package updates or your own configuration and data files.\n\n"
968 }
970 usbbootkey()
971 {
972 $DIALOG --clear \
973 --title " Create a USB boot key " \
974 --yes-label "Continue" --yesno \
975 "\nThe USB key will be used like a CD-ROM. You will not be able to write
976 any data on the boot partition.\n\n
977 An extra FAT32 partition will be created with the remaining free space.\n\n
978 $(tazusbmsg)Please plug your USB stick in now.\n
979 " 16 70
980 [ $? -eq 0 ] || return
981 usbdev || return
983 # perform dd in progress bar
984 max=$(($(cat /sys/block/loop0/size)/2048))
985 i=0; ddq if=/mnt/$ISO bs=1024k | (
986 while ddq bs=1024k count=1 ; do
987 i=$(($i + 1))
988 [ $i -gt $max ] && break
989 echo $((($i*100)/$max)) | dialog --gauge \
990 " The ISO image transfer can be long. Please wait..." \
991 6 70 0 > /dev/tty0 2>&1
992 done ) > $device
994 # partition + fat32 format for the remaining space
995 for p in 0 16; do
996 get $((450+$p)) $device 2 12 | xargs echo | {
997 read dx cx ol oh ll lh
998 [ $dx -eq $((0x3F17)) ] || continue
999 cx=$(($cx & 0xFF00))
1000 ofs=$(($ll+($lh<<16)))
1001 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
1002 m=$(($cx+($n/8)))
1003 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
1004 m=$((($m & 0xFF00)+(($m>>16)<<6)))
1005 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
1006 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
1007 ddq bs=1 seek=$((462-$p)) of=$device
1008 if [ "$(which mkdosfs 2> /dev/null)" ]; then
1009 losetup -o $((512*$ofs)) /dev/loop2 $device
1010 mkdosfs -n "SLITAZ BOOT" /dev/loop2
1011 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
1012 ddq bs=1 seek=28 of=/dev/loop2
1013 sync
1014 losetup -d /dev/loop2
1015 fi
1017 done
1020 usbkey()
1022 $DIALOG --clear \
1023 --title " Create a SliTaz USB key " \
1024 --yes-label "Continue" --yesno \
1025 "\nUnlike a hard drive install, the filesystem is kept in a compressed
1026 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
1027 This should increase responsiveness, protect the filesystem against
1028 accidental corruption and reduce read/writes to the USB drive.
1029 Once setup, the tazusb utility can rewrite the root filesystem
1030 with any changes you have made since booting up,
1031 giving the effective benefits of a hard drive install.\n\n
1032 /home is mounted on boot using the UUID of your particular flash drive.
1033 Unlike a device name, the UUID has the benefit of never changing from machine
1034 to machine.\n\n
1035 Please plug your USB stick in now.\n
1036 " 19 70
1037 [ $? -eq 0 ] || return
1038 usbdev || return
1039 exec 3>&1
1040 format=`$DIALOG --clear \
1041 --title " Select the filesystem " \
1042 --radiolist "\nPlease select the filesystem type to create.\n\n\
1043 The filesystem creation will erase all the data \
1044 in the USB key." 14 70 4 \
1045 "none" "Do not erase the USB key" on \
1046 "ext3" "Ext3 journaling filesystem" off \
1047 "ext2" "Ext2 filesystem" off \
1048 "fat32" "Windows FAT32 filesystem" off \
1049 2>&1 1>&3`
1050 retval=$?
1051 exec 3>&-
1052 [ $retval -eq 0 ] || return
1053 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
1054 tazusb gen-iso2usb /mnt/$ISO $device
1057 mount_loram()
1059 is_loram || return
1060 insmod /lib/squashfs.ko* 2> /dev/null
1061 if [ -d /media/cdrom/fs ]; then
1062 ln -s /media/cdrom/fs /sqfs
1063 else
1064 mkdir /sqfs
1065 mount -o loop,ro -t squashfs /rootfs*.gz /sqfs
1066 fi
1067 ln -s /sqfs/lib/* lib
1068 ln -s /sqfs/usr /sqfs/var /
1069 for i in dmesg basename tr od reboot poweroff getty sync ; do
1070 ln -s /sqfs/bin/busybox /bin/$i
1071 done
1074 umount_loram()
1076 is_loram || return
1077 rm /var /usr
1078 umount -d /sqfs
1079 rmdir /sqfs
1082 dosync()
1084 sync
1085 umount_loram
1086 umount -d /media/cdrom
1087 rm -f /dev/cdrom
1088 umount /mnt
1089 umount_proc
1092 text()
1094 init=
1095 cmdline="$(cat /proc/cmdline)"
1096 if hascustomconf; then
1097 getcustomconf /tmp > /dev/null
1098 [ -s /tmp/cmdline ] &&
1099 cmdline="$cmdline $(cat /tmp/cmdline)" &&
1100 init="$(sed '/rdinit=/!d;s/.*rdinit=\([^ ]*\).*/\1/' < /tmp/cmdline)"
1101 [ -s /tmp/initrd ] && uncpio /tmp/initrd
1102 fi
1103 dosync
1104 exec ${init:-/init} $cmdline
1107 live()
1109 n=0
1110 dotwait "Extract filesystem..."
1111 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
1112 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
1113 [ $((n++)) -eq 0 ] || uncpio $i
1114 done
1115 rm -f /tmp/wait
1116 text
1119 restart()
1121 dosync
1122 reboot -f
1125 stop()
1127 dosync
1128 poweroff -f
1131 dokexec()
1133 kexec -l $file || return
1134 dosync
1135 kexec -e
1138 runmemtest()
1140 gotcdfile "memtest*" && dokexec
1143 runpxe()
1145 gotcdfile "?pxe" && dokexec
1148 flavdata()
1150 ddq if=/mnt/$ISO bs=512 skip=$((1+$(get 417 /mnt/$ISO 1))) \
1151 count=20 | zcat 2>/dev/null
1154 hasflavinfo()
1156 [ "$(flavdata | ddq bs=1 count=8)" == "07070100" ] &&
1157 echo -en "\"$1\" \"$2\""
1160 showfavinfo()
1162 mkdir -p /tmp/data
1163 flavdata | ( cd /tmp/data ; cpio -i )
1164 file=/tmp/data/info
1165 cat /tmp/data/*desc > $file
1166 for i in /tmp/data/*list* ; do
1167 echo "=== extra ${i#*list} files"
1168 cat $i
1169 done >> $file
1170 $DIALOG --clear \
1171 --title " Flavor info " \
1172 --textbox $file 24 78
1173 rm -rf /tmp/data
1176 flavor()
1178 cd /mnt
1179 name="$(flavdata | cpio -t 2> /dev/null | sed 's/.[a-z]*$//;q')"
1180 echo "Create ${name:=flavor}.flavor..."
1181 tazlito iso2flavor "/mnt/$ISO" $name
1182 ls -l $name.flavor 2> /dev/null || sleep 5
1183 cd - > /dev/null
1186 shell()
1188 trap text 2
1189 getty -n -l /bin/ash 38400 tty1 || sh
1192 BIN=bin/mount.posixovl
1193 [ -x /usr/s$BIN ] || mv /bin/mount.posixovl.iso2exe \
1194 /usr/s$BIN 2> /dev/null || mv /bin/mount.posixovl.iso2exe /$BIN 2> /dev/null
1195 mount_proc
1196 for i in /sys/block/*/dev /sys/block/*/*/dev ; do
1197 [ -s "$i" ] || continue
1198 n=${i%/dev}
1199 n=/dev/${n##*/}
1200 [ -e $n ] && continue
1201 mknod $n b $(sed 's/:/ /' < $i)
1202 done
1203 ISO="$(getarg bootfrom | sed 's/.://;s|\\|/|g')"
1204 getiso || text 2> /dev/null
1205 mount_loram
1206 case "${ISO##*/}$(getarg mode)" in
1207 *install*|*INSTALL*) install ;;
1208 *live*|*LIVE*) live ;;
1209 *text*|*TEXT*) text ;;
1210 esac
1211 which $DIALOG 2> /dev/null || DIALOG=tinydialog
1212 dmesg > /tmp/dmesg
1214 isotitle="$(blkid /mnt/$ISO | sed 's/.*LABEL="\([^"]*\).*/\1/') $(stat \
1215 -c %y /media/cdrom | sed 's/ .*//') $(basename $ISO)"
1216 while true; do
1217 trap shell 2
1218 keymap="$(cat /etc/keymap.conf 2> /dev/null)"
1219 locale="$(sed '/^LANG=/!d;s/.*=//' /etc/locale.conf 2> /dev/null)"
1220 cat > /tmp/dialog <<EOT
1221 $DIALOG --clear \
1222 --title " ${isotitle:-Welcome to Linux} " \
1223 --menu "" 23 70 17 \
1224 $(xfile tazkeymap "tazkeymap" "Select keyboard (${keymap:-none})") \
1225 $(xfile tazlocale "tazlocale" "Select locale (${locale:-none})") \
1226 $(cdfile boot/bzImage "live" "Linux RAM boot (full desktop)") \
1227 "text" "Linux RAM boot" \
1228 $(cdfile "README*" "readme" "Show the README file") \
1229 $(gotcustomconf "getcustomconf" "Get custom config") \
1230 $(gotisomd5 "isomd5" "Check the ISO image") \
1231 $(cdfile "md5sum*" "md5" "Check the ISO files") \
1232 $(cdfile "sha*sum*" "sha" "Check the ISO files") \
1233 $(burnable "burniso" "Burn the ISO image") \
1234 $(blankable "blankcd" "Blank the CD/DVD") \
1235 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
1236 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
1237 $(xfile tazusb "usbkey" "USB key read/write installation") \
1238 $(ishybrid "usbbootkey" "USB boot key (read only)") \
1239 $(hasflavinfo "showfavinfo" "Show flavor extra info") \
1240 $(xfile tazlito "flavor" "Get flavor file") \
1241 $(fddata "fdbootstrap" "Create a floppy bootstrap") \
1242 $(cdfile isolinux.cfg "floppyset" "Boot floppy set") \
1243 "tazboot" "Get tazboot.exe Linux loader" \
1244 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
1245 $(cdexe "memtest*" "memtest" "Get Memtest86 DOS/EXE file") \
1246 $(cdfilef "memtest*" "fdmemtest" "Create a Memtest86 boot floppy") \
1247 $(:||cdfilex "memtest*" "runmemtest" "Start Memtest86") \
1248 $(cdexe "?pxe" "pxe" "Get SliTaz Web boot DOS/EXE utility") \
1249 $(cdfilef "?pxe" "fdpxe" "Create a SliTaz Web boot floppy") \
1250 $(:||cdfilex "?pxe" "runpxe" "Start the SliTaz Web boot utility") \
1251 $(xfile reboot "restart" "Restart the computer") \
1252 $(xfile poweroff "stop" "Power off") \
1253 "bootlog" "Linux boot messages" \
1254 "shell" "Shell prompt" \
1256 EOT
1257 exec 3>&1
1258 value=$(. /tmp/dialog 2>&1 1>&3)
1259 retval=$?
1260 exec 3>&-
1261 [ $retval -eq 0 ] || continue
1262 $value
1263 done