merge mainline into hints
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 13 Sep 2010 00:22:10 +0000 (02:22 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 13 Sep 2010 00:22:10 +0000 (02:22 +0200)
24 files changed:
1  2 
grub-core/commands/handler.c
grub-core/commands/search.c
grub-core/commands/search_wrap.c
grub-core/efiemu/runtime/efiemu.sh
grub-core/kern/handler.c
grub-core/kern/i386/ieee1275/init.c
grub-core/kern/i386/loader.S
grub-core/kern/i386/misc.S
grub-core/kern/reader.c
grub-core/loader/i386/bsd_helper.S
grub-core/loader/i386/bsd_trampoline.S
grub-core/loader/i386/efi/linux.c
grub-core/loader/i386/efi/xnu.c
grub-core/loader/i386/ieee1275/linux.c
grub-core/loader/i386/linux_trampoline.S
grub-core/loader/i386/multiboot_helper.S
grub-core/loader/i386/pc/multiboot2.c
grub-core/loader/i386/pc/xnu.c
grub-core/loader/ieee1275/multiboot2.c
grub-core/loader/multiboot2.c
grub-core/loader/multiboot_loader.c
grub-core/normal/handler.c
grub-core/normal/menu_viewer.c
grub-core/term/i386/pc/vesafb.c

index 09b8ff5,0000000..09b8ff5
mode 100644,000000..100644
--- /dev/null
index 0000000,8a646b4..9b693e7
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,175 +1,187 @@@
 -FUNC_NAME (const char *key, const char *var, int no_floppy)
+ /* search.c - search devices based on a file or a filesystem label */
+ /*
+  *  GRUB  --  GRand Unified Bootloader
+  *  Copyright (C) 2005,2007,2008,2009  Free Software Foundation, Inc.
+  *
+  *  GRUB is free software: you can redistribute it and/or modify
+  *  it under the terms of the GNU General Public License as published by
+  *  the Free Software Foundation, either version 3 of the License, or
+  *  (at your option) any later version.
+  *
+  *  GRUB is distributed in the hope that it will be useful,
+  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  *  GNU General Public License for more details.
+  *
+  *  You should have received a copy of the GNU General Public License
+  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+  */
+ #include <grub/types.h>
+ #include <grub/misc.h>
+ #include <grub/mm.h>
+ #include <grub/err.h>
+ #include <grub/dl.h>
+ #include <grub/device.h>
+ #include <grub/file.h>
+ #include <grub/env.h>
+ #include <grub/command.h>
+ #include <grub/search.h>
+ #include <grub/i18n.h>
+ void
 -      grub_device_iterate (iterate_device);
++FUNC_NAME (const char *key, const char *var, int no_floppy,
++         const char **hints, unsigned nhints)
+ {
+   int count = 0;
+   grub_fs_autoload_hook_t saved_autoload;
+   auto int iterate_device (const char *name);
+   int iterate_device (const char *name)
+   {
+     int found = 0;
+     /* Skip floppy drives when requested.  */
+     if (no_floppy &&
+       name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9')
+       return 0;
+ #ifdef DO_SEARCH_FILE
+       {
+       char *buf;
+       grub_file_t file;
+       buf = grub_xasprintf ("(%s)%s", name, key);
+       if (! buf)
+         return 1;
+       grub_file_filter_disable_compression ();
+       file = grub_file_open (buf);
+       if (file)
+         {
+           found = 1;
+           grub_file_close (file);
+         }
+       grub_free (buf);
+       }
+ #else
+       {
+       /* SEARCH_FS_UUID or SEARCH_LABEL */
+       grub_device_t dev;
+       grub_fs_t fs;
+       char *quid;
+       dev = grub_device_open (name);
+       if (dev)
+         {
+           fs = grub_fs_probe (dev);
+ #ifdef DO_SEARCH_FS_UUID
+ #define compare_fn grub_strcasecmp
+ #define read_fn uuid
+ #else
+ #define compare_fn grub_strcmp
+ #define read_fn label
+ #endif
+           if (fs && fs->read_fn)
+             {
+               fs->read_fn (dev, &quid);
+               if (grub_errno == GRUB_ERR_NONE && quid)
+                 {
+                   if (compare_fn (quid, key) == 0)
+                     found = 1;
+                   grub_free (quid);
+                 }
+             }
+           grub_device_close (dev);
+         }
+       }
+ #endif
+     if (found)
+       {
+       count++;
+       if (var)
+         grub_env_set (var, name);
+       else
+         grub_printf (" %s", name);
+       }
+     grub_errno = GRUB_ERR_NONE;
+     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
 -  FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0);
++    try ();
+   if (grub_errno == GRUB_ERR_NONE && count == 0)
+     grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such device: %s", key);
+ }
+ static grub_err_t
+ grub_cmd_do_search (grub_command_t cmd __attribute__ ((unused)), int argc,
+                   char **args)
+ {
+   if (argc == 0)
+     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no argument specified");
 -                         N_("NAME [VARIABLE]"),
++  FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (const char **) (args + 2),
++           argc > 2 ? argc - 2 : 0);
+   return grub_errno;
+ }
+ static grub_command_t cmd;
+ #ifdef DO_SEARCH_FILE
+ GRUB_MOD_INIT(search_fs_file)
+ #elif defined (DO_SEARCH_FS_UUID)
+ GRUB_MOD_INIT(search_fs_uuid)
+ #else
+ GRUB_MOD_INIT(search_label)
+ #endif
+ {
+   cmd =
+     grub_register_command (COMMAND_NAME, grub_cmd_do_search,
++                         N_("NAME [VARIABLE] [HINTS]"),
+                          HELP_MESSAGE);
+ }
+ #ifdef DO_SEARCH_FILE
+ GRUB_MOD_FINI(search_fs_file)
+ #elif defined (DO_SEARCH_FS_UUID)
+ GRUB_MOD_FINI(search_fs_uuid)
+ #else
+ GRUB_MOD_FINI(search_label)
+ #endif
+ {
+   grub_unregister_command (cmd);
+ }
index 0000000,fff3fb4..14028be
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,95 +1,98 @@@
 -    grub_search_label (args[0], var, state[SEARCH_NO_FLOPPY].set);
+ /* search.c - search devices based on a file or a filesystem label */
+ /*
+  *  GRUB  --  GRand Unified Bootloader
+  *  Copyright (C) 2005,2007,2008,2009  Free Software Foundation, Inc.
+  *
+  *  GRUB is free software: you can redistribute it and/or modify
+  *  it under the terms of the GNU General Public License as published by
+  *  the Free Software Foundation, either version 3 of the License, or
+  *  (at your option) any later version.
+  *
+  *  GRUB is distributed in the hope that it will be useful,
+  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  *  GNU General Public License for more details.
+  *
+  *  You should have received a copy of the GNU General Public License
+  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+  */
+ #include <grub/types.h>
+ #include <grub/misc.h>
+ #include <grub/mm.h>
+ #include <grub/err.h>
+ #include <grub/dl.h>
+ #include <grub/env.h>
+ #include <grub/extcmd.h>
+ #include <grub/search.h>
+ #include <grub/i18n.h>
+ static const struct grub_arg_option options[] =
+   {
+     {"file",          'f', 0, N_("Search devices by a file."), 0, 0},
+     {"label",         'l', 0, N_("Search devices by a filesystem label."),
+      0, 0},
+     {"fs-uuid",               'u', 0, N_("Search devices by a filesystem UUID."),
+      0, 0},
+     {"set",           's', GRUB_ARG_OPTION_OPTIONAL,
+      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},
+     {0, 0, 0, 0, 0, 0}
+   };
+ enum options
+   {
+     SEARCH_FILE,
+     SEARCH_LABEL,
+     SEARCH_FS_UUID,
+     SEARCH_SET,
+     SEARCH_NO_FLOPPY,
+  };
+ static grub_err_t
+ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
+ {
+   struct grub_arg_list *state = ctxt->state;
+   const char *var = 0;
+   if (argc == 0)
+     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no argument specified");
+   if (state[SEARCH_SET].set)
+     var = state[SEARCH_SET].arg ? state[SEARCH_SET].arg : "root";
+   if (state[SEARCH_LABEL].set)
 -    grub_search_fs_uuid (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_file (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)
 -                        N_("search [-f|-l|-u|-s|-n] NAME"),
++    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");
+   return grub_errno;
+ }
+ static grub_extcmd_t cmd;
+ GRUB_MOD_INIT(search)
+ {
+   cmd =
+     grub_register_extcmd ("search", grub_cmd_search,
+                         GRUB_COMMAND_FLAG_BOTH,
++                        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"
+                            " set to a variable. If no variable name is"
+                            " specified, \"root\" is used."),
+                         options);
+ }
+ GRUB_MOD_FINI(search)
+ {
+   grub_unregister_extcmd (cmd);
+ }
index 5a492dc,0000000..5a492dc
mode 100644,000000..100644
--- /dev/null
index 2bf8531,0000000..2bf8531
mode 100644,000000..100644
--- /dev/null
index 7658ee1,0000000..7658ee1
mode 100644,000000..100644
--- /dev/null
index 3e9c713,0000000..3e9c713
mode 100644,000000..100644
--- /dev/null
index 7d57df9,0000000..7d57df9
mode 100644,000000..100644
--- /dev/null
index 271a90f,0000000..271a90f
mode 100644,000000..100644
--- /dev/null
index 25aee3a,0000000..25aee3a
mode 100644,000000..100644
--- /dev/null
index a568fff,0000000..a568fff
mode 100644,000000..100644
--- /dev/null
index 1c256e3,0000000..1c256e3
mode 100644,000000..100644
--- /dev/null
index a7ede19,0000000..a7ede19
mode 100644,000000..100644
--- /dev/null
index b577de9,0000000..b577de9
mode 100644,000000..100644
--- /dev/null
index 9bfe5d2,0000000..9bfe5d2
mode 100644,000000..100644
--- /dev/null
index ebb176b,0000000..ebb176b
mode 100644,000000..100644
--- /dev/null
index 8c0bc09,0000000..8c0bc09
mode 100644,000000..100644
--- /dev/null
index dbdee9c,0000000..dbdee9c
mode 100644,000000..100644
--- /dev/null
index 24c0c5e,0000000..24c0c5e
mode 100644,000000..100644
--- /dev/null
index b44dc7a,0000000..b44dc7a
mode 100644,000000..100644
--- /dev/null
index f870ccd,0000000..f870ccd
mode 100644,000000..100644
--- /dev/null
index 52694ed,0000000..52694ed
mode 100644,000000..100644
--- /dev/null