OSDN Git Service

2003-03-11 Corinna Vinschen <corinna@vinschen.de>
authorcorinna <corinna>
Tue, 11 Mar 2003 13:05:36 +0000 (13:05 +0000)
committercorinna <corinna>
Tue, 11 Mar 2003 13:05:36 +0000 (13:05 +0000)
* fhandler_socket.cc (fhandler_socket::dup): On NT systems avoid
using WinSock2 socket duplication methods.  Add comment.

2003-03-11  Pierre Humblet  <pierre.humblet@ieee.org>

* fhandler_socket.cc (fhandler_socket::fixup_after_fork):
Set io_handle to INVALID_SOCKET in case of failure.
(fhandler_socket::dup): Return 0 if the io_handle is valid.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_socket.cc

index 587c46c..6751d18 100644 (file)
@@ -1,3 +1,14 @@
+2003-03-11  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fhandler_socket.cc (fhandler_socket::dup): On NT systems avoid
+       using WinSock2 socket duplication methods.  Add comment.
+
+2003-03-11  Pierre Humblet  <pierre.humblet@ieee.org>
+
+       * fhandler_socket.cc (fhandler_socket::fixup_after_fork):
+       Set io_handle to INVALID_SOCKET in case of failure.
+       (fhandler_socket::dup): Return 0 if the io_handle is valid.
+
 2003-03-10  Corinna Vinschen  <corinna@vinschen.de>
 
        * sec_acl.cc (setacl): Don't handle DELETE flag specially.
index 01965bf..c673df2 100644 (file)
@@ -344,6 +344,7 @@ fhandler_socket::fixup_after_fork (HANDLE parent)
                                   prot_info_ptr, 0, 0)) == INVALID_SOCKET)
     {
       debug_printf ("WSASocket error");
+      set_io_handle ((HANDLE)INVALID_SOCKET);
       set_winsock_errno ();
     }
   else if (!new_sock && !winsock2_active)
@@ -385,11 +386,19 @@ fhandler_socket::dup (fhandler_base *child)
     fhs->set_sun_path (get_sun_path ());
   fhs->set_socket_type (get_socket_type ());
 
-  fhs->fixup_before_fork_exec (GetCurrentProcessId ());
-  if (winsock2_active)
+  /* Using WinSock2 methods for dup'ing sockets seem to collide
+     with user context switches under... some... conditions.  So we
+     drop this for NT systems at all and return to the good ol'
+     DuplicateHandle way of life.  This worked fine all the time on
+     NT anyway and it's even a bit faster. */
+  if (!wincap.has_security ())
     {
-      fhs->fixup_after_fork (hMainProc);
-      return 0;
+      fhs->fixup_before_fork_exec (GetCurrentProcessId ());
+      if (winsock2_active)
+       {
+         fhs->fixup_after_fork (hMainProc);
+         return get_io_handle () == (HANDLE) INVALID_SOCKET;
+       }
     }
   return fhandler_base::dup (child);
 }