# HG changeset patch # User Pascal Bellard # Date 1420146559 -3600 # Node ID 054f70cb9bec662902d050dd47fae25ec241c353 # Parent cef92bf1f7cbb23df0784833b447f2bf95dac65c syslinux/iso2exe: add knoppix support diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/receipt --- a/syslinux/receipt Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/receipt Thu Jan 01 22:09:19 2015 +0100 @@ -13,7 +13,7 @@ DEPENDS="ipxe memtest" BUILD_DEPENDS="kbd-base perl nasm dev86 lzma mingw32-gcc upx posixovl \ -util-linux-uuid-dev" +util-linux-uuid-dev advancecomp" # Rules to gen a SliTaz package suitable for Tazpkg. compile_rules() diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/stuff/iso2exe/Makefile --- a/syslinux/stuff/iso2exe/Makefile Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/stuff/iso2exe/Makefile Thu Jan 01 22:09:19 2015 +0100 @@ -9,17 +9,18 @@ objcopy -O binary meminfo.o meminfo.exe chmod +x $@ -iso2exe: iso2exe.sh boot.com bootiso.bin init win32.exe +iso2exe: iso2exe.sh boot.com bootiso.bin init win32.exe ../mbr/isohdpfx.bin + cp ../mbr/isohdpfx.bin . cp iso2exe.sh $@ chmod +x $@ - ./$@ --build boot.com bootiso.bin init win32.exe + ./$@ --build boot.com bootiso.bin init win32.exe isohdpfx.bin isohybrid.res: isohybrid.rc isohybrid.ico i586-pc-mingw32-windres $< -O coff -o $@ -iso2exe.h: iso2exe ../mbr/isohdpfx.bin +iso2exe.h: iso2exe chmod +x iso2exe.sh - ./iso2exe.sh --array ../mbr/isohdpfx.bin > $@ + ./iso2exe.sh --array isohdpfx.bin > $@ iso2exe.com: iso2exe.c iso2exe.h $(BCC) $(BCCFLAGS) -o $@ iso2exe.c && upx --ultra-brute $@ diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/stuff/iso2exe/boot.c --- a/syslinux/stuff/iso2exe/boot.c Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/stuff/iso2exe/boot.c Thu Jan 01 22:09:19 2015 +0100 @@ -10,10 +10,10 @@ static void usage(char *iso) { printf("Usage: %s [[@commands]|[kernel=] \ -[initrd=[,...]] [iso=] ...]\n\n\ +[initrd=[,...]] [bootfrom=] ...]\n\n\ Defaults: %s @tazboot.cmd or %s kernel=bzImage auto\n\n\ Examples for tazboot.cmd:\n\n\ - iso=\\isos\\slitaz-4.0.iso\n\ + bootfrom=\\isos\\slitaz-4.0.iso\n\ kernel=boot/bzImage\n\ initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.gz\n\ rw root=/dev/null vga=normal autologin\n\n\ @@ -25,30 +25,52 @@ static void bootiso(char **iso) { char *init = " rdinit=/init.exe", *mode="menu", *fmt=""; - char c, rootfs[16], cmdline[256]; - int restart; + char *s, c, rootfs[16], fallback[16], cmdline[256]; + int restart, isknoppix = 0; unsigned long magic; - if (isoreset(*iso) || isoopen("boot")) return; + if (isoreset(*iso)) return; + !isoopen("boot") || + !isoopen("live") || // debian + !isoopen("casper") || // ubuntu + !isoopen("isolinux"); // zeroshell if (iso[1] && !strcmp(mode = iso[1], "text")) init = ""; + do { + if (!isoopen(mode) || // custom + !isoopen("bzImage") || // SliTaz + !isoopen("linux24") || // dsl + !isoopen("vmlinuz") || // misc + (!isoopen("linux") && ++isknoppix)) { + magic = loadkernel(); + break; + } + } while (!isoopen("isolinux")); // Knoppix + fallback[0] = 0; for (c = 0, restart = 1; isoreaddir(restart) == 0; restart = 0) { + if (strstr(isofilename, ".gz")) + strcpy(fallback, isofilename); if (strncmp(isofilename, "rootfs", 6) || c > isofilename[6]) continue; strcpy(rootfs, isofilename); c = isofilename[6]; } - if (isoopen(mode)) - isoopen("bzImage"); - magic = loadkernel(); + if (magic < 0x20630) init = ""; // Does not support multiple initramfs + if (magic > 0) { - fmt = "rw root=/dev/null%s iso=%s magic=%lu mode=%s autologin"; - if (rootfs[6] != '.' && !isoopen("rootfs.gz")) - loadinitrd(); // for loram - isoopen(rootfs); - loadinitrd(); + char *initrd = fallback; + + fmt = "rw root=/dev/null bootfrom=%s%s magic=%lu mode=%s autologin"; + if (rootfs[0]) { + initrd = rootfs; + if (rootfs[6] != '.' && !isoopen("rootfs.gz")) + loadinitrd(); // for loram + } + if (!isoopen(initrd)) { + loadinitrd(); + } if (*init) { lseek(isofd, 24L, SEEK_SET); read(isofd, &magic, 4); @@ -58,7 +80,13 @@ else init=""; } } - sprintf(cmdline, fmt, init, *iso, magic, mode); + if (isknoppix) { + if (iso[0][1] == ':') + *iso += 2; + for (s = *iso; *s; s++) + if (*s == '\\') *s = '/'; + } + sprintf(cmdline, fmt, *iso, init, magic, mode); close(isofd); bootlinux(cmdline); } @@ -159,7 +187,7 @@ kernel = s + 7; else if (stricmp("initrd=", s) == 0) initrd = s + 7; - else if (stricmp("iso=", s) == 0) + else if (stricmp("bootfrom=", s) == 0) iso = s + 4; else { cmdline = s; diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/stuff/iso2exe/bootlinux.c --- a/syslinux/stuff/iso2exe/bootlinux.c Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/stuff/iso2exe/bootlinux.c Thu Jan 01 22:09:19 2015 +0100 @@ -139,7 +139,7 @@ #endasm } -static unsigned zimage = 0; +static unsigned vgamode, zimage = 0; static unsigned getss(void) { #asm @@ -260,6 +260,7 @@ syssize = LONG(buffer + SYSSIZE) << 4; if (!syssize) syssize = 0x7F000; setup = (1 + buffer[SETUPSECTORS]) << 9; + vgamode = WORD(buffer + VIDEOMODE); if (setup == 512) { #ifdef LINUX001_SUPPORT if (WORD(buffer + 0x3F) == 0x3AE8) /* linux 0.01 */ @@ -355,10 +356,26 @@ void bootlinux(char *cmdline) { + char *s; + + s = strstr(cmdline," vga="); + if (s) { + vgamode = -1; + s += 5; + switch (*s | 0x20) { + case 'a' : vgamode--; + case 'e' : vgamode--; + case 'n' : break; + default : vgamode = atoi(s); + } + } dosshutdown(); #asm cld mov es, _setupseg + mov ax, _vgamode + seg es + mov VIDEOMODE, ax mov ax, _setup_version cmp ax, #0x200 jb noinitrd diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/stuff/iso2exe/init --- a/syslinux/stuff/iso2exe/init Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/stuff/iso2exe/init Thu Jan 01 22:09:19 2015 +0100 @@ -18,6 +18,71 @@ sed "/$1=/!d;s/.*$1=\\([^ ]*\\).*/\\1/" /proc/cmdline } +clear() +{ + echo -e "\x1B[1;1H\x1B[J" +} + +tinydialog() +{ + clear + label="" + while [ "$1" ]; do + case "$1" in + --title) title=" \x1B[30;47m$2\x1B[37;40m\n" + echo -e $title; shift ;; + --yes-label) label="$2" ; shift ;; + --textbox) + less "$2" < /dev/tty0 > /dev/tty0 + break;; + --gauge) + t=" " + echo -e "$t$2\n" + while read pct ; do + s=" " + s="$s$pct%$s" + pct=$((($pct*63)/100)) + echo -en "\r$t\x1B[30;47m$(echo "$s" | cut -c-$pct)\x1B[37;40m$(echo "$s" | cut -c$(($pct+1))-)" + done + break;; + --yesno) + while true; do + clear + echo "$2" | sed 's/\\n/\n/g' + echo -en "\n <- 1:${label:-Yes} 2:Cancel\r" + read x + case "$x" in + ''|Y*|y*|1) return 0;; + N*|n*|2|0) return 1;; + esac + done ;; + --menu|--radiolist) + label="$2" + shift 5 + echo -e "$title\n$label\n0 Cancel" > /tmp/data + n=1 + while [ "$1" ]; do + eval key_$n='$1' + echo "$((n++)) $2" + case "$3" in on|off) shift;; esac + shift 2 + done >> /tmp/data + while ! grep -q "^$n " /tmp/data ; do + clear + [ $(wc -l < /tmp/data) -gt 20 ] && + less /tmp/data || cat /tmp/data + echo -en "\n <- Enter the selection number\r" + read n + done 2> /dev/null + rm -f /tmp/data + [ $n -eq 0 ] && return 1 + eval echo -n \$key_$n 1>&2 + return 0;; + esac + shift + done +} + mount_proc() { mount -t proc /proc /proc @@ -69,11 +134,11 @@ getiso() { mkdir -p /media/cdrom - blkid | while read dev info ; do - mount ${dev%:} /mnt + for dev in /sys/block/?d?/?d??* ; do + mount /dev/$(basename $dev) /mnt if checkmagic /mnt/$ISO; then mount -o loop,ro /mnt/$ISO /media/cdrom - echo "Found $ISO on ${dev%:}" + echo "Found $ISO on $(basename $dev)" break fi umount /mnt @@ -82,6 +147,7 @@ uncpio() { + [ -s "$1" ] || return echo -en "\n Extracting $(basename $1) ..." case $(get 0 $1) in *35615) ( zcat || gunzip ) ;; @@ -363,10 +429,10 @@ any linux kernel, multiple initramfs, a kernel command line and an ISO image file loopback (retrieves files from an ISO file).\n\n Usage: tazboot.exe [[@commands]|[kernel=] -[initrd=[,...]] [iso=] cmdline args ...]\n\n +[initrd=[,...]] [bootfrom=] cmdline args ...]\n\n Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\ Examples for tazboot.cmd:\n\n\ - iso=\\isos\\slitaz-4.0.iso\n\ + bootfrom=\\isos\\slitaz-4.0.iso\n\ kernel=boot/bzImage\n\ initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\ rw root=/dev/null autologin\n\n\ @@ -380,7 +446,7 @@ md5() { dotwait "Checking files" - ( cd /media/cdrom ; md5sum -c md5sum* ) > /tmp/data + ( cd /media/cdrom ; ${1:-md5sum -c md5sum*} ) > /tmp/data rm -f /tmp/wait $DIALOG --clear \ --title " Checked files " \ @@ -388,11 +454,19 @@ rm -f /tmp/data } +sha() +{ + gotcdfile sha*sum* + sha=$(basename $file) + md5 "${sha%sum*}sum -c ${file#/media/cdrom/}" +} + readme() { + gotcdfile README* $DIALOG --clear \ --title " Readme " \ - --textbox /media/cdrom/README 24 78 + --textbox $file 24 78 } bootlog() @@ -424,14 +498,11 @@ computers. BIOS based memory tests are a quick, cursory check and often miss many of the failures that are detected by Memtest86.\n " 12 70 - [ $? -eq 0 ] || return - cp /media/cdrom/boot/memtest /mnt/memtest.exe + [ $? -eq 0 ] && gotcdfile memtest* && cp $file /mnt/memtest.exe } -mkfloppy() +mkfat12() { - dotwait "Create a $(basename $1) boot floppy" - ddq if=$1 of=/dev/fd0 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return J=$(($(get 3 $1 1) + 0x02)) R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32)) @@ -452,6 +523,13 @@ bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0 done echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0 +} + +mkfloppy() +{ + dotwait "Create a $(basename $1) boot floppy" + ddq if=$1 of=/dev/fd0 + mkfat12 $1 rm -f /tmp/wait } @@ -465,12 +543,13 @@ miss many of the failures that are detected by Memtest86.\n\n Please insert a blank disk in floppy drive.\n " 12 70 - [ $? -eq 0 ] && mkfloppy /media/cdrom/boot/memtest + [ $? -eq 0 ] && gotcdfile memtest* && mkfloppy $file } pxe() { - pxe=$(ls /media/cdrom/boot/?pxe) + gotcdfile ?pxe + pxe=$(ls $file) $DIALOG --clear \ --title " Create $(basename $pxe).exe ? " \ --yes-label "Install" --yesno \ @@ -494,7 +573,7 @@ from the Web using PXE and HTTP protocols.\n\n Please insert a blank disk in floppy drive.\n " 12 70 - [ $? -eq 0 ] && mkfloppy /media/cdrom/boot/?pxe + [ $? -eq 0 ] && gotcdfile ?pxe && mkfloppy $file } gotposixovl() @@ -508,11 +587,17 @@ [ "$(which $1)" ] && echo -en "\"$2\" \"$3\"" } +gotcdfile() +{ + for file in /media/cdrom/$1 /media/cdrom/*/$1 \ + /media/cdrom/*/isolinux/$1 ; do + [ -s $file ] && break + done +} + cdfile() { - for i in ${1//,/ }; do - [ -s /media/cdrom/$i ] && echo -en "\"$2\" \"$3\"" && break - done + gotcdfile "$1" && echo -en "\"$2\" \"$3\"" } cdfilex() @@ -522,7 +607,8 @@ cdexe() { - [ $(get 0 /media/cdrom/$1 2> /dev/null || echo 0) -eq 23117 ] && + gotcdfile "$1" && + [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] && echo -en "\"$2\" \"$3\"" } @@ -723,18 +809,21 @@ poweroff -f } -runmemtest() +dokexec() { - kexec -l /media/cdrom/boot/memtest + kexec -l $file dosync kexec -e } +runmemtest() +{ + gotcdfile memtest* && dokexec +} + runpxe() { - kexec -l /media/cdrom/boot/?pxe - dosync - kexec -e + gotcdfile ?pxe && dokexec } shell() @@ -744,9 +833,9 @@ BIN=bin/mount.posixovl [ -x /usr/s$BIN ] || mv /bin/mount.posixovl.iso2exe \ -/usr/s$BIN 2> /dev/null || mv /bin/mount.posixovl.iso2exe /$BIN +/usr/s$BIN 2> /dev/null || mv /bin/mount.posixovl.iso2exe /$BIN 2> /dev/null mount_proc -ISO="$(getarg iso | sed 's/.://;s|\\|/|g')" +ISO="$(getarg bootfrom | sed 's/.://;s|\\|/|g')" getiso mount_loram case "${ISO##*/}$(getarg mode)" in @@ -754,7 +843,7 @@ *live*|*LIVE*) live ;; *text*|*TEXT*) text ;; esac -which $DIALOG 2> /dev/null || live +which $DIALOG 2> /dev/null || DIALOG=tinydialog dmesg > /tmp/dmesg while true; do @@ -762,14 +851,15 @@ locale="$(sed '/^LANG=/!d;s/.*=//' /etc/locale.conf 2> /dev/null)" cat > /tmp/dialog <&1 - value=$(sh /tmp/dialog 2>&1 1>&3) + value=$(. /tmp/dialog 2>&1 1>&3) retval=$? exec 3>&- [ $retval -eq 0 ] || continue diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/stuff/iso2exe/iso2exe.c --- a/syslinux/stuff/iso2exe/iso2exe.c Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/stuff/iso2exe/iso2exe.c Thu Jan 01 22:09:19 2015 +0100 @@ -12,7 +12,7 @@ #include "iso2exe.h" static int fd, forced, status = 1; -static char tazlitoinfo[10*1024]; +static char tazlitoinfo[0x8000U - BOOTISOSZ]; #define buffer tazlitoinfo #define BUFFERSZ 2048 #define WORD(n) * (unsigned short *) (n) @@ -31,7 +31,7 @@ { #define heads 64 #define sectors 32 -#define partition 446 +#define partition (446+16) #define trksz (512UL * heads * sectors) unsigned long size, catalog, lba; int cylinders, i, j, isohybrid; @@ -69,14 +69,23 @@ LONG(bootiso + isohybrid + 440) = rand(); LONG(bootiso + isohybrid + partition) = 0x10080UL; WORD(bootiso + isohybrid + 510) = 0xAA55U; +#if 0 size = lseek(fd, 0UL, SEEK_END); - cylinders = (size + trksz - 1) / trksz; + size += 0x000FFFFFUL; + size &= 0xFFF00000UL; +#else + for (size = 0x000FFFFFUL; /* 1M - 1 */ + read(fd, tazlitoinfo, 1024) == 1024; + size += 1024); + size &= 0xFFF00000UL; /* round */ +#endif + cylinders = (size >> 20) - 1; bootiso[isohybrid + partition + 4] = 23; /* "Windows hidden IFS" */ bootiso[isohybrid + partition + 5] = heads - 1; - bootiso[isohybrid + partition + 6] = (((cylinders - 1) & 0x300) >> 2) + sectors; - bootiso[isohybrid + partition + 7] = (cylinders - 1) & 0xFF; + bootiso[isohybrid + partition + 6] = ((cylinders & 0x300) >> 2) + sectors; + bootiso[isohybrid + partition + 7] = cylinders & 0xFF; LONG(bootiso + isohybrid + partition + 8) = 0; - LONG(bootiso + isohybrid + partition + 12) = cylinders * sectors * heads; + LONG(bootiso + isohybrid + partition + 12) = (size >> 9); /* Copy the partition table */ memcpy(bootiso + 0x1BE, bootiso + isohybrid + 0x1BE, 66); @@ -93,8 +102,7 @@ n = (bootiso[69] + 1) * 512; lseek(fd, 0UL, SEEK_SET); write(fd, bootiso, n); /* EXE/PE + isohybrid mbr */ - write(fd, tazlitoinfo, ((0x8000U - BOOTISOSZ) > sizeof(tazlitoinfo)) - ? sizeof(tazlitoinfo) : (0x8000U - BOOTISOSZ)); + write(fd, tazlitoinfo, sizeof(tazlitoinfo)); write(fd, bootiso + n, BOOTISOSZ - n); /* COM + rootfs + EXE/DOS */ /* Compute the checksum */ diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/stuff/iso2exe/iso2exe.sh --- a/syslinux/stuff/iso2exe/iso2exe.sh Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/stuff/iso2exe/iso2exe.sh Thu Jan 01 22:09:19 2015 +0100 @@ -20,7 +20,11 @@ compress() { - if [ "$(which xz 2> /dev/null)" ]; then + if [ "$1" ]; then + gzip -9 > $1 + [ "$(which advdef 2> /dev/null)" ] && + advdef -z4 $1 > /dev/null + elif [ "$(which xz 2> /dev/null)" ]; then xz -z -e --format=lzma --lzma1=mode=normal --stdout else lzma e -si -so @@ -33,12 +37,16 @@ mkdir -p $TMP/bin $TMP/dev cp -a /dev/?d?* /dev/tty /dev/tty0 $TMP/dev $0 --get init > $TMP/init.exe - grep -q mount.posixovl.iso2exe $TMP/init.exe && - cp /usr/sbin/mount.posixovl $TMP/bin/mount.posixovl.iso2exe \ - 2> /dev/null && echo "Store mount.posixovl ($(wc -c \ - < /usr/sbin/mount.posixovl) bytes) ..." +# mount -o loop,ro $1 $TMP +# oldslitaz="$(ls $TMP/boot/isolinux/splash.lss 2> /dev/null)" +# umount -d $TMP +# [ "$oldslitaz" ] && # for SliTaz <= 3.0 only... +# grep -q mount.posixovl.iso2exe $TMP/init.exe && +# cp /usr/sbin/mount.posixovl $TMP/bin/mount.posixovl.iso2exe \ +# 2> /dev/null && echo "Store mount.posixovl ($(wc -c \ +# < /usr/sbin/mount.posixovl) bytes) ..." find $TMP -type f -print0 | xargs -0 chmod +x - ( cd $TMP ; find * | cpio -o -H newc ) | compress > $TMP/rootfs.gz + ( cd $TMP ; find * | cpio -o -H newc ) | compress $TMP/rootfs.gz SIZE=$(wc -c < $TMP/rootfs.gz) store 24 $SIZE $1 OFS=$(( $OFS - $SIZE )) @@ -66,7 +74,6 @@ add_win32exe() { - ddq if=/tmp/exe$$ of=$1 conv=notrunc SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c) printf "Adding WIN32 file at %04X (%d bytes) ...\n" 0 $SIZE ddq if=/tmp/exe$$ of=$1 conv=notrunc @@ -209,7 +216,7 @@ esac case "$(get 0 $1)" in 23117) echo "The file $1 is already an EXE file." 1>&2 && exit 1;; - 0) [ -x /usr/bin/isohybrid ] && isohybrid $1 && echo "Do isohybrid" + 0) $0 --get isohdpfx.bin | ddq bs=512 count=1 of=$1 conv=notrunc esac echo "Read hybrid & tazlito data..." diff -r cef92bf1f7cb -r 054f70cb9bec syslinux/stuff/iso2exe/iso9660.c --- a/syslinux/stuff/iso2exe/iso9660.c Wed Dec 31 11:31:10 2014 -0500 +++ b/syslinux/stuff/iso2exe/iso9660.c Thu Jan 01 22:09:19 2015 +0100 @@ -1,11 +1,14 @@ #include #include #include +#include #include "iso9660.h" #define __ROCKRIDGE +#ifdef __AS386_16__ #asm use16 86 #endasm +#endif char *isofilename; unsigned long isofileofs, isofilesize; @@ -69,7 +72,7 @@ dirsize = isodirsize; pos = SECTORSZ; } - if (pos >= SECTORSZ) { + if (pos >= SECTORSZ || * (short *) (buffer + pos) == 0) { if (dirsize < SECTORSZ) return -1; readsector(dirofs); dirofs += SECTORSZ; @@ -124,6 +127,9 @@ return 0; } +#ifndef __AS386_16__ +#define cpuhaslm() (0) +#else static int cpuhaslm(void) { #asm @@ -164,6 +170,7 @@ not386: #endasm } +#endif #define IS_DIR(x)( ((x) & ~0777) == 040000) int isoopen(char *filename) @@ -187,7 +194,7 @@ char *n = name, *i = isofilename; if (_64bits) { int len = strlen(name); - if (strncmp(name, isofilename), len) continue; + if (strncmp(name, isofilename, len)) continue; n = "64"; i += len; }