]> git.ozlabs.org Git - petitboot/blobdiff - lib/pb-config/storage-powerpc-nvram.c
lib/pb-config/powerpc-nvram: Add petitboot,timeout nvram property
[petitboot] / lib / pb-config / storage-powerpc-nvram.c
index 3ed3c46dbd1b716ec0643381f137698f880cfd97..fa2437c586a289408c829fbaea6ce730a735eb3c 100644 (file)
@@ -1,12 +1,14 @@
 
 #include <string.h>
 #include <stdlib.h>
+#include <limits.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 
 #include <talloc/talloc.h>
 #include <list/list.h>
 #include <log/log.h>
+#include <process/process.h>
 
 #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]);
+       struct process *process;
+       const char *argv[5];
+       int rc;
 
-       len = 0;
-       buf_len = max_partition_size;
-       buf = talloc_array(nv, char, buf_len);
+       argv[0] = "nvram";
+       argv[1] = "--print-config";
+       argv[2] = "--partition";
+       argv[3] = partition;
+       argv[4] = NULL;
 
-       for (;;) {
-               rc = read(pipefds[0], buf + len, buf_len - len);
+       process = process_create(nv);
+       process->path = "nvram";
+       process->argv = argv;
+       process->keep_stdout = true;
 
-               if (rc < 0) {
-                       perror("read");
-                       break;
-               }
+       rc = process_run_sync(process);
 
-               if (rc == 0)
-                       break;
-
-               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,
@@ -329,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);
 }