summaryrefslogtreecommitdiff
path: root/winsup/cygwin/fhandler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler.cc')
-rw-r--r--winsup/cygwin/fhandler.cc11
1 files changed, 10 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index bb54fe99acb..6f551823fa7 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -538,6 +538,10 @@ fhandler_base::open_9x (int flags, mode_t mode)
}
else if (GetLastError () == ERROR_INVALID_HANDLE)
set_errno (ENOENT);
+ else if (GetLastError () == ERROR_PATH_NOT_FOUND
+ && (flags & O_CREAT)
+ && get_win32_name ()[strlen (get_win32_name ()) - 1] == '\\')
+ set_errno (EISDIR);
else
__seterrno ();
if (!nohandle ())
@@ -688,7 +692,12 @@ fhandler_base::open (int flags, mode_t mode)
create_disposition, create_options, NULL, 0);
if (!NT_SUCCESS (status))
{
- __seterrno_from_nt_status (status);
+ /* Trying to create a directory should return EISDIR, not ENOENT. */
+ if (status == STATUS_OBJECT_NAME_INVALID && (flags & O_CREAT)
+ && upath.Buffer[upath.Length / sizeof (WCHAR) - 1] == '\\')
+ set_errno (EISDIR);
+ else
+ __seterrno_from_nt_status (status);
if (!nohandle ())
goto done;
}