Add forgotten files 1.4.70b
[polyglot.git] / pipex_win32.c
index a07df7d..41431b3 100644 (file)
@@ -72,6 +72,8 @@ void pipex_open(pipex_t *pipex,
     char *szCurrentDir;
     pipex->state=0;
     pipex->name=szName;
+    pipex->command=szProcFile;
+    pipex->quit_pending=FALSE;
     pipex->hProcess=NULL;
     if (szProcFile == NULL) {
         pipex->hInput = GetStdHandle(STD_INPUT_HANDLE);
@@ -96,10 +98,11 @@ void pipex_open(pipex_t *pipex,
             my_fatal("pipex_open(): no current directory: %s\n",
                      strerror(errno));
         if(_chdir(szWorkingDir)){
-            my_fatal("pipex_open(): cannot change directory: %s\n",
+            my_fatal("pipex_open(): %s: %s\n",
+                    szWorkingDir,
                      strerror(errno));
         }
-        if(CreateProcess(NULL,
+       if(CreateProcess(NULL,
                          (LPSTR) szProcFile,
                          NULL,
                          NULL,
@@ -118,7 +121,7 @@ void pipex_open(pipex_t *pipex,
             pipex->bConsole = FALSE;
             pipex->bPipe=TRUE;
         }else{
-            my_fatal("pipex_open(): %s",win32_error());
+         my_fatal("pipex_open(): %s: %s",szProcFile,win32_error());
         }
         _chdir(szCurrentDir);
     }
@@ -190,17 +193,47 @@ void pipex_send_eof(pipex_t *pipex)  {
 
 // pipex_exit()
 
-void pipex_exit(pipex_t *pipex) {
+/* This routine waits for kill_timeout milliseconds for 
+ * the process to exit by itself. If that doesn't
+ * happen it will kill the process.
+ */
+
+void pipex_exit(pipex_t *pipex, int kill_timeout) {
     DWORD lpexit;
+    int elapsed_time;
+    bool exited;
     CloseHandle(pipex->hInput);
     CloseHandle(pipex->hOutput);
-    
-    if(GetExitCodeProcess(pipex->hProcess,&lpexit)){
-        if(lpexit==STILL_ACTIVE)
-                //must be java,hammer it down!
-            TerminateProcess(pipex->hProcess,lpexit);
+    // ExitProcess(pipex->hProcess,0);
+
+    my_log("POLYGLOT Waiting for child process to exit.\n");
+    elapsed_time=0;
+    exited=FALSE;
+
+    while(elapsed_time<kill_timeout){
+       GetExitCodeProcess(pipex->hProcess,&lpexit);
+       if(lpexit==STILL_ACTIVE){
+           my_log("POLYGLOT Child has not exited yet. Sleeping %dms.\n", WAIT_GRANULARITY);
+           my_sleep(WAIT_GRANULARITY);
+           elapsed_time+=WAIT_GRANULARITY;
+       }else{
+           exited=TRUE;
+           break;
+       }
+    }
+    if(!exited){
+      my_log("POLYGLOT Child wouldn't exit by itself. Terminating it.\n");
+      TerminateProcess(pipex->hProcess,lpexit);
     }
-       CloseHandle(pipex->hProcess);
+    CloseHandle(pipex->hProcess);    
+
+    if(!pipex->quit_pending){
+      // suppress further errors
+      pipex->quit_pending=TRUE;
+      my_fatal("pipex_exit(): %s: child exited unexpectedly.\n",pipex->command);
+    }
+
 }
 
 // pipex_eof_input()