]> code.delx.au - gnu-emacs/blobdiff - src/callproc.c
Groff \# comments.
[gnu-emacs] / src / callproc.c
index e251fc65941968419d7b2bc40260a5b1678f52c4..90e5b11a9a2efafd0e536495a5c5dc63d1afd9e9 100644 (file)
@@ -1,6 +1,6 @@
 /* Synchronous subprocess invocation for GNU Emacs.
-   Copyright (C) 1985,86,87,88,93,94,95,99, 2000,01,02,03,04
-   Free Software Foundation, Inc.
+   Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995, 1999, 2000, 2001,
+                 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -16,8 +16,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 
 #include <config.h>
@@ -130,10 +130,6 @@ int synch_process_termsig;
 /* If synch_process_death is zero,
    this is exit code of synchronous subprocess.  */
 int synch_process_retcode;
-
-extern Lisp_Object Vdoc_file_name;
-
-extern Lisp_Object Vfile_name_coding_system, Vdefault_file_name_coding_system;
 \f
 /* Clean up when exiting Fcall_process.
    On MSDOS, delete the temporary file on any kind of termination.
@@ -207,6 +203,10 @@ t (mix it with ordinary output), or a file name string.
 Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.
 Remaining arguments are strings passed as command arguments to PROGRAM.
 
+If executable PROGRAM can't be found as an executable, `call-process'
+signals a Lisp error.  `call-process' reports errors in execution of
+the program only through its return and output.
+
 If BUFFER is 0, `call-process' returns immediately with value nil.
 Otherwise it waits for PROGRAM to terminate
 and returns a numeric exit status or a signal description string.
@@ -222,9 +222,10 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
   int fd[2];
   int filefd;
   register int pid;
-  char buf[16384];
-  char *bufptr = buf;
-  int bufsize = sizeof buf;
+#define CALLPROC_BUFFER_SIZE_MIN (16 * 1024)
+#define CALLPROC_BUFFER_SIZE_MAX (4 * CALLPROC_BUFFER_SIZE_MIN)
+  char buf[CALLPROC_BUFFER_SIZE_MAX];
+  int bufsize = CALLPROC_BUFFER_SIZE_MIN;
   int count = SPECPDL_INDEX ();
 
   register const unsigned char **new_argv
@@ -298,6 +299,10 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
              val = Qnil;
          }
        setup_coding_system (Fcheck_coding_system (val), &argument_coding);
+       if (argument_coding.common_flags & CODING_ASCII_INCOMPATIBLE_MASK)
+         setup_coding_system (Qraw_text, &argument_coding);
+       if (argument_coding.eol_type == CODING_EOL_UNDECIDED)
+         argument_coding.eol_type = system_eol_type;
       }
   }
 
@@ -358,11 +363,11 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
      protected by the caller, so all we really have to worry about is
      buffer.  */
   {
-    struct gcpro gcpro1, gcpro2, gcpro3;
+    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
 
     current_dir = current_buffer->directory;
 
-    GCPRO3 (infile, buffer, current_dir);
+    GCPRO4 (infile, buffer, current_dir, error_file);
 
     current_dir
       = expand_and_dir_to_file (Funhandled_file_name_directory (current_dir),
@@ -371,6 +376,12 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
       report_file_error ("Setting current directory",
                         Fcons (current_buffer->directory, Qnil));
 
+    if (STRING_MULTIBYTE (infile))
+      infile = ENCODE_FILE (infile);
+    if (STRING_MULTIBYTE (current_dir))
+      current_dir = ENCODE_FILE (current_dir);
+    if (STRINGP (error_file) && STRING_MULTIBYTE (error_file))
+      error_file = ENCODE_FILE (error_file);
     UNGCPRO;
   }
 
@@ -379,6 +390,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
   filefd = emacs_open (SDATA (infile), O_RDONLY, 0);
   if (filefd < 0)
     {
+      infile = DECODE_FILE (infile);
       report_file_error ("Opening process input file", Fcons (infile, Qnil));
     }
   /* Search for program; barf if not found.  */
@@ -536,14 +548,13 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
 #ifdef MSDOS
        unlink (tempfile);
 #endif
-       report_file_error ("Cannot redirect stderr",
-                          Fcons ((NILP (error_file)
-                                  ? build_string (NULL_DEVICE) : error_file),
-                                 Qnil));
+       if (NILP (error_file))
+         error_file = build_string (NULL_DEVICE);
+       else if (STRINGP (error_file))
+         error_file = DECODE_FILE (error_file);
+       report_file_error ("Cannot redirect stderr", Fcons (error_file, Qnil));
       }
 
