From: Jeremy Kerr Date: Mon, 12 Aug 2013 08:39:36 +0000 (+0800) Subject: lib/process: replace pb_run_cmd_pipe X-Git-Tag: v1.0.0~510 X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=823958fbbd17ab2c1b2a1779eb10351ca0a668c6 lib/process: replace pb_run_cmd_pipe Replace pb_run_cmd_pipe with process_create / process_run_sync. Signed-off-by: Jeremy Kerr --- diff --git a/discover/boot.c b/discover/boot.c index f9b0223..d9c606f 100644 --- a/discover/boot.c +++ b/discover/boot.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -244,29 +245,44 @@ static void run_boot_hooks(struct boot_task *task, boot_status_fn status_fn, for (i = 0; i < n; i++) { const char *argv[2] = { NULL, NULL }; - char *path, *buf; - int buf_len, rc; + struct process *process; + char *path; + int rc; path = join_paths(task, boot_hook_dir, hooks[i]->d_name); - if (access(path, X_OK)) + if (access(path, X_OK)) { + talloc_free(path); continue; + } - pb_log("running boot hook %s\n", hooks[i]->d_name); + process = process_create(task); argv[0] = path; - rc = pb_run_cmd_pipe(argv, 1, task->dry_run, task, - &buf, &buf_len); - - /* if the hook returned with BOOT_HOOK_EXIT_UPDATE, - * then we process stdout to look for updated params - */ - if (rc == BOOT_HOOK_EXIT_UPDATE) { - boot_hook_update(task, hooks[i]->d_name, buf); - boot_hook_setenv(task); + process->path = path; + process->argv = argv; + process->keep_stdout = true; + + pb_log("running boot hook %s\n", hooks[i]->d_name); + + rc = process_run_sync(process); + if (rc) { + pb_log("boot hook exec failed!\n"); + + } else if (WIFEXITED(process->exit_status) && + WEXITSTATUS(process->exit_status) + == BOOT_HOOK_EXIT_UPDATE) { + /* if the hook returned with BOOT_HOOK_EXIT_UPDATE, + * then we process stdout to look for updated params + */ + if (rc == BOOT_HOOK_EXIT_UPDATE) { + boot_hook_update(task, hooks[i]->d_name, + process->stdout_buf); + boot_hook_setenv(task); + } } - talloc_free(buf); + process_release(process); talloc_free(path); } diff --git a/discover/pb-discover.c b/discover/pb-discover.c index a0535c2..61da509 100644 --- a/discover/pb-discover.c +++ b/discover/pb-discover.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "udev.h" #include "user-event.h" @@ -118,6 +119,7 @@ int main(int argc, char *argv[]) struct discover_server *server; struct network *network; struct waitset *waitset; + struct procset *procset; struct opts opts; struct pb_udev *udev; struct user_event *uev; @@ -166,6 +168,10 @@ int main(int argc, char *argv[]) if (!server) return EXIT_FAILURE; + procset = process_init(server, waitset); + if (!procset) + return EXIT_FAILURE; + network = network_init(server, waitset, opts.dry_run == opt_yes); if (!network) return EXIT_FAILURE; diff --git a/lib/pb-config/storage-powerpc-nvram.c b/lib/pb-config/storage-powerpc-nvram.c index 3ed3c46..7c8b9e1 100644 --- a/lib/pb-config/storage-powerpc-nvram.c +++ b/lib/pb-config/storage-powerpc-nvram.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "pb-config.h" #include "storage.h" @@ -117,64 +118,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; - } - - if (rc == 0) - break; + process = process_create(nv); + process->path = "nvram"; + process->argv = argv; + process->keep_stdout = true; - len += rc; - } + rc = process_run_sync(process); - 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, diff --git a/lib/system/system.c b/lib/system/system.c index 528e134..ff4ae99 100644 --- a/lib/system/system.c +++ b/lib/system/system.c @@ -102,67 +102,22 @@ int pb_rmdir_recursive(const char *base, const char *dir) return 0; } -static int read_pipe(void *ctx, int fd, char **bufp, int *lenp) -{ - int rc, len, alloc_len; - char *buf; - - alloc_len = 4096; - len = 0; - - buf = talloc_array(ctx, char, alloc_len); - - for (;;) { - rc = read(fd, buf, alloc_len - len - 1); - if (rc <= 0) - break; - - len += rc; - if (len == alloc_len - 1) { - alloc_len *= 2; - buf = talloc_realloc(ctx, buf, char, alloc_len); - } - } - - if (rc < 0) { - talloc_free(buf); - return rc; - } - - buf[len] = '\0'; - *bufp = buf; - *lenp = len; - - return 0; -} - /** * pb_run_cmd - Run the supplied command. * @cmd_argv: An argument list array for execv. * @wait: Wait for the child process to complete before returning. * @dry_run: Don't actually fork and exec. */ - int pb_run_cmd(const char *const *cmd_argv, int wait, int dry_run) -{ - return pb_run_cmd_pipe(cmd_argv, wait, dry_run, NULL, NULL, NULL); -} - -int pb_run_cmd_pipe(const char *const *cmd_argv, int wait, int dry_run, - void *ctx, char **stdout_buf, int *stdout_buf_len) { #if defined(DEBUG) enum {do_debug = 1}; #else enum {do_debug = 0}; #endif - int status, pipefd[2]; + int status; pid_t pid; - assert(!stdout_buf || wait); - assert(!stdout_buf || ctx); - assert(!stdout_buf || stdout_buf_len); - if (do_debug) { const char *const *p = cmd_argv; @@ -177,22 +132,9 @@ int pb_run_cmd_pipe(const char *const *cmd_argv, int wait, int dry_run, pb_log("%s: %s%s\n", __func__, (dry_run ? "(dry-run) " : ""), cmd_argv[0]); - if (stdout_buf) { - *stdout_buf = NULL; - *stdout_buf_len = 0; - } - if (dry_run) return 0; - if (stdout_buf) { - status = pipe(pipefd); - if (status) { - pb_log("pipe failed"); - return -1; - } - } - pid = fork(); if (pid == -1) { @@ -206,13 +148,8 @@ int pb_run_cmd_pipe(const char *const *cmd_argv, int wait, int dry_run, /* Redirect child output to log. */ - if (stdout_buf) { - status = dup2(pipefd[1], STDOUT_FILENO); - } else { - status = dup2(log, STDOUT_FILENO); - } + status = dup2(log, STDOUT_FILENO); assert(status != -1); - status = dup2(log, STDERR_FILENO); assert(status != -1); @@ -224,13 +161,6 @@ int pb_run_cmd_pipe(const char *const *cmd_argv, int wait, int dry_run, if (!wait && !waitpid(pid, &status, WNOHANG)) return 0; - if (stdout_buf) { - close(pipefd[1]); - status = read_pipe(ctx, pipefd[0], stdout_buf, stdout_buf_len); - if (status) - return -1; - } - if (waitpid(pid, &status, 0) == -1) { pb_log("%s: waitpid failed: %s\n", __func__, strerror(errno)); diff --git a/lib/system/system.h b/lib/system/system.h index a7a1a12..271c435 100644 --- a/lib/system/system.h +++ b/lib/system/system.h @@ -18,8 +18,6 @@ struct pb_system_apps { extern const struct pb_system_apps pb_system_apps; int pb_run_cmd(const char *const *cmd_argv, int wait, int dry_run); -int pb_run_cmd_pipe(const char *const *cmd_argv, int wait, int dry_run, - void *ctx, char **buf, int *buf_len); int pb_mkdir_recursive(const char *dir); int pb_rmdir_recursive(const char *base, const char *dir); diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index 71fec5e..0dc8d4b 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -31,6 +31,7 @@ #include "pb-protocol/pb-protocol.h" #include "talloc/talloc.h" #include "waiter/waiter.h" +#include "process/process.h" #include "ui/common/discover-client.h" #include "nc-cui.h" @@ -507,6 +508,8 @@ struct cui *cui_init(void* platform_info, cui->platform_info = platform_info; cui->waitset = waitset_create(cui); + process_init(cui, cui->waitset); + setlocale(LC_ALL, ""); /* Loop here for scripts that just started the server. */ diff --git a/ui/twin/pbt-client.c b/ui/twin/pbt-client.c index 445c865..1de532d 100644 --- a/ui/twin/pbt-client.c +++ b/ui/twin/pbt-client.c @@ -30,6 +30,7 @@ #include "log/log.h" #include "talloc/talloc.h" #include "waiter/waiter.h" +#include "process/process.h" #include "ui/common/discover-client.h" static struct pb_opt_data *pbt_opt_data_from_item(struct pbt_item *item) @@ -269,6 +270,8 @@ struct pbt_client *pbt_client_init(enum pbt_twin_backend backend, pbt_client->waitset = waitset_create(pbt_client); + process_init(pbt_client, pbt_client->waitset); + pbt_client->sig = "pbt_client"; pbt_client->frame.scr = pbt_scr_init(pbt_client, pbt_client->waitset, backend, width, height, NULL, NULL);