XEmacs 21.2.28 "Hermes".
[chise/xemacs-chise.git.1] / src / callproc.c
index 4b5a5dc..54ec8d0 100644 (file)
@@ -43,7 +43,6 @@ Boston, MA 02111-1307, USA.  */
 
 #ifdef WINDOWSNT
 #define _P_NOWAIT 1    /* from process.h */
-#include <windows.h>
 #include "nt.h"
 #endif
 
@@ -102,7 +101,7 @@ call_process_kill (Lisp_Object fdpid)
 static Lisp_Object
 call_process_cleanup (Lisp_Object fdpid)
 {
-  int fd = XINT (Fcar (fdpid));
+  int fd  = XINT (Fcar (fdpid));
   int pid = XINT (Fcdr (fdpid));
 
   if (!call_process_exited &&
@@ -114,7 +113,18 @@ call_process_cleanup (Lisp_Object fdpid)
     /* #### "c-G" -- need non-consing Single-key-description */
     message ("Waiting for process to die...(type C-g again to kill it instantly)");
 
+#ifdef WINDOWSNT
+    {
+      HANDLE pHandle = OpenProcess (PROCESS_ALL_ACCESS, 0, pid);
+      if (pHandle == NULL)
+       warn_when_safe (Qprocess, Qwarning,
+                       "cannot open process (PID %d) for cleanup", pid);
+      else
+       wait_for_termination (pHandle);
+    }
+#else
     wait_for_termination (pid);
+#endif
 
     /* "Discard" the unwind protect.  */
     XCAR (fdpid) = Qnil;
@@ -170,6 +180,9 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
   Lisp_Object infile, buffer, current_dir, display, path;
   int fd[2];
   int filefd;
+#ifdef WINDOWSNT
+  HANDLE pHandle;
+#endif
   int pid;
   char buf[16384];
   char *bufptr = buf;
@@ -287,8 +300,8 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
        CHECK_STRING (args[i]);
        new_argv[i - 3] = (char *) XSTRING_DATA (args[i]);
       }
-    new_argv[nargs - 3] = 0;
   }
+  new_argv[max(nargs - 3,1)] = 0;
 
   if (NILP (path))
     report_file_error ("Searching for program", Fcons (args[0], Qnil));
@@ -359,6 +372,23 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
 #ifdef WINDOWSNT
     pid = child_setup (filefd, fd1, fd_error, new_argv,
                        (char *) XSTRING_DATA (current_dir));
+    if (!INTP (buffer))
+      {
+       /* OpenProcess() as soon after child_setup as possible.  It's too
+          late once the process terminated. */
+       pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
+#if 0
+       if (pHandle == NULL)
+         {
+           /* #### seems to cause crash in unbind_to(...) below. APA */
+           warn_when_safe (Qprocess, Qwarning,
+                           "cannot open process to wait for");
+         }
+#endif
+      }
+    /* Close STDERR into the parent process.  We no longer need it. */
+    if (fd_error >= 0)
+      close (fd_error);
 #else  /* not WINDOWSNT */
     pid = fork ();
 
@@ -394,12 +424,14 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
   if (!NILP (fork_error))
     signal_error (Qfile_error, fork_error);
 
+#ifndef WINDOWSNT
   if (pid < 0)
     {
       if (fd[0] >= 0)
        close (fd[0]);
       report_file_error ("Doing fork", Qnil);
     }
+#endif
 
   if (INTP (buffer))
     {
@@ -450,7 +482,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
        nread = 0;
        while (nread < bufsize - 1024)
          {
-           int this_read
+           ssize_t this_read
              = Lstream_read (XLSTREAM (instream), bufptr + nread,
                              bufsize - nread);
 
@@ -469,10 +501,12 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
        if (nread == 0)
          break;
 
+#if 0
 #ifdef DOS_NT
        /* Until we pull out of MULE things like
          make_decoding_input_stream(), we do the following which is
          less elegant. --marcpa */
+       /* We did. -- kkm */
        {
         int lf_count = 0;
         if (NILP (Vbinary_process_output)) {
@@ -480,6 +514,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
          }
        }
 #endif
+#endif
 
        total_read += nread;
 
@@ -507,7 +542,11 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
 
     QUIT;
     /* Wait for it to terminate, unless it already has.  */
+#ifdef WINDOWSNT
+    wait_for_termination (pHandle);
+#else
     wait_for_termination (pid);
+#endif
 
     /* Don't kill any children that the subprocess may have left behind
        when exiting.  */
@@ -645,9 +684,10 @@ child_setup (int in, int out, int err, char **new_argv,
     {
       char **ep = env;
       char *envvar_external;
-      Bufbyte *envvar_internal = XSTRING_DATA (XCAR (tail));
 
-      GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (envvar_internal, envvar_external);
+      TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (tail),
+                         C_STRING_ALLOCA, envvar_external,
+                         Qfile_name);
 
       /* See if envvar_external duplicates any string already in the env.
         If so, don't put it in.
@@ -829,10 +869,8 @@ init_callproc (void)
     char **envp;
     Vprocess_environment = Qnil;
     for (envp = environ; envp && *envp; envp++)
-      {
-       Vprocess_environment = Fcons (build_ext_string (*envp, FORMAT_OS),
-                                     Vprocess_environment);
-      }
+      Vprocess_environment =
+       Fcons (build_ext_string (*envp, Qfile_name), Vprocess_environment);
   }
 
   {