*** empty log message ***
[bpt/emacs.git] / src / callproc.c
index d1e62de..73d81d8 100644 (file)
@@ -42,7 +42,7 @@ extern int errno;
 #endif
 
 #include <sys/file.h>
-#ifdef USG5
+#ifdef HAVE_FCNTL_H
 #define INCLUDED_FCNTL
 #include <fcntl.h>
 #endif
@@ -123,6 +123,9 @@ int synch_process_alive;
 /* Nonzero => this is a string explaining death of synchronous subprocess.  */
 char *synch_process_death;
 
+/* Nonzero => this is the signal number that terminated the subprocess.  */
+int synch_process_termsig;
+
 /* If synch_process_death is zero,
    this is exit code of synchronous subprocess.  */
 int synch_process_retcode;
@@ -253,7 +256,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
 
 #ifndef subprocesses
   /* Without asynchronous processes we cannot have BUFFER == 0.  */
-  if (nargs >= 3 
+  if (nargs >= 3
       && (INTEGERP (CONSP (args[2]) ? XCAR (args[2]) : args[2])))
     error ("Operating system cannot handle asynchronous subprocesses");
 #endif /* subprocesses */
@@ -339,7 +342,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
          CHECK_BUFFER (buffer);
        }
     }
-  else 
+  else
     buffer = Qnil;
 
   /* Make sure that the child will be able to chdir to the current
@@ -431,7 +434,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
       *tempfile = '\0';
     }
   dostounix_filename (tempfile);
-  if (*tempfile == '\0' || tempfile[strlen (tempfile) - 1] != '/') 
+  if (*tempfile == '\0' || tempfile[strlen (tempfile) - 1] != '/')
     strcat (tempfile, "/");
   strcat (tempfile, "detmp.XXX");
   mktemp (tempfile);
@@ -506,6 +509,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
        to avoid timing error if process terminates soon.  */
     synch_process_death = 0;
     synch_process_retcode = 0;
+    synch_process_termsig = 0;
 
     if (NILP (error_file))
       fd_error = emacs_open (NULL_DEVICE, O_WRONLY, 0);
@@ -545,7 +549,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
          code does not handle passing the environment to the synchronous
          Mac subprocess.  */
       char *infn, *outfn, *errfn, *currdn;
-      
+
       /* close these files so subprocess can write to them */
       close (outfilefd);
       if (fd_error != outfilefd)
@@ -780,7 +784,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
 
        /* Now NREAD is the total amount of data in the buffer.  */
        immediate_quit = 0;
-       
+
        if (!NILP (buffer))
          {
            if (! CODING_MAY_REQUIRE_DECODING (&process_coding))
@@ -793,7 +797,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
              repeat_decoding:
                size = decoding_buffer_size (&process_coding, nread);
                decoding_buf = (char *) xmalloc (size);
-               
+
                /* We can't use the macro CODING_REQUIRE_DETECTION
                   because it always returns nonzero if the coding
                   system requires EOL detection.  Here, we have to
@@ -807,10 +811,10 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
                  }
                if (process_coding.cmp_data)
                  process_coding.cmp_data->char_offset = PT;
-               
+
                decode_coding (&process_coding, bufptr, decoding_buf,
                               nread, size);
-               
+
                if (display_on_the_fly
                    && saved_coding.type == coding_type_undecided
                    && process_coding.type != coding_type_undecided)
@@ -825,7 +829,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
                    carryover = nread;
                    continue;
                  }
-               
+
                if (process_coding.produced > 0)
                  insert_1_both (decoding_buf, process_coding.produced_char,
                                 process_coding.produced, 0, 1, 0);
@@ -840,9 +844,9 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
                        /* CRs have been replaced with LFs.  Undo
                           that in the text inserted above.  */
                        unsigned char *p;
-                       
+
                        move_gap_both (PT, PT_BYTE);
-                       
+
                        p = BYTE_POS_ADDR (pt_byte_orig);
                        for (; p < GPT_ADDR; ++p)
                          if (*p == '\n')
@@ -858,7 +862,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
                        old_pt = PT;
                        old_pt_byte = PT_BYTE;
                        nCR = 0;
-                       
+
                        for (bytepos = PT_BYTE - 1;
                             bytepos >= pt_byte_orig;
                             --bytepos)
@@ -882,13 +886,13 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
                      coding = AREF (eol_type, CODING_EOL_LF);
                    else
                      coding = saved_coding.symbol;
-                   
+
                    process_coding.symbol = coding;
                    process_coding.eol_type = CODING_EOL_LF;
                    process_coding.mode
                      &= ~CODING_MODE_INHIBIT_INCONSISTENT_EOL;
                  }
