# HG changeset patch # User Stefan Monnier # Date 1202267770 0 # Node ID f14242124fd7b1a987bfb4c613122487aa5123fc # Parent 83267bc0360a680a01dcb4cc6a708e16b2ed22ef * process.c (Fstart_process): * callproc.c (Fcall_process): Handle the case where Funhandled_file_name_directory returns nil. diff -r 83267bc0360a -r f14242124fd7 doc/lispref/files.texi --- a/doc/lispref/files.texi Wed Feb 06 03:14:46 2008 +0000 +++ b/doc/lispref/files.texi Wed Feb 06 03:16:10 2008 +0000 @@ -2800,10 +2800,12 @@ @end defun @defun unhandled-file-name-directory filename -This function returns the name of a directory that is not magic. It -uses the directory part of @var{filename} if that is not magic. For a -magic file name, it invokes the file name handler, which therefore -decides what value to return. +This function returns the name of a directory that is not magic. +It uses the directory part of @var{filename} if that is not magic. +For a magic file name, it invokes the file name handler, which +therefore decides what value to return. If @var{filename} is not +accessible from a local process, then the file name handler should +indicate it by returning nil. This is useful for running a subprocess; every subprocess must have a non-magic directory to serve as its current directory, and this function diff -r 83267bc0360a -r f14242124fd7 src/ChangeLog --- a/src/ChangeLog Wed Feb 06 03:14:46 2008 +0000 +++ b/src/ChangeLog Wed Feb 06 03:16:10 2008 +0000 @@ -1,5 +1,9 @@ 2008-02-06 Stefan Monnier + * process.c (Fstart_process): + * callproc.c (Fcall_process): Handle the case where + Funhandled_file_name_directory returns nil. + * font.h (enum lgstring_indices, enum lglyph_indices): New enums. (LGSTRING_SLOT, LGSTRING_SET_SLOT): New macros. * font.c (check_gstring): Use them and AREF to access the vector before diff -r 83267bc0360a -r f14242124fd7 src/callproc.c --- a/src/callproc.c Wed Feb 06 03:14:46 2008 +0000 +++ b/src/callproc.c Wed Feb 06 03:16:10 2008 +0000 @@ -376,9 +376,12 @@ GCPRO4 (infile, buffer, current_dir, error_file); - current_dir - = expand_and_dir_to_file (Funhandled_file_name_directory (current_dir), - Qnil); + current_dir = Funhandled_file_name_directory (current_dir); + if (NILP (current_dir)) + /* If the file name handler says that current_dir is unreachable, use + a sensible default. */ + current_dir = build_string ("~/"); + current_dir = expand_and_dir_to_file (current_dir, Qnil); if (NILP (Ffile_accessible_directory_p (current_dir))) report_file_error ("Setting current directory", Fcons (current_buffer->directory, Qnil)); diff -r 83267bc0360a -r f14242124fd7 src/fileio.c --- a/src/fileio.c Wed Feb 06 03:14:46 2008 +0000 +++ b/src/fileio.c Wed Feb 06 03:16:10 2008 +0000 @@ -532,6 +532,8 @@ intervention of any file handler. If FILENAME is a directly usable file itself, return \(file-name-directory FILENAME). +If FILENAME refers to a file which is not accessible from a local process, +then this should return nil. The `call-process' and `start-process' functions use this function to get a current directory to run processes in. */) (filename) diff -r 83267bc0360a -r f14242124fd7 src/process.c --- a/src/process.c Wed Feb 06 03:14:46 2008 +0000 +++ b/src/process.c Wed Feb 06 03:16:10 2008 +0000 @@ -1614,9 +1614,12 @@ GCPRO2 (buffer, current_dir); - current_dir - = expand_and_dir_to_file (Funhandled_file_name_directory (current_dir), - Qnil); + current_dir = Funhandled_file_name_directory (current_dir); + if (NILP (current_dir)) + /* If the file name handler says that current_dir is unreachable, use + a sensible default. */ + current_dir = build_string ("~/"); + current_dir = expand_and_dir_to_file (current_dir, Qnil); if (NILP (Ffile_accessible_directory_p (current_dir))) report_file_error ("Setting current directory", Fcons (current_buffer->directory, Qnil));