#include <stdio.h>
#include <string.h>
+#include <log/log.h>
+#include <types/types.h>
#include <talloc/talloc.h>
#include <array-size/array-size.h>
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)
};
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;
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;
assert(!res->resolved);
- dev = device_lookup_by_uuid(handler, info->root->uuid);
+ dev = device_lookup_by_uuid(handler, info->root);
if (!dev)
return false;
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[]);
/* 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);