diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 892255c45..1bd8cd86b 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,21 @@ +2010-03-22 Corinna Vinschen + + * fhandler_socket.cc (fhandler_socket::evaluate_events): Make erase + const in parameter list. + (fhandler_socket::wait_for_events): Take a DWORD flags value instead of + just a bool. Call evaluate_events with erase flag according to + MSG_PEEK value in flags. Replace check for dontwait with check for + MSG_DONTWAIT in flags. + (fhandler_socket::connect): Call wait_for_events with 0 flags value. + (fhandler_socket::accept4): Ditto. + (fhandler_socket::recv_internal): Save flags in wait_flags. Drop + dontwait variable. Call wait_for_events with wait_flags. + (fhandler_socket::send_internal): Save MSG_DONTWAIT flag in wait_flags + and call wait_for_events with wait_flags as argument. Drop dontwait + variable. + * fhandler.h (class fhandler_socket): Change second parameter in + declaration of wait_for_events to const DWORD. + 2010-03-19 Corinna Vinschen * fhandler_disk_file.cc (fhandler_cygdrive::fstat): Add standard read diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index d1130d4ea..3d1b46bf4 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -432,7 +432,7 @@ class fhandler_socket: public fhandler_base const HANDLE wsock_event () const { return wsock_evt; } const LONG serial_number () const { return wsock_events->serial_number; } private: - int wait_for_events (const long event_mask, bool dontwait); + int wait_for_events (const long event_mask, const DWORD flags); void release_events (); pid_t sec_pid; diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 6f6ab31d2..2a03ce6cd 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -540,7 +540,7 @@ fhandler_socket::init_events () int fhandler_socket::evaluate_events (const long event_mask, long &events, - bool erase) + const bool erase) { int ret = 0; long events_now = 0; @@ -587,7 +587,7 @@ fhandler_socket::evaluate_events (const long event_mask, long &events, } int -fhandler_socket::wait_for_events (const long event_mask, bool dontwait) +fhandler_socket::wait_for_events (const long event_mask, const DWORD flags) { if (async_io ()) return 0; @@ -595,9 +595,10 @@ fhandler_socket::wait_for_events (const long event_mask, bool dontwait) int ret; long events; - while (!(ret = evaluate_events (event_mask, events, true)) && !events) + while (!(ret = evaluate_events (event_mask, events, !(flags & MSG_PEEK))) + && !events) { - if (is_nonblocking () || dontwait) + if (is_nonblocking () || (flags & MSG_DONTWAIT)) { WSASetLastError (WSAEWOULDBLOCK); return SOCKET_ERROR; @@ -1100,7 +1101,7 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen) if (!is_nonblocking () && res == SOCKET_ERROR && WSAGetLastError () == WSAEWOULDBLOCK) - res = wait_for_events (FD_CONNECT | FD_CLOSE, false); + res = wait_for_events (FD_CONNECT | FD_CLOSE, 0); if (!res) err = 0; @@ -1201,7 +1202,7 @@ fhandler_socket::accept4 (struct sockaddr *peer, int *len, int flags) int llen = sizeof (struct sockaddr_storage); int res = 0; - while (!(res = wait_for_events (FD_ACCEPT | FD_CLOSE, false)) + while (!(res = wait_for_events (FD_ACCEPT | FD_CLOSE, 0)) && (res = ::accept (get_socket (), (struct sockaddr *) &lpeer, &llen)) == SOCKET_ERROR && WSAGetLastError () == WSAEWOULDBLOCK) @@ -1424,8 +1425,8 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg) bool use_recvmsg = false; static NO_COPY LPFN_WSARECVMSG WSARecvMsg; - bool waitall = !!(wsamsg->dwFlags & MSG_WAITALL); - bool dontwait = !!(wsamsg->dwFlags & MSG_DONTWAIT); + DWORD wait_flags = wsamsg->dwFlags; + bool waitall = !!(wait_flags & MSG_WAITALL); wsamsg->dwFlags &= (MSG_OOB | MSG_PEEK | MSG_DONTROUTE); if (wsamsg->Control.len > 0) { @@ -1452,7 +1453,7 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg) /* Note: Don't call WSARecvFrom(MSG_PEEK) without actually having data waiting in the buffers, otherwise the event handling gets messed up for some reason. */ - while (!(res = wait_for_events (evt_mask | FD_CLOSE, dontwait)) + while (!(res = wait_for_events (evt_mask | FD_CLOSE, wait_flags)) || saw_shutdown_read ()) { if (use_recvmsg) @@ -1609,7 +1610,7 @@ fhandler_socket::send_internal (struct _WSAMSG *wsamsg, int flags) DWORD ret = 0, err = 0, sum = 0, off = 0; WSABUF buf; bool use_sendmsg = false; - bool dontwait = !!(flags & MSG_DONTWAIT); + DWORD wait_flags = flags & MSG_DONTWAIT; bool nosignal = !(flags & MSG_NOSIGNAL); flags &= (MSG_OOB | MSG_DONTROUTE); @@ -1649,7 +1650,7 @@ fhandler_socket::send_internal (struct _WSAMSG *wsamsg, int flags) } } while (res && err == WSAEWOULDBLOCK - && !(res = wait_for_events (FD_WRITE | FD_CLOSE, dontwait))); + && !(res = wait_for_events (FD_WRITE | FD_CLOSE, wait_flags))); if (!res) {