changeset 1683:a0a41de51400

Give subprocess creation a way to find a valid current directory for subprocesses when the buffer's default-directory is a handled name. * fileio.c (Funhandled_file_name_directory): New function. (Qunhandled_file_name_directory): New file-name-handler operation. (syms_of_fileio): Defsubr Sunhandled_file_name_directory, and initialize and staticpro Qunhandled_file_name_directory. * callproc.c (Fcall_process): Call Funhandled_file_name_directory on the buffer's default directory. Do it earlier in the function so there's less to GCPRO. * process.c (create_process): Don't check the validity of the buffer's default directory here... (Fstart_process): Instead, do it here; if we call Funhandled_file_name_directory here, there's less GCPROing to do.
author Jim Blandy <jimb@redhat.com>
date Sat, 12 Dec 1992 15:36:50 +0000
parents af0995b9b142
children f4d848dea8ff
files src/process.c
diffstat 1 files changed, 30 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/process.c	Sat Dec 12 15:35:41 1992 +0000
+++ b/src/process.c	Sat Dec 12 15:36:50 1992 +0000
@@ -955,7 +955,7 @@
      int nargs;
      register Lisp_Object *args;
 {
-  Lisp_Object buffer, name, program, proc, tem;
+  Lisp_Object buffer, name, program, proc, current_dir, tem;
 #ifdef VMS
   register unsigned char *new_argv;
   int len;
@@ -969,6 +969,32 @@
   if (!NILP (buffer))
     buffer = Fget_buffer_create (buffer);
 
+  /* Make sure that the child will be able to chdir to the current
+     buffer's current directory, or its unhandled equivalent.  We
+     can't just have the child check for an error when it does the
+     chdir, since it's in a vfork.
+
+     We have to GCPRO around this because Fexpand_file_name and
+     Funhandled_file_name_directory might call a file name handling
+     function.  The argument list is protected by the caller, so all
+     we really have to worry about is buffer.  */
+  {
+    struct gcpro gcpro1, gcpro2;
+
+    current_dir = current_buffer->directory;
+
+    GCPRO2 (buffer, current_dir);
+
+    current_dir = 
+      expand_and_dir_to_file
+	(Funhandled_file_name_directory (current_dir, Qnil));
+    if (NILP (Ffile_accessible_directory_p (current_dir)))
+      report_file_error ("Setting current directory",
+			 Fcons (current_buffer->directory, Qnil));
+
+    UNGCPRO;
+  }
+
   name = args[0];
   CHECK_STRING (name, 0);
 
@@ -1034,7 +1060,7 @@
   XPROCESS (proc)->filter = Qnil;
   XPROCESS (proc)->command = Flist (nargs - 2, args + 2);
 
-  create_process (proc, new_argv);
+  create_process (proc, new_argv, current_dir);
 
   return unbind_to (count, proc);
 }
@@ -1089,9 +1115,10 @@
 #endif
 
 #ifndef VMS /* VMS version of this function is in vmsproc.c.  */
-create_process (process, new_argv)
+create_process (process, new_argv, current_dir)
      Lisp_Object process;
      char **new_argv;
+     Lisp_Object current_dir;
 {
   int pid, inchannel, outchannel, forkin, forkout;
   int sv[2];
@@ -1099,7 +1126,6 @@
   SIGTYPE (*sigchld)();
 #endif
   int pty_flag = 0;
-  Lisp_Object current_dir;
   extern char **environ;
 
   inchannel = outchannel = -1;
@@ -1108,14 +1134,6 @@
   if (EQ (Vprocess_connection_type, Qt))
     outchannel = inchannel = allocate_pty ();
 
-  /* Make sure that the child will be able to chdir to the current
-     buffer's current directory.  We can't just have the child check
-     for an error when it does the chdir, since it's in a vfork.  */
-  current_dir = expand_and_dir_to_file (current_buffer->directory, Qnil);
-  if (NILP (Ffile_accessible_directory_p (current_dir)))
-    report_file_error ("Setting current directory",
-		       Fcons (current_buffer->directory, Qnil));
-
   if (inchannel >= 0)
     {
 #ifndef USG