=== modified file 'ChangeLog' --- ChangeLog 2012-08-14 08:56:19 +0000 +++ ChangeLog 2012-08-14 09:10:27 +0000 @@ -1,5 +1,14 @@ 2012-08-13 Paulo Flabiano Smorigo + Search for specific config file when it boots from tftp. + + * grub-core/normal/main.c: Call search function. + * grub-core/net/net.c: New function. + * include/grub/net.h: New function. + + +2012-08-13 Paulo Flabiano Smorigo + * grub-core/kern/misc.c: Add %X option to printf functions. 2012-08-05 Grégoire Sutre === modified file 'grub-core/net/net.c' --- grub-core/net/net.c 2012-06-22 20:02:47 +0000 +++ grub-core/net/net.c 2012-08-14 08:59:46 +0000 @@ -1548,6 +1548,96 @@ return GRUB_ERR_NONE; } +grub_err_t +grub_net_search_configfile (char *config) +{ + grub_size_t config_len; + char *suffix; + + auto int search_through (grub_size_t num_tries, grub_size_t slice_size); + int search_through (grub_size_t num_tries, grub_size_t slice_size) + { + while (num_tries-- > 0) + { + grub_dprintf ("net", "probe %s\n", config); + + grub_file_t file; + file = grub_file_open (config); + + if (file) + { + grub_file_close (file); + grub_dprintf ("net", "found!\n"); + return 0; + } + else + { + if (grub_errno == GRUB_ERR_IO) + grub_errno = GRUB_ERR_NONE; + } + + if (grub_strlen (suffix) < slice_size) + break; + + config[grub_strlen (config) - slice_size] = '\0'; + } + + return 1; + } + + config_len = grub_strlen (config); + config[config_len] = '-'; + suffix = config + config_len + 1; + + struct grub_net_network_level_interface *inf; + FOR_NET_NETWORK_LEVEL_INTERFACES (inf) + { + /* Try by the MAC address. */ + + /* Add ethernet type */ + grub_strcpy (suffix, "01-"); + + grub_net_hwaddr_to_str (&inf->hwaddress, suffix + 3); + + char *ptr; + for (ptr = suffix; *ptr; ptr++) + if (*ptr == ':') + *ptr = '-'; + + if (search_through (1, 3) == 0) return GRUB_ERR_NONE; + + /* Then by IP address */ + + switch ((&inf->address)->type) + { + case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6: + { + break; + } + case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4: + { + grub_uint32_t n = grub_be_to_cpu32 ((&inf->address)->ipv4); + grub_snprintf (suffix, GRUB_NET_MAX_STR_ADDR_LEN, "%02X%02X%02X%02X", \ + ((n >> 24) & 0xff), ((n >> 16) & 0xff), \ + ((n >> 8) & 0xff), ((n >> 0) & 0xff)); + + if (search_through (8, 1) == 0) return GRUB_ERR_NONE; + break; + } + case GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV: + return grub_error (GRUB_ERR_BUG, "shouldn't reach here"); + default: + return grub_error (GRUB_ERR_BUG, + "unsupported address type %d", (&inf->address)->type); + } + } + + /* Remove the remaining minus sign at the end. */ + config[config_len] = '\0'; + + return GRUB_ERR_NONE; +} + static struct grub_preboot *fini_hnd; static grub_command_t cmd_addaddr, cmd_deladdr, cmd_addroute, cmd_delroute; === modified file 'grub-core/normal/main.c' --- grub-core/normal/main.c 2012-06-28 00:06:36 +0000 +++ grub-core/normal/main.c 2012-08-14 08:56:59 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include GRUB_MOD_LICENSE ("GPLv3+"); @@ -337,10 +338,18 @@ prefix = grub_env_get ("prefix"); if (prefix) - { - config = grub_xasprintf ("%s/grub.cfg", prefix); - if (! config) - goto quit; + { + grub_size_t config_len; + config_len = grub_strlen (prefix) + sizeof ("/grub.cfg-XX-XX-XX-XX-XX-XX-XX"); + config = grub_malloc (config_len); + + if (! config) + goto quit; + + grub_snprintf (config, config_len, "%s/grub.cfg", prefix); + + if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) + grub_net_search_configfile (config); grub_enter_normal_mode (config); grub_free (config); === modified file 'include/grub/net.h' --- include/grub/net.h 2012-06-22 12:17:46 +0000 +++ include/grub/net.h 2012-08-14 08:56:59 +0000 @@ -523,4 +523,7 @@ #define GRUB_NET_TRIES 40 #define GRUB_NET_INTERVAL 400 +grub_err_t +grub_net_search_configfile (char *config); + #endif /* ! GRUB_NET_HEADER */