From: Jeremy Kerr Date: Mon, 16 Sep 2013 08:47:17 +0000 (+0800) Subject: discover/grub2: Implement 'linux' & 'initrd' commands X-Git-Tag: v1.0.0~456 X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=1513dd5d05f6408a64e19ea18cfaeb0cb8c5fb73 discover/grub2: Implement 'linux' & 'initrd' commands Signed-off-by: Jeremy Kerr --- 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 #include +#include +#include #include #include @@ -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);