X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fplatform-powerpc.c;h=df8c7d611d26a0c46c97de0bd921fc82e1414520;hp=a4b955ef6fd48e3c2daa72cf2696b4e6f9f8159d;hb=b0c603d007174e75452c1c14402d62d305da76ab;hpb=8ed97667e4c602ef37cb2a870a198cfbf008b29a diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c index a4b955e..df8c7d6 100644 --- a/discover/platform-powerpc.c +++ b/discover/platform-powerpc.c @@ -4,9 +4,9 @@ #include #include #include +#include #include #include -#include #include #include @@ -16,6 +16,7 @@ #include #include #include +#include #include "hostboot.h" #include "platform.h" @@ -25,7 +26,7 @@ static const char *partition = "common"; static const char *sysparams_dir = "/sys/firmware/opal/sysparams/"; static const char *devtree_dir = "/proc/device-tree/"; -static const int ipmi_timeout = 5000; /* milliseconds. */ +static const int ipmi_timeout = 10000; /* milliseconds. */ struct param { char *name; @@ -287,7 +288,7 @@ static int parse_one_interface_config(struct config *config, char *confstr) { struct interface_config *ifconf; - char *tok, *saveptr; + char *tok, *tok_gw, *tok_url, *saveptr; ifconf = talloc_zero(config, struct interface_config); @@ -320,18 +321,26 @@ static int parse_one_interface_config(struct config *config, ifconf->static_config.address = talloc_strdup(ifconf, tok); - tok = strtok_r(NULL, ",", &saveptr); - if (tok) { - ifconf->static_config.gateway = - talloc_strdup(ifconf, tok); + /* + * If a url is set but not a gateway, we can accidentally + * interpret the url as the gateway. To avoid changing the + * parameter format check if the "gateway" is actually a + * pb-url if it's the last token. + */ + tok_gw = strtok_r(NULL, ",", &saveptr); + tok_url = strtok_r(NULL, ",", &saveptr); + + if (tok_gw) { + if (tok_url || !is_url(tok_gw)) + ifconf->static_config.gateway = + talloc_strdup(ifconf, tok_gw); + else + tok_url = tok_gw; } - tok = strtok_r(NULL, ",", &saveptr); - if (tok) { + if (tok_url) ifconf->static_config.url = - talloc_strdup(ifconf, tok); - } - + talloc_strdup(ifconf, tok_url); } else { pb_log("Unknown network configuration method %s\n", tok); goto out_err; @@ -492,19 +501,6 @@ static void populate_bootdev_config(struct platform_powerpc *platform, config->n_autoboot_opts = n_new; } -static void set_proxy_variables(struct config *config) -{ - if (config->http_proxy) - setenv("http_proxy", config->http_proxy, 1); - else - unsetenv("http_proxy"); - - if (config->https_proxy) - setenv("https_proxy", config->https_proxy, 1); - else - unsetenv("https_proxy"); -} - static void populate_config(struct platform_powerpc *platform, struct config *config) { @@ -560,7 +556,6 @@ static void populate_config(struct platform_powerpc *platform, val = get_param(platform, "petitboot,https_proxy"); if (val) config->https_proxy = talloc_strdup(config, val); - set_proxy_variables(config); } static char *iface_config_str(void *ctx, struct interface_config *config) @@ -740,7 +735,6 @@ static int update_config(struct platform_powerpc *platform, update_string_config(platform, "petitboot,http_proxy", val); val = config->https_proxy ?: ""; update_string_config(platform, "petitboot,https_proxy", val); - set_proxy_variables(config); update_network_config(platform, config);