Gert Hulselmans
2010-Jul-05 22:23 UTC
[syslinux] whichsys.c32: execute specific command, based on Syslinux bootloader variant
I wrote a new module "whichsys.c32" which detemines which command to execute, based on the Syslinux bootloader variant. In the near future it should/can be replaced by a lua script. But for people who want small binaries: whichsys.c32 is +/- eighty times smaller than lua.c32, atm. Usage: whichsys.c32 [-iso- command] [-pxe- command] [-sys- command] Examples: whichsys.c32 -iso- chain.c32 hd0 -sys- chain.c32 hd1 swap whichsys.c32 -iso- config iso.cfg -sys- sys.cfg -pxe- pxe.cfg http://git.zytor.com/?p=users/gerth/syslinux.git;a=commit;h=66c3eb4f6fc622fc3326956adfb0c6e23342b98f - Gert Hulselmans --- com32/modules/Makefile | 2 +- com32/modules/whichsys.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 1 deletions(-) create mode 100644 com32/modules/whichsys.c diff --git a/com32/modules/Makefile b/com32/modules/Makefile index f42ce96..2d47913 100644 --- a/com32/modules/Makefile +++ b/com32/modules/Makefile @@ -22,7 +22,7 @@ MODULES = chain.c32 config.c32 ethersel.c32 dmitest.c32 cpuidtest.c32 \ disk.c32 pcitest.c32 elf.c32 linux.c32 reboot.c32 pmload.c32 \ meminfo.c32 sdi.c32 sanboot.c32 ifcpu64.c32 vesainfo.c32 \ kbdmap.c32 cmd.c32 vpdtest.c32 host.c32 ls.c32 gpxecmd.c32 \ - ifcpu.c32 cpuid.c32 cat.c32 pwd.c32 ifplop.c32 + ifcpu.c32 cpuid.c32 cat.c32 pwd.c32 ifplop.c32 whichsys.c32 TESTFILES diff --git a/com32/modules/whichsys.c b/com32/modules/whichsys.c new file mode 100644 index 0000000..c186722 --- /dev/null +++ b/com32/modules/whichsys.c @@ -0,0 +1,128 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2010 Gert Hulselmans - All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston MA 02110-1301, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * whichsys.c + * + * Detemine which command to execute, based on the Syslinux bootloader variant + * from which you run it. + * + * Usage: whichsys.c32 [-iso- command] [-pxe- command] [-sys- command] + * Examples: whichsys.c32 -iso- chain.c32 hd0 -sys- chain.c32 hd1 swap + * whichsys.c32 -iso- config iso.cfg -sys- sys.cfg -pxe- pxe.cfg + * + */ + +#include <stdio.h> +#include <alloca.h> +#include <console.h> +#include <string.h> +#include <syslinux/boot.h> +#include "syslinux/config.h" + + +static struct syslinux_parameter { + char **arg[1]; + bool option; +} isolinux, pxelinux, syslinux; + +/* XXX: this really should be librarized */ +static void boot_args(char **args) +{ + int len = 0, a = 0; + char **pp; + const char *p; + char c, *q, *str; + + for (pp = args; *pp; pp++) + len += strlen(*pp) + 1; + + q = str = alloca(len); + for (pp = args; *pp; pp++) { + p = *pp; + while ((c = *p++)) + *q++ = c; + *q++ = ' '; + a = 1; + } + q -= a; + *q = '\0'; + + if (!str[0]) + syslinux_run_default(); + else + syslinux_run_command(str); +} + +static void usage(void) +{ + static const char usage[] = "\ +Usage: whichsys.c32 [-iso- command] [-pxe- command] [-sys- command]\n\ +Examples: whichsys.c32 -iso- chain.c32 hd0 -sys- chain.c32 hd1 swap\n\ + whichsys.c32 -iso- config iso.cfg -sys- sys.cfg -pxe- pxe.cfg\n"; + fprintf(stderr, usage); +} + +int main(int argc, char *argv[]) +{ + const union syslinux_derivative_info *sdi; + + int arg = 0; + + openconsole(&dev_null_r, &dev_stdcon_w); + + /* If no argument got passed, let's show the usage */ + if (argc == 1) { + usage(); + return 0; + } + + arg++; + + while (arg < argc) { + if (!strcmp(argv[arg], "-iso-")) { + argv[arg] = NULL; + isolinux.arg[0] = &argv[arg + 1]; + isolinux.option = true; + } + if (!strcmp(argv[arg], "-pxe-")) { + argv[arg] = NULL; + pxelinux.arg[0] = &argv[arg + 1]; + pxelinux.option = true; + } + if (!strcmp(argv[arg], "-sys-")) { + argv[arg] = NULL; + syslinux.arg[0] = &argv[arg + 1]; + syslinux.option = true; + } + arg++; + } + + sdi = syslinux_derivative_info(); + + switch (sdi->c.filesystem) { + case SYSLINUX_FS_ISOLINUX: + isolinux.option ? boot_args(isolinux.arg[0]) : fprintf(stderr, "No command specified for ISOLINUX.\n\n"); usage(); + break; + case SYSLINUX_FS_PXELINUX: + pxelinux.option ? boot_args(pxelinux.arg[0]) : fprintf(stderr, "No command specified for PXELINUX.\n\n"); usage(); + break; + case SYSLINUX_FS_SYSLINUX: + syslinux.option ? boot_args(syslinux.arg[0]) : fprintf(stderr, "No command specified for SYSLINUX.\n\n"); usage(); + break; + case SYSLINUX_FS_UNKNOWN: + default: + fprintf(stderr, "Unknown Syslinux filesystem\n\n"); + } + + return -1; +} -- 1.6.3.3
Possibly Parallel Threads
- [PATCH] ifplop.c32: Detect if PLoP USB/CD INT13h hook is enabled/disabled
- [PATCH] ifcpuXX: Support multiple parameters with labels
- [PATCH] ifmemdsk.c32: Allow boot options based on presence of MEMDISK
- [PATCH] Fix recognition of keeppxe option
- bug in ifcpu64 if !pae and only two options?