X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fsyslinux-parser.c;h=38cfd1d32a5925f256457c1a5ab8552823c0da14;hp=b1274942e753f4137f6ced79badab221ead1191b;hb=9e869ebe3a5127575105d82c4d289d95cbed2db9;hpb=b014b38f115dcc1b47e52f8b5f9eb219f75ef071 diff --git a/discover/syslinux-parser.c b/discover/syslinux-parser.c index b127494..38cfd1d 100644 --- a/discover/syslinux-parser.c +++ b/discover/syslinux-parser.c @@ -36,7 +36,6 @@ struct syslinux_options { char *cfg_dir; }; - static const char *const syslinux_conf_files[] = { "/boot/syslinux/syslinux.cfg", "/syslinux/syslinux.cfg", @@ -333,11 +332,13 @@ static void syslinux_finalize(struct conf_context *conf) /* '-' can signal do not use global APPEND */ if (!strcmp(syslinux_opt->append, "-")) opt->boot_args = talloc_strdup(opt, ""); - else + else if (global_append) opt->boot_args = talloc_asprintf(opt, "%s %s", global_append, syslinux_opt->append); - } else + else + opt->boot_args = talloc_strdup(opt, syslinux_opt->append); + } else if (global_append) opt->boot_args = talloc_strdup(opt, global_append); if (!opt->boot_args) @@ -403,6 +404,7 @@ static void syslinux_finalize(struct conf_context *conf) conf_strip_str(opt->description); discover_context_add_boot_option(dc, d_opt); + d_opt = NULL; continue; fail: @@ -419,19 +421,21 @@ static int syslinux_parse(struct discover_context *dc) struct syslinux_options *state; const char * const *filename; struct conf_context *conf; - char *cfg_dir; - int len, rc; - char *buf; + struct list *found_list; /* 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 = syslinux_global_options, conf_init_global_options(conf); @@ -444,15 +448,23 @@ static int syslinux_parse(struct discover_context *dc) /* * set the global defaults * by spec 'default' defaults to 'linux' and - * 'implicit' defaults to '1', we also just set - * and empty string in 'append' to make it easier - * in syslinux_finish + * 'implicit' defaults to '1' */ conf_set_global_option(conf, "default", "linux"); conf_set_global_option(conf, "implicit", "1"); - conf_set_global_option(conf, "append", ""); for (filename = syslinux_conf_files; *filename; filename++) { + char *cfg_dir; + int len, rc; + char *buf; + + /* + * guard against duplicate entries in case-insensitive + * filesystems, mainly vfat boot partitions + */ + if (!parser_is_unique(dc, dc->device, *filename, found_list)) + continue; + rc = parser_request_file(dc, dc->device, *filename, &buf, &len); if (rc) continue;