]> Savannah Git Hosting - gnulib.git/commitdiff
modules/fcntl: fix error reporting by dupfd
authorEli Zaretskii <eliz@gnu.org>
Tue, 7 Oct 2014 17:59:11 +0000 (20:59 +0300)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 7 Oct 2014 20:17:23 +0000 (13:17 -0700)
* 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.

lib/fcntl.c

index 54f748606b71eb4e9542e879cc18c84310072242..1e35dd1a4f9e2cc471017e1c2747db9b03ad4aa6 100644 (file)
@@ -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;
         }