Module: wine Branch: master Commit: 6df7adfff1a344ab7983b49e4ccb8f1d133b9171 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6df7adfff1a344ab7983b49e4c...
Author: Ken Thomases ken@codeweavers.com Date: Wed Nov 30 16:49:14 2011 -0600
winspool: Wait for and reap print spool child process.
---
dlls/winspool.drv/info.c | 33 ++++++++++++++++++++++++++++++++- 1 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 7bf9149..68ab5d7 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -33,6 +33,12 @@ #include <string.h> #include <ctype.h> #include <stddef.h> +#ifdef HAVE_SYS_ERRNO_H +#include <sys/errno.h> +#endif +#ifdef HAVE_SYS_WAIT_H +#include <sys/wait.h> +#endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif @@ -7408,6 +7414,8 @@ static BOOL schedule_pipe(LPCWSTR cmd, LPCWSTR filename) int fds[2] = {-1, -1}, file_fd = -1, no_read; BOOL ret = FALSE; char buf[1024]; + pid_t pid, wret; + int status;
if(!(unixname = wine_get_unix_file_name(filename))) return FALSE; @@ -7427,7 +7435,7 @@ static BOOL schedule_pipe(LPCWSTR cmd, LPCWSTR filename) goto end; }
- if (fork() == 0) + if ((pid = fork()) == 0) { close(0); dup2(fds[0], 0); @@ -7439,10 +7447,33 @@ static BOOL schedule_pipe(LPCWSTR cmd, LPCWSTR filename) execl("/bin/sh", "/bin/sh", "-c", cmdA, NULL); _exit(1); } + else if (pid == -1) + { + ERR("fork() failed!\n"); + goto end; + }
while((no_read = read(file_fd, buf, sizeof(buf))) > 0) write(fds[1], buf, no_read);
+ close(fds[1]); + fds[1] = -1; + + /* reap child */ + do { + wret = waitpid(pid, &status, 0); + } while (wret < 0 && errno == EINTR); + if (wret < 0) + { + ERR("waitpid() failed!\n"); + goto end; + } + if (!WIFEXITED(status) || WEXITSTATUS(status)) + { + ERR("child process failed! %d\n", status); + goto end; + } + ret = TRUE;
end: