Ken Thomases : gdi.exe16: Wait for and reap print spool child process.

Alexandre Julliard julliard at winehq.org
Thu Dec 1 14:05:32 CST 2011


Module: wine
Branch: master
Commit: 6c8929f83fb4e6bb456bc6bcfb3e9a0f83f81474
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6c8929f83fb4e6bb456bc6bcfb3e9a0f83f81474

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Nov 30 16:49:06 2011 -0600

gdi.exe16: Wait for and reap print spool child process.

---

 dlls/gdi.exe16/printdrv.c |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/dlls/gdi.exe16/printdrv.c b/dlls/gdi.exe16/printdrv.c
index 3bd0605..c1665f5 100644
--- a/dlls/gdi.exe16/printdrv.c
+++ b/dlls/gdi.exe16/printdrv.c
@@ -34,6 +34,9 @@
 #ifdef HAVE_IO_H
 # include <io.h>
 #endif
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
@@ -205,6 +208,7 @@ typedef struct PRINTJOB
     HANDLE16 	hHandle;
     int		nIndex;
     int		fd;
+    pid_t       pid;
 } PRINTJOB, *PPRINTJOB;
 
 #define MAX_PRINT_JOBS 1
@@ -218,7 +222,7 @@ static PPRINTJOB FindPrintJobFromHandle(HANDLE16 hHandle)
     return gPrintJobsTable[0];
 }
 
-static int CreateSpoolFile(LPCSTR pszOutput)
+static int CreateSpoolFile(LPCSTR pszOutput, pid_t *out_pid)
 {
     int fd=-1;
     char psCmd[1024];
@@ -227,9 +231,11 @@ static int CreateSpoolFile(LPCSTR pszOutput)
 
     /* TTD convert the 'output device' into a spool file name */
 
-    if (pszOutput == NULL || *pszOutput == '\0')
+    if (pszOutput == NULL || *pszOutput == '\0' || out_pid == NULL)
       return -1;
 
+    *out_pid = -1;
+
     psCmd[0] = 0;
     /* @@ Wine registry key: HKCU\Software\Wine\Printing\Spooler */
     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Printing\\Spooler", &hkey))
@@ -263,7 +269,7 @@ static int CreateSpoolFile(LPCSTR pszOutput)
 	    ERR("pipe() failed!\n");
             return -1;
 	}
-        if (fork() == 0)
+        if ((*out_pid = fork()) == 0)
         {
             psCmdP++;
 
@@ -317,12 +323,22 @@ static int FreePrintJob(HANDLE16 hJob)
     pPrintJob = FindPrintJobFromHandle(hJob);
     if (pPrintJob != NULL)
     {
+	nRet = SP_OK;
 	gPrintJobsTable[pPrintJob->nIndex] = NULL;
 	HeapFree(GetProcessHeap(), 0, pPrintJob->pszOutput);
 	HeapFree(GetProcessHeap(), 0, pPrintJob->pszTitle);
 	if (pPrintJob->fd >= 0) close(pPrintJob->fd);
+	if (pPrintJob->pid > 0)
+	{
+	    pid_t wret;
+            int status;
+            do {
+                wret = waitpid(pPrintJob->pid, &status, 0);
+            } while (wret < 0 && errno == EINTR);
+            if (wret < 0 || !WIFEXITED(status) || WEXITSTATUS(status))
+                nRet = SP_ERROR;
+	}
 	HeapFree(GetProcessHeap(), 0, pPrintJob);
-	nRet = SP_OK;
     }
     return nRet;
 }
@@ -342,9 +358,10 @@ HPJOB16 WINAPI OpenJob16(LPCSTR lpOutput, LPCSTR lpTitle, HDC16 hDC)
     if (pPrintJob == NULL)
     {
 	int fd;
+	pid_t pid;
 
 	/* Try and create a spool file */
-	fd = CreateSpoolFile(lpOutput);
+	fd = CreateSpoolFile(lpOutput, &pid);
 	if (fd >= 0)
 	{
 	    pPrintJob = HeapAlloc(GetProcessHeap(), 0, sizeof(PRINTJOB));
@@ -364,6 +381,7 @@ HPJOB16 WINAPI OpenJob16(LPCSTR lpOutput, LPCSTR lpTitle, HDC16 hDC)
             }
 	    pPrintJob->hDC = hDC;
 	    pPrintJob->fd = fd;
+	    pPrintJob->pid = pid;
 	    pPrintJob->nIndex = 0;
 	    pPrintJob->hHandle = hHandle;
 	    gPrintJobsTable[pPrintJob->nIndex] = pPrintJob;




More information about the wine-cvs mailing list