Print this page
fixes + mirror


   5  *
   6  *  GRUB is free software: you can redistribute it and/or modify
   7  *  it under the terms of the GNU General Public License as published by
   8  *  the Free Software Foundation, either version 3 of the License, or
   9  *  (at your option) any later version.
  10  *
  11  *  GRUB is distributed in the hope that it will be useful,
  12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14  *  GNU General Public License for more details.
  15  *
  16  *  You should have received a copy of the GNU General Public License
  17  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  18  */
  19 
  20 #include <grub/types.h>
  21 #include <grub/misc.h>
  22 #include <grub/mm.h>
  23 #include <grub/err.h>
  24 #include <grub/dl.h>

  25 #include <grub/device.h>
  26 #include <grub/file.h>
  27 #include <grub/env.h>
  28 #include <grub/command.h>
  29 #include <grub/search.h>
  30 #include <grub/i18n.h>
  31 #include <grub/disk.h>
  32 #include <grub/partition.h>
  33 
  34 GRUB_MOD_LICENSE ("GPLv3+");
  35 
  36 struct cache_entry
  37 {
  38   struct cache_entry *next;
  39   char *key;
  40   char *value;
  41 };
  42 
  43 static struct cache_entry *cache;
  44 
  45 void
  46 FUNC_NAME (const char *key, const char *var, int no_floppy,
  47            char **hints, unsigned nhints)
  48 {
  49   int count = 0;
  50   int is_cache = 0;

  51   grub_fs_autoload_hook_t saved_autoload;
  52 
  53   auto int iterate_device (const char *name);
  54   int iterate_device (const char *name)
  55   {
  56     int found = 0;
  57 
  58     /* Skip floppy drives when requested.  */
  59     if (no_floppy &&
  60         name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9')
  61       return 0;
  62 
  63 #ifdef DO_SEARCH_FS_UUID
  64 #define compare_fn grub_strcasecmp
  65 #else
  66 #define compare_fn grub_strcmp
  67 #endif
  68 
  69 #ifdef DO_SEARCH_FILE
  70       {


 131             if (cache_ent->value && cache_ent->key)
 132               {
 133                 cache_ent->next = cache;
 134                 cache = cache_ent;
 135               }
 136             else
 137               {
 138                 grub_free (cache_ent->value);
 139                 grub_free (cache_ent->key);
 140                 grub_free (cache_ent);
 141                 grub_errno = GRUB_ERR_NONE;
 142               }
 143           }
 144         else
 145           grub_errno = GRUB_ERR_NONE;
 146       }
 147 
 148     if (found)
 149       {
 150         count++;
 151         if (var)

 152           grub_env_set (var, name);
 153         else



















 154           grub_printf (" %s", name);
 155       }

 156 
 157     grub_errno = GRUB_ERR_NONE;
 158     return (found && var);
 159   }
 160 
 161   auto int part_hook (grub_disk_t disk, const grub_partition_t partition);
 162   int part_hook (grub_disk_t disk, const grub_partition_t partition)
 163   {
 164     char *partition_name, *devname;
 165     int ret;
 166 
 167     partition_name = grub_partition_get_name (partition);
 168     if (! partition_name)
 169       return 1;
 170 
 171     devname = grub_xasprintf ("%s,%s", disk->name, partition_name);
 172     grub_free (partition_name);
 173     if (!devname)
 174       return 1;
 175     ret = iterate_device (devname);
 176     grub_free (devname);    
 177 
 178     return ret;


 263 
 264       /* Retry with autoload if nothing found.  */
 265       if (grub_errno == GRUB_ERR_NONE && count == 0)
 266         try ();
 267     }
 268   else
 269     try ();
 270 
 271   if (grub_errno == GRUB_ERR_NONE && count == 0)
 272     grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such device: %s", key);
 273 }
 274 
 275 static grub_err_t
 276 grub_cmd_do_search (grub_command_t cmd __attribute__ ((unused)), int argc,
 277                     char **args)
 278 {
 279   if (argc == 0)
 280     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
 281 
 282   FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (args + 2),
 283              argc > 2 ? argc - 2 : 0);
 284 
 285   return grub_errno;
 286 }
 287 
 288 static grub_command_t cmd;
 289 
 290 #ifdef DO_SEARCH_FILE
 291 GRUB_MOD_INIT(search_fs_file)
 292 #elif defined (DO_SEARCH_FS_UUID)
 293 GRUB_MOD_INIT(search_fs_uuid)
 294 #else
 295 GRUB_MOD_INIT(search_label)
 296 #endif
 297 {
 298   cmd =
 299     grub_register_command (COMMAND_NAME, grub_cmd_do_search,
 300                            N_("NAME [VARIABLE] [HINTS]"),
 301                            HELP_MESSAGE);
 302 }
 303 


   5  *
   6  *  GRUB is free software: you can redistribute it and/or modify
   7  *  it under the terms of the GNU General Public License as published by
   8  *  the Free Software Foundation, either version 3 of the License, or
   9  *  (at your option) any later version.
  10  *
  11  *  GRUB is distributed in the hope that it will be useful,
  12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14  *  GNU General Public License for more details.
  15  *
  16  *  You should have received a copy of the GNU General Public License
  17  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  18  */
  19 
  20 #include <grub/types.h>
  21 #include <grub/misc.h>
  22 #include <grub/mm.h>
  23 #include <grub/err.h>
  24 #include <grub/dl.h>
  25 #include <grub/zfs/zfs.h>
  26 #include <grub/device.h>
  27 #include <grub/file.h>
  28 #include <grub/env.h>
  29 #include <grub/command.h>
  30 #include <grub/search.h>
  31 #include <grub/i18n.h>
  32 #include <grub/disk.h>
  33 #include <grub/partition.h>
  34 
  35 GRUB_MOD_LICENSE ("GPLv3+");
  36 
  37 struct cache_entry
  38 {
  39   struct cache_entry *next;
  40   char *key;
  41   char *value;
  42 };
  43 
  44 static struct cache_entry *cache;
  45 
  46 void
  47 FUNC_NAME (const char *key, const char *var, int no_floppy,
  48            char **hints, unsigned nhints, int mirror)
  49 {
  50   int count = 0;
  51   int is_cache = 0;
  52   grub_uint64_t txg = 0;
  53   grub_fs_autoload_hook_t saved_autoload;
  54 
  55   auto int iterate_device (const char *name);
  56   int iterate_device (const char *name)
  57   {
  58     int found = 0;
  59 
  60     /* Skip floppy drives when requested.  */
  61     if (no_floppy &&
  62         name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9')
  63       return 0;
  64 
  65 #ifdef DO_SEARCH_FS_UUID
  66 #define compare_fn grub_strcasecmp
  67 #else
  68 #define compare_fn grub_strcmp
  69 #endif
  70 
  71 #ifdef DO_SEARCH_FILE
  72       {


 133             if (cache_ent->value && cache_ent->key)
 134               {
 135                 cache_ent->next = cache;
 136                 cache = cache_ent;
 137               }
 138             else
 139               {
 140                 grub_free (cache_ent->value);
 141                 grub_free (cache_ent->key);
 142                 grub_free (cache_ent);
 143                 grub_errno = GRUB_ERR_NONE;
 144               }
 145           }
 146         else
 147           grub_errno = GRUB_ERR_NONE;
 148       }
 149 
 150     if (found)
 151       {
 152         count++;
 153         if (var) {
 154           if (! mirror) {
 155             grub_env_set (var, name);
 156           } else {
 157             grub_uint64_t tmp_txg = 0;
 158             char * nvlist = NULL;
 159             grub_device_t dev = grub_device_open (name);
 160             if (! dev) {
 161               grub_errno = GRUB_ERR_BAD_DEVICE;
 162               return 0;
 163             }
 164             grub_errno = grub_zfs_fetch_nvlist (dev, &nvlist);
 165             grub_device_close (dev);
 166             if (grub_errno)
 167               return 0;
 168             grub_zfs_nvlist_lookup_uint64 (nvlist, ZPOOL_CONFIG_POOL_TXG, &tmp_txg);
 169             if (tmp_txg > txg) {
 170               grub_env_set (var, name);
 171               txg = tmp_txg;
 172             }
 173             grub_free (nvlist);
 174           }
 175         } else {
 176           grub_printf (" %s", name);
 177         }
 178       }
 179 
 180     grub_errno = GRUB_ERR_NONE;
 181     return (found && var && !mirror);
 182   }
 183 
 184   auto int part_hook (grub_disk_t disk, const grub_partition_t partition);
 185   int part_hook (grub_disk_t disk, const grub_partition_t partition)
 186   {
 187     char *partition_name, *devname;
 188     int ret;
 189 
 190     partition_name = grub_partition_get_name (partition);
 191     if (! partition_name)
 192       return 1;
 193 
 194     devname = grub_xasprintf ("%s,%s", disk->name, partition_name);
 195     grub_free (partition_name);
 196     if (!devname)
 197       return 1;
 198     ret = iterate_device (devname);
 199     grub_free (devname);    
 200 
 201     return ret;


 286 
 287       /* Retry with autoload if nothing found.  */
 288       if (grub_errno == GRUB_ERR_NONE && count == 0)
 289         try ();
 290     }
 291   else
 292     try ();
 293 
 294   if (grub_errno == GRUB_ERR_NONE && count == 0)
 295     grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such device: %s", key);
 296 }
 297 
 298 static grub_err_t
 299 grub_cmd_do_search (grub_command_t cmd __attribute__ ((unused)), int argc,
 300                     char **args)
 301 {
 302   if (argc == 0)
 303     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
 304 
 305   FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (args + 2),
 306              argc > 2 ? argc - 2 : 0, 0);
 307 
 308   return grub_errno;
 309 }
 310 
 311 static grub_command_t cmd;
 312 
 313 #ifdef DO_SEARCH_FILE
 314 GRUB_MOD_INIT(search_fs_file)
 315 #elif defined (DO_SEARCH_FS_UUID)
 316 GRUB_MOD_INIT(search_fs_uuid)
 317 #else
 318 GRUB_MOD_INIT(search_label)
 319 #endif
 320 {
 321   cmd =
 322     grub_register_command (COMMAND_NAME, grub_cmd_do_search,
 323                            N_("NAME [VARIABLE] [HINTS]"),
 324                            HELP_MESSAGE);
 325 }
 326