From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Fri, 3 Oct 2014 11:08:03 -0400 Subject: [PATCH] Try $prefix if $fw_path doesn't work. Related: rhbz#1148652 Signed-off-by: Peter Jones --- grub-core/kern/ieee1275/init.c | 28 +++++----- grub-core/net/net.c | 2 +- grub-core/normal/main.c | 120 ++++++++++++++++++++--------------------- 3 files changed, 75 insertions(+), 75 deletions(-) diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c index e69c0133e69..4dfa41a37d5 100644 --- a/grub-core/kern/ieee1275/init.c +++ b/grub-core/kern/ieee1275/init.c @@ -138,23 +138,25 @@ grub_machine_get_bootlocation (char **device, char **path) grub_free (canon); } else - *device = grub_ieee1275_encode_devname (bootpath); - grub_free (type); - - filename = grub_ieee1275_get_filename (bootpath); - if (filename) { - char *lastslash = grub_strrchr (filename, '\\'); - - /* Truncate at last directory. */ - if (lastslash) + filename = grub_ieee1275_get_filename (bootpath); + if (filename) { - *lastslash = '\0'; - grub_translate_ieee1275_path (filename); + char *lastslash = grub_strrchr (filename, '\\'); - *path = filename; - } + /* Truncate at last directory. */ + if (lastslash) + { + *lastslash = '\0'; + grub_translate_ieee1275_path (filename); + + *path = filename; + } + } + *device = grub_ieee1275_encode_devname (bootpath); } + + grub_free (type); grub_free (bootpath); } diff --git a/grub-core/net/net.c b/grub-core/net/net.c index 0769bf850d3..16d2ce06d5a 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -1850,7 +1850,7 @@ grub_net_search_configfile (char *config) /* Remove the remaining minus sign at the end. */ config[config_len] = '\0'; - return GRUB_ERR_NONE; + return GRUB_ERR_FILE_NOT_FOUND; } static struct grub_preboot *fini_hnd; diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c index 7d9c4f09b9b..b69f9e738fa 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -331,74 +331,72 @@ grub_enter_normal_mode (const char *config) grub_boot_time ("Exiting normal mode"); } +static grub_err_t +grub_try_normal (const char *variable) +{ + char *config; + const char *prefix; + grub_err_t err = GRUB_ERR_FILE_NOT_FOUND; + + prefix = grub_env_get (variable); + if (!prefix) + return GRUB_ERR_FILE_NOT_FOUND; + + if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) + { + grub_size_t config_len; + config_len = grub_strlen (prefix) + + sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); + config = grub_malloc (config_len); + + if (! config) + return GRUB_ERR_FILE_NOT_FOUND; + + grub_snprintf (config, config_len, "%s/grub.cfg", prefix); + err = grub_net_search_configfile (config); + } + + if (err != GRUB_ERR_NONE) + { + config = grub_xasprintf ("%s/grub.cfg", prefix); + if (config) + { + grub_file_t file; + file = grub_file_open (config); + if (file) + { + grub_file_close (file); + err = GRUB_ERR_NONE; + } + } + } + + if (err == GRUB_ERR_NONE) + grub_enter_normal_mode (config); + + grub_errno = 0; + grub_free (config); + return err; +} + /* Enter normal mode from rescue mode. */ static grub_err_t grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { - if (argc == 0) - { - /* Guess the config filename. It is necessary to make CONFIG static, - so that it won't get broken by longjmp. */ - char *config; - const char *prefix; - - prefix = grub_env_get ("fw_path"); - if (! prefix) - prefix = grub_env_get ("prefix"); - - if (prefix) - { - if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) - { - grub_size_t config_len; - config_len = grub_strlen (prefix) + - sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); - config = grub_malloc (config_len); - - if (! config) - goto quit; - - grub_snprintf (config, config_len, "%s/grub.cfg", prefix); - - grub_net_search_configfile (config); - - grub_enter_normal_mode (config); - grub_free (config); - config = NULL; - } - - if (!config) - { - config = grub_xasprintf ("%s/grub.cfg", prefix); - if (config) - { - grub_file_t file; - - file = grub_file_open (config); - if (file) - { - grub_file_close (file); - grub_enter_normal_mode (config); - } - else - { - /* Ignore all errors. */ - grub_errno = 0; - } - grub_free (config); - } - } - } - else - { - grub_enter_normal_mode (0); - } - } - else + if (argc) grub_enter_normal_mode (argv[0]); + else + { + /* Guess the config filename. */ + grub_err_t err; + err = grub_try_normal ("fw_path"); + if (err == GRUB_ERR_FILE_NOT_FOUND) + err = grub_try_normal ("prefix"); + if (err == GRUB_ERR_FILE_NOT_FOUND) + grub_enter_normal_mode (0); + } -quit: return 0; }