diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-09-13 16:33:58 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-09-24 13:14:59 +0800 |
commit | 5c6c8ea8ca66fe70563143cb226852a10b1a98fb (patch) | |
tree | b14557b3f7914f0b762401a9c9bf8f3b30b188a2 /discover/grub2/builtins.c | |
parent | 0a47d0c3a25552e0661fd919c4f87f990b081245 (diff) | |
download | talos-petitboot-5c6c8ea8ca66fe70563143cb226852a10b1a98fb.tar.gz talos-petitboot-5c6c8ea8ca66fe70563143cb226852a10b1a98fb.zip |
discover/grub2: Add initial command execution
.. with a simple 'set' command to update the environment
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2/builtins.c')
-rw-r--r-- | discover/grub2/builtins.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/discover/grub2/builtins.c b/discover/grub2/builtins.c new file mode 100644 index 0000000..379e870 --- /dev/null +++ b/discover/grub2/builtins.c @@ -0,0 +1,47 @@ + +#include <stdio.h> +#include <string.h> + +#include <talloc/talloc.h> +#include <array-size/array-size.h> + +#include "grub2.h" + + +static int builtin_set(struct grub2_script *script, int argc, char *argv[]) +{ + char *name, *value, *p; + int i; + + if (argc < 2) + return -1; + + p = strchr(argv[1], '='); + if (!p) + return -1; + + name = talloc_strndup(script, argv[1], p - argv[1]); + value = talloc_strdup(script, p+1); + + for (i = 2; i < argc; i++) + value = talloc_asprintf_append(value, " %s", argv[i]); + + script_env_set(script, name, value); + + return 0; +} + +static struct grub2_command commands[] = { + { + .name = "set", + .exec = builtin_set + }, +}; + +void register_builtins(struct grub2_script *script) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(commands); i++) + script_register_command(script, &commands[i]); +} |