X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fsyslinux-parser.c;h=38cfd1d32a5925f256457c1a5ab8552823c0da14;hp=be7b94aa5d5b2ccb625ebea1fc23212fda8784c2;hb=c3dfc9b7b91045172d460651c0309b09b0ab121a;hpb=281b1398778cdcde08aa8a6a96d0d8c7794fd259 diff --git a/discover/syslinux-parser.c b/discover/syslinux-parser.c index be7b94a..38cfd1d 100644 --- a/discover/syslinux-parser.c +++ b/discover/syslinux-parser.c @@ -36,12 +36,6 @@ struct syslinux_options { char *cfg_dir; }; -struct conf_file_stat { - char *name; - struct stat stat; - struct list_item list; -}; - static const char *const syslinux_conf_files[] = { "/boot/syslinux/syslinux.cfg", "/syslinux/syslinux.cfg", @@ -338,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) @@ -408,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: @@ -421,25 +418,24 @@ fail: static int syslinux_parse(struct discover_context *dc) { - struct conf_file_stat *confcmp, *confdat; - struct list processed_conf_files; struct syslinux_options *state; const char * const *filename; struct conf_context *conf; - struct stat statbuf; - 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); @@ -449,51 +445,30 @@ static int syslinux_parse(struct discover_context *dc) conf->parser_info = state = talloc_zero(conf, struct syslinux_options); list_init(&state->processed_options); - list_init(&processed_conf_files); - /* * 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 */ - rc = parser_stat_path(dc, dc->device, *filename, &statbuf); - if (rc) - continue; - - rc = 0; - - list_for_each_entry(&processed_conf_files, confcmp, list) { - if (confcmp->stat.st_ino == statbuf.st_ino) { - pb_log("conf file %s is a path duplicate of %s..skipping\n", - *filename, confcmp->name); - rc = 1; - break; - } - } - - if (rc) + if (!parser_is_unique(dc, dc->device, *filename, found_list)) continue; rc = parser_request_file(dc, dc->device, *filename, &buf, &len); if (rc) continue; - confdat = talloc_zero(conf, struct conf_file_stat); - confdat->stat = statbuf; - confdat->name = talloc_strdup(confdat, *filename); - list_add(&processed_conf_files, &confdat->list); - /* * save location of root config file for possible * INCLUDE directives later