summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2007-06-26 19:20:55 +1000
committerJeremy Kerr <jk@ozlabs.org>2007-06-26 19:20:55 +1000
commit5395466a3522eccf73e2f617dc4a18bff98b290f (patch)
tree71aabd5355afe62129d0c57acce2c929964b707c
parentc53617ef4337b76b623994404e495e21275f6ce5 (diff)
downloadtalos-petitboot-5395466a3522eccf73e2f617dc4a18bff98b290f.tar.gz
talos-petitboot-5395466a3522eccf73e2f617dc4a18bff98b290f.zip
kboot parser: add facility for default options
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
-rw-r--r--Makefile2
-rw-r--r--devices/kboot-parser.c53
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);
OpenPOWER on IntegriCloud