aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier <[email protected]>2008-02-06 03:16:10 +0000
committerStefan Monnier <[email protected]>2008-02-06 03:16:10 +0000
commitca3199106fe185dd5d42e5086a7e5c4f7ea10659 (patch)
treeefb194ceb0a413d37973cfdebd24ab574c1d0d3c
parentf9ffa1eabb499f073b72015041ac2ed1d10f34e7 (diff)
* process.c (Fstart_process):
* callproc.c (Fcall_process): Handle the case where Funhandled_file_name_directory returns nil.
-rw-r--r--doc/lispref/files.texi10
-rw-r--r--src/ChangeLog4
-rw-r--r--src/callproc.c9
-rw-r--r--src/fileio.c2
-rw-r--r--src/process.c9
5 files changed, 24 insertions, 10 deletions
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index a77f5387a2..640d4acdd1 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -2800,10 +2800,12 @@ making connections when they don't exist.
@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 --git a/src/ChangeLog b/src/ChangeLog
index 88ed0a7f4c..b06d4d4552 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,9 @@
2008-02-06 Stefan Monnier <[email protected]>
+ * 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 --git a/src/callproc.c b/src/callproc.c
index a3b7b7afa4..fdd1ee7988 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -376,9 +376,12 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */)
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 --git a/src/fileio.c b/src/fileio.c
index 2602073216..76d076f75b 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -532,6 +532,8 @@ A `directly usable' directory name is one that may be used without the
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 --git a/src/process.c b/src/process.c
index e5546488aa..73da0db18a 100644
--- a/src/process.c
+++ b/src/process.c
@@ -1614,9 +1614,12 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */)
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));