diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-09-16 16:47:17 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-09-24 13:14:59 +0800 |
commit | 1513dd5d05f6408a64e19ea18cfaeb0cb8c5fb73 (patch) | |
tree | 5290f1c2d6c57d2d084426d38fa4eb3a7fb187b4 /discover/grub2/builtins.c | |
parent | 64899475f9b895628fd7b654f7b549e50494229a (diff) | |
download | talos-petitboot-1513dd5d05f6408a64e19ea18cfaeb0cb8c5fb73.tar.gz talos-petitboot-1513dd5d05f6408a64e19ea18cfaeb0cb8c5fb73.zip |
discover/grub2: Implement 'linux' & 'initrd' commands
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2/builtins.c')
-rw-r--r-- | discover/grub2/builtins.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/discover/grub2/builtins.c b/discover/grub2/builtins.c index 55597c1..cd56dcc 100644 --- a/discover/grub2/builtins.c +++ b/discover/grub2/builtins.c @@ -2,6 +2,8 @@ #include <stdio.h> #include <string.h> +#include <log/log.h> +#include <types/types.h> #include <talloc/talloc.h> #include <array-size/array-size.h> @@ -33,14 +35,84 @@ static int builtin_set(struct grub2_script *script, return 0; } +static int builtin_linux(struct grub2_script *script, + void *data __attribute__((unused)), + int argc, char *argv[]) +{ + struct discover_boot_option *opt = script->opt; + const char *root; + int i; + + if (!opt) { + pb_log("grub2 syntax error: 'linux' statement outside " + "a menuentry.\n"); + return -1; + } + + if (argc < 2) { + pb_log("grub2 syntax error: no filename provided to " + "linux statement\n"); + return -1; + } + + root = script_env_get(script, "root"); + + opt->boot_image = create_grub2_resource(opt, script->ctx->device, + root, argv[1]); + opt->option->boot_args = NULL; + + if (argc > 2) + opt->option->boot_args = talloc_strdup(opt, argv[2]); + + for (i = 3; i < argc; i++) + opt->option->boot_args = talloc_asprintf_append( + opt->option->boot_args, + " %s", argv[i]); + return 0; +} + +static int builtin_initrd(struct grub2_script *script, + void *data __attribute__((unused)), + int argc, char *argv[]) +{ + struct discover_boot_option *opt = script->opt; + const char *root; + + if (!opt) { + pb_log("grub2 syntax error: 'initrd' statement outside " + "a menuentry.\n"); + return -1; + } + + if (argc < 2) { + pb_log("grub2 syntax error: no filename provided to " + "initrd statement\n"); + return -1; + } + + root = script_env_get(script, "root"); + opt->initrd = create_grub2_resource(opt, script->ctx->device, + root, argv[1]); + + return 0; +} + static struct { const char *name; grub2_function fn; } builtins[] = { { .name = "set", - .fn = builtin_set + .fn = builtin_set, }, + { + .name = "linux", + .fn = builtin_linux, + }, + { + .name = "initrd", + .fn = builtin_initrd, + } }; void register_builtins(struct grub2_script *script) |