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

syslinux/iso2exe: fix floppyset (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Mar 31 21:07:45 2017 +0200 (2017-03-31)
parents 6c622282f662
children 378b0ba41272
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 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/cdrom/$KERNEL $(dirname $file)/$KERNEL /media/cdrom/$(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/cdrom/$i $(dirname $KERNEL)/$i /media/cdrom/$(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 mv fd???.img /mnt
916 }
918 fdbootstrap()
919 {
920 sz=$((512 * $(echo $(get 26 /mnt/$ISO 1))))
921 $DIALOG --clear \
922 --title " Create a floppy bootstrap " \
923 --yes-label "Continue" --yesno \
924 "\nThe floppy will install a driver to access the ISO file
925 on your hard disk and will emulate a CD-ROM during the boot process.\n\n
926 Please insert a floppy in drive now.\n
927 " 10 70
928 [ $? -eq 0 ] || return
929 ddq if=/mnt/$ISO of=/tmp/bootiso bs=1 count=512 \
930 skip=$(( $(get 64 /mnt/$ISO) - $sz ))
931 echo "$ISO" | ddq of=/tmp/bootiso bs=512 seek=1 count=1
932 ddq if=/mnt/$ISO of=/tmp/bootiso bs=1 count=$sz seek=2 \
933 skip=$(( $(get 64 /mnt/$ISO) - $sz + 512 ))
934 mkfloppy /tmp/bootiso
935 rm -f /tmp/bootiso
936 }
938 usbdev()
939 {
940 dotwait "Wait 5 seconds for USB devices"
941 sleep 5
942 rm -f /tmp/wait
943 DEV="$(grep -l 1 /sys/block/*/removable | \
944 sed 's|/sys/block/\(.*\)/removable|\1|')"
945 grep -qs 1 /sys/block/$DEV/ro && return
946 [ "$DEV" ] || return
947 cat > /tmp/dialog <<EOT
948 $DIALOG --clear \
949 --title " Select your USB key " \
950 --menu "\nPlease select the USB key according to its known size.\n\n" \
951 14 70 4 \
952 $(for i in $DEV ; do
953 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
954 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 ddq if=/mnt/$ISO bs=512 skip=$((1+$(get 417 /mnt/$ISO 1))) \
1152 count=20 | zcat 2>/dev/null
1155 hasflavinfo()
1157 [ "$(flavdata | ddq bs=1 count=8)" == "07070100" ] &&
1158 echo -en "\"$1\" \"$2\""
1161 showfavinfo()
1163 mkdir -p /tmp/data
1164 flavdata | ( cd /tmp/data ; cpio -i )
1165 file=/tmp/data/info
1166 cat /tmp/data/*desc > $file
1167 for i in /tmp/data/*list* ; do
1168 echo "=== extra ${i#*list} files"
1169 cat $i
1170 done >> $file
1171 $DIALOG --clear \
1172 --title " Flavor info " \
1173 --textbox $file 24 78
1174 rm -rf /tmp/data
1177 flavor()
1179 cd /mnt
1180 name="$(flavdata | cpio -t 2> /dev/null | sed 's/.[a-z]*$//;q')"
1181 echo "Create ${name:=flavor}.flavor..."
1182 tazlito iso2flavor "/mnt/$ISO" $name
1183 ls -l $name.flavor 2> /dev/null || sleep 5
1184 cd - > /dev/null
1187 shell()
1189 trap text 2
1190 getty -n -l /bin/ash 38400 tty1 || sh
1193 BIN=bin/mount.posixovl
1194 [ -x /usr/s$BIN ] || mv /bin/mount.posixovl.iso2exe \
1195 /usr/s$BIN 2> /dev/null || mv /bin/mount.posixovl.iso2exe /$BIN 2> /dev/null
1196 mount_proc
1197 for i in /sys/block/*/dev /sys/block/*/*/dev ; do
1198 [ -s "$i" ] || continue
1199 n=${i%/dev}
1200 n=/dev/${n##*/}
1201 [ -e $n ] && continue
1202 mknod $n b $(sed 's/:/ /' < $i)
1203 done
1204 ISO="$(getarg bootfrom | sed 's/.://;s|\\|/|g')"
1205 getiso || text 2> /dev/null
1206 mount_loram
1207 case "${ISO##*/}$(getarg mode)" in
1208 *install*|*INSTALL*) install ;;
1209 *live*|*LIVE*) live ;;
1210 *text*|*TEXT*) text ;;
1211 esac
1212 which $DIALOG 2> /dev/null || DIALOG=tinydialog
1213 dmesg > /tmp/dmesg
1215 isotitle="$(blkid /mnt/$ISO | sed 's/.*LABEL="\([^"]*\).*/\1/') $(stat \
1216 -c %y /media/cdrom | sed 's/ .*//') $(basename $ISO)"
1217 while true; do
1218 trap shell 2
1219 keymap="$(cat /etc/keymap.conf 2> /dev/null)"
1220 locale="$(sed '/^LANG=/!d;s/.*=//' /etc/locale.conf 2> /dev/null)"
1221 cat > /tmp/dialog <<EOT
1222 $DIALOG --clear \
1223 --title " ${isotitle:-Welcome to Linux} " \
1224 --menu "" 23 70 17 \
1225 $(xfile tazkeymap "tazkeymap" "Select keyboard (${keymap:-none})") \
1226 $(xfile tazlocale "tazlocale" "Select locale (${locale:-none})") \
1227 $(cdfile boot/bzImage "live" "Linux RAM boot (full desktop)") \
1228 "text" "Linux RAM boot" \
1229 $(cdfile "README*" "readme" "Show the README file") \
1230 $(gotcustomconf "getcustomconf" "Get custom config") \
1231 $(gotisomd5 "isomd5" "Check the ISO image") \
1232 $(cdfile "md5sum*" "md5" "Check the ISO files") \
1233 $(cdfile "sha*sum*" "sha" "Check the ISO files") \
1234 $(burnable "burniso" "Burn the ISO image") \
1235 $(blankable "blankcd" "Blank the CD/DVD") \
1236 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
1237 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
1238 $(xfile tazusb "usbkey" "USB key read/write installation") \
1239 $(ishybrid "usbbootkey" "USB boot key (read only)") \
1240 $(hasflavinfo "showfavinfo" "Show flavor extra info") \
1241 $(xfile tazlito "flavor" "Get flavor file") \
1242 $(fddata "fdbootstrap" "Create a floppy bootstrap") \
1243 $(cdfile isolinux.cfg "floppyset" "Boot floppy set") \
1244 "tazboot" "Get tazboot.exe Linux loader" \
1245 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
1246 $(cdexe "memtest*" "memtest" "Get Memtest86 DOS/EXE file") \
1247 $(cdfilef "memtest*" "fdmemtest" "Create a Memtest86 boot floppy") \
1248 $(:||cdfilex "memtest*" "runmemtest" "Start Memtest86") \
1249 $(cdexe "?pxe" "pxe" "Get SliTaz Web boot DOS/EXE utility") \
1250 $(cdfilef "?pxe" "fdpxe" "Create a SliTaz Web boot floppy") \
1251 $(:||cdfilex "?pxe" "runpxe" "Start the SliTaz Web boot utility") \
1252 $(xfile reboot "restart" "Restart the computer") \
1253 $(xfile poweroff "stop" "Power off") \
1254 "bootlog" "Linux boot messages" \
1255 "shell" "Shell prompt" \
1257 EOT
1258 exec 3>&1
1259 value=$(. /tmp/dialog 2>&1 1>&3)
1260 retval=$?
1261 exec 3>&-
1262 [ $retval -eq 0 ] || continue
1263 $value
1264 done