summaryrefslogtreecommitdiffstats
path: root/discover/grub2/builtins.c
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-09-16 16:47:17 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-09-24 13:14:59 +0800
commit1513dd5d05f6408a64e19ea18cfaeb0cb8c5fb73 (patch)
tree5290f1c2d6c57d2d084426d38fa4eb3a7fb187b4 /discover/grub2/builtins.c
parent64899475f9b895628fd7b654f7b549e50494229a (diff)
downloadtalos-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.c74
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)
OpenPOWER on IntegriCloud