summaryrefslogtreecommitdiffstats
path: root/discover/grub2/script.c
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-09-25 08:37:50 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-09-25 11:34:26 +0800
commit1972d9cfcc5300cd8cb2f587d9bc5f856322ae8f (patch)
tree29af05dd01214ca68c319748fa600007ed9cc090 /discover/grub2/script.c
parent995e08e3de9aaff81e72227587ffcb4cc78175d0 (diff)
downloadtalos-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/script.c')
-rw-r--r--discover/grub2/script.c25
1 files changed, 23 insertions, 2 deletions
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);
OpenPOWER on IntegriCloud