summaryrefslogtreecommitdiffstats
path: root/discover/grub2
diff options
context:
space:
mode:
authorBen Stoltz <stoltz@google.com>2014-01-15 15:10:25 -0800
committerJeremy Kerr <jk@ozlabs.org>2014-01-17 16:13:25 +0800
commit44e10d816427c001d60eb5e7b3e75b740e5a2823 (patch)
treecfdf9fde6b7f8b556a25fcbc411db002cf0cd13c /discover/grub2
parent729bcafedd3b117c031c413fac2e2d2096d62510 (diff)
downloadtalos-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.c31
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++;
OpenPOWER on IntegriCloud