X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fsyslinux-parser.c;h=be7b94aa5d5b2ccb625ebea1fc23212fda8784c2;hp=b1274942e753f4137f6ced79badab221ead1191b;hb=281b1398778cdcde08aa8a6a96d0d8c7794fd259;hpb=b014b38f115dcc1b47e52f8b5f9eb219f75ef071 diff --git a/discover/syslinux-parser.c b/discover/syslinux-parser.c index b127494..be7b94a 100644 --- a/discover/syslinux-parser.c +++ b/discover/syslinux-parser.c @@ -36,6 +36,11 @@ 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", @@ -416,9 +421,12 @@ 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; @@ -441,6 +449,8 @@ 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 @@ -453,10 +463,37 @@ static int syslinux_parse(struct discover_context *dc) conf_set_global_option(conf, "append", ""); for (filename = syslinux_conf_files; *filename; filename++) { + /* + * 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) + 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