]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
support subpartition hints
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 13 Sep 2010 10:16:22 +0000 (12:16 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 13 Sep 2010 10:16:22 +0000 (12:16 +0200)
grub-core/commands/search.c
grub-core/commands/search_wrap.c
include/grub/search.h

index 9b693e76f4dc9f5fc4cb3c0180b43b123aa3a957..f265f86d62c8a9e5ba0cf16ada3d363a35ddd764 100644 (file)
 #include <grub/command.h>
 #include <grub/search.h>
 #include <grub/i18n.h>
+#include <grub/disk.h>
+#include <grub/partition.h>
 
 void
 FUNC_NAME (const char *key, const char *var, int no_floppy,
-          const char **hints, unsigned nhints)
+          char **hints, unsigned nhints)
 {
   int count = 0;
   grub_fs_autoload_hook_t saved_autoload;
@@ -115,13 +117,67 @@ FUNC_NAME (const char *key, const char *var, int no_floppy,
     return (found && var);
   }
 
+  auto int part_hook (grub_disk_t disk, const grub_partition_t partition);
+  int part_hook (grub_disk_t disk, const grub_partition_t partition)
+  {
+    char *partition_name, *devname;
+    int ret;
+
+    partition_name = grub_partition_get_name (partition);
+    if (! partition_name)
+      return 1;
+
+    devname = grub_xasprintf ("%s,%s", disk->name, partition_name);
+    grub_free (partition_name);
+    if (!devname)
+      return 1;
+    ret = iterate_device (devname);
+    grub_free (devname);    
+
+    return ret;
+  }
+
   auto void try (void);
   void try (void)    
   {
     unsigned i;
     for (i = 0; i < nhints; i++)
-      if (iterate_device (hints[i]))
-       return;
+      {
+       char *end;
+       if (!hints[i][0])
+         continue;
+       end = hints[i] + grub_strlen (hints[i]) - 1;
+       if (*end == ',')
+         *end = 0;
+       if (iterate_device (hints[i]))
+         {
+           if (!*end)
+             *end = ',';
+           return;
+         }
+       if (!*end)
+         {
+           grub_device_t dev;
+           int ret;
+           dev = grub_device_open (hints[i]);
+           if (!dev)
+             {
+               *end = ',';
+               continue;
+             }
+           if (!dev->disk)
+             {
+               grub_device_close (dev);
+               *end = ',';
+               continue;
+             }
+           ret = grub_partition_iterate (dev->disk, part_hook);
+           *end = ',';
+           grub_device_close (dev);
+           if (ret)
+             return;
+         }
+      }
     grub_device_iterate (iterate_device);
   }
 
@@ -153,7 +209,7 @@ grub_cmd_do_search (grub_command_t cmd __attribute__ ((unused)), int argc,
   if (argc == 0)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no argument specified");
 
-  FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (const char **) (args + 2),
+  FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (args + 2),
             argc > 2 ? argc - 2 : 0);
 
   return grub_errno;
index 68497fa0dc0dd85a9c1741b6a1f2787c1c75873e..61eb7820365c3b8ada44b8819125b97452ce0376 100644 (file)
@@ -38,7 +38,8 @@ static const struct grub_arg_option options[] =
      N_("Set a variable to the first device found."), "VAR", ARG_TYPE_STRING},
     {"no-floppy",      'n', 0, N_("Do not probe any floppy drive."), 0, 0},
     {"hint",           'h', GRUB_ARG_OPTION_REPEATABLE,
-     N_("First try the device HINT"), N_("HINT"), ARG_TYPE_STRING},
+     N_("First try the device HINT. If HINT ends in comma, "
+       "also try subpartitions"), N_("HINT"), ARG_TYPE_STRING},
     {0, 0, 0, 0, 0, 0}
   };
 
@@ -71,13 +72,13 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
 
   if (state[SEARCH_LABEL].set)
     grub_search_label (args[0], var, state[SEARCH_NO_FLOPPY].set, 
-                      (const char **) state[SEARCH_HINT].args, nhints);
+                      state[SEARCH_HINT].args, nhints);
   else if (state[SEARCH_FS_UUID].set)
     grub_search_fs_uuid (args[0], var, state[SEARCH_NO_FLOPPY].set,
-                        (const char **) state[SEARCH_HINT].args, nhints);
+                        state[SEARCH_HINT].args, nhints);
   else if (state[SEARCH_FILE].set)
     grub_search_fs_file (args[0], var, state[SEARCH_NO_FLOPPY].set, 
-                        (const char **) state[SEARCH_HINT].args, nhints);
+                        state[SEARCH_HINT].args, nhints);
   else
     return grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type");
 
index 3c56f0305d6cee462750d221a31d0ee5c2f7e0e6..d80347df34b373d7c0638d7b51c99bb7a02c232b 100644 (file)
 #define GRUB_SEARCH_HEADER 1
 
 void grub_search_fs_file (const char *key, const char *var, int no_floppy,
-                         const char **hints, unsigned nhints);
+                         char **hints, unsigned nhints);
 void grub_search_fs_uuid (const char *key, const char *var, int no_floppy,
-                         const char **hints, unsigned nhints);
+                         char **hints, unsigned nhints);
 void grub_search_label (const char *key, const char *var, int no_floppy,
-                       const char **hints, unsigned nhints);
+                       char **hints, unsigned nhints);
 
 #endif