summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--discover/grub2/builtins.c74
-rw-r--r--discover/grub2/grub2.c8
-rw-r--r--discover/grub2/grub2.h6
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);
OpenPOWER on IntegriCloud