diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-09-17 09:36:11 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-09-24 13:14:59 +0800 |
commit | e8a50ad2461a8efaa4d71ea19692a1b63a0f9bc2 (patch) | |
tree | 74d2c13c671e05ff686031e8e80076547c548292 /discover/grub2/script.c | |
parent | d808f5d2ec8e232d736a5f811d647df91e2a5b43 (diff) | |
download | talos-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.c | 33 |
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; |