From 20c68be907cd4696b2419e804e327e9327e9d428 Mon Sep 17 00:00:00 2001 From: Rein Klazes Date: Sat, 4 Mar 2000 19:09:16 +0000 Subject: [PATCH] Made WINSOCK_setsockopt handle option SO_DONTLINGER correctly. --- dlls/winsock/socket.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c index f606e72764e..e72236ee026 100644 --- a/dlls/winsock/socket.c +++ b/dlls/winsock/socket.c @@ -1638,8 +1638,15 @@ INT WINAPI WINSOCK_setsockopt(SOCKET16 s, INT level, INT optname, struct linger linger; int fd = _get_sock_fd(s); - convert_sockopt(&level, &optname); - if (optname == SO_LINGER && optval) { + if(optname == WS_SO_DONTLINGER) { + linger.l_onoff = *((int*)optval) ? 0: 1; + linger.l_linger = 0; + optname=SO_LINGER; + optval = (char*)&linger; + optlen = sizeof(struct linger); + }else{ + convert_sockopt(&level, &optname); + if (optname == SO_LINGER && optval) { /* yes, uses unsigned short in both win16/win32 */ linger.l_onoff = ((UINT16*)optval)[0]; linger.l_linger = ((UINT16*)optval)[1]; @@ -1647,7 +1654,8 @@ INT WINAPI WINSOCK_setsockopt(SOCKET16 s, INT level, INT optname, is null?? */ optval = (char*)&linger; optlen = sizeof(struct linger); - } + } + } if (setsockopt(fd, level, optname, optval, optlen) == 0) { close(fd);