[PATCH 05/14] discover/grub2: expose a struct for grub2 file references

Samuel Mendoza-Jonas sam at mendozajonas.com
Mon Dec 2 16:47:48 AEDT 2019


On Wed, 2019-11-20 at 10:42 +0800, Jeremy Kerr wrote:
> 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 at ozlabs.org>
> ---
>  discover/grub2/grub2.c | 24 +++++++++---------------
>  discover/grub2/grub2.h |  8 ++++++++
>  2 files changed, 17 insertions(+), 15 deletions(-)
> 
> diff --git a/discover/grub2/grub2.c b/discover/grub2/grub2.c
> index f62ccdd..412298b 100644
> --- a/discover/grub2/grub2.c
> +++ b/discover/grub2/grub2.c
> @@ -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, "://")) {
> @@ -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);

Should be fine I think but caught my eye; do we lose anything by
dropping that talloc_reference()?

>  
>  		res->resolved = false;
> -		res->info = info;
> +		res->info = file;
>  
>  	} else
>  		resolve_resource_against_device(res, orig_device,
> path);
> @@ -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;
>  }
> diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h
> index 68176fb..73d91b2 100644
> --- a/discover/grub2/grub2.h
> +++ b/discover/grub2/grub2.h
> @@ -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[]);



More information about the Petitboot mailing list