diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2019-11-04 14:58:01 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2019-11-29 13:54:10 +0800 |
commit | 1580c6557d4e703348edb0dda83814f8972e9f3d (patch) | |
tree | e4e47b215814831e3eefd409388c47131ac665d4 /discover/grub2 | |
parent | 76e97c5d9dab40236a589cd96a69967d3ef17cab (diff) | |
download | talos-petitboot-1580c6557d4e703348edb0dda83814f8972e9f3d.tar.gz talos-petitboot-1580c6557d4e703348edb0dda83814f8972e9f3d.zip |
discover/grub2: Add support for UUID and label for 'search' command
This change adds support for searching by UUID and filesystem label.
We still fall back to passthrough if the UUID is not found, but we now
resolve to device ID strings.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2')
-rw-r--r-- | discover/grub2/builtins.c | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/discover/grub2/builtins.c b/discover/grub2/builtins.c index ab6b0ec..7cac9f1 100644 --- a/discover/grub2/builtins.c +++ b/discover/grub2/builtins.c @@ -115,6 +115,21 @@ static const struct option search_options[] = { .has_arg = required_argument, .val = 's', }, + { + .name = "file", + .has_arg = no_argument, + .val = 'f', + }, + { + .name = "label", + .has_arg = no_argument, + .val = 'l', + }, + { + .name = "fs-uuid", + .has_arg = no_argument, + .val = 'u', + }, { 0 }, }; @@ -122,13 +137,23 @@ static int builtin_search(struct grub2_script *script, void *data __attribute__((unused)), int argc, char *argv[]) { - const char *env_var, *spec; + const char *env_var, *spec, *res; + struct discover_device *dev; + enum { + LOOKUP_UUID = 'u', + LOOKUP_LABEL = 'l', + LOOKUP_FILE = 'f', + } lookup_type; env_var = "root"; optind = 0; + /* Default to UUID, for backwards compat with earlier petitboot + * versions. This argument is non-optional in GRUB. */ + lookup_type = LOOKUP_UUID; + for (;;) { - int c = getopt_long(argc, argv, ":", search_options, NULL); + int c = getopt_long(argc, argv, ":flu", search_options, NULL); if (c == -1) break; @@ -136,6 +161,11 @@ static int builtin_search(struct grub2_script *script, case 's': env_var = optarg; break; + case LOOKUP_UUID: + case LOOKUP_LABEL: + case LOOKUP_FILE: + lookup_type = c; + break; case '?': case ':': break; @@ -149,8 +179,27 @@ static int builtin_search(struct grub2_script *script, return -1; spec = argv[optind]; + res = NULL; + + switch (lookup_type) { + case LOOKUP_UUID: + dev = device_lookup_by_uuid(script->ctx->handler, + spec); + res = dev ? dev->device->id : spec; + break; + case LOOKUP_LABEL: + dev = device_lookup_by_label(script->ctx->handler, + spec); + if (dev) + res = dev->device->id; + break; + case LOOKUP_FILE: + /* not yet implemented */ + break; + } - script_env_set(script, env_var, spec); + if (res) + script_env_set(script, env_var, res); return 0; } |