Skip to content

Commit

Permalink
discover/grub2: expose a struct for grub2 file references
Browse files Browse the repository at this point in the history
Currently, we have struct grub2_resource_info to keep references to boot
payloads that may be returned in boot options, and be (conditionally)
resolved by the parser.

We'd also like to use the same semantics for other file references in
the grub2 parser, for arbitrary usage in scripts - where files are
also referenced by a path and an optional device.

To do this, this change moves struct grub2_resource_info to grub2.h, and
renames to struct grub2_file. Future changes will use this for
script-internal file handling.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
  • Loading branch information
jk-ozlabs committed Nov 29, 2019
1 parent 1580c65 commit 8cb74c4
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 15 deletions.
24 changes: 9 additions & 15 deletions discover/grub2/grub2.c
Expand Up @@ -33,17 +33,12 @@ static const char *const grub2_conf_files[] = {
NULL
};

struct grub2_resource_info {
char *root;
char *path;
};

/* we use slightly different resources for grub2 */
struct resource *create_grub2_resource(struct discover_boot_option *opt,
struct discover_device *orig_device,
const char *root, const char *path)
{
struct grub2_resource_info *info;
struct grub2_file *file;
struct resource *res;

if (strstr(path, "://")) {
Expand All @@ -55,13 +50,12 @@ struct resource *create_grub2_resource(struct discover_boot_option *opt,
res = talloc(opt, struct resource);

if (root) {
info = talloc(res, struct grub2_resource_info);
talloc_reference(info, root);
info->root = talloc_strdup(info, root);
info->path = talloc_strdup(info, path);
file = talloc(res, struct grub2_file);
file->dev = talloc_strdup(file, root);
file->path = talloc_strdup(file, path);

res->resolved = false;
res->info = info;
res->info = file;

} else
resolve_resource_against_device(res, orig_device, path);
Expand All @@ -72,18 +66,18 @@ struct resource *create_grub2_resource(struct discover_boot_option *opt,
bool resolve_grub2_resource(struct device_handler *handler,
struct resource *res)
{
struct grub2_resource_info *info = res->info;
struct grub2_file *file = res->info;
struct discover_device *dev;

assert(!res->resolved);

dev = device_lookup_by_uuid(handler, info->root);
dev = device_lookup_by_uuid(handler, file->dev);

if (!dev)
return false;

resolve_resource_against_device(res, dev, info->path);
talloc_free(info);
resolve_resource_against_device(res, dev, file->path);
talloc_free(file);

return true;
}
Expand Down
8 changes: 8 additions & 0 deletions discover/grub2/grub2.h
Expand Up @@ -107,6 +107,14 @@ struct grub2_parser {
bool inter_word;
};

/* References to files in grub2 consist of an optional device and a path
* (specified here by UUID). If the dev is unspecified, we fall back to a
* default - usually the 'root' environment variable. */
struct grub2_file {
char *dev;
char *path;
};

/* type for builtin functions */
typedef int (*grub2_function)(struct grub2_script *script, void *data,
int argc, char *argv[]);
Expand Down

0 comments on commit 8cb74c4

Please sign in to comment.