summaryrefslogtreecommitdiffstats
path: root/discover/grub2/script.c
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-09-17 09:36:11 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-09-24 13:14:59 +0800
commite8a50ad2461a8efaa4d71ea19692a1b63a0f9bc2 (patch)
tree74d2c13c671e05ff686031e8e80076547c548292 /discover/grub2/script.c
parentd808f5d2ec8e232d736a5f811d647df91e2a5b43 (diff)
downloadtalos-petitboot-e8a50ad2461a8efaa4d71ea19692a1b63a0f9bc2.tar.gz
talos-petitboot-e8a50ad2461a8efaa4d71ea19692a1b63a0f9bc2.zip
discover/grub2: Add function support
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2/script.c')
-rw-r--r--discover/grub2/script.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/discover/grub2/script.c b/discover/grub2/script.c
index ec37fbb..9c08737 100644
--- a/discover/grub2/script.c
+++ b/discover/grub2/script.c
@@ -13,6 +13,8 @@
container_of(stmt, struct grub2_statement_if, st)
#define to_stmt_menuentry(stmt) \
container_of(stmt, struct grub2_statement_menuentry, st)
+#define to_stmt_function(stmt) \
+ container_of(stmt, struct grub2_statement_function, st)
struct env_entry {
const char *name;
@@ -297,6 +299,37 @@ int statement_menuentry_execute(struct grub2_script *script,
return 0;
}
+static int function_invoke(struct grub2_script *script,
+ void *data, int argc, char **argv)
+{
+ struct grub2_statement_function *fn = data;
+ char *name;
+ int i;
+
+ /* set positional parameters */
+ for (i = 0; i < argc; i++) {
+ name = talloc_asprintf(script, "$%d", i);
+ script_env_set(script, name, argv[i]);
+ }
+
+ return statements_execute(script, fn->body);
+}
+
+int statement_function_execute(struct grub2_script *script,
+ struct grub2_statement *statement)
+{
+ struct grub2_statement_function *st = to_stmt_function(statement);
+ const char *name;
+
+ if (st->name->type == GRUB2_WORD_VAR)
+ expand_var(script, st->name);
+
+ name = st->name->text;
+ script_register_function(script, name, function_invoke, st);
+
+ return 0;
+}
+
static void init_env(struct grub2_script *script)
{
struct env_entry *env;
OpenPOWER on IntegriCloud