blob: cc97858e3f1557a388534b2f8c4900104291b8c0 [file] [log] [blame]
Klaus Heinrich Kiwid1cd8c52020-02-27 12:43:47 -03001From a4716f32814e6624f975da0a261175e4fee5f79d Mon Sep 17 00:00:00 2001
2From: Jeremy Kerr <jk@ozlabs.org>
3Date: Wed, 6 Nov 2019 11:04:54 +0800
4Subject: [PATCH 09/18] discover/grub2: Add parsing code for grub2 file
5 specifiers
6
7This change adds a (currently unused) function to parse (device)/path
8references from grub scripts.
9
10Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
11(cherry picked from commit 51f71178cd82a1cb7fae1a4e6bf40290e41b7d0e)
12Signed-off-by: Klaus Heinrich Kiwi <klaus@linux.vnet.ibm.com>
13---
14 discover/grub2/grub2.c | 38 ++++++++++++++++++++++++++++++++++++++
15 discover/grub2/grub2.h | 4 ++++
16 2 files changed, 42 insertions(+)
17
18diff --git a/discover/grub2/grub2.c b/discover/grub2/grub2.c
19index 412298b..3873720 100644
20--- a/discover/grub2/grub2.c
21+++ b/discover/grub2/grub2.c
22@@ -82,6 +82,44 @@ bool resolve_grub2_resource(struct device_handler *handler,
23 return true;
24 }
25
26+struct grub2_file *grub2_parse_file(struct grub2_script *script,
27+ const char *str)
28+{
29+ struct grub2_file *file;
30+ size_t dev_len;
31+ char *pos;
32+
33+ if (!str)
34+ return NULL;
35+
36+ file = talloc_zero(script, struct grub2_file);
37+
38+ if (*str != '(') {
39+ /* just a path - no device, return path as-is */
40+ file->path = talloc_strdup(file, str);
41+
42+ } else {
43+ /* device plus path - split into components */
44+
45+ pos = strchr(str, ')');
46+
47+ /* no closing bracket, or zero-length path? */
48+ if (!pos || *(pos+1) == '\0') {
49+ talloc_free(file);
50+ return NULL;
51+ }
52+
53+ file->path = talloc_strdup(file, pos + 1);
54+
55+ dev_len = pos - str - 1;
56+ if (dev_len)
57+ file->dev = talloc_strndup(file, str + 1, dev_len);
58+ }
59+
60+ return file;
61+}
62+
63+
64 static int grub2_parse(struct discover_context *dc)
65 {
66 const char * const *filename;
67diff --git a/discover/grub2/grub2.h b/discover/grub2/grub2.h
68index 73d91b2..8c4839b 100644
69--- a/discover/grub2/grub2.h
70+++ b/discover/grub2/grub2.h
71@@ -198,6 +198,10 @@ struct resource *create_grub2_resource(struct discover_boot_option *opt,
72 bool resolve_grub2_resource(struct device_handler *handler,
73 struct resource *res);
74
75+/* grub-style device+path parsing */
76+struct grub2_file *grub2_parse_file(struct grub2_script *script,
77+ const char *str);
78+
79 /* external parser api */
80 struct grub2_parser *grub2_parser_create(struct discover_context *ctx);
81 void grub2_parser_parse(struct grub2_parser *parser, const char *filename,
82--
832.17.1
84