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
path: root/winsup
diff options
context:
space:
mode:
authorThomas Pfaff <tpfaff@gmx.net>2003-05-27 22:30:29 +0400
committerThomas Pfaff <tpfaff@gmx.net>2003-05-27 22:30:29 +0400
commita946fb037ddb3db8acc4b25da6110a35c89cf6f3 (patch)
tree9aa5a30b58e29d35498c64646b939e0f5b3655f2 /winsup
parentdae86e4507ca652a9222f3e61f2ebc65502ea119 (diff)
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/fhandler_socket.cc47
2 files changed, 34 insertions, 21 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 5b769c942..4a606af4a 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,11 @@
+2003-05-27 Thomas Pfaff <tpfaff@gmx.net>
+
+ * 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 <corinna@vinschen.de>
* fhandler_socket.cc (fhandler_socket::dup): First try duplicating
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 45b8bc12b..3cb988608 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 */