changeset 37447:d5662177574a

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.
author Eli Zaretskii <eliz@gnu.org>
date Tue, 07 Oct 2014 20:59:11 +0300
parents a12b16f43c94
children 503d9d833a18
files lib/fcntl.c
diffstat 1 files changed, 19 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lib/fcntl.c	Sun Sep 28 09:52:08 2014 -0700
+++ b/lib/fcntl.c	Tue Oct 07 20:59:11 2014 +0300
@@ -89,8 +89,25 @@
                             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 @@
       if (duplicated_fd < 0)
         {
           CloseHandle (new_handle);
-          errno = EMFILE;
           result = -1;
           break;
         }