[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 05/16] commands/search: Add support to search by partition PAR
From: |
Vitaly Kuzmichev |
Subject: |
[PATCH v5 05/16] commands/search: Add support to search by partition PARTUUID |
Date: |
Tue, 22 Aug 2023 23:39:13 +0200 |
Improve 'search' grub-shell command with functionality to search for
a partition by PARTUUID string. This is useful for embedded systems
where FSUUID is not guaranteed to be constant, e.g. it is not preserved
between system updates, and modifying grub.cfg is undesired.
Signed-off-by: Vitaly Kuzmichev <vitaly.kuzmichev@rtsoft.de>
---
grub-core/Makefile.core.def | 5 +++++
grub-core/commands/search.c | 31 ++++++++++++++++++++++++++--
grub-core/commands/search_partuuid.c | 5 +++++
grub-core/commands/search_wrap.c | 10 +++++++--
include/grub/search.h | 3 +++
5 files changed, 50 insertions(+), 4 deletions(-)
create mode 100644 grub-core/commands/search_partuuid.c
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index d2cf29584..5834e8570 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -1097,6 +1097,11 @@ module = {
common = commands/search_uuid.c;
};
+module = {
+ name = search_part_uuid;
+ common = commands/search_partuuid.c;
+};
+
module = {
name = search_label;
common = commands/search_label.c;
diff --git a/grub-core/commands/search.c b/grub-core/commands/search.c
index 263f1501c..96b32baec 100644
--- a/grub-core/commands/search.c
+++ b/grub-core/commands/search.c
@@ -30,6 +30,8 @@
#include <grub/i18n.h>
#include <grub/disk.h>
#include <grub/partition.h>
+#include <grub/gpt_partition.h>
+#include <grub/msdos_partition.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -86,13 +88,34 @@ iterate_device (const char *name, void *data)
grub_device_close (dev);
}
-#ifdef DO_SEARCH_FS_UUID
+#if defined (DO_SEARCH_PART_UUID)
+#define compare_fn(a, b) grub_uuidcasecmp (a, b, sizeof (grub_guid_t) * 2)
+#elif defined (DO_SEARCH_FS_UUID)
#define compare_fn grub_strcasecmp
#else
#define compare_fn grub_strcmp
#endif
-#ifdef DO_SEARCH_FILE
+#if defined (DO_SEARCH_PART_UUID)
+ {
+ grub_device_t dev;
+ char *part_uuid;
+
+ dev = grub_device_open (name);
+ part_uuid = grub_gpt_partition_get_uuid (dev);
+ if (part_uuid && compare_fn (part_uuid, ctx->key) == 0)
+ found = 1;
+ else
+ {
+ grub_free (part_uuid);
+ part_uuid = grub_mbr_partition_get_uuid (dev);
+ if (part_uuid && compare_fn (part_uuid, ctx->key) == 0)
+ found = 1;
+ }
+ grub_free (part_uuid);
+ grub_device_close (dev);
+ }
+#elif defined (DO_SEARCH_FILE)
{
char *buf;
grub_file_t file;
@@ -333,6 +356,8 @@ static grub_command_t cmd;
#ifdef DO_SEARCH_FILE
GRUB_MOD_INIT(search_fs_file)
+#elif defined (DO_SEARCH_PART_UUID)
+GRUB_MOD_INIT(search_part_uuid)
#elif defined (DO_SEARCH_FS_UUID)
GRUB_MOD_INIT(search_fs_uuid)
#else
@@ -347,6 +372,8 @@ GRUB_MOD_INIT(search_label)
#ifdef DO_SEARCH_FILE
GRUB_MOD_FINI(search_fs_file)
+#elif defined (DO_SEARCH_PART_UUID)
+GRUB_MOD_FINI(search_part_uuid)
#elif defined (DO_SEARCH_FS_UUID)
GRUB_MOD_FINI(search_fs_uuid)
#else
diff --git a/grub-core/commands/search_partuuid.c
b/grub-core/commands/search_partuuid.c
new file mode 100644
index 000000000..2d1d3d0d7
--- /dev/null
+++ b/grub-core/commands/search_partuuid.c
@@ -0,0 +1,5 @@
+#define DO_SEARCH_PART_UUID 1
+#define FUNC_NAME grub_search_part_uuid
+#define COMMAND_NAME "search.part_uuid"
+#define HELP_MESSAGE N_("Search devices by partition UUID. If VARIABLE is
specified, the first device found is set to a variable.")
+#include "search.c"
diff --git a/grub-core/commands/search_wrap.c b/grub-core/commands/search_wrap.c
index 318581f3b..8b9a1f018 100644
--- a/grub-core/commands/search_wrap.c
+++ b/grub-core/commands/search_wrap.c
@@ -36,6 +36,8 @@ static const struct grub_arg_option options[] =
0, 0},
{"fs-uuid", 'u', 0, N_("Search devices by a filesystem
UUID."),
0, 0},
+ {"part-uuid", 'p', 0, N_("Search devices by a partition UUID."),
+ 0, 0},
{"set", 's', GRUB_ARG_OPTION_OPTIONAL,
N_("Set a variable to the first device found."), N_("VARNAME"),
ARG_TYPE_STRING},
@@ -72,6 +74,7 @@ enum options
SEARCH_FILE,
SEARCH_LABEL,
SEARCH_FS_UUID,
+ SEARCH_PART_UUID,
SEARCH_SET,
SEARCH_NO_FLOPPY,
SEARCH_EFIDISK_ONLY,
@@ -193,6 +196,8 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char
**args)
grub_search_label (id, var, flags, hints, nhints);
else if (state[SEARCH_FS_UUID].set)
grub_search_fs_uuid (id, var, flags, hints, nhints);
+ else if (state[SEARCH_PART_UUID].set)
+ grub_search_part_uuid (id, var, flags, hints, nhints);
else if (state[SEARCH_FILE].set)
grub_search_fs_file (id, var, flags, hints, nhints);
else
@@ -212,8 +217,9 @@ GRUB_MOD_INIT(search)
GRUB_COMMAND_FLAG_EXTRACTOR |
GRUB_COMMAND_ACCEPT_DASH,
N_("[-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] ...]"
" NAME"),
- N_("Search devices by file, filesystem label"
- " or filesystem UUID."
+ N_("Search devices by file, filesystem label,"
+ " filesystem UUID, GPT partition UUID"
+ " or MBR partition signature."
" If --set is specified, the first device found is"
" set to a variable. If no variable name is"
" specified, `root' is used."),
diff --git a/include/grub/search.h b/include/grub/search.h
index ffd2411ca..43810379f 100644
--- a/include/grub/search.h
+++ b/include/grub/search.h
@@ -35,5 +35,8 @@ void grub_search_fs_uuid (const char *key, const char *var,
void grub_search_label (const char *key, const char *var,
enum search_flags flags,
char **hints, unsigned nhints);
+void grub_search_part_uuid (const char *key, const char *var,
+ enum search_flags flags,
+ char **hints, unsigned nhints);
#endif
--
2.34.1
- Re: [PATCH v5 01/16] partmap/gpt: Add grub_gpt_partition_get_uuid(), (continued)
[PATCH v5 03/16] commands/probe: Simplify 'probe --part-uuid' command, Vitaly Kuzmichev, 2023/08/22
[PATCH v5 11/16] commands/probe: Add command option to display partition PARTLABEL, Vitaly Kuzmichev, 2023/08/22
[PATCH v5 12/16] docs/grub.texi: Update documentation for 'probe' and 'search' commands, Vitaly Kuzmichev, 2023/08/22
[PATCH v5 04/16] include/grub/misc.h: Fix edge case in grub_uuidcasecmp(), Vitaly Kuzmichev, 2023/08/22
[PATCH v5 05/16] commands/search: Add support to search by partition PARTUUID,
Vitaly Kuzmichev <=
[PATCH v5 10/16] commands/search: Add support to search by partition PARTLABEL, Vitaly Kuzmichev, 2023/08/22
[PATCH v5 13/16] fs/f2fs: Simplify to use grub_utf16_to_utf8_alloc(), Vitaly Kuzmichev, 2023/08/22
[PATCH v5 07/16] include/grub/charset.h: Add grub_utf16_{strlen, strnlen}(), Vitaly Kuzmichev, 2023/08/22
[PATCH v5 06/16] include/grub/charset.h: Enhance grub_utf16_to_utf8(), Vitaly Kuzmichev, 2023/08/22
[PATCH v5 14/16] fs/fat: Simplify to use grub_utf16_to_utf8_alloc(), Vitaly Kuzmichev, 2023/08/22