]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Search hinting support
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 28 Dec 2009 13:02:23 +0000 (14:02 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 28 Dec 2009 13:02:23 +0000 (14:02 +0100)
commands/search.c
commands/search_wrap.c
include/grub/search.h

index 01e83739bb50f3ecb7e8066c134b5403d7638a84..c3626d3526ae7aabb33d425e3317228db521dec4 100644 (file)
@@ -30,7 +30,8 @@
 #include <grub/i18n.h>
 
 void
-FUNC_NAME (const char *key, const char *var, int no_floppy)
+FUNC_NAME (const char *key, const char *var, int no_floppy,
+          const char **hints, unsigned nhints)
 {
   int count = 0;
   char *buf = NULL;
@@ -118,22 +119,32 @@ FUNC_NAME (const char *key, const char *var, int no_floppy)
     return (found && var);
   }
 
+  auto void try (void);
+  void try (void)    
+  {
+    unsigned i;
+    for (i = 0; i < nhints; i++)
+      if (iterate_device (hints[i]))
+       return;
+    grub_device_iterate (iterate_device);
+  }
+
   /* First try without autoloading if we're setting variable. */
   if (var)
     {
       saved_autoload = grub_fs_autoload_hook;
       grub_fs_autoload_hook = 0;
-      grub_device_iterate (iterate_device);
+      try ();
 
       /* Restore autoload hook.  */
       grub_fs_autoload_hook = saved_autoload;
 
       /* Retry with autoload if nothing found.  */
       if (grub_errno == GRUB_ERR_NONE && count == 0)
-       grub_device_iterate (iterate_device);
+       try ();
     }
   else
-    grub_device_iterate (iterate_device);
+    try ();
 
   grub_free (buf);
 
@@ -148,7 +159,8 @@ 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);
+  FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (const char **) (args + 2),
+            argc > 2 ? argc - 2 : 0);
 
   return grub_errno;
 }
@@ -165,7 +177,7 @@ GRUB_MOD_INIT(search_fs_label)
 {
   cmd =
     grub_register_command (COMMAND_NAME, grub_cmd_do_search,
-                          "NAME [VARIABLE]",
+                          "NAME [VARIABLE] [HINTS]",
                           "Search devices by " SEARCH_TARGET "."
                           " If VARIABLE is specified, "
                           "the first device found is set to a variable.");
index 2891d85d75363178c9d7055e34d448e967ebea2f..eb9279e870ccd53b5bf0f27531e7f654c24b1812 100644 (file)
@@ -62,11 +62,14 @@ grub_cmd_search (grub_extcmd_t cmd, int argc, char **args)
     var = state[SEARCH_SET].arg ? state[SEARCH_SET].arg : "root";
 
   if (state[SEARCH_LABEL].set)
-    grub_search_label (args[0], var, state[SEARCH_NO_FLOPPY].set);
+    grub_search_label (args[0], var, state[SEARCH_NO_FLOPPY].set, 
+                      (const char **) (args + 1), argc - 1);
   else if (state[SEARCH_FS_UUID].set)
-    grub_search_fs_uuid (args[0], var, state[SEARCH_NO_FLOPPY].set);
+    grub_search_fs_uuid (args[0], var, state[SEARCH_NO_FLOPPY].set,
+                        (const char **) (args + 1), argc - 1);
   else if (state[SEARCH_FILE].set)
-    grub_search_fs_file (args[0], var, state[SEARCH_NO_FLOPPY].set);
+    grub_search_fs_file (args[0], var, state[SEARCH_NO_FLOPPY].set, 
+                        (const char **) (args + 1), argc - 1);
   else
     return grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type");
 
@@ -80,7 +83,7 @@ GRUB_MOD_INIT(search)
   cmd =
     grub_register_extcmd ("search", grub_cmd_search,
                          GRUB_COMMAND_FLAG_BOTH,
-                         N_("search [-f|-l|-u|-s|-n] NAME"),
+                         N_("[-f|-l|-u|-s|-n] NAME [HINTS]"),
                          N_("Search devices by file, filesystem label"
                             " or filesystem UUID."
                             " If --set is specified, the first device found is"
index e8f9db285c7389a33fe2c64dc97b529275c40d79..3c56f0305d6cee462750d221a31d0ee5c2f7e0e6 100644 (file)
 #ifndef GRUB_SEARCH_HEADER
 #define GRUB_SEARCH_HEADER 1
 
-void grub_search_fs_file (const char *key, const char *var, int no_floppy);
-void grub_search_fs_uuid (const char *key, const char *var, int no_floppy);
-void grub_search_label (const char *key, const char *var, int no_floppy);
+void grub_search_fs_file (const char *key, const char *var, int no_floppy,
+                         const char **hints, unsigned nhints);
+void grub_search_fs_uuid (const char *key, const char *var, int no_floppy,
+                         const char **hints, unsigned nhints);
+void grub_search_label (const char *key, const char *var, int no_floppy,
+                       const char **hints, unsigned nhints);
 
 #endif