diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-09-25 08:37:50 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-09-25 11:34:26 +0800 |
commit | 1972d9cfcc5300cd8cb2f587d9bc5f856322ae8f (patch) | |
tree | 29af05dd01214ca68c319748fa600007ed9cc090 /discover/grub2 | |
parent | 995e08e3de9aaff81e72227587ffcb4cc78175d0 (diff) | |
download | talos-petitboot-1972d9cfcc5300cd8cb2f587d9bc5f856322ae8f.tar.gz talos-petitboot-1972d9cfcc5300cd8cb2f587d9bc5f856322ae8f.zip |
discover/grub2: Reimplement default options
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2')
-rw-r--r-- | discover/grub2/grub2.h | 1 | ||||
-rw-r--r-- | discover/grub2/script.c | 25 |
2 files changed, 24 insertions, 2 deletions
diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h index 4d083ae..5ee8503 100644 --- a/discover/grub2/grub2.h +++ b/discover/grub2/grub2.h @@ -89,6 +89,7 @@ struct grub2_script { struct list symtab; struct discover_context *ctx; struct discover_boot_option *opt; + unsigned int n_options; }; struct grub2_parser { diff --git a/discover/grub2/script.c b/discover/grub2/script.c index 3f5bc23..0cf2196 100644 --- a/discover/grub2/script.c +++ b/discover/grub2/script.c @@ -1,6 +1,7 @@ #include <sys/types.h> #include <string.h> +#include <stdlib.h> #include <types/types.h> #include <talloc/talloc.h> @@ -96,6 +97,24 @@ static bool is_delim(char c) return c == ' ' || c == '\t'; } +static bool option_is_default(struct grub2_script *script, + struct discover_boot_option *opt) +{ + unsigned int default_idx; + const char *var; + char *end; + + var = script_env_get(script, "default"); + if (!var) + return false; + + default_idx = strtoul(var, &end, 10); + if (end != var && *end == '\0') + return default_idx == script->n_options; + + return !strcmp(opt->option->name, var); +} + /* For non-double-quoted variable expansions, we may need to split the * variable's value into multiple argv items. * @@ -333,7 +352,10 @@ int statement_menuentry_execute(struct grub2_script *script, statements_execute(script, st->statements); + opt->option->is_default = option_is_default(script, opt); + discover_context_add_boot_option(script->ctx, opt); + script->n_options++; script->opt = NULL; return 0; @@ -407,11 +429,10 @@ struct grub2_script *create_script(struct grub2_parser *parser, { struct grub2_script *script; - script = talloc(parser, struct grub2_script); + script = talloc_zero(parser, struct grub2_script); init_env(script); script->ctx = ctx; - script->opt = NULL; list_init(&script->symtab); register_builtins(script); |