From: Eli Zaretskii Date: Tue, 7 Oct 2014 17:59:11 +0000 (+0300) Subject: modules/fcntl: fix error reporting by dupfd X-Git-Tag: v1.0~7291 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=8a695b675d018ecfab9db14fce4b13379f5ac908;p=gnulib.git modules/fcntl: fix error reporting by dupfd * lib/fcntl.c (dupfd) [_WIN32]: Don't overwrite the value of errno set by _open_osfhandle by EMFILE. Convert errors returned by DuplicateHandle to corresponding errno values. --- diff --git a/lib/fcntl.c b/lib/fcntl.c index 54f748606b..1e35dd1a4f 100644 --- a/lib/fcntl.c +++ b/lib/fcntl.c @@ -89,8 +89,25 @@ dupfd (int oldfd, int newfd, int flags) inherit, /* InheritHandle */ DUPLICATE_SAME_ACCESS)) /* Options */ { - /* TODO: Translate GetLastError () into errno. */ - errno = EMFILE; + switch (GetLastError ()) + { + case ERROR_TOO_MANY_OPEN_FILES: + errno = EMFILE; + break; + case ERROR_INVALID_HANDLE: + case ERROR_INVALID_TARGET_HANDLE: + case ERROR_DIRECT_ACCESS_HANDLE: + errno = EBADF; + break; + case ERROR_INVALID_PARAMETER: + case ERROR_INVALID_FUNCTION: + case ERROR_INVALID_ACCESS: + errno = EINVAL; + break; + default: + errno = EACCES; + break; + } result = -1; break; } @@ -98,7 +115,6 @@ dupfd (int oldfd, int newfd, int flags) if (duplicated_fd < 0) { CloseHandle (new_handle); - errno = EMFILE; result = -1; break; }