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.
This commit is contained in:
parent
f723909038
commit
b9a766427b
@ -1,3 +1,12 @@
|
|||||||
|
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.
|
||||||
|
|
||||||
2004-01-23 Christopher Faylor <cgf@redhat.com>
|
2004-01-23 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* configure.in: Remove NEWVFORK default.
|
* configure.in: Remove NEWVFORK default.
|
||||||
|
@ -183,6 +183,9 @@ fhandler_socket::create_secret_event (int* secret)
|
|||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
int sin_len = sizeof (sin);
|
int sin_len = sizeof (sin);
|
||||||
|
|
||||||
|
if (secret_event)
|
||||||
|
return secret_event;
|
||||||
|
|
||||||
if (::getsockname (get_socket (), (struct sockaddr*) &sin, &sin_len))
|
if (::getsockname (get_socket (), (struct sockaddr*) &sin, &sin_len))
|
||||||
{
|
{
|
||||||
debug_printf ("error getting local socket name (%d)", WSAGetLastError ());
|
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];
|
char event_name[CYG_MAX_PATH];
|
||||||
secret_event_name (event_name, sin.sin_port, secret ?: connect_secret);
|
secret_event_name (event_name, sin.sin_port, secret ?: connect_secret);
|
||||||
LPSECURITY_ATTRIBUTES sec = get_inheritance (true);
|
secret_event = CreateEvent (&sec_all, FALSE, FALSE, event_name);
|
||||||
secret_event = CreateEvent (sec, FALSE, FALSE, event_name);
|
|
||||||
if (!secret_event && GetLastError () == ERROR_ALREADY_EXISTS)
|
|
||||||
secret_event = OpenEvent (EVENT_ALL_ACCESS, FALSE, event_name);
|
|
||||||
|
|
||||||
if (!secret_event)
|
if (!secret_event)
|
||||||
/* nothing to do */;
|
debug_printf("create event %E");
|
||||||
else if (sec == &sec_all_nih || sec == &sec_none_nih)
|
else if (get_close_on_exec ())
|
||||||
ProtectHandle (secret_event);
|
/* Event allows inheritance, but handle will not be inherited */
|
||||||
else
|
set_inheritance (secret_event, 1);
|
||||||
ProtectHandleINH (secret_event);
|
|
||||||
|
|
||||||
return secret_event;
|
return secret_event;
|
||||||
}
|
}
|
||||||
@ -222,7 +221,7 @@ void
|
|||||||
fhandler_socket::close_secret_event ()
|
fhandler_socket::close_secret_event ()
|
||||||
{
|
{
|
||||||
if (secret_event)
|
if (secret_event)
|
||||||
ForceCloseHandle (secret_event);
|
CloseHandle (secret_event);
|
||||||
secret_event = NULL;
|
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);
|
secret_event_name (event_name, peer->sin_port, secret ?: connect_secret);
|
||||||
HANDLE ev = CreateEvent (&sec_all_nih, FALSE, FALSE, event_name);
|
HANDLE ev = CreateEvent (&sec_all_nih, FALSE, FALSE, event_name);
|
||||||
if (!ev && GetLastError () == ERROR_ALREADY_EXISTS)
|
if (!ev)
|
||||||
{
|
debug_printf("create event %E");
|
||||||
debug_printf ("event \"%s\" already exists", event_name);
|
|
||||||
ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, event_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
signal_secret_event ();
|
signal_secret_event ();
|
||||||
|
|
||||||
@ -1303,6 +1299,8 @@ fhandler_socket::fcntl (int cmd, void *arg)
|
|||||||
void
|
void
|
||||||
fhandler_socket::set_close_on_exec (int val)
|
fhandler_socket::set_close_on_exec (int val)
|
||||||
{
|
{
|
||||||
|
if (secret_event)
|
||||||
|
set_inheritance (secret_event, val);
|
||||||
if (!winsock2_active) /* < Winsock 2.0 */
|
if (!winsock2_active) /* < Winsock 2.0 */
|
||||||
set_inheritance (get_handle (), val);
|
set_inheritance (get_handle (), val);
|
||||||
set_close_on_exec_flag (val);
|
set_close_on_exec_flag (val);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user