]> git.ozlabs.org Git - petitboot/blobdiff - discover/kboot-parser.c
discover: pxe: Avoid dereferencing null pointer
[petitboot] / discover / kboot-parser.c
index 9d0322de39280e0f66a28ad9f783c419afbc12ae..bf9c5eb2fe98f5f59056cad85f47e018cb31a674 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 <assert.h>
 #include <stdlib.h>
 #include <string.h>
+#include <i18n/i18n.h>
 
 #include "log/log.h"
 #include "talloc/talloc.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);
 
        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);
        if (root) {
                opt->boot_args = talloc_asprintf(opt, "root=%s %s", root, args);
                talloc_free(args);
@@ -151,33 +160,48 @@ static const char *const kboot_ignored_names[] = {
        NULL
 };
 
        NULL
 };
 
-static int kboot_parse(struct discover_context *dc, char *buf, int len)
+static int kboot_parse(struct discover_context *dc)
 {
        struct conf_context *conf;
 {
        struct conf_context *conf;
+       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)
 
        conf = talloc_zero(dc, struct conf_context);
 
        if (!conf)
-               return 0;
+               return -1;
 
        conf->dc = dc;
        conf->global_options = kboot_global_options,
        conf_init_global_options(conf);
        conf->get_pair = conf_get_pair_equal;
        conf->process_pair = kboot_process_pair;
 
        conf->dc = dc;
        conf->global_options = kboot_global_options,
        conf_init_global_options(conf);
        conf->get_pair = conf_get_pair_equal;
        conf->process_pair = kboot_process_pair;
-       conf->parser_info = (void *)kboot_ignored_names,
+       conf->parser_info = (void *)kboot_ignored_names;
 
 
-       conf_parse_buf(conf, buf, len);
+       for (filename = kboot_conf_files; *filename; filename++) {
+               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);
+       }
 
        talloc_free(conf);
 
        talloc_free(conf);
-       return 1;
+       return 0;
 }
 
 static struct parser kboot_parser = {
        .name                   = "kboot",
 }
 
 static struct parser kboot_parser = {
        .name                   = "kboot",
-       .method                 = CONF_METHOD_LOCAL_FILE,
        .parse                  = kboot_parse,
        .parse                  = kboot_parse,
-       .filenames              = kboot_conf_files,
        .resolve_resource       = resolve_devpath_resource,
 };
 
        .resolve_resource       = resolve_devpath_resource,
 };