From 67797a9560f77c1061ad5c901400abc7e9a4fcc2 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 5 May 2014 15:18:17 +0000 Subject: * net.cc (cygwin_getsockopt): Rearrange code slightly and handle TCP_NODELAY just like SO_KEEPALIVE and SO_DONTROUTE. --- winsup/cygwin/net.cc | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) (limited to 'winsup/cygwin/net.cc') diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index 5ccfc96fd..ab36a30b4 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -923,32 +923,27 @@ cygwin_getsockopt (int fd, int level, int optname, void *optval, (int *) optlen); if (res == SOCKET_ERROR) set_winsock_errno (); - else if (level == SOL_SOCKET) + else if (level == SOL_SOCKET && optname == SO_ERROR) { - switch (optname) + int *e = (int *) optval; + debug_printf ("WinSock SO_ERROR = %d", *e); + *e = find_winsock_errno (*e); + } + else if (*optlen == 1) + { + /* Regression in Vista and later: instead of a 4 byte BOOL value, + a 1 byte BOOLEAN value is returned, in contrast to older systems + and the documentation. Since an int type is expected by the + calling application, we convert the result here. For some reason + only three BSD-compatible socket options seem to be affected. */ + if ((level == SOL_SOCKET + && (optname == SO_KEEPALIVE || optname == SO_DONTROUTE)) + || (level == IPPROTO_TCP && optname == TCP_NODELAY)) { - case SO_ERROR: - { - int *e = (int *) optval; - debug_printf ("WinSock SO_ERROR = %d", *e); - *e = find_winsock_errno (*e); - } - break; - case SO_KEEPALIVE: - case SO_DONTROUTE: - /* Regression in Vista and later: instead of a 4 byte BOOL - value, a 1 byte BOOLEAN value is returned, in contrast - to older systems and the documentation. Since an int - type is expected by the calling application, we convert - the result here. */ - if (*optlen == 1) - { - BOOLEAN *in = (BOOLEAN *) optval; - int *out = (int *) optval; - *out = *in; - *optlen = 4; - } - break; + BOOLEAN *in = (BOOLEAN *) optval; + int *out = (int *) optval; + *out = *in; + *optlen = 4; } } } -- cgit v1.2.3