diff --git a/src/version.c b/src/version.c index a8c11f9..a5c0fc0 100644 --- a/src/version.c +++ b/src/version.c @@ -565,10 +565,10 @@ exec_buf(struct sbuf *res, char **argv) { } if ((spawn_err = posix_spawn_file_actions_init(&actions) != 0) || - (spawn_err = posix_spawn_file_actions_addclose(&actions, - STDERR_FILENO)) != 0 || - (spawn_err = posix_spawn_file_actions_addclose(&actions, - STDIN_FILENO)) != 0 || + (spawn_err = posix_spawn_file_actions_addopen(&actions, + STDERR_FILENO, "/dev/null", O_RDONLY, 0)) != 0 || + (spawn_err = posix_spawn_file_actions_addopen(&actions, + STDIN_FILENO, "/dev/null", O_RDONLY, 0)) != 0 || (spawn_err = posix_spawn_file_actions_adddup2(&actions, pfd[1], STDOUT_FILENO)!= 0) || (spawn_err = posix_spawnp(&pid, argv[0], &actions, NULL, @@ -576,17 +576,20 @@ exec_buf(struct sbuf *res, char **argv) { warnc(spawn_err, "%s", argv[0]); return (0); } + posix_spawn_file_actions_destroy(&actions); close(pfd[1]); + sbuf_clear(res); while ((r = read(pfd[0], buf, BUFSIZ)) > 0) { sbuf_bcat(res, buf, r); - if (waitpid(pid, &pstat, WNOHANG) == -1) - break; } close(pfd[0]); - posix_spawn_file_actions_destroy(&actions); + while (waitpid(pid, &pstat, 0) == -1) { + if (errno != EINTR) + return (-1); + } sbuf_finish(res);