diff options
author | Ben Stoltz <stoltz@google.com> | 2014-01-15 15:10:25 -0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2014-01-17 16:13:25 +0800 |
commit | 44e10d816427c001d60eb5e7b3e75b740e5a2823 (patch) | |
tree | cfdf9fde6b7f8b556a25fcbc411db002cf0cd13c /discover/grub2 | |
parent | 729bcafedd3b117c031c413fac2e2d2096d62510 (diff) | |
download | talos-petitboot-44e10d816427c001d60eb5e7b3e75b740e5a2823.tar.gz talos-petitboot-44e10d816427c001d60eb5e7b3e75b740e5a2823.zip |
discover/grub: Use --id values for default option detection
Fix Petitboot's grub.cfg parser to handle --id=label argument to
menuentry, and use it (in preference to the option name) when looking
for a default option.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2')
-rw-r--r-- | discover/grub2/script.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/discover/grub2/script.c b/discover/grub2/script.c index a58f1a0..aeb5978 100644 --- a/discover/grub2/script.c +++ b/discover/grub2/script.c @@ -103,7 +103,7 @@ static bool is_delim(char c) } static bool option_is_default(struct grub2_script *script, - struct discover_boot_option *opt) + struct discover_boot_option *opt, const char *id) { unsigned int default_idx; const char *var; @@ -117,7 +117,12 @@ static bool option_is_default(struct grub2_script *script, if (end != var && *end == '\0') return default_idx == script->n_options; - return !strcmp(opt->option->name, var); + /* if we don't have an explicit id for this option, fall back to + * the name */ + if (!id) + id = opt->option->name; + + return !strcmp(id, var); } /* For non-double-quoted variable expansions, we may need to split the @@ -340,24 +345,36 @@ int statement_menuentry_execute(struct grub2_script *script, { struct grub2_statement_menuentry *st = to_stmt_menuentry(statement); struct discover_boot_option *opt; + const char *id = NULL; + int i; process_expansions(script, st->argv); opt = discover_boot_option_create(script->ctx, script->ctx->device); - if (st->argv->argc > 0) { + + /* XXX: --options=values need to be parsed properly; this is a simple + * implementation to get --id= working. + */ + for (i = 1; i < st->argv->argc; ++i) { + if (strncmp("--id=", st->argv->argv[i], 5) == 0) { + id = st->argv->argv[i] + 5; + break; + } + } + if (st->argv->argc > 0) opt->option->name = talloc_strdup(opt, st->argv->argv[0]); - } else { + else opt->option->name = talloc_strdup(opt, "(unknown)"); - } + opt->option->id = talloc_asprintf(opt->option, "%s#%s", script->ctx->device->device->id, - opt->option->name); + id ? id : opt->option->name); script->opt = opt; statements_execute(script, st->statements); - opt->option->is_default = option_is_default(script, opt); + opt->option->is_default = option_is_default(script, opt, id); discover_context_add_boot_option(script->ctx, opt); script->n_options++; |