From 2d0a1d23d365a32db96f15c560e660dd9c7fcc1e Mon Sep 17 00:00:00 2001 From: corinna Date: Tue, 11 Mar 2003 16:49:58 +0000 Subject: [PATCH] * fhandler_socket.cc (fhandler_socket::dup): Don't call fhandler_base::dup() but call DuplicateHandle directly instead to have control over socket inheritence. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/fhandler_socket.cc | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 6751d18887..fe3b93311a 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2003-03-11 Corinna Vinschen + * fhandler_socket.cc (fhandler_socket::dup): Don't call + fhandler_base::dup() but call DuplicateHandle directly instead to have + control over socket inheritence. + +2003-03-11 Corinna Vinschen + * fhandler_socket.cc (fhandler_socket::dup): On NT systems avoid using WinSock2 socket duplication methods. Add comment. diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index c673df2af2..7617bc23ba 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -400,7 +400,20 @@ fhandler_socket::dup (fhandler_base *child) return get_io_handle () == (HANDLE) INVALID_SOCKET; } } - return fhandler_base::dup (child); + /* We don't call fhandler_base::dup here since that requires to + have winsock called from fhandler_base and it creates only + inheritable sockets which is wrong for winsock2. */ + HANDLE nh; + if (!DuplicateHandle (hMainProc, get_io_handle (), hMainProc, &nh, 0, + !winsock2_active, DUPLICATE_SAME_ACCESS)) + { + system_printf ("dup(%s) failed, handle %x, %E", + get_name (), get_io_handle ()); + __seterrno (); + return -1; + } + child->set_io_handle (nh); + return 0; } int __stdcall -- 2.11.0