/* 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
};
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;
grub_fs_t fs;
fs = grub_fs_probe (dev);
- if (fs && fs->label)
- {
- char *label;
-
- (fs->label) (dev, &label);
- if (grub_errno == GRUB_ERR_NONE && label)
- {
- if (grub_strcmp (label, key) == 0)
- {
- /* Found! */
- count++;
- if (var)
- {
- grub_env_set (var, name);
- abort = 1;
- }
- else
- grub_printf (" %s", name);
- }
-
- grub_free (label);
- }
- }
-
- 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);
+#define QUID(x) (is_uuid ? (x)->uuid : (x)->label)
- 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)
+ if (fs && QUID(fs))
{
- char *uuid;
+ char *quid;
- (fs->uuid) (dev, &uuid);
- if (grub_errno == GRUB_ERR_NONE && uuid)
+ (QUID(fs)) (dev, &quid);
+ if (grub_errno == GRUB_ERR_NONE && quid)
{
- if (grub_strcasecmp (uuid, key) == 0)
+ if (grub_strcmp (quid, key) == 0)
{
/* Found! */
count++;
abort = 1;
}
else
- grub_printf (" %s", name);
+ grub_printf (" %s", name);
}
- grub_free (uuid);
+ grub_free (quid);
}
}
grub_device_close (dev);
}
-
+
grub_errno = GRUB_ERR_NONE;
return abort;
}
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);