diff options
author | Jim Blandy <[email protected]> | 1992-12-12 15:36:50 +0000 |
---|---|---|
committer | Jim Blandy <[email protected]> | 1992-12-12 15:36:50 +0000 |
commit | 1e30af705a70316d1e8bb12b1f5364abf97296cb (patch) | |
tree | a9e40384c2547e7d8e094dea012b953833d25f29 | |
parent | e86f81cc46f817117847e8086d05092e08079d4c (diff) |
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.
-rw-r--r-- | src/process.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/process.c b/src/process.c index f343c594f0..1e1e2e339c 100644 --- a/src/process.c +++ b/src/process.c @@ -955,7 +955,7 @@ Remaining arguments are strings to give program as arguments.") 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 @@ Remaining arguments are strings to give program as arguments.") 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 @@ Remaining arguments are strings to give program as arguments.") 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 @@ create_process_sigchld () #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 @@ create_process (process, new_argv) SIGTYPE (*sigchld)(); #endif int pty_flag = 0; - Lisp_Object current_dir; extern char **environ; inchannel = outchannel = -1; @@ -1108,14 +1134,6 @@ create_process (process, new_argv) 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 |