diff options
author | Eli Zaretskii <eliz@gnu.org> | 2015-01-27 21:02:13 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2015-01-27 21:02:13 +0200 |
commit | 9664defd262252faf037c5fe1ea095f1cc4b308b (patch) | |
tree | 141dc6740e1de7e715ae5037fe4297a55c921dac /src | |
parent | fd4e65e4ae76eb59a990fc72bce791a50e494338 (diff) | |
download | emacs-9664defd262252faf037c5fe1ea095f1cc4b308b.tar.gz |
Signal a file-error from directory-files on MS-Windows (Bug#19701)
src/dired.c (directory_files_internal) [WINDOWSNT]: If readdir
returns NULL and errno is ENOTDIR, behave as if opendir failed to
open the directory.
src/w32.c (sys_readdir): If FindFirstFile fails because the
directory doesn't exist, set errno to ENOTDIR.
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 9 | ||||
-rw-r--r-- | src/dired.c | 13 | ||||
-rw-r--r-- | src/w32.c | 17 |
3 files changed, 38 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 9cf5eb591bb..a33e834e0ec 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2015-01-27 Eli Zaretskii <eliz@gnu.org> + + * dired.c (directory_files_internal) [WINDOWSNT]: If readdir + returns NULL and errno is ENOTDIR, behave as if opendir failed to + open the directory. (Bug#19701) + + * w32.c (sys_readdir): If FindFirstFile fails because the + directory doesn't exist, set errno to ENOTDIR. + 2015-01-24 Jan Djärv <jan.h.d@swipnet.se> * nsterm.m (drawRect:): Add block/unblock_input (Bug#19660). diff --git a/src/dired.c b/src/dired.c index 5d7977bf024..f6c47a71400 100644 --- a/src/dired.c +++ b/src/dired.c @@ -247,6 +247,19 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, QUIT; continue; } +#ifdef WINDOWSNT + /* The MS-Windows implementation of 'opendir' doesn't + actually open a directory until the first call to + 'readdir'. If 'readdir' fails to open the directory, it + sets errno to ENOTDIR; we convert it here to ENOENT so + that the error message is similar to what happens on + Posix hosts in such cases. */ + if (errno == ENOTDIR) + { + errno = ENOENT; + report_file_error ("Opening directory", directory); + } +#endif break; } diff --git a/src/w32.c b/src/w32.c index 09902a2bb0d..aedf64942e0 100644 --- a/src/w32.c +++ b/src/w32.c @@ -3432,7 +3432,22 @@ sys_readdir (DIR *dirp) } if (dir_find_handle == INVALID_HANDLE_VALUE) - return NULL; + { + switch (GetLastError ()) + { + case ERROR_PATH_NOT_FOUND: + case ERROR_ACCESS_DENIED: + case ERROR_INVALID_DRIVE: + case ERROR_BAD_NETPATH: + /* This special value will be noticed by + directory_files_internal, which see. */ + errno = ENOTDIR; + break; + default: + break; + } + return NULL; + } } else if (w32_unicode_filenames) { |