From 25d0462d07fcd29eada1f9579ecaccfd1c507bcd Mon Sep 17 00:00:00 2001 From: tpfaff Date: Tue, 27 May 2003 18:30:29 +0000 Subject: [PATCH] * fhandler_socket.cc (sock_event::~sock_event): New method. (sock_event::load): Change to void. Check if winsock2 is available. (socke_event::wait): Return 0 if interruptible mode is not available. (fhandler_socket::connect): Remove checks for winsock2 availability. (fhandler_socket::accept): Ditto. --- winsup/cygwin/ChangeLog | 8 +++++++ winsup/cygwin/fhandler_socket.cc | 47 ++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 5b769c9429..4a606af4a5 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2003-05-27 Thomas Pfaff + + * fhandler_socket.cc (sock_event::~sock_event): New method. + (sock_event::load): Change to void. Check if winsock2 is available. + (socke_event::wait): Return 0 if interruptible mode is not available. + (fhandler_socket::connect): Remove checks for winsock2 availability. + (fhandler_socket::accept): Ditto. + 2003-05-27 Corinna Vinschen * fhandler_socket.cc (fhandler_socket::dup): First try duplicating diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 45b8bc12bc..3cb988608d 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -131,31 +131,44 @@ public: ev[0] = WSA_INVALID_EVENT; ev[1] = signal_arrived; } - bool load (SOCKET sock, int type_bit) + ~sock_event () { - if ((ev[0] = WSACreateEvent ()) == WSA_INVALID_EVENT) - return false; + if (ev[0] != WSA_INVALID_EVENT) + WSACloseEvent (ev[0]); + } + void load (SOCKET sock, int type_bit) + { + if (!winsock2_active) + /* Can not wait for signal if winsock2 is not active */ + return; + + if (ev[0] == WSA_INVALID_EVENT) + if ((ev[0] = WSACreateEvent ()) == WSA_INVALID_EVENT) + return; + evt_sock = sock; evt_type_bit = type_bit; if (WSAEventSelect (evt_sock, ev[0], 1 << evt_type_bit)) { WSACloseEvent (ev[0]); ev[0] = WSA_INVALID_EVENT; - return false; } - return true; } int wait () { WSANETWORKEVENTS sock_event; - int wait_result = WSAWaitForMultipleEvents (2, ev, FALSE, WSA_INFINITE, + int wait_result; + + if (ev[0] == WSA_INVALID_EVENT) + return 0; + + wait_result = WSAWaitForMultipleEvents (2, ev, FALSE, WSA_INFINITE, FALSE); if (wait_result == WSA_WAIT_EVENT_0) WSAEnumNetworkEvents (evt_sock, ev[0], &sock_event); /* Cleanup, Revert to blocking. */ WSAEventSelect (evt_sock, ev[0], 0); - WSACloseEvent (ev[0]); unsigned long nonblocking = 0; ioctlsocket (evt_sock, FIONBIO, &nonblocking); @@ -565,17 +578,13 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen) if (!get_inet_addr (name, namelen, &sin, &namelen, secret)) return -1; - if (winsock2_active && !is_nonblocking () && !is_connect_pending ()) - if (!evt.load (get_socket (), FD_CONNECT_BIT)) - { - set_winsock_errno (); - return -1; - } + if (!is_nonblocking () && !is_connect_pending ()) + evt.load (get_socket (), FD_CONNECT_BIT); res = ::connect (get_socket (), (sockaddr *) &sin, namelen); - if (winsock2_active && res && !is_nonblocking () && !is_connect_pending () && - WSAGetLastError () == WSAEWOULDBLOCK) + if (res && !is_nonblocking () && !is_connect_pending () + && WSAGetLastError () == WSAEWOULDBLOCK) switch (evt.wait ()) { case 1: /* Signal */ @@ -685,14 +694,10 @@ fhandler_socket::accept (struct sockaddr *peer, int *len) if (len && ((unsigned) *len < sizeof (struct sockaddr_in))) *len = sizeof (struct sockaddr_in); - if (winsock2_active && !is_nonblocking ()) + if (!is_nonblocking ()) { sock_event evt; - if (!evt.load (get_socket (), FD_ACCEPT_BIT)) - { - set_winsock_errno (); - return -1; - } + evt.load (get_socket (), FD_ACCEPT_BIT); switch (evt.wait ()) { case 1: /* Signal */ -- 2.11.0