mirror of
https://github.com/reactos/reactos.git
synced 2025-04-21 12:40:33 +00:00
[MSAFD]
- Implement SO_LINGER and SO_DONTLINGER for getsockopt and setsockopt - Fix and add buffer size checks - Yes, we've gone this long without SO_LINGER support svn path=/trunk/; revision=53174
This commit is contained in:
parent
5ea7b9c764
commit
248fe419e0
1 changed files with 43 additions and 6 deletions
|
@ -2034,7 +2034,7 @@ WSPGetSockOpt(IN SOCKET Handle,
|
||||||
PSOCKET_INFORMATION Socket = NULL;
|
PSOCKET_INFORMATION Socket = NULL;
|
||||||
PVOID Buffer;
|
PVOID Buffer;
|
||||||
INT BufferSize;
|
INT BufferSize;
|
||||||
BOOLEAN BoolBuffer;
|
BOOL BoolBuffer;
|
||||||
|
|
||||||
/* Get the Socket Structure associate to this Socket*/
|
/* Get the Socket Structure associate to this Socket*/
|
||||||
Socket = GetSocketStructure(Handle);
|
Socket = GetSocketStructure(Handle);
|
||||||
|
@ -2069,29 +2069,38 @@ WSPGetSockOpt(IN SOCKET Handle,
|
||||||
case SO_ACCEPTCONN:
|
case SO_ACCEPTCONN:
|
||||||
BoolBuffer = Socket->SharedData.Listening;
|
BoolBuffer = Socket->SharedData.Listening;
|
||||||
Buffer = &BoolBuffer;
|
Buffer = &BoolBuffer;
|
||||||
BufferSize = sizeof(BOOLEAN);
|
BufferSize = sizeof(BOOL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SO_BROADCAST:
|
case SO_BROADCAST:
|
||||||
BoolBuffer = Socket->SharedData.Broadcast;
|
BoolBuffer = Socket->SharedData.Broadcast;
|
||||||
Buffer = &BoolBuffer;
|
Buffer = &BoolBuffer;
|
||||||
BufferSize = sizeof(BOOLEAN);
|
BufferSize = sizeof(BOOL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SO_DEBUG:
|
case SO_DEBUG:
|
||||||
BoolBuffer = Socket->SharedData.Debug;
|
BoolBuffer = Socket->SharedData.Debug;
|
||||||
Buffer = &BoolBuffer;
|
Buffer = &BoolBuffer;
|
||||||
BufferSize = sizeof(BOOLEAN);
|
BufferSize = sizeof(BOOL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SO_DONTLINGER:
|
||||||
|
BoolBuffer = (Socket->SharedData.LingerData.l_onoff == 0);
|
||||||
|
Buffer = &BoolBuffer;
|
||||||
|
BufferSize = sizeof(BOOL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SO_LINGER:
|
||||||
|
Buffer = &Socket->SharedData.LingerData;
|
||||||
|
BufferSize = sizeof(struct linger);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* case SO_CONDITIONAL_ACCEPT: */
|
/* case SO_CONDITIONAL_ACCEPT: */
|
||||||
case SO_DONTLINGER:
|
|
||||||
case SO_DONTROUTE:
|
case SO_DONTROUTE:
|
||||||
case SO_ERROR:
|
case SO_ERROR:
|
||||||
case SO_GROUP_ID:
|
case SO_GROUP_ID:
|
||||||
case SO_GROUP_PRIORITY:
|
case SO_GROUP_PRIORITY:
|
||||||
case SO_KEEPALIVE:
|
case SO_KEEPALIVE:
|
||||||
case SO_LINGER:
|
|
||||||
case SO_MAX_MSG_SIZE:
|
case SO_MAX_MSG_SIZE:
|
||||||
case SO_OOBINLINE:
|
case SO_OOBINLINE:
|
||||||
case SO_PROTOCOL_INFO:
|
case SO_PROTOCOL_INFO:
|
||||||
|
@ -2155,8 +2164,36 @@ WSPSetSockOpt(
|
||||||
switch (optname)
|
switch (optname)
|
||||||
{
|
{
|
||||||
case SO_BROADCAST:
|
case SO_BROADCAST:
|
||||||
|
if (optlen < sizeof(BOOL))
|
||||||
|
{
|
||||||
|
*lpErrno = WSAEFAULT;
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
}
|
||||||
Socket->SharedData.Broadcast = (*optval != 0) ? 1 : 0;
|
Socket->SharedData.Broadcast = (*optval != 0) ? 1 : 0;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case SO_DONTLINGER:
|
||||||
|
if (optlen < sizeof(BOOL))
|
||||||
|
{
|
||||||
|
*lpErrno = WSAEFAULT;
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
Socket->SharedData.LingerData.l_onoff = (*optval != 0) ? 0 : 1;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case SO_LINGER:
|
||||||
|
if (optlen < sizeof(struct linger))
|
||||||
|
{
|
||||||
|
*lpErrno = WSAEFAULT;
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
RtlCopyMemory(&Socket->SharedData.LingerData,
|
||||||
|
optval,
|
||||||
|
sizeof(struct linger));
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue