]> git.ozlabs.org Git - petitboot/blobdiff - discover/kboot-parser.c
discover: Recognise and open LUKS encrypted partitions
[petitboot] / discover / kboot-parser.c
index 8572674b982a94f1b49395cb3d504cf67f3f3879..4c68cd4dc812c784ab0ea671b813a6392e6bfa42 100644 (file)
@@ -1,8 +1,11 @@
-#define _GNU_SOURCE
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
 
 #include <assert.h>
 #include <stdlib.h>
 #include <string.h>
+#include <i18n/i18n.h>
 
 #include "log/log.h"
 #include "talloc/talloc.h"
@@ -94,6 +97,12 @@ out_add:
        d_opt->boot_image = create_devpath_resource(d_opt,
                                conf->dc->device, value);
 
+       char* args_sigfile_default = talloc_asprintf(d_opt,
+               "%s.cmdline.sig", value);
+       d_opt->args_sig_file = create_devpath_resource(d_opt,
+                               conf->dc->device, args_sigfile_default);
+       talloc_free(args_sigfile_default);
+
        if (root) {
                opt->boot_args = talloc_asprintf(opt, "root=%s %s", root, args);
                talloc_free(args);
@@ -117,6 +126,10 @@ out_add:
                                " dtb=%s", dtb);
        }
 
+       if (conf_get_global_option(conf, "default"))
+               opt->is_default = streq(opt->name,
+                               conf_get_global_option(conf, "default"));
+
        conf_strip_str(opt->boot_args);
        conf_strip_str(opt->description);
 
@@ -128,6 +141,7 @@ static struct conf_global_option kboot_global_options[] = {
        { .name = "initrd" },
        { .name = "root" },
        { .name = "video" },
+       { .name = "default" },
        { .name = NULL }
 };
 
@@ -136,15 +150,18 @@ static const char *const kboot_conf_files[] = {
        "/kboot.cnf",
        "/etc/kboot.conf",
        "/etc/kboot.cnf",
+       "/boot/kboot.conf",
+       "/boot/kboot.cnf",
        "/KBOOT.CONF",
        "/KBOOT.CNF",
        "/ETC/KBOOT.CONF",
        "/ETC/KBOOT.CNF",
+       "/BOOT/KBOOT.CONF",
+       "/BOOT/KBOOT.CNF",
        NULL
 };
 
 static const char *const kboot_ignored_names[] = {
-       "default",
        "delay",
        "message",
        "timeout",
@@ -154,19 +171,22 @@ static const char *const kboot_ignored_names[] = {
 static int kboot_parse(struct discover_context *dc)
 {
        struct conf_context *conf;
+       struct list *found_list;
        const char * const *filename;
-       char *buf;
-       int len, rc;
 
        /* Support block device boot only at present */
        if (dc->event)
                return -1;
 
        conf = talloc_zero(dc, struct conf_context);
-
        if (!conf)
                return -1;
 
+       found_list = talloc(conf, struct list);
+       if (!found_list)
+               return -1;
+       list_init(found_list);
+
        conf->dc = dc;
        conf->global_options = kboot_global_options,
        conf_init_global_options(conf);
@@ -175,11 +195,20 @@ static int kboot_parse(struct discover_context *dc)
        conf->parser_info = (void *)kboot_ignored_names;
 
        for (filename = kboot_conf_files; *filename; filename++) {
+               int len, rc;
+               char *buf;
+
+               if (!parser_is_unique(dc, dc->device, *filename, found_list))
+                       continue;
+
                rc = parser_request_file(dc, dc->device, *filename, &buf, &len);
                if (rc)
                        continue;
 
                conf_parse_buf(conf, buf, len);
+               device_handler_status_dev_info(dc->handler, dc->device,
+                               _("Parsed kboot configuration from %s"),
+                               *filename);
                talloc_free(buf);
        }