X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fpb-config%2Fstorage-powerpc-nvram.c;h=fa2437c586a289408c829fbaea6ce730a735eb3c;hp=e6bf7df5544408900d5b1c24fc0f9d608a076798;hb=769fd76dc9bf3440999297ab943af49160df9c45;hpb=2b41985dde73e71daad90c36fa5d06c199da3ae1 diff --git a/lib/pb-config/storage-powerpc-nvram.c b/lib/pb-config/storage-powerpc-nvram.c index e6bf7df..fa2437c 100644 --- a/lib/pb-config/storage-powerpc-nvram.c +++ b/lib/pb-config/storage-powerpc-nvram.c @@ -1,12 +1,14 @@ #include #include +#include #include #include #include #include #include +#include #include "pb-config.h" #include "storage.h" @@ -28,6 +30,7 @@ struct powerpc_nvram_storage { static const char *known_params[] = { "auto-boot?", "petitboot,network", + "petitboot,timeout", NULL, }; @@ -117,64 +120,35 @@ static int parse_nvram_params(struct powerpc_nvram_storage *nv, static int parse_nvram(struct powerpc_nvram_storage *nv) { - int rc, len, buf_len; - int pipefds[2], status; - char *buf; - pid_t pid; - - rc = pipe(pipefds); - if (rc) { - perror("pipe"); - return -1; - } - - pid = fork(); - - if (pid < 0) { - perror("fork"); - return -1; - } - - if (pid == 0) { - close(STDIN_FILENO); - close(pipefds[0]); - dup2(pipefds[1], STDOUT_FILENO); - execlp("nvram", "nvram", "--print-config", - "--partition", partition, NULL); - exit(EXIT_FAILURE); - } - - close(pipefds[1]); - - len = 0; - buf_len = max_partition_size; - buf = talloc_array(nv, char, buf_len); + struct process *process; + const char *argv[5]; + int rc; - for (;;) { - rc = read(pipefds[0], buf + len, buf_len - len); + argv[0] = "nvram"; + argv[1] = "--print-config"; + argv[2] = "--partition"; + argv[3] = partition; + argv[4] = NULL; - if (rc < 0) { - perror("read"); - break; - } + process = process_create(nv); + process->path = "nvram"; + process->argv = argv; + process->keep_stdout = true; - if (rc == 0) - break; + rc = process_run_sync(process); - len += rc; - } - - waitpid(pid, &status, 0); - if (!WIFEXITED(status) || WEXITSTATUS(status)) { + if (rc || !WIFEXITED(process->exit_status) + || WEXITSTATUS(process->exit_status)) { fprintf(stderr, "nvram process returned " "non-zero exit status\n"); - return -1; + rc = -1; + } else { + rc = parse_nvram_params(nv, process->stdout_buf, + process->stdout_len); } - if (rc < 0) - return rc; - - return parse_nvram_params(nv, buf, len); + process_release(process); + return rc; } static const char *get_param(struct powerpc_nvram_storage *nv, @@ -243,7 +217,7 @@ static int parse_one_interface_config(struct config *config, } else if (!strcmp(tok, "static")) { ifconf->method = CONFIG_METHOD_STATIC; - /* ip/mask, [optional] gateway, [optional] dns */ + /* ip/mask, [optional] gateway */ tok = strtok_r(NULL, ",", &saveptr); if (!tok) goto out_err; @@ -254,13 +228,8 @@ static int parse_one_interface_config(struct config *config, if (tok) { ifconf->static_config.gateway = talloc_strdup(ifconf, tok); - tok = strtok_r(NULL, ",", &saveptr); } - if (tok) { - ifconf->static_config.dns = - talloc_strdup(config, tok); - } } else { pb_log("Unknown network configuration method %s\n", tok); goto out_err; @@ -279,6 +248,27 @@ out_err: return -1; } +static int parse_one_dns_config(struct config *config, + char *confstr) +{ + char *tok, *saveptr; + + for (tok = strtok_r(confstr, ",", &saveptr); tok; + tok = strtok_r(NULL, ",", &saveptr)) { + + char *server = talloc_strdup(config, tok); + + config->network.dns_servers = talloc_realloc(config, + config->network.dns_servers, const char *, + ++config->network.n_dns_servers); + + config->network.dns_servers[config->network.n_dns_servers - 1] + = server; + } + + return 0; +} + static void populate_network_config(struct powerpc_nvram_storage *nv, struct config *config) { @@ -299,7 +289,10 @@ static void populate_network_config(struct powerpc_nvram_storage *nv, if (!tok) break; - parse_one_interface_config(config, tok); + if (!strncasecmp(tok, "dns,", strlen("dns,"))) + parse_one_dns_config(config, tok + strlen("dns,")); + else + parse_one_interface_config(config, tok); } @@ -310,12 +303,24 @@ static void populate_config(struct powerpc_nvram_storage *nv, struct config *config) { const char *val; + char *end; + unsigned long timeout; /* if the "auto-boot?' property is present and "false", disable auto * boot */ val = get_param(nv, "auto-boot?"); config->autoboot_enabled = !val || strcmp(val, "false"); + val = get_param(nv, "petitboot,timeout"); + if (val) { + timeout = strtoul(val, &end, 10); + if (end != val) { + if (timeout >= INT_MAX) + timeout = INT_MAX; + config->autoboot_timeout_sec = (int)timeout; + } + } + populate_network_config(nv, config); }