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

syslinux/iso2exe/init: fix 'Show flavor infos'
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jan 01 16:02:21 2016 +0100 (2016-01-01)
parents a7572fba48de
children 310fee6a1186
line source
1 #!/bin/sh
3 [ $(id -u) -eq 0 ] || exec su -c "$0 $@"
5 DIALOG=dialog
7 ddq()
8 {
9 dd $@ 2> /dev/null
10 }
12 get()
13 {
14 od -v -j $1 -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An "$2" 2>/dev/null ||
15 hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" "$2"
16 }
18 bytes2bin()
19 {
20 for i in $@ ; do
21 printf '\\\\x%02X' $(($i&255))
22 done | xargs echo -en
23 }
25 words2bin()
26 {
27 for i in $@ ; do
28 printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255))
29 done | xargs echo -en
30 }
32 gettazboot()
33 {
34 echo "Creating $(basename $1) ..."
35 O=$(($(get 64 "$ISO") - 0xC0))
36 L=$(($(get 20 "$ISO") - 0xC0 - $(get 24 "$ISO") - $O))
37 S=$((32+$L))
38 P=$((($S+511)/512))
39 E=$((4096-(32*$P)))
40 words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
41 -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1
42 ddq bs=1 count=$L skip=$(echo $O) if="$ISO" >> $1
43 }
45 uncpio()
46 {
47 [ -s "$1" ] || return
48 echo -en "\n Extracting $(basename $1) ..."
49 case $(get 0 $1) in
50 *35615) ( zcat || gunzip ) ;;
51 *14333) unxz ;;
52 *\ 93) unlzma ;;
53 *) cat ;;
54 esac < $1 | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
55 }
57 dotwait()
58 {
59 echo -n "${1:-Install filesystem}.."
60 touch /tmp/wait
61 [ "$REQUEST_URI" ] && return
62 while [ -e /tmp/wait ]; do
63 echo -n "." > /dev/tty
64 sleep 1
65 done &
66 }
68 getuuid()
69 {
70 dev=$(mount | sed "/ $(echo $mnt | sed 's|/|\\/|g') /!d;s/ .*//;s|/dev/||;q")
71 [ "$dev" ] &&
72 blkid | sed "/$dev:/!d;s/.* UUID=.\\([^ ]*\\)\".*/\\1/" ||
73 echo "/dev/hda1"
74 }
76 tazusbinitfs()
77 {
78 PAD=$(($(stat -c %s $1) % 4))
79 [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
80 mkdir -p /tmp/fs$$/etc /tmp/fs$$/lib /tmp/fs$$/home
81 cp -a /etc/locale.conf /tmp/fs$$/etc 2> /dev/null
82 cp -a /etc/keymap.conf /tmp/fs$$/etc 2> /dev/null
83 cat > /tmp/fs$$/init1 <<EOT
84 #!/bin/sh
85 sed -i 's|sbin/init|init2|' /init
86 exec /init
87 EOT
88 cat > /tmp/fs$$/init2 <<EOT
89 #!/bin/sh
91 mount -t proc /proc /proc
92 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
93 v=\$(sed '/\\/home=/!d;s|.*/home=\\([^ ]*\\).*|\\1|' /proc/cmdline /cmdline 2> /dev/null)
94 mount / -o remount,rw
95 mkdir /mnt/dos
96 rm -f /cmdline 2> /dev/null
97 mount / -o remount,ro
98 mnt=/mnt/dos/\${v#*/}
99 dev=\$( (blkid /dev/[sh]d* || blkid) | grep \${v%%/*} | sed 's/:.*//;q')
100 echo "Mount \$dev in /mnt/dos for \$v..." | tee -a /run/boot.log
101 mount \$dev /mnt/dos
102 if [ ! -d /mnt/dos/slitaz ]; then
103 umount /mnt/dos 2> /dev/null
104 (blkid /dev/[sh]d* || blkid) | while read dev line; do
105 case "\$line" in
106 *ntfs*|*vfat*|*msdos*) ;;
107 *) continue ;;
108 esac
109 mount \${dev%:} /mnt/dos
110 [ -d /mnt/dos/slitaz ] && break
111 umount /mnt/dos
112 done
113 fi
114 $([ "$2" ] || echo '# ')mount.posixovl -F \$mnt -- -oallow_other -odefault_permissions -osuid
115 mount --bind \$mnt /home
116 umount /proc
117 exec /sbin/init
118 EOT
119 chmod 755 /tmp/fs$$/init?
120 ( cd /tmp/fs$$ ; find * | cpio -o -H newc ) | gzip -9 >> $1
121 rm -rf /tmp/fs$$
122 }
124 mkinitrd()
125 {
126 echo -en "\nCreating $(basename $1) "
127 fs=/tmp/fs$$
128 for i in bin lib dev proc tmp mnt etc ; do
129 mkdir -p $fs/$i
130 done
131 for i in /dev/console /dev/null /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 \
132 /dev/fuse /dev/hd* /dev/sd* ; do
133 cp -a $2$i $fs/dev/
134 done
135 for i in /bin/busybox $(which mount.posixovl) $(which blkid); do
136 cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $i | \
137 sed 's|.*=> \(.*/lib/l[^ ]*\).*|\1|;/^\//!d') $fs/lib
138 cp $i $fs/bin
139 done
140 cp -a /lib/ld-* $fs/lib
141 for i in $(busybox | sed '/Current/,$!d'); do
142 [ -e $fs/bin/${i%,} ] || ln -s busybox $fs/bin/${i%,}
143 done
144 ln -s /proc/mounts $fs/etc/mtab
145 sed 's/ .*//' /proc/modules | while read mod ; do
146 find /lib/modules/ | grep $mod.ko | \
147 sed 's|.*|cp & $fs/lib|' | sh
148 done
149 cat > $fs/init <<EOT
150 #!/bin/sh
152 arg()
153 {
154 grep -q \$1 /proc/cmdline &&
155 val="\$(sed "s/.*\$1=\\([^ ]*\\).*/\\1/" < /proc/cmdline)" &&
156 echo "\$2 \$val"
157 }
159 mount -t proc /proc /proc
160 arg debug "shell" && debug=true && set -x
161 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
162 arg mount "Mount device"
163 mount \$( (blkid /dev/[sh]d* || blkid) | grep \$val | sed 's/:.*//;q') /mnt
164 arg subroot "Change root to directory"
165 if [ -d /mnt/\$val ]; then
166 umount /mnt 2> /dev/null
167 (blkid /dev/[sh]d* || blkid) | while read dev line; do
168 case "\$line" in
169 *ntfs*|*vfat*|*msdos*) ;;
170 *) continue ;;
171 esac
172 mount \${dev%:} /mnt
173 [ -d /mnt/\$val ] && break
174 umount /mnt
175 done
176 fi
177 $([ "$3" ] || echo '# ')mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid
178 mount --bind /mnt /mnt/\$val/mnt/dos
179 mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
180 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q)
181 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib
182 [ "$debug" = "true" ] && sh
183 umount /proc
184 exec /bin/switch_root /mnt \${LDSO#/mnt/} \$val/usr/sbin/chroot \$val /sbin/init
185 EOT
186 chmod +x $fs/init
187 ( cd $fs ; find * | cpio -o -H newc ) | lzma e $1 -si 2> /dev/null
188 rm -rf $fs /tmp/wait
189 }
191 ls_r()
192 {
193 ls -r $@ 2> /dev/null || ls $@
194 }
196 doinstall()
197 {
198 unset useposixovl
199 blkid | grep $(df $mnt | sed '$!d;s/ .*/:/') | \
200 grep -qiE "(msdos|vfat|ntfs)" && useposixovl=YES
202 mkdir -p $mnt/slitaz/boot $mnt/slitaz/mnt/dos
203 [ "$useposixovl" ] &&
204 if ! mount.posixovl -F $mnt/slitaz -- \
205 -oallow_other -odefault_permissions -osuid; then
206 echo "Can't install SliTaz. Abort."
207 sleep 5
208 return 1
209 fi
210 dotwait "Install root filesystem in /slitaz.."
211 if [ "$1" ]; then
212 ls_r $media/boot/rootfs*gz | \
213 xargs cat > $mnt/slitaz/boot/rootfs.gz
214 tazusbinitfs $mnt/slitaz/boot/rootfs.gz $useposixovl
215 initrd=rootfs.gz
216 extraargs="/home=$(getuuid)/slitaz rdinit=/init1"
217 else
218 for i in $(ls_r $media/boot/rootfs*gz); do
219 uncpio $i $mnt/slitaz
220 done
221 for i in $packages_list; do
222 tazpkg get-install $i --root=$mnt/slitaz
223 done
224 for i in $packages_dir/*.tazpkg; do
225 [ -s "$i" ] &&
226 tazpkg install $i --root=$mnt/slitaz
227 done
228 cp -a /etc/locale.conf $mnt/slitaz/etc 2> /dev/null
229 cp -a /etc/keymap.conf $mnt/slitaz/etc 2> /dev/null
230 mkinitrd $mnt/slitaz/boot/initrd $mnt/slitaz $useposixovl
231 initrd=initrd
232 extraargs="mount=$(getuuid) subroot=slitaz"
233 fi
234 echo -en "\nInstall boot files..."
235 for i in $media/boot/bzImage $media/boot/*pxe* \
236 $media/boot/isolinux/he* $media/boot/isolinux/opt* \
237 $media/README $media/boot/memtest* ; do
238 [ -s $i ] && cp $i $mnt/slitaz/boot
239 done
240 for i in $mnt/slitaz/boot/memtest $mnt/slitaz/boot/*pxe* ; do
241 [ $(get 0 $i 2> /dev/null || echo 0) -eq 23117 ] &&
242 mv $i $i.exe
243 done
244 gettazboot $mnt/slitaz/boot/tazboot.exe
245 unix2dos > $mnt/slitaz/boot/tazboot.cmd <<EOT
246 kernel=/slitaz/boot/bzimage
247 initrd=/slitaz/boot/$initrd
248 rw root=/dev/null $extraargs autologin
249 EOT
250 unix2dos $mnt/slitaz/boot/he* $mnt/slitaz/boot/opt* \
251 $mnt/slitaz/boot/README
252 [ -d $mnt/slitaz/usr/sbin -a ! -x $mnt/slitaz/usr/sbin/mount.posixovl ] &&
253 cp $(which mount.posixovl) $mnt/slitaz/usr/sbin
254 if "$useposixovl" && grep -qs " $mnt " /proc/mounts &&
255 [ ! -d $mnt/boot/grub ]; then
256 mkdir -p $mnt/boot/grub
257 echo -en "\nInstall grub in /boot/grub..."
258 cp -a /usr/lib/grub/*/* $mnt/boot/grub
259 cat > $mnt/boot/grub/menu.lst <<EOT
260 # /boot/grub/menu.lst: GRUB boot loader configuration.
262 # By default, boot the first entry.
263 default 0
265 # Boot automatically after 8 secs.
266 timeout 8
268 title Microsoft Windows
269 chainloader +1
271 EOT
272 dev=$(grep " $mnt " /proc/mounts | awk '{ print $1 }')
273 base=${dev//[0-9]/}
274 dd if=$base bs=32k count=1 of=$mnt/boot/grub/$(basename $base)
275 cat > $mnt/boot/grub/uninstall-grub.sh <<EOT
276 #!/bin/sh
278 [ -s /boot/grub/$(basename $base) ] &&
279 dd if=/boot/grub/$(basename $base) of=$base
280 EOT
281 grub-install --no-floppy --root-directory=$mnt $base
282 fi
283 if [ -s $mnt/boot/grub/menu.lst ] &&
284 ! grep -q /slitaz/boot/bzimage $mnt/boot/grub/menu.lst; then
285 echo -en "\nUpdate /boot/grub/menu/lst..."
286 cat >> $mnt/boot/grub/menu.lst <<EOT
287 title SliTaz GNU/Linux $(cat $mnt/slitaz/etc/slitaz-release)
288 kernel /slitaz/boot/bzimage rw root=/dev/null $extraargs autologin
289 initrd /slitaz/boot/$initrd
291 EOT
292 fi
293 rm -f /tmp/wait
294 [ "$useposixovl" ] && umount $mnt/slitaz
295 return 0
296 }
298 windev()
299 {
300 if [ -b "$1" ]; then
301 device=$1
302 elif [ "$1" ]; then
303 echo "Invalid Linux/Windows partition"
304 return 1
305 else
306 DEV="$(blkid | grep -iE "(msdos|vfat|ntfs|ext[234]|xfs|btrfs)" | sed 's/:.*//;s|/dev/||')"
307 [ "$DEV" ] || return
308 cat > /tmp/dialog$$ <<EOT
309 $DIALOG --clear \
310 --title " Select your Linux/Windows partition " \
311 --menu "\nPlease select the Linux/Windows partition according to its known size.
312 The data will be kept untouched.\n" \
313 17 70 8 \
314 $(for i in $DEV ; do
315 label="$(blkid | sed "/$i:/!d;s/.*://;s/[^ ]*UUID=[^ ]* //g;s/LABEL=//")"
316 echo -n "/dev/$i \"$(($(cat /sys/block/*/$i/size)/2048))MB $label\" "
317 done)
318 EOT
319 exec 3>&1
320 [ $? -eq 0 ] || return
321 device=$(. /tmp/dialog$$ 2>&1 1>&3)
322 exec 3>&-
323 rm -f /tmp/dialog$$
324 fi
325 mnt=/tmp/mnt$$
326 mkdir -p $mnt && mount $device $mnt
327 }
329 extra_packages()
330 {
331 packages_list=
332 packages_dir=
333 $DIALOG --clear \
334 --title " Extra packages " \
335 --defaultno --yesno \
336 "
337 Do you want to add extra packages ?
338 " 7 70
339 [ $? -eq 0 ] || return
340 [ -s /var/lib/tazpkg/packages.txt ] || tazpkg recharge
341 if [ -s $media/boot/vmlinuz-$(uname -r) ]; then
342 cat > /tmp/dialog$$ <<EOT
343 $DIALOG --clear \
344 --title " Select the packages " \
345 --separate-output \
346 --cancel-label "Skip" \
347 --checklist "Please select the packages you want to install. Try with the first letter." \
348 0 0 0 \\
349 EOT
350 awk -F\| '{ printf "%s \"%s\" off ",$1,$3 }' \
351 /var/lib/tazpkg/packages.desc >> /tmp/dialog$$
352 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
353 [ $? -eq 0 ] && packages_list="$(cat /tmp/dialog.out$$)"
354 fi
355 cat > /tmp/dialog$$ <<EOT
356 $DIALOG --clear \
357 --title "Please select the directory with every custom package to install." \
358 --cancel-label "Skip" \
359 --dselect $PWD 13 78
360 EOT
361 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
362 [ $? -eq 0 ] && packages_dir="$(cat /tmp/dialog.out$$)"
363 rm -f /tmp/dialog$$ /tmp/dialog.out$$
364 }
366 _install()
367 {
368 extra_packages
369 $DIALOG --clear \
370 --title " SliTaz UMSDOS way installation " \
371 --yes-label "Install" --yesno \
372 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
373 Linux/DOS/Windows partition. You can see your files from /mnt/dos.\n\n
374 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
375 To uninstall SliTaz, you have only to remove this directory.
376 The file \\boot.ini or \\config.sys may be modified too.\n\n
377 SliTaz may run slowly on 'UMSDOS way' installation due to the
378 posixovl filesystem. The 'TAZUSB way' installation runs faster.\n\n
379 To do a traditional installation with disk partitioning,
380 start SliTaz Live with 'SliTaz RAM boot' menu.\n
381 " 19 70
382 [ $? -eq 0 ] || return
383 doinstall
384 }
386 readtazbootconf()
387 {
388 kernel="$(sed '/^kernel=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
389 initrd="$(sed '/^initrd=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
390 cmdline="$(sed '/^kernel=/d;/^initrd=/d' $mnt/slitaz/boot/tazboot.cmd)"
391 }
393 bootinstalled()
394 {
395 [ "$(which kexec)" ] || return
396 [ -x $mnt/slitaz$1 ] || return
397 [ -s $mnt/slitaz/boot/tazboot.cmd ] || return
398 readtazbootconf
399 kexec -l $kernel --initrd $initrd --command-line "$cmdline" || return
400 umount $mnt
401 rm -rf $mnt
402 quit "kexec -e"
403 }
405 mkzip()
406 {
407 device=
408 packages_list=
409 packages_dir=
410 mnt=/tmp/mnt$$
411 mkdir -p $mnt
412 $1 $2 || return
413 for i in bootlace.com grubinst.exe grldr ; do
414 wget -O $mnt/slitaz/boot/$i http://mirror.slitaz.org/boot/$i
415 done
416 readtazbootconf
417 cat > $mnt/slitaz/boot/menu.lst <<EOT
418 title SliTaz
419 kernel $kernel $cmdline
420 initrd $initrd
422 EOT
423 while read file title; do
424 file=$(ls $mnt/slitaz/boot/*$file* 2> /dev/null)
425 [ -s "$file" ] && cat >> $mnt/slitaz/boot/menu.lst <<EOT
426 title $title
427 kernel ${file#$mnt}
429 EOT
430 done <<EOT
431 memtest MemTest
432 pxe Web boot
433 EOT
434 unix2dos $mnt/slitaz/boot/menu.lst
435 unix2dos > $mnt/slitaz/boot/install.txt <<EOT
436 For DOS users (real mode only):
438 Start SliTaz with \\slitaz\\boot\\tazboot.exe
441 For NT/2000/XP users:
443 1- Move the files grldr and menu.lst into the root directory
445 C:\\> copy \\slitaz\\boot\\grldr \\
446 C:\\> copy \\slitaz\\boot\\menu.lst \\
448 2- Remove boot.ini attributes
450 C:\\> attrib -r -h -s boot.ini
452 3- Append the following line to boot.init
454 C:\\grldr="slitaz"
456 4- Restore boot.ini attributes
458 C:\\> attrib +r +h +s boot.ini
460 See http://diddy.boot-land.net/grub4dos/files/README_GRUB4DOS.txt
461 and http://xpt.sourceforge.net/techdocs/nix/disk/boot/boot07-GrubForDosInfo/ar01s03.html
462 EOT
463 ( cd $mnt ; echo 'See \slitaz\boot\install.txt to launch SliTaz.' | \
464 zip -zr9 $(basename "$ISO" .iso).zip slitaz )
465 [ "$(which advzip)" ] && advzip -z4 $mnt/*.zip
466 mv $mnt/*.zip .
467 ls -l $PWD/$(basename "$ISO" .iso).zip
468 umount $mnt
469 rm -rf $mnt
470 }
472 install()
473 {
474 windev $1 || return
475 packages_list=
476 packages_dir=
477 if [ "$1" ]; then
478 doinstall
479 else
480 _install && bootinstalled /sbin/init
481 fi
482 umount $mnt
483 rm -rf $mnt
484 }
486 inst2zip()
487 {
488 if [ "$1" ]; then
489 mkzip doinstall
490 else
491 mkzip _install
492 fi
493 }
495 _installtaz()
496 {
497 $DIALOG --clear \
498 --title " SliTaz TAZUSB way installation " \
499 --yes-label "Install" --yesno \
500 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
501 Linux/DOS/Windows partition. You can see your files from /mnt/dos.\n\n
502 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
503 To uninstall SliTaz, you have only to remove this directory.
504 The file \\boot.ini or \\config.sys may be modified too.\n\n
505 The filesystem is loaded entirely into memory upon boot to
506 increase responsiveness. Only /home lands on hard disk.\n\n
507 To do a traditional installation with disk partitioning,
508 start SliTaz Live with 'SliTaz RAM boot' menu.\n
509 " 19 70
510 [ $? -eq 0 ] || return
511 doinstall tazusblike
512 }
514 installtaz()
515 {
516 windev $1 || return
517 packages_list=
518 packages_dir=
519 if [ "$1" ]; then
520 doinstall tazusblike
521 else
522 _installtaz && bootinstalled /boot/bzimage
523 fi
524 umount $mnt
525 rm -rf $mnt
526 }
528 insttaz2zip()
529 {
530 if [ "$1" ]; then
531 mkzip doinstall tazusblike
532 else
533 mkzip _installtaz
534 fi
535 }
537 bootiso()
538 {
539 for i in $(ls_r $media/boot/rootfs*gz); do
540 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
541 cat $i
542 n=$((4 - ($(stat -c %s $i) % 4)))
543 [ $n -eq 4 ] || dd if=/dev/zero bs=1 count=$n
544 done > /tmp/initrd$$
545 kernel=$media/boot/bzImage
546 grep -q ' lm ' /proc/cpuinfo && [ -s ${kernel}64 ] && kernel=${kernel}64
547 . /etc/locale.conf
548 kexec -l $kernel --initrd /tmp/initrd$$ --command-line \
549 "root=/dev/null autologin lang=$LANG kmap=$(cat /etc/keymap.conf)" &&
550 rm -f /tmp/initrd$$
551 quit "kexec -e"
552 }
554 tazboot()
555 {
556 if [ -z "$1" ]; then
557 $DIALOG --clear \
558 --title " SliTaz bootloader for DOS " \
559 --yes-label "Install" --yesno \
560 "\nThe file TAZBOOT.EXE will be created in the top directory. It supports
561 any linux kernel, multiple initramfs, a kernel command line and
562 an ISO image file loopback (retrieves files from an ISO file).\n\n
563 Usage: tazboot.exe [[@commands]|[kernel=<bzimage>]
564 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] cmdline args ...]\n\n
565 Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\
566 Examples for tazboot.cmd:\n\n\
567 bootfrom=\\isos\\slitaz-4.0.iso\n\
568 kernel=boot/bzImage\n\
569 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
570 rw root=/dev/null autologin\n\n\
571 kernel=\\slitaz\\vmlinuz root=/dev/sda5 ro\n\n
572 Unlike GRUB4DOS, it doesn't require unfragmented ISO image files.\n
573 " 0 0
574 [ $? -eq 0 ] || return
575 fi
576 gettazboot tazboot.exe
577 ls -l $PWD/tazboot.exe
578 }
580 md5()
581 {
582 dotwait "Checking files"
583 ( cd $media ; ${md5sum:-md5sum -c md5sum*} | sort ) > /tmp/data
584 unset md5sum
585 rm -f /tmp/wait
586 if [ "$1" ]; then
587 cat /tmp/data
588 else
589 $DIALOG --clear \
590 --title " Checked files " \
591 --textbox /tmp/data 0 0
592 fi
593 rm -f /tmp/data
594 }
596 gotcdfile()
597 {
598 for i in "$media/$1" "$media/*/$1" "$media/*/isolinux/$1" ; do
599 file=$(ls $i 2> /dev/null | sed q)
600 [ -s "$file" ] && break
601 done
602 }
604 sha()
605 {
606 gotcdfile 'sha*sum*'
607 sha=$(basename $file)
608 md5sum="${sha%sum*}sum -c ${file#$media/}"
609 md5 $@
610 }
612 readme()
613 {
614 gotcdfile 'README*'
615 if [ "$1" ]; then
616 cat $file
617 else
618 $DIALOG --clear \
619 --title " Readme " \
620 --textbox $file 0 0
621 fi
622 }
624 bzimage()
625 {
626 if [ -z "$1" ]; then
627 $DIALOG --clear \
628 --title " Create linux.exe ? " \
629 --yes-label "Install" --yesno \
630 "\nLinux.exe launches the linux kernel under DOS (in real mode only).
631 The cmdline arguments are supported except initrd=,
632 vga= (you can try 'rdev -v') and mem= (partially).
633 \nExample:\nC:\\> linux.exe root=/dev/hda2 ro panic=60\n
634 " 12 70
635 [ $? -eq 0 ] || return
636 fi
637 cp $media/boot/bzImage linux.exe
638 ls -l $PWD/linux.exe
639 }
641 memtest()
642 {
643 if [ -z "$1" ]; then
644 $DIALOG --clear \
645 --title " Create memtest.exe ? " \
646 --yes-label "Install" --yesno \
647 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
648 computers. BIOS based memory tests are a quick, cursory check and often
649 miss many of the failures that are detected by Memtest86.\n
650 " 0 0
651 [ $? -eq 0 ] || return
652 fi
653 gotcdfile 'memtest*' && cp $file memtest.exe
654 ls -l $PWD/memtest.exe
655 }
657 mkfat12()
658 {
659 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return
660 J=$(($(get 3 $1 1) + 0x02))
661 R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32))
662 [ $R -lt 2500 ] || return
663 [ $((($(get 500 $1)-1) & 31)) -lt 30 ] &&
664 ddq if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0
665 G="18 0 2 0 0 0 0 0"
666 [ $J -gt 25 ] || G=""
667 F=0
668 for i in 1 2 3; do
669 F=$((((2880-$R-$F-$F)*3+1023)/1024))
670 done
671 bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \
672 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \
673 $G | ddq bs=1 of=/dev/fd0
674 ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0
675 for i in $R $(($R+$F)) ; do
676 bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0
677 done
678 echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0
679 }
681 mkfloppy()
682 {
683 dotwait "Create a $(basename $1) boot floppy"
684 ddq if=$1 of=/dev/fd0
685 mkfat12 $1
686 rm -f /tmp/wait
687 }
689 fdmemtest()
690 {
691 if [ -z "$1" ]; then
692 $DIALOG --clear \
693 --title " Create a Memtest86 boot floppy " \
694 --yes-label "Create floppy" --yesno \
695 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
696 computers. BIOS based memory tests are a quick, cursory check and often
697 miss many of the failures that are detected by Memtest86.\n\n
698 Please insert a blank disk in floppy drive.\n
699 " 0 0
700 [ $? -eq 0 ] || return
701 fi
702 gotcdfile 'memtest*' && mkfloppy $file
703 }
705 pxe()
706 {
707 gotcdfile '?pxe'
708 if [ -z "$1" ]; then
709 $DIALOG --clear \
710 --title " Create $(basename $file).exe ? " \
711 --yes-label "Install" --yesno \
712 "\nBoot your operating system from the internet and enjoy a full system
713 working entirely in RAM with speed and stability in mind. The Linux Kernel
714 and the complete SliTaz compressed root filesystem will be loaded into RAM
715 from the Web using PXE and HTTP protocols.\n
716 " 0 0
717 [ $? -eq 0 ] || return
718 fi
719 cp $file $(basename $file).exe
720 ls -l $PWD/$(basename $file).exe
721 }
723 fdpxe()
724 {
725 if [ -z "$1" ]; then
726 $DIALOG --clear \
727 --title " Create a SliTaz Web boot floppy " \
728 --yes-label "Create floppy" --yesno \
729 "\nBoot your operating system from the internet and enjoy a full system
730 working entirely in RAM with speed and stability in mind. The Linux Kernel
731 and the complete SliTaz compressed root filesystem will be loaded into RAM
732 from the Web using PXE and HTTP protocols.\n\n
733 Please insert a blank disk in floppy drive.\n
734 " 0 0
735 [ $? -eq 0 ] || return
736 fi
737 gotcdfile '?pxe' && mkfloppy $file
738 }
740 menuitem()
741 {
742 [ "$3" ] && shift
743 echo -en "\"$1\" \"$2\""
744 }
746 gotposixovl()
747 {
748 mount.posixovl 2>&1 | grep -qi usage && menuitem "$@"
749 }
751 gotposixovlzip()
752 {
753 [ "$(which zip)" ] && gotposixovl "$1" "$2"
754 }
756 xfile()
757 {
758 [ "$(which $1)" ] && menuitem "$@"
759 }
761 cdfile()
762 {
763 gotcdfile "$1" && menuitem "$@"
764 }
766 isbzImage()
767 {
768 [ $(get 514 $file 4) -eq 1400005704 ] &&
769 [ $(($(get 529 $file 1) & 1)) -eq 1 ]
770 }
772 cdfilex()
773 {
774 gotcdfile "$1" && [ "$(which kexec)" ] && isbzImage && menuitem "$@"
775 }
777 cdfilef()
778 {
779 [ -e /sys/block/fd0 ] && cdfile "$@"
780 }
782 cdexe()
783 {
784 gotcdfile "$1" &&
785 [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] &&
786 menuitem "$@"
787 }
789 misspkg()
790 {
791 for i in zip kexec-tools posixovl cdrkit ; do
792 [ -d /var/lib/tazpkg/installed/$i/ ] && continue
793 [ "$1" != "install" ] && menuitem "$@" && return
794 tazpkg get-install $i
795 done
796 }
798 missing()
799 {
800 misspkg install
801 }
803 ishybrid()
804 {
805 [ $(get 510 "$ISO") -eq 43605 ] || return
806 C=$((2048*$(get $(((17*2048) + 71)) "$ISO" 4)))
807 [ $(get $C "$ISO" 4) -eq 1 ] || return
808 [ $(get $(($C+30)) "$ISO" 4) -eq $((0x88AA55)) ] || return
809 C=$((2048*$(get $(($C+40)) "$ISO" 4)))
810 [ $(get $(($C+64)) "$ISO" 4) -eq 1886961915 ] && menuitem "$@"
811 }
813 isiso()
814 {
815 [ $(get 32769 "$ISO" 4) -eq 808469571 ] && menuitem "$@"
816 }
818 hastazboot()
819 {
820 [ $(get 0 "$ISO") -eq 23117 ] && menuitem "$@"
821 }
823 burnable()
824 {
825 [ "$(sed '/Can wr.*1$/!d' /proc/sys/dev/cdrom/info)" ] && menuitem "$@"
826 }
828 blankable()
829 {
830 [ "$(sed '/Can wr.*RW.*1$/!d' /proc/sys/dev/cdrom/info)" ] && menuitem "$@"
831 }
833 burniso()
834 {
835 wodim -v speed=$(fgrep "drive speed" /proc/sys/dev/cdrom/info | cut -f3) \
836 -eject -multi "$ISO"
837 }
839 blankcd()
840 {
841 wodim -v -blank=fast
842 }
844 customsector()
845 {
846 echo $(($(get 32848 "$ISO" 4)+16))
847 }
849 hascustomconf()
850 {
851 [ "$(ddq bs=2k skip=$(customsector) if="$ISO" | ddq bs=1 count=6)" \
852 == "#!boot" ]
853 }
855 gotcustomconf()
856 {
857 hascustomconf && menuitem "$@"
858 }
860 gotisomd5()
861 {
862 [ "$(which md5sum 2> /dev/null)" ] &&
863 [ $(get 0 "$ISO") -eq 23117 ] &&
864 [ $(get 18 "$ISO") -ne 0 ] && menuitem "$@"
865 }
867 getcustomconf()
868 {
869 ddq bs=2k skip=$(customsector) if="$ISO" | while read line; do
870 case "$line" in
871 \#!boot*) ;;
872 append=*) echo ${line#append=} > cmdline && ls -l $PWD/cmdline ;;
873 initrd:*) cnt=${line#initrd:}
874 { ddq bs=512 count=$(($cnt / 512));
875 ddq bs=1 count=$(($cnt % 512)); } > initrd &&
876 ls -l $PWD/initrd
877 break ;;
878 *) break ;;
879 esac
880 done
881 [ "$1" ] && return 0
882 echo -e "\rPress RETURN to continue."
883 read n
884 }
886 isomd5()
887 {
888 dotwait "Checking iso image"
889 [ "$(ddq if="$ISO" bs=2k skip=16 \
890 count=$(echo $(get 32848 "$ISO" 4)) | md5sum)" == \
891 "$(ddq if="$ISO" bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
892 sed 's/ //g') -" ] && echo "OK" || echo "ERROR"
893 echo -en "\rChecking iso hybrid boot..."
894 n=$(($(get 2 "$ISO")-1+($(get 4 "$ISO")-1)*512))
895 if [ $n -lt 40000 -a $n -gt 32768 ]; then
896 s=$(get 0 "$ISO" 2 $n | awk '{ i+= $0 } END { print i }')
897 [ $(((1+$s+$(get $(($n+1)) "$ISO" 1)) % 65536)) -eq 0 ] &&
898 echo "OK" || echo "ERROR"
899 fi
900 if hascustomconf; then
901 echo -en "\rChecking iso custom config..."
902 TMP=/tmp/$(basename $0)$$md5
903 md5="$(ddq bs=2k skip=$(customsector) if="$ISO" | while read line; do
904 case "$line" in
905 \#!boot*) echo ${line#*boot } > $TMP ;;
906 append=*) echo $line ;;
907 initrd:*) echo $line
908 cnt=${line#initrd:}
909 ddq bs=512 count=$((cnt / 512))
910 ddq bs=1 count=$((cnt % 512))
911 break ;;
912 *) break ;;
913 esac
914 done | md5sum | cut -c1-32)"
915 [ "$md5" == "$(cat $TMP)" ] && echo "OK" || echo "ERROR"
916 rm -f $TMP
917 fi
918 rm -f /tmp/wait
919 [ "$1" ] && return 0
920 echo -e "\rPress RETURN to continue."
921 read n
922 }
924 usbdev()
925 {
926 dotwait "Wait 5 seconds for USB devices"
927 sleep 5
928 rm -f /tmp/wait
929 DEV="$(grep -l 1 /sys/block/*/removable | \
930 sed 's|/sys/block/\(.*\)/removable|\1|')"
931 grep -qs 1 /sys/block/$DEV/ro && return
932 [ "$DEV" ] || return
933 cat > /tmp/dialog$$ <<EOT
934 $DIALOG --clear \
935 --title " Select your USB key " \
936 --menu "\nPlease select the USB key according to its known size.\n\n" \
937 0 0 0 \
938 $(for i in $DEV ; do
939 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
940 done) \
942 EOT
943 exec 3>&1
944 device=$(. /tmp/dialog$$ 2>&1 1>&3)
945 rm -f /tmp/dialog$$
946 retval=$?
947 exec 3>&-
948 rm -f /tmp/dialog$$
949 [ $retval -eq 0 ]
950 }
952 tazusbmsg()
953 {
954 [ "$(which tazusb 2> /dev/null)" ] || return
955 echo "You should choose 'USB key read/write installation' to be
956 able to save the package updates or your own configuration and data files.\n\n"
957 }
959 usbbootkey()
960 {
961 if [ -b "$1" ]; then
962 device=$1
963 elif [ "$1" ]; then
964 echo "Invalid USB key device"
965 return 1
966 else
967 $DIALOG --clear \
968 --title " Create a USB boot key " \
969 --yes-label "Continue" --yesno \
970 "\nThe USB key will be used like a CD-ROM. You will not be able to write
971 any data on the boot partition.\n\n
972 An extra FAT32 partition will be created with the remaining free space.\n\n
973 $(tazusbmsg)Please plug your USB stick in now.\n
974 " 16 70
975 [ $? -eq 0 ] || return
976 usbdev || return
978 # perform dd in progress bar
979 max=$(($(stat -c %s "$ISO")/2048))
980 i=0; ddq if="$ISO" bs=1024k | (
981 while ddq bs=1024k count=1 ; do
982 i=$(($i + 1))
983 [ $i -gt $max ] && break
984 echo $((($i*100)/$max)) | dialog --gauge \
985 " The ISO image transfer can be long. Please wait..." \
986 6 70 0 > /dev/tty 2>&1
987 done ) > $device
988 fi
990 # partition + fat32 format for the remaining space
991 for p in 0 16; do
992 get $((450+$p)) $device 2 12 | xargs echo | {
993 read dx cx ol oh ll lh
994 [ $dx -eq $((0x3F17)) ] || continue
995 cx=$(($cx & 0xFF00))
996 ofs=$(($ll+($lh<<16)))
997 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
998 m=$(($cx+($n/8)))
999 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
1000 m=$((($m & 0xFF00)+(($m>>16)<<6)))
1001 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
1002 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
1003 ddq bs=1 seek=$((462-$p)) of=$device
1004 if [ "$(which mkdosfs 2> /dev/null)" ]; then
1005 losetup -o $((512*$ofs)) /dev/loop2 $device
1006 mkdosfs -n "SLITAZ BOOT" /dev/loop2
1007 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
1008 ddq bs=1 seek=28 of=/dev/loop2
1009 sync
1010 losetup -d /dev/loop2
1011 fi
1013 done
1016 usbkey()
1018 $DIALOG --clear \
1019 --title " Create a SliTaz USB key " \
1020 --yes-label "Continue" --yesno \
1021 "\nUnlike a hard drive install, the filesystem is kept in a compressed
1022 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
1023 This should increase responsiveness, protect the filesystem against
1024 accidental corruption and reduce read/writes to the USB drive.
1025 Once setup, the tazusb utility can rewrite the root filesystem
1026 with any changes you have made since booting up,
1027 giving the effective benefits of a hard drive install.\n\n
1028 /home is mounted on boot using the UUID of your particular flash drive.
1029 Unlike a device name, the UUID has the benefit of never changing from machine
1030 to machine.\n\n
1031 Please plug your USB stick in now.\n
1032 " 19 70
1033 [ $? -eq 0 ] || return
1034 usbdev || return
1035 exec 3>&1
1036 format=`$DIALOG --clear \
1037 --title " Select the filesystem " \
1038 --radiolist "\nPlease select the filesystem type to create.\n\n\
1039 The filesystem creation will erase all the data \
1040 in the USB key." 14 70 4 \
1041 "none" "Do not erase the USB key" on \
1042 "ext3" "Ext3 journaling filesystem" off \
1043 "ext2" "Ext2 filesystem" off \
1044 "fat32" "Windows FAT32 filesystem" off \
1045 2>&1 1>&3`
1046 retval=$?
1047 exec 3>&-
1048 [ $retval -eq 0 ] || return
1049 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
1050 tazusb gen-iso2usb "$ISO" $device
1053 dokexec()
1055 kexec -l $file || return
1056 quit "kexec -e"
1059 runmemtest()
1061 gotcdfile 'memtest*' && dokexec
1064 runpxe()
1066 gotcdfile '?pxe' && dokexec
1069 flavdata()
1071 [ $(get 1024 "$ISO") -eq 35615 ] && n=2 || n=$((1+$(get 417 "$ISO" 1)))
1072 dd if="$ISO" bs=512 skip=$n count=20 2>/dev/null | zcat 2>/dev/null
1075 hasflavinfo()
1077 [ "$(flavdata | dd bs=1 count=8 2> /dev/null | strings)" == \
1078 "07070100" ] && menuitem "$@"
1081 showfavinfo()
1083 mkdir -p /tmp/data
1084 flavdata | ( cd /tmp/data ; cpio -i )
1085 file=/tmp/data/info
1086 cat /tmp/data/*desc > $file
1087 if [ -s /tmp/data/*receipt ]; then
1088 echo "=== receipt ==="
1089 cat /tmp/data/*receipt
1090 fi >> $file
1091 for i in /tmp/data/*list* ; do
1092 echo "=== extra ${i#*list} files"
1093 cat $i
1094 done >> $file
1095 if [ "$1" ]; then
1096 cat $file
1097 else
1098 $DIALOG --clear \
1099 --title " Flavor info " \
1100 --textbox $file 0 0
1101 fi
1102 rm -rf /tmp/data
1105 flavor()
1107 name="$(flavdata | cpio -t 2> /dev/null | sed 's/.[a-z]*$//;q')"
1108 echo "Create ${name:=flavor}.flavor..."
1109 tazlito iso2flavor "$ISO" $name
1110 ls -l $name.flavor 2> /dev/null && return
1111 sleep 5
1112 [ "$1" ] && return
1113 echo -e "\rPress RETURN to continue."
1114 read n
1117 if [ "$1" == "--build" ]; then #install-begin
1118 uuencode -m - < ifmem.bin | sed -e '/^ifmemcode$/r/dev/stdin' \
1119 -e '/^ifmemcode$/d' -i $0
1120 uuencode -m - < bootloader.bin | sed -e '/^bootloader$/r/dev/stdin' \
1121 -e '/^bootloader$/d' -e '/install-begin$/,/install-end$/d' -i $0
1122 exit
1123 fi #install-end
1124 parse_isolinux()
1126 awk 'BEGIN { IGNORECASE=1 }
1127 function multi(n)
1129 auto=$n
1130 for (--n; n < NF; n+=2) {
1131 s=$n
1132 if (s ~ /M$/) s = substr(s,0,length(s)-1)
1133 else s /= 1024
1134 sizes=int(s) " " sizes
1136 next
1139 if ($1 == "LABEL") {
1140 label=$2
1141 if (auto == "") auto=label
1143 if ($1 == "KERNEL" || $1 == "COM32") kernel[label]=$2
1144 if ($1 == "INITRD") initrd[label]=$2
1145 if ($1 == "APPEND") {
1146 i=2
1147 if (kernel[label] ~ "ifmem.c32") multi(3)
1148 if (kernel[label] ~ "c32box.c32") {
1149 if ($2 == "linux") { kernel[label]=$3; i=4 }
1150 if ($2 == "ifmem") multi(4)
1152 if (kernel[label] ~ "ifcpu64.c32") { auto=$4; next }
1153 while (i <= NF) {
1154 if ($i ~ "^initrd=") initrd[label]=substr($i,8)
1155 else cmdline[label]=cmdline[label] " " $i
1156 i++
1160 END {
1161 print "KERNEL=\"" kernel[auto] "\""
1162 print "INITRD=\"" initrd[auto] "\""
1163 print "CMDLINE=\"" substr(cmdline[auto],2) "\""
1164 print "SIZES=\"" sizes "\""
1165 }'
1168 locase()
1170 echo "$1" | tr [A-Z] [a-z]
1173 ifmemcode()
1175 uudecode <<EOT
1176 ifmemcode
1177 EOT
1180 floppyset()
1182 gotcdfile isolinux.cfg
1183 parse_isolinux < $file > /tmp/var$$
1184 . /tmp/var$$
1185 for i in $media/$KERNEL $(dirname $file)/$KERNEL $media/$(locase $KERNEL) \
1186 $(dirname $file)/$(locase $KERNEL); do
1187 [ -s $i ] && KERNEL=$i && break
1188 done
1189 rm -f /tmp/var$$
1190 [ $(get 514 $KERNEL 4) -eq 1400005704 ] || return
1191 n=$(($(get 497 $KERNEL 1)+1))
1192 ddq bs=512 count=$n if=$KERNEL of=/tmp/fd$$
1193 uudecode <<EOT | ddq of=/tmp/fd$$ conv=notrunc
1194 bootloader
1195 EOT
1196 pos=$(($n*512))
1197 if [ -n "$CMDLINE" ]; then
1198 echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> /tmp/fd$$
1199 bytes2bin $n | ddq conv=notrunc \
1200 bs=1 seek=497 count=1 of=/tmp/fd$$
1201 words2bin $pos | ddq conv=notrunc \
1202 bs=1 seek=34 count=2 of=/tmp/fd$$
1203 [ $(get 518 $KERNEL 4) -ge 514 ] &&
1204 words2bin 32768 9 | ddq conv=notrunc \
1205 bs=1 seek=552 count=4 of=/tmp/fd$$
1206 fi
1207 syssize=$(echo $(get 500 /tmp/fd$$ 4))
1208 ddq bs=512 skip=$n if=$KERNEL | cat - /dev/zero | \
1209 ddq bs=512 count=$((($syssize+31)/32)) conv=sync >> /tmp/fd$$
1210 base=$(stat -c %s /tmp/fd$$)
1211 len=
1212 if [ "$INITRD" ]; then
1213 l=0
1214 for i in ${INITRD//,/ }; do
1215 for j in $media/$i $(dirname $KERNEL)/$i $media/$(locase $i) \
1216 $(dirname $KERNEL)/$(locase $i); do
1217 [ -s $j ] && i=$j && break
1218 done
1219 ddq if=$i >> /tmp/fd$$
1220 l=$(($l+$(stat -c %s $i)))
1221 r=$((4 - ($l % 4)))
1222 if [ $r -ne 4 ]; then
1223 ddq if=/dev/zero bs=1 count=$r >> /tmp/fd$$
1224 l=$(($l + $r))
1225 fi
1226 case "$i:$INITRD" in
1227 *rootfs.gz:*rootfs.gz,*) continue # loram
1228 esac
1229 len="$len $l"; l=0
1230 done
1231 rdadrs=${RDADRS:-$(((($syssize*16)+0x1F0000) & -4096))}
1232 words2bin $(($rdadrs & 0xFFFF)) $(($rdadrs >> 16)) | ddq \
1233 conv=notrunc bs=1 seek=536 count=4 of=/tmp/fd$$
1234 fi
1235 n=$(echo $len | wc -w)
1236 if [ $((494 - $(get 494 /tmp/fd$$))) -ge $(($n * 4)) ]; then
1237 i=$(($(get 494 /tmp/fd$$)))
1238 bytes2bin $(($i + ($n*4) - 256)) | ddq bs=1 conv=notrunc \
1239 seek=496 count=1 of=/tmp/fd$$
1240 else
1241 i=$(($pos + 0x1FC - ($n*4)))
1242 bytes2bin $(($i % 256)) $((i / 256)) 252 | ddq bs=1 \
1243 conv=notrunc seek=494 count=3 of=/tmp/fd$$
1244 s=$(($i - 2*$(echo "$SIZES" | wc -w)))
1245 p=$(($s - $(ifmemcode | wc -c)))
1246 ifmemcode | ddq bs=1 conv=notrunc seek=$p of=/tmp/fd$$
1247 words2bin $SIZES | ddq bs=1 conv=notrunc seek=$s of=/tmp/fd$$
1248 bytes2bin 154 $(($p%256)) $(($p/256)) 0 144 | \
1249 ddq bs=1 conv=notrunc seek=60 of=/tmp/fd$$
1250 fi
1251 for r in $len ; do
1252 words2bin $(($r & 0xFFFF)) $(($r >> 16)) | ddq conv=notrunc \
1253 bs=1 seek=$i count=4 of=/tmp/fd$$
1254 i=$(($i + 4))
1255 done
1256 split -b 1440k /tmp/fd$$ fd$$
1257 rm -f /tmp/fd$$
1258 n=1; i=0; r=0
1259 set -- $len
1260 ls fd$$* | while read file ; do
1261 if [ $i -gt $(($1+$base)) ]; then
1262 shift
1263 r=$(($r+100)); n=0; i=0; base=0
1264 fi
1265 ddq of=$file bs=18k seek=80 count=0
1266 i=$(($i+1474560))
1267 printf "mv %s fd%03d.img\n" $file $(($r+$n))
1268 n=$(($n+1))
1269 done | sh
1270 ls fd???.img
1273 quit()
1275 umount -d $media
1276 rmdir $media
1277 ${1:-exit}
1280 isotitle()
1282 echo "$(blkid "$ISO" | sed 's/.*LABEL="\([^"]*\).*/\1/') $(stat \
1283 -c %y $media/.|sed 's/ .*//') $(basename "$ISO")"
1286 ISO="${1:-/dev/null}"
1287 [ -z "$(isiso 2> /dev/null)" ] && echo "Usage : $0 file.iso" && exit 1
1288 media=/tmp/media$$
1289 mkdir -p $media
1290 mount -o loop,ro "$ISO" $media
1292 if [ "$2" == "list" ]; then
1293 sed '/^\$(.*") \\/!d;s/^\$(\(.*\)").*/\1"/' $0 | while read line; do
1294 eval $line
1295 echo
1296 done | sed '/^$/d;/"usbkey"/d'
1297 quit
1298 fi
1299 if grep -q "^$2()" $0; then
1300 exe=$2
1301 shift 2
1302 if [ -n "$(eval $(grep "\"$exe\"" $0 | sed \
1303 '/^\$/!d;s/.(\(.*\)[\t ]*".*"[\t ]*".*/\1/'))" ]; then
1304 isotitle
1305 grep "\"$exe\"" $0 | sed '/^\$/!d;s/.*"[\t ]*"\(.*\)".*/\1/'
1306 echo ----
1307 $exe "$@"
1308 fi
1309 quit
1310 fi
1312 while true; do
1313 cat > /tmp/dialog$$ <<EOT
1314 $DIALOG --clear \
1315 --title " $(isotitle) " \
1316 --menu "" -2 70 0 \
1317 $(cdfile 'README*' "readme" "Show the README file") \
1318 $(gotcustomconf "getcustomconf" "Get custom config") \
1319 $(gotisomd5 "isomd5" "Check the ISO image") \
1320 $(cdfile 'md5sum*' "md5" "Check the ISO files") \
1321 $(cdfile 'sha*sum*' "sha" "Check the ISO files") \
1322 $(cdfilex boot/bzImage "bootiso" "Boot the ISO image") \
1323 $(burnable "burniso" "Burn the ISO image") \
1324 $(blankable "blankcd" "Blank the CD/DVD") \
1325 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
1326 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
1327 $(gotposixovlzip "inst2zip" "ZIP installation archive (UMSDOS way)") \
1328 $(gotposixovlzip "insttaz2zip" "ZIP installation archive (TAZUSB way)") \
1329 $(xfile tazusb "usbkey" "USB key read/write installation") \
1330 $(ishybrid "usbbootkey" "USB boot key (read only)") \
1331 $(hasflavinfo "showfavinfo" "Show flavor extra info") \
1332 $(xfile tazlito "flavor" "Get flavor file") \
1333 $(cdfile isolinux.cfg "floppyset" "Boot floppy set") \
1334 $(hastazboot "tazboot" "Get tazboot.exe Linux loader") \
1335 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
1336 $(cdexe 'memtest*' "memtest" "Get Memtest86 DOS/EXE file") \
1337 $(cdfilef 'memtest*' "fdmemtest" "Create a Memtest86 boot floppy") \
1338 $(cdfilex 'memtest*' "runmemtest" "Start Memtest86") \
1339 $(cdexe '?pxe' "pxe" "Get SliTaz Web boot DOS/EXE utility") \
1340 $(cdfilef '?pxe' "fdpxe" "Create a SliTaz Web boot floppy") \
1341 $(cdfilex '?pxe' "runpxe" "Start the SliTaz Web boot utility") \
1342 $(misspkg "missing" "Install packages to get more options") \
1343 $(menuitem "quit" "Quit this utility")
1344 EOT
1345 exec 3>&1
1346 value=$(. /tmp/dialog$$ 2>&1 1>&3)
1347 retval=$?
1348 exec 3>&-
1349 rm -f /tmp/dialog$$
1350 [ $retval -eq 0 ] || quit
1351 $value
1352 done