-               
+
                nread -= process_coding.consumed;
                carryover = nread;
                if (carryover > 0)
@@ -977,6 +981,19 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
 
   unbind_to (count, Qnil);
 
+  if (synch_process_termsig)
+    {
+      char *signame;
+
+      synchronize_system_messages_locale ();
+      signame = strsignal (synch_process_termsig);
+
+      if (signame == 0)
+        signame = "unknown";
+
+      synch_process_death = signame;
+    }
+
   if (synch_process_death)
     return code_convert_string_norecord (build_string (synch_process_death),
                                         Vlocale_coding_system, 0);
@@ -1011,7 +1028,7 @@ t (mix it with ordinary output), or a file name string.
 Sixth arg DISPLAY non-nil means redisplay buffer as output is inserted.
 Remaining args are passed to PROGRAM at startup as command args.
 
-If BUFFER is nil, `call-process-region' returns immediately with value nil.
+If BUFFER is 0, `call-process-region' returns immediately with value nil.
 Otherwise it waits for PROGRAM to terminate
 and returns a numeric exit status or a signal description string.
 If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.
@@ -1106,7 +1123,7 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r
     unbind_to (count1, Qnil);
   }
 
-  /* Note that Fcall_process takes care of binding 
+  /* Note that Fcall_process takes care of binding
      coding-system-for-read.  */
 
   record_unwind_protect (delete_temp_file, filename_string);
@@ -1144,7 +1161,7 @@ static int relocate_fd ();
    of environ around the vfork and the call to this function.
 
    SET_PGRP is nonzero if we should put the subprocess into a separate
-   process group.  
+   process group.
 
    CURRENT_DIR is an elisp string giving the path of the current
    directory the subprocess should have.  Since we can't really signal
@@ -1467,7 +1484,7 @@ egetenv (var)
 #endif /* not VMS */
 \f
 /* This is run before init_cmdargs.  */
-  
+
 void
 init_callproc_1 ()
 {
@@ -1475,7 +1492,7 @@ init_callproc_1 ()
   char *doc_dir = egetenv ("EMACSDOC");
 
   Vdata_directory
-    = Ffile_name_as_directory (build_string (data_dir ? data_dir 
+    = Ffile_name_as_directory (build_string (data_dir ? data_dir
                                             : PATH_DATA));
   Vdoc_directory
     = Ffile_name_as_directory (build_string (doc_dir ? doc_dir
@@ -1494,7 +1511,7 @@ void
 init_callproc ()
 {
   char *data_dir = egetenv ("EMACSDATA");
-    
+
   register char * sh;
   Lisp_Object tempdir;
 
@@ -1512,7 +1529,7 @@ init_callproc ()
          Vexec_path = Fcons (tem, Vexec_path);
          Vexec_path = nconc2 (decode_env_path ("PATH", ""), Vexec_path);
        }
-      
+
       Vexec_directory = Ffile_name_as_directory (tem);
 #endif /* not DOS_NT */
 
@@ -1672,7 +1689,10 @@ Each element should be a string of the form ENVVARNAME=VALUE.
 If multiple entries define the same variable, the first one always
 takes precedence.
 The environment which Emacs inherits is placed in this variable
-when Emacs starts.  */);
+when Emacs starts.
+Non-ASCII characters are encoded according to the initial value of
+`locale-coding-system', i.e. the elements must normally be decoded for use.
+See `setenv' and `getenv'.  */);
 
 #ifndef VMS
   defsubr (&Scall_process);
@@ -1680,3 +1700,6 @@ when Emacs starts.  */);
 #endif
   defsubr (&Scall_process_region);
 }
+
+/* arch-tag: 769b8045-1df7-4d2b-8968-e3fb49017f95
+   (do not change this comment) */