-    current_dir = ENCODE_FILE (current_dir);
-
 #ifdef MAC_OS8
     {
       /* Call run_mac_command in sysdep.c here directly instead of doing
@@ -769,7 +780,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
        nread = carryover;
        while (nread < bufsize - 1024)
          {
-           int this_read = emacs_read (fd[0], bufptr + nread,
+           int this_read = emacs_read (fd[0], buf + nread,
                                        bufsize - nread);
 
            if (this_read < 0)
@@ -794,7 +805,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
        if (!NILP (buffer))
          {
            if (! CODING_MAY_REQUIRE_DECODING (&process_coding))
-             insert_1_both (bufptr, nread, nread, 0, 1, 0);
+             insert_1_both (buf, nread, nread, 0, 1, 0);
            else
              {                 /* We have to decode the input.  */
                int size;
@@ -811,7 +822,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
                   requires text-encoding detection.  */
                if (process_coding.type == coding_type_undecided)
                  {
-                   detect_coding (&process_coding, bufptr, nread);
+                   detect_coding (&process_coding, buf, nread);
                    if (process_coding.composing != COMPOSITION_DISABLED)
                      /* We have not yet allocated the composition
                         data because the coding type was undecided.  */
@@ -820,7 +831,7 @@ 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,
+               decode_coding (&process_coding, buf, decoding_buf,
                               nread, size);
 
                if (display_on_the_fly
@@ -909,7 +920,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
                if (carryover > 0)
                  /* As CARRYOVER should not be that large, we had
                     better avoid overhead of bcopy.  */
-                 BCOPY_SHORT (bufptr + process_coding.consumed, bufptr,
+                 BCOPY_SHORT (buf + process_coding.consumed, buf,
                               carryover);
                if (process_coding.result == CODING_FINISH_INSUFFICIENT_CMP)
                  {
@@ -926,17 +937,13 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
        if (process_coding.mode & CODING_MODE_LAST_BLOCK)
          break;
 
+#if (CALLPROC_BUFFER_SIZE_MIN != CALLPROC_BUFFER_SIZE_MAX)
        /* Make the buffer bigger as we continue to read more data,
-          but not past 64k.  */
-       if (bufsize < 64 * 1024 && total_read > 32 * bufsize)
-         {
-           char *tempptr;
-           bufsize *= 2;
-
-           tempptr = (char *) alloca (bufsize);
-           bcopy (bufptr, tempptr, bufsize / 2);
-           bufptr = tempptr;
-         }
+          but not past CALLPROC_BUFFER_SIZE_MAX.  */
+       if (bufsize < CALLPROC_BUFFER_SIZE_MAX && total_read > 32 * bufsize)
+         if ((bufsize *= 2) > CALLPROC_BUFFER_SIZE_MAX)
+           bufsize = CALLPROC_BUFFER_SIZE_MAX;
+#endif
 
        if (display_p)
          {
@@ -1020,9 +1027,11 @@ static Lisp_Object
 delete_temp_file (name)
      Lisp_Object name;
 {
-  /* Use Fdelete_file (indirectly) because that runs a file name handler.
-     We did that when writing the file, so we should do so when deleting.  */
+  /* Suppress jka-compr handling, etc.  */
+  int count = SPECPDL_INDEX ();
+  specbind (intern ("file-name-handler-alist"), Qnil);
   internal_delete_file (name);
+  unbind_to (count, Qnil);
   return Qnil;
 }
 
@@ -1095,7 +1104,11 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r
 
 #ifdef HAVE_MKSTEMP
  {
-   int fd = mkstemp (tempfile);
+   int fd;
+
+   BLOCK_INPUT;
+   fd = mkstemp (tempfile);
+   UNBLOCK_INPUT;
    if (fd == -1)
      report_file_error ("Failed to open temporary file",
                        Fcons (Vtemp_file_name_pattern, Qnil));
@@ -1133,6 +1146,9 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r
     int count1 = SPECPDL_INDEX ();
 
     specbind (intern ("coding-system-for-write"), val);
+    /* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we
+       happen to get a ".Z" suffix.  */
+    specbind (intern ("file-name-handler-alist"), Qnil);
     Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil);
 
     unbind_to (count1, Qnil);
@@ -1466,7 +1482,7 @@ getenv_internal (var, varlen, value, valuelen)
 DEFUN ("getenv-internal", Fgetenv_internal, Sgetenv_internal, 1, 1, 0,
        doc: /* Return the value of environment variable VAR, as a string.
 VAR should be a string.  Value is nil if VAR is undefined in the environment.
-This function consults the variable ``process-environment'' for its value.  */)
+This function consults the variable `process-environment' for its value.  */)
      (var)
      Lisp_Object var;
 {
@@ -1653,7 +1669,8 @@ syms_of_callproc ()
 
   DEFVAR_LISP ("shell-file-name", &Vshell_file_name,
               doc: /* *File name to load inferior shells from.
-Initialized from the SHELL environment variable.  */);
+Initialized from the SHELL environment variable, or to a system-dependent
+default if SHELL is not set.  */);
 
   DEFVAR_LISP ("exec-path", &Vexec_path,
               doc: /* *List of directories to search programs to run in subprocesses.
@@ -1675,12 +1692,12 @@ These are files intended for Emacs to use while it runs.  */);
 
   DEFVAR_LISP ("doc-directory", &Vdoc_directory,
               doc: /* Directory containing the DOC file that comes with GNU Emacs.
-This is usually the same as data-directory.  */);
+This is usually the same as `data-directory'.  */);
 
   DEFVAR_LISP ("configure-info-directory", &Vconfigure_info_directory,
               doc: /* For internal use by the build procedure only.
 This is the name of the directory in which the build procedure installed
-Emacs's info files; the default value for Info-default-directory-list
+Emacs's info files; the default value for `Info-default-directory-list'
 includes this.  */);
   Vconfigure_info_directory = build_string (PATH_INFO);