summaryrefslogtreecommitdiffstats
path: root/discover/grub2
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2019-11-06 11:04:54 +0800
committerJeremy Kerr <jk@ozlabs.org>2019-11-29 13:54:10 +0800
commit51f71178cd82a1cb7fae1a4e6bf40290e41b7d0e (patch)
treebdf924fa1c85abbebf11e7de70460e73ffa1570d /discover/grub2
parent8cb74c4502712162ba899bc06e2d0cf249a8697b (diff)
downloadtalos-petitboot-51f71178cd82a1cb7fae1a4e6bf40290e41b7d0e.tar.gz
talos-petitboot-51f71178cd82a1cb7fae1a4e6bf40290e41b7d0e.zip
discover/grub2: Add parsing code for grub2 file specifiers
This change adds a (currently unused) function to parse (device)/path references from grub scripts. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2')
-rw-r--r--discover/grub2/grub2.c38
-rw-r--r--discover/grub2/grub2.h4
2 files changed, 42 insertions, 0 deletions
diff --git a/discover/grub2/grub2.c b/discover/grub2/grub2.c
index 412298b..3873720 100644
--- a/discover/grub2/grub2.c
+++ b/discover/grub2/grub2.c
@@ -82,6 +82,44 @@ bool resolve_grub2_resource(struct device_handler *handler,
return true;
}
+struct grub2_file *grub2_parse_file(struct grub2_script *script,
+ const char *str)
+{
+ struct grub2_file *file;
+ size_t dev_len;
+ char *pos;
+
+ if (!str)
+ return NULL;
+
+ file = talloc_zero(script, struct grub2_file);
+
+ if (*str != '(') {
+ /* just a path - no device, return path as-is */
+ file->path = talloc_strdup(file, str);
+
+ } else {
+ /* device plus path - split into components */
+
+ pos = strchr(str, ')');
+
+ /* no closing bracket, or zero-length path? */
+ if (!pos || *(pos+1) == '\0') {
+ talloc_free(file);
+ return NULL;
+ }
+
+ file->path = talloc_strdup(file, pos + 1);
+
+ dev_len = pos - str - 1;
+ if (dev_len)
+ file->dev = talloc_strndup(file, str + 1, dev_len);
+ }
+
+ return file;
+}
+
+
static int grub2_parse(struct discover_context *dc)
{
const char * const *filename;
diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h
index 73d91b2..8c4839b 100644
--- a/discover/grub2/grub2.h
+++ b/discover/grub2/grub2.h
@@ -198,6 +198,10 @@ struct resource *create_grub2_resource(struct discover_boot_option *opt,
bool resolve_grub2_resource(struct device_handler *handler,
struct resource *res);
+/* grub-style device+path parsing */
+struct grub2_file *grub2_parse_file(struct grub2_script *script,
+ const char *str);
+
/* external parser api */
struct grub2_parser *grub2_parser_create(struct discover_context *ctx);
void grub2_parser_parse(struct grub2_parser *parser, const char *filename,
OpenPOWER on IntegriCloud