grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/1] search: Add search by GPT partition type
@ 2018-06-20 15:38 Will Thompson
  2018-06-20 15:38 ` [PATCH 1/1] " Will Thompson
  0 siblings, 1 reply; 3+ messages in thread
From: Will Thompson @ 2018-06-20 15:38 UTC (permalink / raw)
  To: grub-devel, linux; +Cc: Will Thompson

This may be useful to locate a root partition by the GUID defined in the
Discoverable Partitions Specification.

https://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/

Endless moved away from using this technique because we have to support
non-GPT partition tables in some cases, but this feature may be useful
to others in future.

Carlo Caione (1):
  search: Add search by GPT partition type

 docs/grub.texi                   | 14 ++++---
 grub-core/Makefile.core.def      |  5 +++
 grub-core/commands/search.c      | 69 +++++++++++++++++++++++++++++++-
 grub-core/commands/search_type.c |  5 +++
 grub-core/commands/search_wrap.c | 12 ++++--
 grub-core/partmap/gpt.c          |  9 +++++
 include/grub/gpt_partition.h     |  9 -----
 include/grub/partition.h         | 12 ++++++
 include/grub/search.h            |  2 +
 9 files changed, 118 insertions(+), 19 deletions(-)
 create mode 100644 grub-core/commands/search_type.c

-- 
2.17.1



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/1] search: Add search by GPT partition type
  2018-06-20 15:38 [PATCH 0/1] search: Add search by GPT partition type Will Thompson
@ 2018-06-20 15:38 ` Will Thompson
  2018-10-18 10:27   ` Daniel Kiper
  0 siblings, 1 reply; 3+ messages in thread
From: Will Thompson @ 2018-06-20 15:38 UTC (permalink / raw)
  To: grub-devel, linux; +Cc: Carlo Caione, Will Thompson

From: Carlo Caione <carlo@endlessm.com>

Add a new search.fs_type tool to search by GPT partition type UUID.

Signed-off-by: Carlo Caione <carlo@endlessm.com>
Signed-off-by: Will Thompson <wjt@endlessm.com>
---
 docs/grub.texi                   | 14 ++++---
 grub-core/Makefile.core.def      |  5 +++
 grub-core/commands/search.c      | 69 +++++++++++++++++++++++++++++++-
 grub-core/commands/search_type.c |  5 +++
 grub-core/commands/search_wrap.c | 12 ++++--
 grub-core/partmap/gpt.c          |  9 +++++
 include/grub/gpt_partition.h     |  9 -----
 include/grub/partition.h         | 12 ++++++
 include/grub/search.h            |  2 +
 9 files changed, 118 insertions(+), 19 deletions(-)
 create mode 100644 grub-core/commands/search_type.c

diff --git a/docs/grub.texi b/docs/grub.texi
index 2adfa97be..17b3ff55c 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -4849,11 +4849,12 @@ unbootable. @xref{Using digital signatures}, for more information.
 @subsection search
 
 @deffn Command search @
- [@option{--file}|@option{--label}|@option{--fs-uuid}] @
+ [@option{--file}|@option{--label}|@option{--fs-uuid}|@option{--fs-type}] @
  [@option{--set} [var]] [@option{--no-floppy}] name
 Search devices by file (@option{-f}, @option{--file}), filesystem label
-(@option{-l}, @option{--label}), or filesystem UUID (@option{-u},
-@option{--fs-uuid}).
+(@option{-l}, @option{--label}), filesystem UUID (@option{-u},
+@option{--fs-uuid}), or filesystem type UUID (@option{-t},
+@option{--fs-type}).
 
 If the @option{--set} option is used, the first device found is set as the
 value of environment variable @var{var}.  The default variable is
@@ -4862,9 +4863,10 @@ value of environment variable @var{var}.  The default variable is
 The @option{--no-floppy} option prevents searching floppy devices, which can
 be slow.
 
-The @samp{search.file}, @samp{search.fs_label}, and @samp{search.fs_uuid}
-commands are aliases for @samp{search --file}, @samp{search --label}, and
-@samp{search --fs-uuid} respectively.
+The @samp{search.file}, @samp{search.fs_label}, @samp{search.fs_uuid}, and
+@samp{search.fs_type} commands are aliases for @samp{search --file},
+@samp{search --label}, @samp{search --fs-type} and @samp{search --fs-uuid}
+respectively.
 @end deffn
 
 
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index fc4767f19..b6c760bc1 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -1017,6 +1017,11 @@ module = {
   common = commands/search_uuid.c;
 };
 
+module = {
+  name = search_fs_type;
+  common = commands/search_type.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 7dd32e445..22820ec47 100644
--- a/grub-core/commands/search.c
+++ b/grub-core/commands/search.c
@@ -52,8 +52,48 @@ struct search_ctx
   unsigned nhints;
   int count;
   int is_cache;
+#ifdef DO_SEARCH_FS_TYPE
+  char *part;
+#endif
 };
 
+#ifdef DO_SEARCH_FS_TYPE
+static int
+type_part_hook (grub_disk_t disk, const grub_partition_t partition, void *data)
+{
+  struct search_ctx *ctx = data;
+  char *partition_name, *guid, *dev_name;
+  int found = 0;
+
+  partition_name = grub_partition_get_name (partition);
+  if (!partition_name)
+    return 0;
+
+  dev_name = grub_xasprintf ("%s,%s", disk->name, partition_name);
+  grub_free (partition_name);
+
+  guid = grub_xasprintf ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+                         grub_le_to_cpu32(partition->gpttype.data1),
+                         grub_le_to_cpu16(partition->gpttype.data2),
+                         grub_le_to_cpu16(partition->gpttype.data3),
+                         (partition->gpttype.data4[0]), (partition->gpttype.data4[1]),
+                         (partition->gpttype.data4[2]), (partition->gpttype.data4[3]),
+                         (partition->gpttype.data4[4]), (partition->gpttype.data4[5]),
+                         (partition->gpttype.data4[6]), (partition->gpttype.data4[7]));
+
+  if (grub_strcasecmp (guid, ctx->key) == 0)
+    {
+      ctx->part = dev_name;
+      found = 1;
+    }
+  else
+    grub_free (dev_name);
+
+  grub_free (guid);
+  return found;
+}
+#endif
+
 /* Helper for FUNC_NAME.  */
 static int
 iterate_device (const char *name, void *data)
@@ -66,12 +106,27 @@ iterate_device (const char *name, void *data)
       name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9')
     return 1;
 
-#ifdef DO_SEARCH_FS_UUID
+#if defined(DO_SEARCH_FS_UUID) || defined(DO_SEARCH_FS_TYPE)
 #define compare_fn grub_strcasecmp
 #else
 #define compare_fn grub_strcmp
 #endif
 
+#ifdef DO_SEARCH_FS_TYPE
+    {
+      grub_device_t dev;
+
+      dev = grub_device_open (name);
+      if (dev)
+        {
+          if (dev->disk)
+            {
+              found = grub_partition_iterate (dev->disk, type_part_hook, ctx);
+            }
+          grub_device_close (dev);
+        }
+    }
+#else
 #ifdef DO_SEARCH_FILE
     {
       char *buf;
@@ -124,6 +179,7 @@ iterate_device (const char *name, void *data)
 	  grub_device_close (dev);
 	}
     }
+#endif
 #endif
 
   if (!ctx->is_cache && found && ctx->count == 0)
@@ -153,11 +209,18 @@ iterate_device (const char *name, void *data)
 
   if (found)
     {
+#ifdef DO_SEARCH_FS_TYPE
+      name = ctx->part;
+#endif
       ctx->count++;
       if (ctx->var)
 	grub_env_set (ctx->var, name);
       else
 	grub_printf (" %s", name);
+
+#ifdef DO_SEARCH_FS_TYPE
+      grub_free (ctx->part);
+#endif
     }
 
   grub_errno = GRUB_ERR_NONE;
@@ -315,6 +378,8 @@ static grub_command_t cmd;
 GRUB_MOD_INIT(search_fs_file)
 #elif defined (DO_SEARCH_FS_UUID)
 GRUB_MOD_INIT(search_fs_uuid)
+#elif defined (DO_SEARCH_FS_TYPE)
+GRUB_MOD_INIT(search_fs_type)
 #else
 GRUB_MOD_INIT(search_label)
 #endif
@@ -329,6 +394,8 @@ GRUB_MOD_INIT(search_label)
 GRUB_MOD_FINI(search_fs_file)
 #elif defined (DO_SEARCH_FS_UUID)
 GRUB_MOD_FINI(search_fs_uuid)
+#elif defined (DO_SEARCH_FS_TYPE)
+GRUB_MOD_FINI(search_fs_type)
 #else
 GRUB_MOD_FINI(search_label)
 #endif
diff --git a/grub-core/commands/search_type.c b/grub-core/commands/search_type.c
new file mode 100644
index 000000000..437a55b33
--- /dev/null
+++ b/grub-core/commands/search_type.c
@@ -0,0 +1,5 @@
+#define DO_SEARCH_FS_TYPE 1
+#define FUNC_NAME grub_search_fs_type
+#define COMMAND_NAME "search.fs_type"
+#define HELP_MESSAGE N_("Search devices by filesystem type. 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 d7fd26b94..ea9c98e65 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},
+    {"fs-type",		't', 0, N_("Search devices by a filesystem type."),
+     0, 0},
     {"set",		's', GRUB_ARG_OPTION_OPTIONAL,
      N_("Set a variable to the first device found."), N_("VARNAME"),
      ARG_TYPE_STRING},
@@ -71,6 +73,7 @@ enum options
     SEARCH_FILE,
     SEARCH_LABEL,
     SEARCH_FS_UUID,
+    SEARCH_FS_TYPE,
     SEARCH_SET,
     SEARCH_NO_FLOPPY,
     SEARCH_HINT,
@@ -186,6 +189,9 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
   else if (state[SEARCH_FS_UUID].set)
     grub_search_fs_uuid (id, var, state[SEARCH_NO_FLOPPY].set,
 			 hints, nhints);
+  else if (state[SEARCH_FS_TYPE].set)
+    grub_search_fs_type (id, var, state[SEARCH_NO_FLOPPY].set,
+			 hints, nhints);
   else if (state[SEARCH_FILE].set)
     grub_search_fs_file (id, var, state[SEARCH_NO_FLOPPY].set, 
 			 hints, nhints);
@@ -204,10 +210,10 @@ GRUB_MOD_INIT(search)
   cmd =
     grub_register_extcmd ("search", grub_cmd_search,
 			  GRUB_COMMAND_FLAG_EXTRACTOR | GRUB_COMMAND_ACCEPT_DASH,
-			  N_("[-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] ...]"
+			  N_("[-f|-l|-u|-t|-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 or filesystem type."
 			     " 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/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
index 103f6796f..3b575afad 100644
--- a/grub-core/partmap/gpt.c
+++ b/grub-core/partmap/gpt.c
@@ -109,9 +109,18 @@ grub_gpt_partition_map_iterate (grub_disk_t disk,
 	  part.partmap = &grub_gpt_partition_map;
 	  part.parent = disk->partition;
 
+	  grub_memcpy(&part.gpttype, &entry.type, sizeof (grub_gpt_part_guid_t));
+
 	  grub_dprintf ("gpt", "GPT entry %d: start=%lld, length=%lld\n", i,
 			(unsigned long long) part.start,
 			(unsigned long long) part.len);
+	  grub_dprintf ("gpt", "  partition type GUID=%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
+			grub_le_to_cpu32(entry.type.data1), grub_le_to_cpu16(entry.type.data2),
+			grub_le_to_cpu16(entry.type.data3),
+			(entry.type.data4[0]), (entry.type.data4[1]),
+			(entry.type.data4[2]), (entry.type.data4[3]),
+			(entry.type.data4[4]), (entry.type.data4[5]),
+			(entry.type.data4[6]), (entry.type.data4[7]));
 
 	  if (hook (disk, &part, hook_data))
 	    return grub_errno;
diff --git a/include/grub/gpt_partition.h b/include/grub/gpt_partition.h
index 7a93f4329..75504f3e0 100644
--- a/include/grub/gpt_partition.h
+++ b/include/grub/gpt_partition.h
@@ -22,15 +22,6 @@
 #include <grub/types.h>
 #include <grub/partition.h>
 
-struct grub_gpt_part_guid
-{
-  grub_uint32_t data1;
-  grub_uint16_t data2;
-  grub_uint16_t data3;
-  grub_uint8_t data4[8];
-} GRUB_PACKED;
-typedef struct grub_gpt_part_guid grub_gpt_part_guid_t;
-
 #define GRUB_GPT_PARTITION_TYPE_EMPTY \
   { 0x0, 0x0, 0x0, \
     { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } \
diff --git a/include/grub/partition.h b/include/grub/partition.h
index 7adb7ec6e..a5783fdc6 100644
--- a/include/grub/partition.h
+++ b/include/grub/partition.h
@@ -60,6 +60,15 @@ struct grub_partition_map
 };
 typedef struct grub_partition_map *grub_partition_map_t;
 
+struct grub_gpt_part_guid
+{
+  grub_uint32_t data1;
+  grub_uint16_t data2;
+  grub_uint16_t data3;
+  grub_uint8_t data4[8];
+} GRUB_PACKED;
+typedef struct grub_gpt_part_guid grub_gpt_part_guid_t;
+
 /* Partition description.  */
 struct grub_partition
 {
@@ -87,6 +96,9 @@ struct grub_partition
   /* The type of partition whne it's on MSDOS.
      Used for embedding detection.  */
   grub_uint8_t msdostype;
+
+  /* The type of partition when it's on GPT. */
+  grub_gpt_part_guid_t gpttype;
 };
 
 grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk,
diff --git a/include/grub/search.h b/include/grub/search.h
index d80347df3..4845a1901 100644
--- a/include/grub/search.h
+++ b/include/grub/search.h
@@ -23,6 +23,8 @@ void grub_search_fs_file (const char *key, const char *var, int no_floppy,
 			  char **hints, unsigned nhints);
 void grub_search_fs_uuid (const char *key, const char *var, int no_floppy,
 			  char **hints, unsigned nhints);
+void grub_search_fs_type (const char *key, const char *var, int no_floppy,
+			  char **hints, unsigned nhints);
 void grub_search_label (const char *key, const char *var, int no_floppy,
 			char **hints, unsigned nhints);
 
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/1] search: Add search by GPT partition type
  2018-06-20 15:38 ` [PATCH 1/1] " Will Thompson
