From 9664defd262252faf037c5fe1ea095f1cc4b308b Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 27 Jan 2015 21:02:13 +0200 Subject: [PATCH] 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. --- src/ChangeLog | 9 +++++++++ src/dired.c | 13 +++++++++++++ src/w32.c | 17 ++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) 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 + + * 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 * 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) { -- 2.39.2