diff options
author | H. Peter Anvin <hpa@zytor.com> | 2008-06-20 16:09:13 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2008-06-20 16:09:13 -0700 |
commit | 188d5ee48e8bdfd7f637b459449f77b218cf3a92 (patch) | |
tree | b766649298f9026b55eae47d6f7d459eefd02f84 | |
parent | fbe507eb900dc42983ea93adce062b333dc2990d (diff) | |
download | syslinux-188d5ee48e8bdfd7f637b459449f77b218cf3a92.tar.gz |
chain.c32: use a more Linux-kernel-like syntax
Make the syntax for chain.c32 more Linux-kernel-like. This also makes
parsing easier, so it's a win all around.
-rw-r--r-- | NEWS | 16 | ||||
-rw-r--r-- | com32/modules/chain.c | 49 |
2 files changed, 37 insertions, 28 deletions
@@ -30,19 +30,23 @@ Changes in 3.70: common extended formats, but it is still possible some very exotic formats need geometry specification. Large floppies and very small harddisks still need explicit specification. - * chain.c32: option -swap to support swapping of BIOS drive + * chain.c32: option "swap" to support swapping of BIOS drive numbers. This is necessary to boot certain operating systems (DOS, Windows) from a secondary drive. - * chain.c32: option -file to support loading a boot file from + * chain.c32: option "file=" to support loading a boot file from the SYSLINUX filesystem instead of loading the boot sector from the drive. - * chain.c32: option -seg to control the load location. - * chain.c32: option -ntldr as a shorthand for "-seg 0x2000 - -file"; use this to load one of WinNT's loaders: + * chain.c32: option "seg=" to control the load location. + * chain.c32: option "ntldr=" as a shorthand for "seg=0x2000 + file="; use this to load one of WinNT's loaders: - chain.c32 hd0 1 -ntldr /MiniNT/setupldr.bin + chain.c32 hd0 1 ntldr=/MiniNT/setupldr.bin Note that the file needs to be in the SYSLINUX filesystem. + * chain.32: options "freedos=" and "msdos="/"pcdos=" as + shorthands for "seg=0x60 file=" and "seg=0x70 file=" + respectively; use this to load FreeDOS's kernel.sys, MS-DOS's + io.sys or PC-DOS's ibmbio.sys. Changes in 3.64: * SYSLINUX/EXTLINUX: support "localboot" with the same feature diff --git a/com32/modules/chain.c b/com32/modules/chain.c index e4aa69b8..e6699614 100644 --- a/com32/modules/chain.c +++ b/com32/modules/chain.c @@ -528,7 +528,7 @@ enomem: int main(int argc, char *argv[]) { - char *mbr; + char *mbr, *p; void *boot_sector = NULL; struct part_entry *partinfo; struct syslinux_rm_regs regs; @@ -546,41 +546,46 @@ int main(int argc, char *argv[]) memset(®s, 0, sizeof regs); for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-file") && argv[i+1]) { - opt.loadfile = argv[++i]; - } else if (!strcmp(argv[i], "-seg") && argv[i+1]) { - uint32_t segval = strtoul(argv[++i], NULL, 0); + if (!strncmp(argv[i], "file=", 5)) { + opt.loadfile = argv[i]+5; + } else if (!strncmp(argv[i], "seg=", 4)) { + uint32_t segval = strtoul(argv[i]+4, NULL, 0); if (segval < 0x50 || segval > 0x9f000) { error("Invalid segment"); goto bail; } opt.seg = segval; - } else if (!strcmp(argv[i], "-ntldr") && argv[i+1]) { + } else if (!strncmp(argv[i], "ntldr=", 6)) { opt.seg = 0x2000; /* NTLDR wants this address */ - opt.loadfile = argv[++i]; - } else if (!strcmp(argv[i], "-freedos") && argv[i+1]) { + opt.loadfile = argv[i]+6; + } else if (!strncmp(argv[i], "freedos=", 8)) { opt.seg = 0x60; /* FREEDOS wants this address */ - opt.loadfile = argv[++i]; - } else if (!strcmp(argv[i], "-msdos") && argv[i+1]) { + opt.loadfile = argv[i]+8; + } else if (!strncmp(argv[i], "msdos=", 6) || + !strncmp(argv[i], "pcdos=", 6)) { opt.seg = 0x70; /* MS-DOS 2.0+ wants this address */ - opt.loadfile = argv[++i]; - } else if (!strcmp(argv[i], "-swap")) { + opt.loadfile = argv[i]+6; + } else if (!strcmp(argv[i], "swap")) { opt.swap = true; } else if (!strcmp(argv[i], "keeppxe")) { opt.keeppxe = 3; + } else if (((argv[i][0] == 'h' || argv[i][0] == 'f') && argv[i][1] == 'd') + || !strncmp(argv[i], "mbr:", 4) + || !strncmp(argv[i], "mbr=", 4)) { + drivename = argv[i]; + p = strchr(drivename, ','); + if (p) { + *p = '\0'; + partition = p+1; + } else if (argv[i+1] && argv[i+1][0] >= '0' && argv[i+1][0] <= '9') { + partition = argv[++i]; + } } else { - if (!drivename) - drivename = argv[i]; - else if (!partition) - partition = argv[i]; + error("Usage: chain.c32 (hd#|fd#|mbr:#)[,partition] [options]\n"); + goto bail; } } - if ( !drivename ) { - error("Usage: chain.c32 (hd#|fd#|mbr:#) [partition] [options]\n"); - goto bail; - } - if (opt.seg) { regs.es = regs.cs = regs.ss = regs.ds = regs.fs = regs.gs = opt.seg; } else { @@ -598,7 +603,7 @@ int main(int argc, char *argv[]) partition = argv[2]; /* Possibly null */ hd = 0; - if ( !memcmp(drivename, "mbr:", 4) ) { + if ( !strncmp(drivename, "mbr", 3) ) { drive = find_disk(strtoul(drivename+4, NULL, 0), mbr); if (drive == -1) { error("Unable to find requested MBR signature\n"); |