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

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