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

syslinux/iso2exe/init: typo
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Feb 13 11:08:54 2019 +0100 (2019-02-13)
parents 8ba0c1488f0c
children 02994416f017
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 18 $1 2) ]
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 cp $0 $0.tmp
763 uuencode -m - < ifmem.bin | sed -e 's|^[ \t]*||;s|[ \t]*###.*||' \
764 -e '/^ifmemcode$/r/dev/stdin' -e '/^ifmemcode$/d' -i $0.tmp
765 uuencode -m - < bootloader.bin | sed -e '/^bootloader$/r/dev/stdin' \
766 -e '/^bootloader$/d' -e '/install-begin$/,/install-end$/d' -i $0.tmp
767 mv -f $0.tmp $0; exit
768 fi #install-end
769 parse_isolinux()
770 {
771 awk 'BEGIN { IGNORECASE=1 }
772 function multi(n)
773 {
774 auto=$n
775 for (--n; n < NF; n+=2) {
776 s=$n
777 if (s ~ /M$/) s = substr(s,0,length(s)-1)
778 else s /= 1024
779 sizes=int(s) " " sizes
780 }
781 next
782 }
783 {
784 if ($1 == "LABEL") {
785 label=$2
786 if (auto == "") auto=label
787 }
788 if ($1 == "KERNEL" || $1 == "COM32") kernel[label]=$2
789 if ($1 == "INITRD") initrd[label]=$2
790 if ($1 == "APPEND") {
791 i=2
792 if (kernel[label] ~ "ifmem.c32") multi(3)
793 if (kernel[label] ~ "c32box.c32") {
794 if ($2 == "linux") { kernel[label]=$3; i=4 }
795 if ($2 == "ifmem") multi(4)
796 }
797 if (kernel[label] ~ "ifcpu64.c32") { auto=$4; next }
798 while (i <= NF) {
799 if ($i ~ "^initrd=") initrd[label]=substr($i,8)
800 else cmdline[label]=cmdline[label] " " $i
801 i++
802 }
803 }
804 }
805 END {
806 print "KERNEL=\"" kernel[auto] "\""
807 print "INITRD=\"" initrd[auto] "\""
808 print "CMDLINE=\"" substr(cmdline[auto],2) "\""
809 print "SIZES=\"" sizes "\""
810 }'
811 }
813 locase()
814 {
815 echo "$1" | tr [A-Z] [a-z]
816 }
818 ifmemcode()
819 {
820 uudecode <<EOT
821 ifmemcode
822 EOT
823 }
825 floppyset()
826 {
827 gotcdfile isolinux.cfg
828 parse_isolinux < $file > /tmp/var$$
829 . /tmp/var$$
830 for i in /media/cdrom/$KERNEL $(dirname $file)/$KERNEL /media/cdrom/$(locase $KERNEL) \
831 $(dirname $file)/$(locase $KERNEL); do
832 [ -s $i ] && KERNEL=$i && break
833 done
834 rm -f /tmp/var$$
835 [ $(get 514 $KERNEL 4) -eq 1400005704 ] || return
836 n=$(($(get 497 $KERNEL 1)+1))
837 ddq bs=512 count=$n if=$KERNEL of=/tmp/fd$$
838 uudecode <<EOT | ddq of=/tmp/fd$$ conv=notrunc
839 bootloader
840 EOT
841 pos=$(($n*512))
842 if [ -n "$CMDLINE" ]; then
843 echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> /tmp/fd$$
844 bytes2bin $n | ddq conv=notrunc \
845 bs=1 seek=497 count=1 of=/tmp/fd$$
846 words2bin $pos | ddq conv=notrunc \
847 bs=1 seek=34 count=2 of=/tmp/fd$$
848 [ $(get 518 $KERNEL 4) -ge 514 ] &&
849 words2bin 32768 9 | ddq conv=notrunc \
850 bs=1 seek=552 count=4 of=/tmp/fd$$
851 fi
852 syssize=$(echo $(get 500 /tmp/fd$$ 4))
853 ddq bs=512 skip=$n if=$KERNEL | cat - /dev/zero | \
854 ddq bs=512 count=$((($syssize+31)/32)) conv=sync >> /tmp/fd$$
855 base=$(stat -c %s /tmp/fd$$)
856 len=
857 if [ "$INITRD" ]; then
858 l=0
859 for i in ${INITRD//,/ }; do
860 for j in /media/cdrom/$i $(dirname $KERNEL)/$i /media/cdrom/$(locase $i) \
861 $(dirname $KERNEL)/$(locase $i); do
862 [ -s $j ] && i=$j && break
863 done
864 ddq if=$i >> /tmp/fd$$
865 l=$(($l+$(stat -c %s $i)))
866 r=$((4 - ($l % 4)))
867 if [ $r -ne 4 ]; then
868 ddq if=/dev/zero bs=1 count=$r >> /tmp/fd$$
869 l=$(($l + $r))
870 fi
871 case "$i:$INITRD" in
872 *rootfs.gz:*rootfs.gz,*) continue ### loram
873 esac
874 len="$len $l"; l=0
875 done
876 rdadrs=${RDADRS:-$(((($syssize*16)+0x1F0000) & -4096))}
877 words2bin $(($rdadrs & 0xFFFF)) $(($rdadrs >> 16)) | ddq \
878 conv=notrunc bs=1 seek=536 count=4 of=/tmp/fd$$
879 fi
880 n=$(echo $len | wc -w)
881 if [ $((494 - $(get 494 /tmp/fd$$))) -ge $(($n * 4)) ]; then
882 i=$(($(get 494 /tmp/fd$$)))
883 bytes2bin $(($i + ($n*4) - 256)) | ddq bs=1 conv=notrunc \
884 seek=496 count=1 of=/tmp/fd$$
885 else
886 i=$(($pos + 0x1FC - ($n*4)))
887 bytes2bin $(($i % 256)) $((i / 256)) 252 | ddq bs=1 \
888 conv=notrunc seek=494 count=3 of=/tmp/fd$$
889 s=$(($i - 2*$(echo "$SIZES" | wc -w)))
890 p=$(($s - $(ifmemcode | wc -c)))
891 ifmemcode | ddq bs=1 conv=notrunc seek=$p of=/tmp/fd$$
892 words2bin $SIZES | ddq bs=1 conv=notrunc seek=$s of=/tmp/fd$$
893 bytes2bin 154 $(($p%256)) $(($p/256)) 0 144 | \
894 ddq bs=1 conv=notrunc seek=60 of=/tmp/fd$$
895 fi
896 for r in $len ; do
897 words2bin $(($r & 0xFFFF)) $(($r >> 16)) | ddq conv=notrunc \
898 bs=1 seek=$i count=4 of=/tmp/fd$$
899 i=$(($i + 4))
900 done
901 split -b 1440k /tmp/fd$$ fd$$
902 rm -f /tmp/fd$$
903 n=1; i=0; r=0
904 set -- $len
905 ls fd$$* | while read file ; do
906 if [ $i -gt $(($1+$base)) ]; then
907 shift
908 r=$(($r+100)); n=0; i=0; base=0
909 fi
910 ddq of=$file bs=18k seek=80 count=0
911 i=$(($i+1474560))
912 printf "mv %s fd%03d.img\n" $file $(($r+$n))
913 n=$(($n+1))
914 done | sh
915 ls fd???.img
916 mv fd???.img /mnt
917 }
919 fdbootstrap()
920 {
921 sz=$((512 * $(echo $(get 26 /mnt/$ISO 1))))
922 $DIALOG --clear \
923 --title " Create a floppy bootstrap " \
924 --yes-label "Continue" --yesno \
925 "\nThe floppy will install a driver to access the ISO file
926 on your hard disk and will emulate a CD-ROM during the boot process.\n\n
927 Please insert a floppy in drive now.\n
928 " 10 70
929 [ $? -eq 0 ] || return
930 ddq if=/mnt/$ISO of=/tmp/bootiso bs=1 count=512 \
931 skip=$(( $(get 64 /mnt/$ISO) - $sz ))
932 echo "$ISO" | ddq of=/tmp/bootiso bs=512 seek=1 count=1
933 ddq if=/mnt/$ISO of=/tmp/bootiso bs=1 count=$sz seek=2 \
934 skip=$(( $(get 64 /mnt/$ISO) - $sz + 512 ))
935 mkfloppy /tmp/bootiso
936 rm -f /tmp/bootiso
937 }
939 usbdev()
940 {
941 dotwait "Wait 5 seconds for USB devices"
942 sleep 5
943 rm -f /tmp/wait
944 DEV="$(grep -l 1 /sys/block/*/removable | \
945 sed 's|/sys/block/\(.*\)/removable|\1|')"
946 grep -qs 1 /sys/block/$DEV/ro && return
947 [ "$DEV" ] || return
948 cat > /tmp/dialog <<EOT
949 $DIALOG --clear \
950 --title " Select your USB key " \
951 --menu "\nPlease select the USB key according to its known size.\n\n" \
952 14 70 4 \
953 $(for i in $DEV ; do
954 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
955 done)
956 EOT
957 exec 3>&1
958 device=$(. /tmp/dialog 2>&1 1>&3)
959 retval=$?
960 exec 3>&-
961 [ $retval -eq 0 ]
962 }
964 tazusbmsg()
965 {
966 [ "$(which tazusb 2> /dev/null)" ] || return
967 echo "You should choose 'USB key read/write installation' to be
968 able to save the package updates or your own configuration and data files.\n\n"
969 }
971 usbbootkey()
972 {
973 $DIALOG --clear \
974 --title " Create a USB boot key " \
975 --yes-label "Continue" --yesno \
976 "\nThe USB key will be used like a CD-ROM. You will not be able to write
977 any data on the boot partition.\n\n
978 An extra FAT32 partition will be created with the remaining free space.\n\n
979 $(tazusbmsg)Please plug your USB stick in now.\n
980 " 16 70
981 [ $? -eq 0 ] || return
982 usbdev || return
984 ### perform dd in progress bar
985 max=$(($(cat /sys/block/loop0/size)/2048))
986 i=0; ddq if=/mnt/$ISO bs=1024k | (
987 while ddq bs=1024k count=1 ; do
988 i=$(($i + 1))
989 [ $i -gt $max ] && break
990 echo $((($i*100)/$max)) | dialog --gauge \
991 " The ISO image transfer can be long. Please wait..." \
992 6 70 0 > /dev/tty0 2>&1
993 done ) > $device
995 ### partition + fat32 format for the remaining space
996 for p in 0 16; do
997 get $((450+$p)) $device 2 12 | xargs echo | {
998 read dx cx ol oh ll lh
999 [ $dx -eq $((0x3F17)) ] || continue
1000 cx=$(($cx & 0xFF00))
1001 ofs=$(($ll+($lh<<16)))
1002 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
1003 m=$(($cx+($n/8)))
1004 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
1005 m=$((($m & 0xFF00)+(($m>>16)<<6)))
1006 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
1007 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
1008 ddq bs=1 seek=$((462-$p)) of=$device
1009 if [ "$(which mkdosfs 2> /dev/null)" ]; then
1010 losetup -o $((512*$ofs)) /dev/loop2 $device
1011 mkdosfs -n "SLITAZ BOOT" /dev/loop2
1012 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
1013 ddq bs=1 seek=28 of=/dev/loop2
1014 sync
1015 losetup -d /dev/loop2
1016 fi
1018 done
1021 usbkey()
1023 $DIALOG --clear \
1024 --title " Create a SliTaz USB key " \
1025 --yes-label "Continue" --yesno \
1026 "\nUnlike a hard drive install, the filesystem is kept in a compressed
1027 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
1028 This should increase responsiveness, protect the filesystem against
1029 accidental corruption and reduce read/writes to the USB drive.
1030 Once setup, the tazusb utility can rewrite the root filesystem
1031 with any changes you have made since booting up,
1032 giving the effective benefits of a hard drive install.\n\n
1033 /home is mounted on boot using the UUID of your particular flash drive.
1034 Unlike a device name, the UUID has the benefit of never changing from machine
1035 to machine.\n\n
1036 Please plug your USB stick in now.\n
1037 " 19 70
1038 [ $? -eq 0 ] || return
1039 usbdev || return
1040 exec 3>&1
1041 format=`$DIALOG --clear \
1042 --title " Select the filesystem " \
1043 --radiolist "\nPlease select the filesystem type to create.\n\n\
1044 The filesystem creation will erase all the data \
1045 in the USB key." 14 70 4 \
1046 "none" "Do not erase the USB key" on \
1047 "ext3" "Ext3 journaling filesystem" off \
1048 "ext2" "Ext2 filesystem" off \
1049 "fat32" "Windows FAT32 filesystem" off \
1050 2>&1 1>&3`
1051 retval=$?
1052 exec 3>&-
1053 [ $retval -eq 0 ] || return
1054 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
1055 tazusb gen-iso2usb /mnt/$ISO $device
1058 mount_loram()
1060 is_loram || return
1061 insmod /lib/squashfs.ko* 2> /dev/null
1062 if [ -d /media/cdrom/fs ]; then
1063 ln -s /media/cdrom/fs /sqfs
1064 else
1065 mkdir /sqfs
1066 mount -o loop,ro -t squashfs /rootfs*.gz /sqfs
1067 fi
1068 ln -s /sqfs/lib/* lib
1069 ln -s /sqfs/usr /sqfs/var /
1070 for i in dmesg basename tr od reboot poweroff getty sync ; do
1071 ln -s /sqfs/bin/busybox /bin/$i
1072 done
1075 umount_loram()
1077 is_loram || return
1078 rm /var /usr
1079 umount -d /sqfs
1080 rmdir /sqfs
1083 dosync()
1085 sync
1086 umount_loram
1087 umount -d /media/cdrom
1088 rm -f /dev/cdrom
1089 umount /mnt
1090 umount_proc
1093 text()
1095 init=
1096 cmdline="$(cat /proc/cmdline)"
1097 if hascustomconf; then
1098 getcustomconf /tmp > /dev/null
1099 [ -s /tmp/cmdline ] &&
1100 cmdline="$cmdline $(cat /tmp/cmdline)" &&
1101 init="$(sed '/rdinit=/!d;s/.*rdinit=\([^ ]*\).*/\1/' < /tmp/cmdline)"
1102 [ -s /tmp/initrd ] && uncpio /tmp/initrd
1103 fi
1104 dosync
1105 exec ${init:-/init} $cmdline
1108 live()
1110 n=0
1111 dotwait "Extract filesystem..."
1112 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
1113 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
1114 [ $((n++)) -eq 0 ] || uncpio $i
1115 done
1116 rm -f /tmp/wait
1117 text
1120 restart()
1122 dosync
1123 reboot -f
1126 stop()
1128 dosync
1129 poweroff -f
1132 dokexec()
1134 kexec -l $file || return
1135 dosync
1136 kexec -e
1139 runmemtest()
1141 gotcdfile "memtest*" && dokexec
1144 runpxe()
1146 gotcdfile "?pxe*" && dokexec
1149 flavdata()
1151 [ $(get 1024 /mnt/$ISO) -eq 35615 ] && n=2 ||
1152 n=$((1+$(get 417 /mnt/$ISO 1)))
1153 [ $n -eq 4 ] && n=20
1154 [ $(get $(($n*512)) /mnt/$ISO) -eq 35615 ] || n=13
1155 ddq if=/mnt/$ISO bs=512 skip=$n count=20 | zcat 2>/dev/null
1158 hasflavinfo()
1160 [ "$(flavdata | ddq bs=1 count=7)" == "0707010" ] &&
1161 echo -en "\"$1\" \"$2\""
1164 showfavinfo()
1166 mkdir -p /tmp/data
1167 flavdata | ( cd /tmp/data ; cpio -i )
1168 file=/tmp/data/info
1169 cat /tmp/data/*desc > $file
1170 for i in /tmp/data/*list* ; do
1171 echo "=== extra ${i#*list} files"
1172 cat $i
1173 done >> $file
1174 $DIALOG --clear \
1175 --title " Flavor info " \
1176 --textbox $file 24 78
1177 rm -rf /tmp/data
1180 flavor()
1182 cd /mnt
1183 name="$(flavdata | cpio -t 2> /dev/null | sed 's/.[a-z]*$//;q')"
1184 echo "Create ${name:=flavor}.flavor..."
1185 tazlito iso2flavor "/mnt/$ISO" $name
1186 ls -l $name.flavor 2> /dev/null || sleep 5
1187 cd - > /dev/null
1190 shell()
1192 trap text 2
1193 getty -n -l /bin/ash 38400 tty1 || sh
1196 BIN=bin/mount.posixovl
1197 [ -x /usr/s$BIN ] || mv /bin/mount.posixovl.iso2exe \
1198 /usr/s$BIN 2> /dev/null || mv /bin/mount.posixovl.iso2exe /$BIN 2> /dev/null
1199 mount_proc
1200 for i in /sys/block/*/dev /sys/block/*/*/dev ; do
1201 [ -s "$i" ] || continue
1202 n=${i%/dev}
1203 n=/dev/${n##*/}
1204 [ -e $n ] && continue
1205 mknod $n b $(sed 's/:/ /' < $i)
1206 done
1207 ISO="$(getarg bootfrom | sed 's/.://;s|\\|/|g')"
1208 getiso || text 2> /dev/null
1209 mount_loram
1210 case "${ISO##*/}$(getarg mode)" in
1211 *install*|*INSTALL*) install ;;
1212 *live*|*LIVE*) live ;;
1213 *text*|*TEXT*) text ;;
1214 esac
1215 which $DIALOG 2> /dev/null || DIALOG=tinydialog
1216 dmesg > /tmp/dmesg
1218 isotitle="$(blkid /mnt/$ISO | sed 's/.*LABEL="\([^"]*\).*/\1/') $(stat \
1219 -c %y /media/cdrom | sed 's/ .*//') $(basename $ISO)"
1220 while true; do
1221 trap shell 2
1222 keymap="$(cat /etc/keymap.conf 2> /dev/null)"
1223 locale="$(sed '/^LANG=/!d;s/.*=//' /etc/locale.conf 2> /dev/null)"
1224 cat > /tmp/dialog <<EOT
1225 $DIALOG --clear \
1226 --title " ${isotitle:-Welcome to Linux} " \
1227 --menu "" 23 70 17 \
1228 $(xfile tazkeymap "tazkeymap" "Select keyboard (${keymap:-none})") \
1229 $(xfile tazlocale "tazlocale" "Select locale (${locale:-none})") \
1230 $(cdfile boot/bzImage "live" "Linux RAM boot (full desktop)") \
1231 "text" "Linux RAM boot" \
1232 $(cdfile "README*" "readme" "Show the README file") \
1233 $(gotcustomconf "getcustomconf" "Get custom config") \
1234 $(gotisomd5 "isomd5" "Check the ISO image") \
1235 $(cdfile "md5sum*" "md5" "Check the ISO files") \
1236 $(cdfile "sha*sum*" "sha" "Check the ISO files") \
1237 $(burnable "burniso" "Burn the ISO image") \
1238 $(blankable "blankcd" "Blank the CD/DVD") \
1239 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
1240 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
1241 $(xfile tazusb "usbkey" "USB key read/write installation") \
1242 $(ishybrid "usbbootkey" "USB boot key (read only)") \
1243 $(hasflavinfo "showfavinfo" "Show flavor extra info") \
1244 $(xfile tazlito "flavor" "Get flavor file") \
1245 $(fddata "fdbootstrap" "Create a floppy bootstrap") \
1246 $(cdfile isolinux.cfg "floppyset" "Boot floppy set") \
1247 "tazboot" "Get tazboot.exe Linux loader" \
1248 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
1249 $(cdexe "memtest*" "memtest" "Get Memtest86 DOS/EXE file") \
1250 $(cdfilef "memtest*" "fdmemtest" "Create a Memtest86 boot floppy") \
1251 $(:||cdfilex "memtest*" "runmemtest" "Start Memtest86") \
1252 $(cdexe "?pxe*" "pxe" "Get SliTaz Web boot DOS/EXE utility") \
1253 $(cdfilef "?pxe*" "fdpxe" "Create a SliTaz Web boot floppy") \
1254 $(:||cdfilex "?pxe*" "runpxe" "Start the SliTaz Web boot utility") \
1255 $(xfile reboot "restart" "Restart the computer") \
1256 $(xfile poweroff "stop" "Power off") \
1257 "bootlog" "Linux boot messages" \
1258 "shell" "Shell prompt"
1259 EOT
1260 exec 3>&1
1261 value=$(. /tmp/dialog 2>&1 1>&3)
1262 retval=$?
1263 exec 3>&-
1264 [ $retval -eq 0 ] || continue
1265 $value
1266 done