From 5395466a3522eccf73e2f617dc4a18bff98b290f Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Tue, 26 Jun 2007 19:20:55 +1000 Subject: [PATCH] kboot parser: add facility for default options Signed-off-by: Jeremy Kerr --- Makefile | 2 +- devices/kboot-parser.c | 53 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 764582b..161d01a 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ TWIN_CFLAGS?=$(shell pkg-config --cflags libtwin) TWIN_LDFLAGS?=$(shell pkg-config --libs libtwin) LDFLAGS = -CFLAGS = -O0 -ggdb -Wall '-DPREFIX="$(PREFIX)"' +CFLAGS = --std=c99 -O0 -ggdb -Wall '-DPREFIX="$(PREFIX)"' PARSERS = native yaboot kboot ARTWORK = background.jpg cdrom.png hdd.png usbpen.png tux.png cursor.gz diff --git a/devices/kboot-parser.c b/devices/kboot-parser.c index 4485759..d449ef6 100644 --- a/devices/kboot-parser.c +++ b/devices/kboot-parser.c @@ -76,6 +76,47 @@ static char *get_param_pair(char *str, char **name_out, char **value_out, return tmp ? tmp + 1 : NULL; } +struct global_option { + char *name; + char *value; +}; + + +struct global_option global_options[] = { + { .name = "root" }, + { .name = "initrd" }, + { .name = "video" }, + { .name = NULL } +}; + +/* + * Check if an option (name=value) is a global option. If so, store it in + * the global options table, and return 1. Otherwise, return 0. + */ +static int check_for_global_option(const char *name, const char *value) +{ + int i; + + for (i = 0; global_options[i].name ;i++) { + if (!strcmp(name, global_options[i].name)) { + global_options[i].value = strdup(value); + return 1; + } + } + return 0; +} + +static char *get_global_option(const char *name) +{ + int i; + + for (i = 0; global_options[i].name ;i++) + if (!strcmp(name, global_options[i].name)) + return global_options[i].value; + + return NULL; +} + static int parse_option(struct boot_option *opt, char *config) { char *pos, *name, *value, *root, *initrd, *cmdline, *tmp; @@ -128,6 +169,11 @@ static int parse_option(struct boot_option *opt, char *config) } } + if (!root) + root = get_global_option("root"); + if (!initrd) + initrd = get_global_option("initrd"); + if (initrd) { asprintf(&tmp, "initrd=%s %s", initrd, cmdline); free(cmdline); @@ -141,14 +187,14 @@ static int parse_option(struct boot_option *opt, char *config) free(cmdline); cmdline = tmp; - } else if (!initrd) { + } else if (initrd) { /* if there's an initrd but no root, fake up /dev/ram0 */ asprintf(&tmp, "root=/dev/ram0 %s", cmdline); free(cmdline); cmdline = tmp; } - pb_log("kboot cmdline: %s", cmdline); + pb_log("kboot cmdline: %s\n", cmdline); opt->boot_args = cmdline; asprintf(&opt->description, "%s %s", config, cmdline); @@ -174,6 +220,9 @@ static void parse_buf(struct device *dev, char *buf) if (*name == '#') continue; + if (check_for_global_option(name, value)) + continue; + memset(&opt, 0, sizeof(opt)); opt.name = strdup(name); -- 2.39.2