X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fgrub2%2Fscript.c;h=3f5bc236a66911fb54111a8ec7d3916c68454cca;hb=f452571550b6c6016698a50c834087c0d8c7575b;hp=5fb13aa4f0979e24451471df8db627c4802ee26b;hpb=bbf4805d8750a363b1ec78831ad085b8c56a1c99;p=petitboot diff --git a/discover/grub2/script.c b/discover/grub2/script.c index 5fb13aa..3f5bc23 100644 --- a/discover/grub2/script.c +++ b/discover/grub2/script.c @@ -9,6 +9,8 @@ #define to_stmt_simple(stmt) \ container_of(stmt, struct grub2_statement_simple, st) +#define to_stmt_block(stmt) \ + container_of(stmt, struct grub2_statement_block, st) #define to_stmt_if(stmt) \ container_of(stmt, struct grub2_statement_if, st) #define to_stmt_menuentry(stmt) \ @@ -233,6 +235,7 @@ int statement_simple_execute(struct grub2_script *script, { struct grub2_statement_simple *st = to_stmt_simple(statement); struct grub2_symtab_entry *entry; + char *pos; int rc; if (!st->argv) @@ -243,6 +246,17 @@ int statement_simple_execute(struct grub2_script *script, if (!st->argv->argc) return 0; + /* is this a var=value assignment? */ + pos = strchr(st->argv->argv[0], '='); + if (pos) { + char *name, *value; + name = st->argv->argv[0]; + name = talloc_strndup(st, name, pos - name); + value = pos + 1; + script_env_set(script, name, value); + return 0; + } + entry = script_lookup_function(script, st->argv->argv[0]); if (!entry) { fprintf(stderr, "undefined function '%s'\n", st->argv->argv[0]); @@ -254,6 +268,13 @@ int statement_simple_execute(struct grub2_script *script, return rc; } +int statement_block_execute(struct grub2_script *script, + struct grub2_statement *statement) +{ + struct grub2_statement_block *st = to_stmt_block(statement); + return statements_execute(script, st->statements); +} + /* returns 0 if the statement was executed, 1 otherwise */ static int statement_conditional_execute(struct grub2_script *script, struct grub2_statement *statement, bool *executed)