Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Humblet <phumblet@phumblet.no-ip.org>2004-01-24 03:14:27 +0300
committerPierre Humblet <phumblet@phumblet.no-ip.org>2004-01-24 03:14:27 +0300
commitb9a766427b2ff5f5760ab8c305f3b60f08c20157 (patch)
treed4eebbb22ce8071fb4f1be03e0bd2c189ce7797a /winsup/cygwin/fhandler_socket.cc
parentf723909038afc7657b5a19c48d64458ad0dd18d8 (diff)
2004-01-23 Pierre Humblet <pierre.humblet@ieee.org>
* fhandler_socket.cc (fhandler_socket::create_secret_event): Avoid creating multiple handles. Always allow event inheritance but set the handle inheritance appropriately. Improve error handling. (fhandler_socket::check_peer_secret_event): Improve error handling. (fhandler_socket::close_secret_event): Simply call CloseHandle. (fhandler_socket::set_close_on_exec): Set secret event inheritance.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc28
1 files changed, 13 insertions, 15 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 559731065..22d322ff7 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -183,6 +183,9 @@ fhandler_socket::create_secret_event (int* secret)
struct sockaddr_in sin;
int sin_len = sizeof (sin);
+ if (secret_event)
+ return secret_event;
+
if (::getsockname (get_socket (), (struct sockaddr*) &sin, &sin_len))
{
debug_printf ("error getting local socket name (%d)", WSAGetLastError ());
@@ -191,17 +194,13 @@ fhandler_socket::create_secret_event (int* secret)
char event_name[CYG_MAX_PATH];
secret_event_name (event_name, sin.sin_port, secret ?: connect_secret);
- LPSECURITY_ATTRIBUTES sec = get_inheritance (true);
- secret_event = CreateEvent (sec, FALSE, FALSE, event_name);
- if (!secret_event && GetLastError () == ERROR_ALREADY_EXISTS)
- secret_event = OpenEvent (EVENT_ALL_ACCESS, FALSE, event_name);
+ secret_event = CreateEvent (&sec_all, FALSE, FALSE, event_name);
if (!secret_event)
- /* nothing to do */;
- else if (sec == &sec_all_nih || sec == &sec_none_nih)
- ProtectHandle (secret_event);
- else
- ProtectHandleINH (secret_event);
+ debug_printf("create event %E");
+ else if (get_close_on_exec ())
+ /* Event allows inheritance, but handle will not be inherited */
+ set_inheritance (secret_event, 1);
return secret_event;
}
@@ -222,7 +221,7 @@ void
fhandler_socket::close_secret_event ()
{
if (secret_event)
- ForceCloseHandle (secret_event);
+ CloseHandle (secret_event);
secret_event = NULL;
}
@@ -234,11 +233,8 @@ fhandler_socket::check_peer_secret_event (struct sockaddr_in* peer, int* secret)
secret_event_name (event_name, peer->sin_port, secret ?: connect_secret);
HANDLE ev = CreateEvent (&sec_all_nih, FALSE, FALSE, event_name);
- if (!ev && GetLastError () == ERROR_ALREADY_EXISTS)
- {
- debug_printf ("event \"%s\" already exists", event_name);
- ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, event_name);
- }
+ if (!ev)
+ debug_printf("create event %E");
signal_secret_event ();
@@ -1303,6 +1299,8 @@ fhandler_socket::fcntl (int cmd, void *arg)
void
fhandler_socket::set_close_on_exec (int val)
{
+ if (secret_event)
+ set_inheritance (secret_event, val);
if (!winsock2_active) /* < Winsock 2.0 */
set_inheritance (get_handle (), val);
set_close_on_exec_flag (val);