@ 2018-10-18 10:27   ` Daniel Kiper
  0 siblings, 0 replies; 3+ messages in thread
From: Daniel Kiper @ 2018-10-18 10:27 UTC (permalink / raw)
  To: Will Thompson; +Cc: grub-devel, linux, Carlo Caione

Hi Will,

Sorry for huge delay but I was swamped by other stuff.

Anyway, patch LGTM. Just a few nit picks below.

On Wed, Jun 20, 2018 at 04:38:08PM +0100, Will Thompson wrote:
> From: Carlo Caione <carlo@endlessm.com>
>
> Add a new search.fs_type tool to search by GPT partition type UUID.
>
> Signed-off-by: Carlo Caione <carlo@endlessm.com>
> Signed-off-by: Will Thompson <wjt@endlessm.com>
> ---
>  docs/grub.texi                   | 14 ++++---
>  grub-core/Makefile.core.def      |  5 +++
>  grub-core/commands/search.c      | 69 +++++++++++++++++++++++++++++++-
>  grub-core/commands/search_type.c |  5 +++
>  grub-core/commands/search_wrap.c | 12 ++++--
>  grub-core/partmap/gpt.c          |  9 +++++
>  include/grub/gpt_partition.h     |  9 -----
>  include/grub/partition.h         | 12 ++++++
>  include/grub/search.h            |  2 +
>  9 files changed, 118 insertions(+), 19 deletions(-)
>  create mode 100644 grub-core/commands/search_type.c
>
> diff --git a/docs/grub.texi b/docs/grub.texi
> index 2adfa97be..17b3ff55c 100644
> --- a/docs/grub.texi
> +++ b/docs/grub.texi
> @@ -4849,11 +4849,12 @@ unbootable. @xref{Using digital signatures}, for more information.
>  @subsection search
>
>  @deffn Command search @
> - [@option{--file}|@option{--label}|@option{--fs-uuid}] @
> + [@option{--file}|@option{--label}|@option{--fs-uuid}|@option{--fs-type}] @
>   [@option{--set} [var]] [@option{--no-floppy}] name
>  Search devices by file (@option{-f}, @option{--file}), filesystem label
> -(@option{-l}, @option{--label}), or filesystem UUID (@option{-u},
> -@option{--fs-uuid}).
> +(@option{-l}, @option{--label}), filesystem UUID (@option{-u},
> +@option{--fs-uuid}), or filesystem type UUID (@option{-t},
> +@option{--fs-type}).
>
>  If the @option{--set} option is used, the first device found is set as the
>  value of environment variable @var{var}.  The default variable is
> @@ -4862,9 +4863,10 @@ value of environment variable @var{var}.  The default variable is
>  The @option{--no-floppy} option prevents searching floppy devices, which can
>  be slow.
>
> -The @samp{search.file}, @samp{search.fs_label}, and @samp{search.fs_uuid}
> -commands are aliases for @samp{search --file}, @samp{search --label}, and
> -@samp{search --fs-uuid} respectively.
> +The @samp{search.file}, @samp{search.fs_label}, @samp{search.fs_uuid}, and
> +@samp{search.fs_type} commands are aliases for @samp{search --file},
> +@samp{search --label}, @samp{search --fs-type} and @samp{search --fs-uuid}
> +respectively.

Could not you use the same enumeration order like above?

>  @end deffn
>
>
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index fc4767f19..b6c760bc1 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -1017,6 +1017,11 @@ module = {
>    common = commands/search_uuid.c;
>  };
>
> +module = {
> +  name = search_fs_type;
> +  common = commands/search_type.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 7dd32e445..22820ec47 100644
> --- a/grub-core/commands/search.c
> +++ b/grub-core/commands/search.c
> @@ -52,8 +52,48 @@ struct search_ctx
>    unsigned nhints;
>    int count;
>    int is_cache;
> +#ifdef DO_SEARCH_FS_TYPE
> +  char *part;
> +#endif
>  };
>
> +#ifdef DO_SEARCH_FS_TYPE
> +static int
> +type_part_hook (grub_disk_t disk, const grub_partition_t partition, void *data)
> +{
> +  struct search_ctx *ctx = data;
> +  char *partition_name, *guid, *dev_name;
> +  int found = 0;
> +
> +  partition_name = grub_partition_get_name (partition);
> +  if (!partition_name)
> +    return 0;
> +
> +  dev_name = grub_xasprintf ("%s,%s", disk->name, partition_name);
> +  grub_free (partition_name);
> +
> +  guid = grub_xasprintf ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
> +                         grub_le_to_cpu32(partition->gpttype.data1),
> +                         grub_le_to_cpu16(partition->gpttype.data2),
> +                         grub_le_to_cpu16(partition->gpttype.data3),
> +                         (partition->gpttype.data4[0]), (partition->gpttype.data4[1]),
> +                         (partition->gpttype.data4[2]), (partition->gpttype.data4[3]),
> +                         (partition->gpttype.data4[4]), (partition->gpttype.data4[5]),
> +                         (partition->gpttype.data4[6]), (partition->gpttype.data4[7]));
> +
> +  if (grub_strcasecmp (guid, ctx->key) == 0)
> +    {
> +      ctx->part = dev_name;
> +      found = 1;
> +    }
> +  else
> +    grub_free (dev_name);
> +
> +  grub_free (guid);
> +  return found;
> +}
> +#endif
> +
>  /* Helper for FUNC_NAME.  */
>  static int
>  iterate_device (const char *name, void *data)
> @@ -66,12 +106,27 @@ iterate_device (const char *name, void *data)
>        name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9')
>      return 1;
>
> -#ifdef DO_SEARCH_FS_UUID
> +#if defined(DO_SEARCH_FS_UUID) || defined(DO_SEARCH_FS_TYPE)
>  #define compare_fn grub_strcasecmp
>  #else
>  #define compare_fn grub_strcmp
>  #endif
>
> +#ifdef DO_SEARCH_FS_TYPE
> +    {
> +      grub_device_t dev;
> +
> +      dev = grub_device_open (name);
> +      if (dev)
> +        {
> +          if (dev->disk)
> +            {
> +              found = grub_partition_iterate (dev->disk, type_part_hook, ctx);
> +            }

We do not need curly brackets here.

> +          grub_device_close (dev);
> +        }
> +    }
> +#else
>  #ifdef DO_SEARCH_FILE
>      {
>        char *buf;
> @@ -124,6 +179,7 @@ iterate_device (const char *name, void *data)
>  	  grub_device_close (dev);
>  	}
>      }
> +#endif
>  #endif
>
>    if (!ctx->is_cache && found && ctx->count == 0)
> @@ -153,11 +209,18 @@ iterate_device (const char *name, void *data)
>
>    if (found)
>      {
> +#ifdef DO_SEARCH_FS_TYPE
> +      name = ctx->part;
> +#endif
>        ctx->count++;
>        if (ctx->var)
>  	grub_env_set (ctx->var, name);
>        else
>  	grub_printf (" %s", name);
> +
> +#ifdef DO_SEARCH_FS_TYPE
> +      grub_free (ctx->part);
> +#endif
>      }
>
>    grub_errno = GRUB_ERR_NONE;
> @@ -315,6 +378,8 @@ static grub_command_t cmd;
>  GRUB_MOD_INIT(search_fs_file)
>  #elif defined (DO_SEARCH_FS_UUID)
>  GRUB_MOD_INIT(search_fs_uuid)
> +#elif defined (DO_SEARCH_FS_TYPE)
> +GRUB_MOD_INIT(search_fs_type)
>  #else
>  GRUB_MOD_INIT(search_label)
>  #endif
> @@ -329,6 +394,8 @@ GRUB_MOD_INIT(search_label)
>  GRUB_MOD_FINI(search_fs_file)
>  #elif defined (DO_SEARCH_FS_UUID)
>  GRUB_MOD_FINI(search_fs_uuid)
> +#elif defined (DO_SEARCH_FS_TYPE)
> +GRUB_MOD_FINI(search_fs_type)
>  #else
>  GRUB_MOD_FINI(search_label)
>  #endif
> diff --git a/grub-core/commands/search_type.c b/grub-core/commands/search_type.c
> new file mode 100644
> index 000000000..437a55b33
> --- /dev/null
> +++ b/grub-core/commands/search_type.c
> @@ -0,0 +1,5 @@
> +#define DO_SEARCH_FS_TYPE 1
> +#define FUNC_NAME grub_search_fs_type
> +#define COMMAND_NAME "search.fs_type"
> +#define HELP_MESSAGE N_("Search devices by filesystem type. 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 d7fd26b94..ea9c98e65 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},
> +    {"fs-type",		't', 0, N_("Search devices by a filesystem type."),
> +     0, 0},
>      {"set",		's', GRUB_ARG_OPTION_OPTIONAL,
>       N_("Set a variable to the first device found."), N_("VARNAME"),
>       ARG_TYPE_STRING},
> @@ -71,6 +73,7 @@ enum options
>      SEARCH_FILE,
>      SEARCH_LABEL,
>      SEARCH_FS_UUID,
> +    SEARCH_FS_TYPE,
>      SEARCH_SET,
>      SEARCH_NO_FLOPPY,
>      SEARCH_HINT,
> @@ -186,6 +189,9 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
>    else if (state[SEARCH_FS_UUID].set)
>      grub_search_fs_uuid (id, var, state[SEARCH_NO_FLOPPY].set,
>  			 hints, nhints);
> +  else if (state[SEARCH_FS_TYPE].set)
> +    grub_search_fs_type (id, var, state[SEARCH_NO_FLOPPY].set,
> +			 hints, nhints);
>    else if (state[SEARCH_FILE].set)
>      grub_search_fs_file (id, var, state[SEARCH_NO_FLOPPY].set,
>  			 hints, nhints);
> @@ -204,10 +210,10 @@ GRUB_MOD_INIT(search)
>    cmd =
>      grub_register_extcmd ("search", grub_cmd_search,
>  			  GRUB_COMMAND_FLAG_EXTRACTOR | GRUB_COMMAND_ACCEPT_DASH,
> -			  N_("[-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] ...]"
> +			  N_("[-f|-l|-u|-t|-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 or filesystem type."
>  			     " 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/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
> index 103f6796f..3b575afad 100644
> --- a/grub-core/partmap/gpt.c
> +++ b/grub-core/partmap/gpt.c
> @@ -109,9 +109,18 @@ grub_gpt_partition_map_iterate (grub_disk_t disk,
>  	  part.partmap = &grub_gpt_partition_map;
>  	  part.parent = disk->partition;
>
> +	  grub_memcpy(&part.gpttype, &entry.type, sizeof (grub_gpt_part_guid_t));
> +
>  	  grub_dprintf ("gpt", "GPT entry %d: start=%lld, length=%lld\n", i,
>  			(unsigned long long) part.start,
>  			(unsigned long long) part.len);
> +	  grub_dprintf ("gpt", "  partition type GUID=%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
> +			grub_le_to_cpu32(entry.type.data1), grub_le_to_cpu16(entry.type.data2),
> +			grub_le_to_cpu16(entry.type.data3),
> +			(entry.type.data4[0]), (entry.type.data4[1]),
> +			(entry.type.data4[2]), (entry.type.data4[3]),
> +			(entry.type.data4[4]), (entry.type.data4[5]),
> +			(entry.type.data4[6]), (entry.type.data4[7]));
>
>  	  if (hook (disk, &part, hook_data))
>  	    return grub_errno;
> diff --git a/include/grub/gpt_partition.h b/include/grub/gpt_partition.h
> index 7a93f4329..75504f3e0 100644
> --- a/include/grub/gpt_partition.h
> +++ b/include/grub/gpt_partition.h
> @@ -22,15 +22,6 @@
>  #include <grub/types.h>
>  #include <grub/partition.h>
>
> -struct grub_gpt_part_guid
> -{
> -  grub_uint32_t data1;
> -  grub_uint16_t data2;
> -  grub_uint16_t data3;
> -  grub_uint8_t data4[8];
> -} GRUB_PACKED;
> -typedef struct grub_gpt_part_guid grub_gpt_part_guid_t;
> -
>  #define GRUB_GPT_PARTITION_TYPE_EMPTY \
>    { 0x0, 0x0, 0x0, \
>      { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } \
> diff --git a/include/grub/partition.h b/include/grub/partition.h
> index 7adb7ec6e..a5783fdc6 100644
> --- a/include/grub/partition.h
> +++ b/include/grub/partition.h
> @@ -60,6 +60,15 @@ struct grub_partition_map
>  };
>  typedef struct grub_partition_map *grub_partition_map_t;
>
> +struct grub_gpt_part_guid
> +{
> +  grub_uint32_t data1;
> +  grub_uint16_t data2;
> +  grub_uint16_t data3;
> +  grub_uint8_t data4[8];
> +} GRUB_PACKED;
> +typedef struct grub_gpt_part_guid grub_gpt_part_guid_t;
> +

Do we really need this code shuffling?

>  /* Partition description.  */
>  struct grub_partition
>  {
> @@ -87,6 +96,9 @@ struct grub_partition
>    /* The type of partition whne it's on MSDOS.
>       Used for embedding detection.  */
>    grub_uint8_t msdostype;
> +
> +  /* The type of partition when it's on GPT. */
> +  grub_gpt_part_guid_t gpttype;

OK, this is used here but... I would like to avoid code shuffling if
possible. And it is more natural to have grub_gpt_part_guid in
include/grub/gpt_partition.h

Daniel


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-10-18 10:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-06-20 15:38 [PATCH 0/1] search: Add search by GPT partition type Will Thompson
2018-06-20 15:38 ` [PATCH 1/1] " Will Thompson
2018-10-18 10:27   ` Daniel Kiper

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).