Commit 9dd32508 authored by Rein Klazes's avatar Rein Klazes Committed by Alexandre Julliard

Convert the value of level when setsockopt is called with

WS_SO_DONTLINGER.
parent a9f6a9da
...@@ -2092,32 +2092,33 @@ INT WINAPI WSOCK32_setsockopt(SOCKET16 s, INT level, INT optname, ...@@ -2092,32 +2092,33 @@ INT WINAPI WSOCK32_setsockopt(SOCKET16 s, INT level, INT optname,
int fd = _get_sock_fd(s); int fd = _get_sock_fd(s);
int woptval; int woptval;
if(optname == WS_SO_DONTLINGER) { if(optname == WS_SO_DONTLINGER && level == WS_SOL_SOCKET) {
/* This is unique to WinSock and takes special conversion */ /* This is unique to WinSock and takes special conversion */
linger.l_onoff = *((int*)optval) ? 0: 1; linger.l_onoff = *((int*)optval) ? 0: 1;
linger.l_linger = 0; linger.l_linger = 0;
optname=SO_LINGER; optname=SO_LINGER;
optval = (char*)&linger; optval = (char*)&linger;
optlen = sizeof(struct linger); optlen = sizeof(struct linger);
level = SOL_SOCKET;
}else{ }else{
if (!convert_sockopt(&level, &optname)) { if (!convert_sockopt(&level, &optname)) {
SetLastError(WSAENOPROTOOPT); SetLastError(WSAENOPROTOOPT);
close(fd); close(fd);
return SOCKET_ERROR; return SOCKET_ERROR;
} }
} if (optname == SO_LINGER && optval) {
if (optname == SO_LINGER && optval) { /* yes, uses unsigned short in both win16/win32 */
/* yes, uses unsigned short in both win16/win32 */ linger.l_onoff = ((UINT16*)optval)[0];
linger.l_onoff = ((UINT16*)optval)[0]; linger.l_linger = ((UINT16*)optval)[1];
linger.l_linger = ((UINT16*)optval)[1]; /* FIXME: what is documented behavior if SO_LINGER optval
/* FIXME: what is documented behavior if SO_LINGER optval is null?? */
is null?? */ optval = (char*)&linger;
optval = (char*)&linger; optlen = sizeof(struct linger);
optlen = sizeof(struct linger); } else if (optlen < sizeof(int)){
} else if (optlen < sizeof(int)){ woptval= *((INT16 *) optval);
woptval= *((INT16 *) optval); optval= (char*) &woptval;
optval= (char*) &woptval; optlen=sizeof(int);
optlen=sizeof(int); }
} }
if(optname == SO_RCVBUF && *(int*)optval < 2048) { if(optname == SO_RCVBUF && *(int*)optval < 2048) {
WARN("SO_RCVBF for %d bytes is too small: ignored\n", *(int*)optval ); WARN("SO_RCVBF for %d bytes is too small: ignored\n", *(int*)optval );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment