2009-06-04 Robert Millan <rmh.grub@aybabtu.com>

Simplify the code duplication in commands/search.c.

        * commands/search.c (search_label, search_fs_uuid): Merge into ...
        (search_fs): ... this.  Update all users.
This commit is contained in:
robertmh 2009-06-04 11:18:18 +00:00
parent f6fd460a40
commit 2bf5885a3d
2 changed files with 22 additions and 66 deletions

View File

@ -1,3 +1,10 @@
2009-06-04 Robert Millan <rmh.grub@aybabtu.com>
Simplify the code duplication in commands/search.c.
* commands/search.c (search_label, search_fs_uuid): Merge into ...
(search_fs): ... this. Update all users.
2009-06-03 Felix Zielcke <fzielcke@z-51.de>
* util/grub-mkconfig.in (update_grub_dir): Rename to grub_mkconfig_dir.

View File

@ -1,7 +1,7 @@
/* search.c - search devices based on a file or a filesystem label */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2005,2007,2008 Free Software Foundation, Inc.
* 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
@ -37,11 +37,11 @@ static const struct grub_arg_option options[] =
};
static void
search_label (const char *key, const char *var)
search_fs (const char *key, const char *var, int is_uuid)
{
int count = 0;
auto int iterate_device (const char *name);
int iterate_device (const char *name)
{
grub_device_t dev;
@ -53,14 +53,17 @@ search_label (const char *key, const char *var)
grub_fs_t fs;
fs = grub_fs_probe (dev);
if (fs && fs->label)
#define QUID(x) (is_uuid ? (x)->uuid : (x)->label)
if (fs && QUID(fs))
{
char *label;
char *quid;
(fs->label) (dev, &label);
if (grub_errno == GRUB_ERR_NONE && label)
(QUID(fs)) (dev, &quid);
if (grub_errno == GRUB_ERR_NONE && quid)
{
if (grub_strcmp (label, key) == 0)
if (grub_strcmp (quid, key) == 0)
{
/* Found! */
count++;
@ -73,67 +76,13 @@ search_label (const char *key, const char *var)
grub_printf (" %s", name);
}
grub_free (label);
grub_free (quid);
}
}
grub_device_close (dev);
}
grub_errno = GRUB_ERR_NONE;
return abort;
}
grub_device_iterate (iterate_device);
if (count == 0)
grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such device: %s", key);
}
static void
search_fs_uuid (const char *key, const char *var)
{
int count = 0;
auto int iterate_device (const char *name);
int iterate_device (const char *name)
{
grub_device_t dev;
int abort = 0;
dev = grub_device_open (name);
if (dev)
{
grub_fs_t fs;
fs = grub_fs_probe (dev);
if (fs && fs->uuid)
{
char *uuid;
(fs->uuid) (dev, &uuid);
if (grub_errno == GRUB_ERR_NONE && uuid)
{
if (grub_strcasecmp (uuid, key) == 0)
{
/* Found! */
count++;
if (var)
{
grub_env_set (var, name);
abort = 1;
}
else
grub_printf (" %s", name);
}
grub_free (uuid);
}
}
grub_device_close (dev);
}
grub_errno = GRUB_ERR_NONE;
return abort;
}
@ -207,9 +156,9 @@ grub_cmd_search (grub_extcmd_t cmd, int argc, char **args)
var = state[3].arg ? state[3].arg : "root";
if (state[1].set)
search_label (args[0], var);
search_fs (args[0], var, 0);
else if (state[2].set)
search_fs_uuid (args[0], var);
search_fs (args[0], var, 1);
else
search_file (args[0], var);