From 4acdbb7fa9ae1621df8a5c3defe6e4433457a8a4 Mon Sep 17 00:00:00 2001 From: proski Date: Tue, 7 Jul 2009 20:13:39 +0000 Subject: [PATCH] 2009-07-07 Pavel Roskin * commands/search.c (search_file): Merge into ... (search_fs): ... this. Accept search type as argument. (grub_cmd_search): Pass search type to search_fs(). git-svn-id: svn+ssh://svn.savannah.gnu.org/grub/trunk/grub2@2402 d0de0278-0dc1-4c01-8a07-af38b3205e46 --- ChangeLog | 4 ++ commands/search.c | 194 +++++++++++++++++++++++------------------------------- 2 files changed, 86 insertions(+), 112 deletions(-) diff --git a/ChangeLog b/ChangeLog index e16ae1cf..3fe273f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2009-07-07 Pavel Roskin + * commands/search.c (search_file): Merge into ... + (search_fs): ... this. Accept search type as argument. + (grub_cmd_search): Pass search type to search_fs(). + * include/grub/util/console.h: New file. * util/console.c: Use it instead of grub/machine/console.h. * util/grub-emu.c: Likewise. diff --git a/commands/search.c b/commands/search.c index 68ec8ccd..4ac7429e 100644 --- a/commands/search.c +++ b/commands/search.c @@ -47,126 +47,96 @@ enum options }; static void -search_fs (const char *key, const char *var, int no_floppy, int is_uuid) +search_fs (const char *key, const char *var, int no_floppy, enum options type) { int count = 0; - auto int iterate_device (const char *name); - - int iterate_device (const char *name) - { - grub_device_t dev; - int abort = 0; - - /* Skip floppy drives when requested. */ - if (no_floppy && - name[0] == 'f' && name[1] == 'd' && - name[2] >= '0' && name[2] <= '9') - return 0; - - dev = grub_device_open (name); - if (dev) - { - grub_fs_t fs; - int (*compare_fn) (const char *, const char *); - - fs = grub_fs_probe (dev); - compare_fn = is_uuid ? grub_strcasecmp : grub_strcmp; - - if (fs && (is_uuid ? fs->uuid : fs->label)) - { - char *quid; - - if (is_uuid) - fs->uuid (dev, &quid); - else - fs->label (dev, &quid); - - if (grub_errno == GRUB_ERR_NONE && quid) - { - if (compare_fn (quid, key) == 0) - { - /* Found! */ - count++; - if (var) - { - grub_env_set (var, name); - abort = 1; - } - else - grub_printf (" %s", name); - } - - 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); -} + char *buf = NULL; -static void -search_file (const char *key, const char *var, int no_floppy) -{ - int count = 0; - char *buf = 0; auto int iterate_device (const char *name); - int iterate_device (const char *name) - { - grub_size_t len; - char *p; - grub_file_t file; - int abort = 0; - - /* Skip floppy drives when requested. */ - if (no_floppy && - name[0] == 'f' && name[1] == 'd' && - name[2] >= '0' && name[2] <= '9') - return 0; - - len = grub_strlen (name) + 2 + grub_strlen (key) + 1; - p = grub_realloc (buf, len); - if (! p) - return 1; - - buf = p; - grub_sprintf (buf, "(%s)%s", name, key); - - file = grub_file_open (buf); - if (file) - { - /* Found! */ - count++; - if (var) - { - grub_env_set (var, name); - abort = 1; - } - else - grub_printf (" %s", name); - - grub_file_close (file); - } - - grub_errno = GRUB_ERR_NONE; - return abort; - } + { + 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; + + if (type == SEARCH_FILE) + { + grub_size_t len; + char *p; + grub_file_t file; + + len = grub_strlen (name) + 2 + grub_strlen (key) + 1; + p = grub_realloc (buf, len); + if (! p) + return 1; + + buf = p; + grub_sprintf (buf, "(%s)%s", name, key); + + file = grub_file_open (buf); + if (file) + { + found = 1; + grub_file_close (file); + } + } + else + { + /* type is SEARCH_FS_UUID or SEARCH_LABEL */ + grub_device_t dev; + grub_fs_t fs; + int (*compare_fn) (const char *, const char *); + char *quid; + + dev = grub_device_open (name); + if (dev) + { + fs = grub_fs_probe (dev); + compare_fn = + (type == SEARCH_FS_UUID) ? grub_strcasecmp : grub_strcmp; + + if (fs && ((type == SEARCH_FS_UUID) ? fs->uuid : fs->label)) + { + if (type == SEARCH_FS_UUID) + fs->uuid (dev, &quid); + else + fs->label (dev, &quid); + + if (grub_errno == GRUB_ERR_NONE && quid) + { + if (compare_fn (quid, key) == 0) + found = 1; + + grub_free (quid); + } + } + + grub_device_close (dev); + } + } + + if (found) + { + count++; + if (var) + grub_env_set (var, name); + else + grub_printf (" %s", name); + } + + grub_errno = GRUB_ERR_NONE; + return (found && var); + } grub_device_iterate (iterate_device); grub_free (buf); if (grub_errno == GRUB_ERR_NONE && count == 0) - grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such file: %s", key); + grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such device: %s", key); } static grub_err_t @@ -182,11 +152,11 @@ 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) - search_fs (args[0], var, state[SEARCH_NO_FLOPPY].set, 0); + search_fs (args[0], var, state[SEARCH_NO_FLOPPY].set, SEARCH_LABEL); else if (state[SEARCH_FS_UUID].set) - search_fs (args[0], var, state[SEARCH_NO_FLOPPY].set, 1); + search_fs (args[0], var, state[SEARCH_NO_FLOPPY].set, SEARCH_FS_UUID); else if (state[SEARCH_FILE].set) - search_file (args[0], var, state[SEARCH_NO_FLOPPY].set); + search_fs (args[0], var, state[SEARCH_NO_FLOPPY].set, SEARCH_FILE); else return grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type"); -- 2.11.4.GIT