]> git.ozlabs.org Git - petitboot/blobdiff - devices/kboot-parser.c
Make kboot_parser global options array static
[petitboot] / devices / kboot-parser.c
index ef1f247b8b39ffd5ce879220d314933ca7ebf5d2..df2e7620e13ad8ea40a735aaa04da60881f43de1 100644 (file)
@@ -15,7 +15,7 @@
 
 #define buf_size 1024
 
-static const char *mountpoint;
+static const char *devpath;
 
 static int param_is_ignored(const char *param)
 {
@@ -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;
+};
+
+
+static 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;
@@ -97,15 +138,16 @@ static int parse_option(struct boot_option *opt, char *config)
 
        /* if there's no space, it's only a kernel image with no params */
        if (!pos) {
-               opt->boot_image_file = join_paths(mountpoint, config);
+               opt->boot_image_file = resolve_path(config, devpath);
                opt->description = strdup(config);
                return 1;
        }
 
        *pos = 0;
-       opt->boot_image_file = join_paths(mountpoint, config);
+       opt->boot_image_file = resolve_path(config, devpath);
 
        cmdline = malloc(buf_size);
+       *cmdline = 0;
 
        for (pos++; pos;) {
                pos = get_param_pair(pos, &name, &value, ' ');
@@ -127,12 +169,17 @@ 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);
                cmdline = tmp;
 
-               opt->initrd_file = join_paths(mountpoint, initrd);
+               opt->initrd_file = resolve_path(initrd, devpath);
        }
 
        if (root) {
@@ -140,17 +187,18 @@ 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;
        }
 
-       printf("kboot cmdline: %s", cmdline);
+       pb_log("kboot cmdline: %s\n", cmdline);
        opt->boot_args = cmdline;
 
-       asprintf(&opt->description, "%s %s", config, cmdline);
+       asprintf(&opt->description, "%s %s",
+                       config, opt->boot_args);
 
        return 1;
 }
@@ -165,11 +213,17 @@ static void parse_buf(struct device *dev, char *buf)
 
                pos = get_param_pair(pos, &name, &value, '\n');
 
-               printf("kboot param: '%s' = '%s'\n", name, value);
+               pb_log("kboot param: '%s' = '%s'\n", name, value);
 
                if (name == NULL || param_is_ignored(name))
                        continue;
 
+               if (*name == '#')
+                       continue;
+
+               if (check_for_global_option(name, value))
+                       continue;
+
                memset(&opt, 0, sizeof(opt));
                opt.name = strdup(name);
 
@@ -182,16 +236,16 @@ static void parse_buf(struct device *dev, char *buf)
        }
 }
 
-static int parse(const char *devicepath, const char *_mountpoint)
+static int parse(const char *device)
 {
        char *filepath, *buf;
        int fd, len, rc = 0;
        struct stat stat;
        struct device *dev;
 
-       mountpoint = _mountpoint;
+       devpath = device;
 
-       filepath = join_paths(mountpoint, "/etc/kboot.conf");
+       filepath = resolve_path("/etc/kboot.conf", devpath);
 
        fd = open(filepath, O_RDONLY);
        if (fd < 0)
@@ -211,7 +265,7 @@ static int parse(const char *devicepath, const char *_mountpoint)
 
        dev = malloc(sizeof(*dev));
        memset(dev, 0, sizeof(*dev));
-       dev->id = strdup(devicepath);
+       dev->id = strdup(device);
        dev->icon_file = strdup(generic_icon_file(guess_device_type()));
 
        parse_buf(dev, buf);