From 281d8a3232538514a316fc4ed1f4b7cda86b8170 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 28 Aug 2002 10:18:20 +0000 Subject: [PATCH] * fhandler_socket.cc (fhandler_socket::recvfrom): Eliminate flags not understood by WinSock. (fhandler_socket::sendto): Ditto. If WinSock sendto() returns WSAESHUTDOWN, change errno to EPIPE and raise SIGPIPE if MSG_NOSIGNAL isn't set in flags. * include/cygwin/socket.h: Define MSG_WINMASK and MSG_NOSIGNAL. * include/cygwin/version.h: Bump API minor number. --- winsup/cygwin/ChangeLog | 10 ++++++++++ winsup/cygwin/fhandler_socket.cc | 14 ++++++++++++-- winsup/cygwin/include/cygwin/socket.h | 2 ++ winsup/cygwin/include/cygwin/version.h | 3 ++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4d2806e97..e0e72acf7 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +2002-08-28 Corinna Vinschen + + * fhandler_socket.cc (fhandler_socket::recvfrom): Eliminate flags + not understood by WinSock. + (fhandler_socket::sendto): Ditto. If WinSock sendto() returns + WSAESHUTDOWN, change errno to EPIPE and raise SIGPIPE if MSG_NOSIGNAL + isn't set in flags. + * include/cygwin/socket.h: Define MSG_WINMASK and MSG_NOSIGNAL. + * include/cygwin/version.h: Bump API minor number. + 2002-08-28 Corinna Vinschen * poll.cc (poll): Eliminate erroneous POLLERR conditional. diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 2057a9eec..85b210752 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -674,6 +674,7 @@ fhandler_socket::recvfrom (void *ptr, size_t len, int flags, wsock_event wsock_evt; LPWSAOVERLAPPED ovr; + flags &= MSG_WINMASK; if (is_nonblocking () || !(ovr = wsock_evt.prepare ())) { debug_printf ("Fallback to winsock 1 recvfrom call"); @@ -765,7 +766,8 @@ fhandler_socket::sendto (const void *ptr, size_t len, int flags, if (is_nonblocking () || !(ovr = wsock_evt.prepare ())) { debug_printf ("Fallback to winsock 1 sendto call"); - if ((res = ::sendto (get_socket (), (const char *) ptr, len, flags, + if ((res = ::sendto (get_socket (), (const char *) ptr, len, + flags & MSG_WINMASK, (to ? (sockaddr *) &sin : NULL), tolen)) == SOCKET_ERROR) { @@ -777,7 +779,8 @@ fhandler_socket::sendto (const void *ptr, size_t len, int flags, { WSABUF wsabuf = { len, (char *) ptr }; DWORD ret = 0; - if (WSASendTo (get_socket (), &wsabuf, 1, &ret, (DWORD)flags, + if (WSASendTo (get_socket (), &wsabuf, 1, &ret, + (DWORD)(flags & MSG_WINMASK), (to ? (sockaddr *) &sin : NULL), tolen, ovr, NULL) != SOCKET_ERROR) @@ -791,6 +794,13 @@ fhandler_socket::sendto (const void *ptr, size_t len, int flags, set_winsock_errno (); } + /* Special handling for SIGPIPE */ + if (get_errno () == ESHUTDOWN) + { + set_errno (EPIPE); + if (! (flags & MSG_NOSIGNAL)) + _raise (SIGPIPE); + } return res; } diff --git a/winsup/cygwin/include/cygwin/socket.h b/winsup/cygwin/include/cygwin/socket.h index b66c38f73..3a40c12a3 100644 --- a/winsup/cygwin/include/cygwin/socket.h +++ b/winsup/cygwin/include/cygwin/socket.h @@ -112,6 +112,8 @@ struct msghdr #define MSG_OOB 0x1 /* process out-of-band data */ #define MSG_PEEK 0x2 /* peek at incoming message */ #define MSG_DONTROUTE 0x4 /* send without using routing tables */ +#define MSG_WINMASK 0x7 /* flags understood by WinSock calls */ +#define MSG_NOSIGNAL 0x20 /* Don't raise SIGPIPE */ /* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */ #define SOL_IP 0 diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index e9459070d..8a78ae4e3 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -158,12 +158,13 @@ details. */ 58: Export memalign, valloc, malloc_trim, malloc_usable_size, mallopt, malloc_stats 59: getsid + 60: MSG_NOSIGNAL */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 59 +#define CYGWIN_VERSION_API_MINOR 60 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible