]> code.delx.au - gnu-emacs/blobdiff - src/w32.c
Merge from origin/emacs-24
[gnu-emacs] / src / w32.c
index acd06ba260128b11634e683828992c547eb9e976..90096689776395cb6a879e3355c35b3ab60ab94d 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -3434,17 +3434,30 @@ sys_readdir (DIR *dirp)
 
       if (dir_find_handle == INVALID_HANDLE_VALUE)
        {
+         /* Any changes in the value of errno here should be in sync
+            with what directory_files_internal does when it calls
+            readdir.  */
          switch (GetLastError ())
            {
-           case ERROR_PATH_NOT_FOUND:
+             /* Windows uses this value when FindFirstFile finds no
+                files that match the wildcard.  This is not supposed
+                to happen, since our wildcard is "*", but just in
+                case, if there's some weird empty directory with not
+                even "." and ".." entries...  */
+           case ERROR_FILE_NOT_FOUND:
+             errno = 0;
+             /* FALLTHRU */
+           default:
+             break;
            case ERROR_ACCESS_DENIED:
+           case ERROR_NETWORK_ACCESS_DENIED:
+             errno = EACCES;
+             break;
+           case ERROR_PATH_NOT_FOUND:
            case ERROR_INVALID_DRIVE:
            case ERROR_BAD_NETPATH:
-             /* This special value will be noticed by
-                directory_files_internal, which see.  */
-             errno = ENOTDIR;
-             break;
-           default:
+           case ERROR_BAD_NET_NAME:
+             errno = ENOENT;
              break;
            }
          return NULL;
@@ -3453,12 +3466,18 @@ sys_readdir (DIR *dirp)
   else if (w32_unicode_filenames)
     {
       if (!FindNextFileW (dir_find_handle, &dir_find_data_w))
-       return NULL;
+       {
+         errno = 0;
+         return NULL;
+       }
     }
   else
     {
       if (!FindNextFileA (dir_find_handle, &dir_find_data_a))
-       return NULL;
+       {
+         errno = 0;
+         return NULL;
+       }
     }
 
   /* Emacs never uses this value, so don't bother making it match
@@ -3560,7 +3579,11 @@ open_unc_volume (const char *path)
   if (result == NO_ERROR)
     return henum;
   else
-    return INVALID_HANDLE_VALUE;
+    {
+      /* Make sure directory_files_internal reports a sensible error.  */
+      errno = ENOENT;
+      return INVALID_HANDLE_VALUE;
+    }
 }
 
 static void *