X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=discover%2Fplatform-powerpc.c;h=2ee376d0d9fa29d641e55f5948e2c7f9bcf79a20;hb=ec07742d2a37f8f96705fc0f20d9b22b583dad57;hp=02d9a207e707463424bb855fb20823f03bc0acc5;hpb=3132110c344c60bbe648b5e1b0473bdec101d111;p=petitboot diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c index 02d9a20..2ee376d 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; @@ -147,7 +148,7 @@ static int parse_nvram_params(struct platform_powerpc *platform, static int parse_nvram(struct platform_powerpc *platform) { - struct process *process; + struct process_stdout *stdout; const char *argv[5]; int rc; @@ -157,23 +158,17 @@ static int parse_nvram(struct platform_powerpc *platform) argv[3] = partition; argv[4] = NULL; - process = process_create(platform); - process->path = "nvram"; - process->argv = argv; - process->keep_stdout = true; - - rc = process_run_sync(process); + rc = process_get_stdout_argv(NULL, &stdout, argv); - if (rc || !process_exit_ok(process)) { + if (rc) { fprintf(stderr, "nvram process returned " "non-zero exit status\n"); rc = -1; } else { - rc = parse_nvram_params(platform, process->stdout_buf, - process->stdout_len); + rc = parse_nvram_params(platform, stdout->buf, stdout->len); } - process_release(process); + talloc_free(stdout); return rc; } @@ -287,7 +282,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 +315,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; @@ -1184,7 +1187,7 @@ static void get_ipmi_network_override(struct platform_powerpc *platform, memcpy(&cookie, &resp[i], sizeof(cookie)); cookie = __be32_to_cpu(cookie); if (cookie != magic_value) { - pb_log("%s: Incorrect cookie %x\n", __func__, cookie); + pb_log_fn("Incorrect cookie %x\n", cookie); return; } i += sizeof(cookie); @@ -1250,7 +1253,7 @@ static int load_config(struct platform *p, struct config *config) rc = parse_nvram(platform); if (rc) - pb_log("%s: Failed to parse nvram\n", __func__); + pb_log_fn("Failed to parse nvram\n"); populate_config(platform, config);