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 | |
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>
-rw-r--r-- | discover/grub2/builtins.c | 74 | ||||
-rw-r--r-- | discover/grub2/grub2.c | 8 | ||||
-rw-r--r-- | discover/grub2/grub2.h | 6 |
3 files changed, 78 insertions, 10 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) diff --git a/discover/grub2/grub2.c b/discover/grub2/grub2.c index ebc6ac7..fb3d866 100644 --- a/discover/grub2/grub2.c +++ b/discover/grub2/grub2.c @@ -31,14 +31,14 @@ static const char *const grub2_conf_files[] = { }; struct grub2_resource_info { - struct grub2_root *root; + char *root; char *path; }; /* we use slightly different resources for grub2 */ struct resource *create_grub2_resource(void *ctx, struct discover_device *orig_device, - struct grub2_root *root, const char *path) + const char *root, const char *path) { struct grub2_resource_info *info; struct resource *res; @@ -47,8 +47,8 @@ struct resource *create_grub2_resource(void *ctx, if (root) { info = talloc(res, struct grub2_resource_info); - info->root = root; talloc_reference(info, root); + info->root = talloc_strdup(info, root); info->path = talloc_strdup(info, path); res->resolved = false; @@ -68,7 +68,7 @@ bool resolve_grub2_resource(struct device_handler *handler, assert(!res->resolved); - dev = device_lookup_by_uuid(handler, info->root->uuid); + dev = device_lookup_by_uuid(handler, info->root); if (!dev) return false; diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h index 2de77a2..4949f3c 100644 --- a/discover/grub2/grub2.h +++ b/discover/grub2/grub2.h @@ -85,10 +85,6 @@ struct grub2_parser { struct grub2_script *script; }; -struct grub2_root { - char *uuid; -}; - /* type for builtin functions */ typedef int (*grub2_function)(struct grub2_script *script, void *data, int argc, char *argv[]); @@ -150,7 +146,7 @@ void register_builtins(struct grub2_script *script); /* resources */ struct resource *create_grub2_resource(void *ctx, struct discover_device *orig_device, - struct grub2_root *root, const char *path); + const char *root, const char *path); bool resolve_grub2_resource(struct device_handler *handler, struct resource *res); |