X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=discover%2Fgrub2%2Fscript.c;h=3f5bc236a66911fb54111a8ec7d3916c68454cca;hb=d4fc42052f99c5841b642f552f178320eab2731e;hp=67b4b7801f8717d51df2cdbfc68edab97988f082;hpb=882f61e8eb44ec9f9becc32328667c65f364d066;p=petitboot diff --git a/discover/grub2/script.c b/discover/grub2/script.c index 67b4b78..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,10 +246,21 @@ 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]); - return 0; + return 1; } rc = entry->fn(script, entry->data, st->argv->argc, st->argv->argv); @@ -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)