- Add more option support to WSPGetSockOpt and WSPSetSockOpt
- Return the correct error code for an unsupported option in WSPGetSockOpt
- Hack a SO_ERROR get handler together for apps that need it
- Add better unsupported protoopts debugging (particularly for getsockopt)
- SMPlayer can now stream media from the Internet :)

svn path=/trunk/; revision=57094
This commit is contained in:
Cameron Gutman 2012-08-18 09:57:27 +00:00
parent 8b45c713bf
commit f2112ca452

View file

@ -2052,6 +2052,7 @@ WSPGetSockOpt(IN SOCKET Handle,
PVOID Buffer;
INT BufferSize;
BOOL BoolBuffer;
INT IntBuffer;
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
@ -2112,21 +2113,46 @@ WSPGetSockOpt(IN SOCKET Handle,
BufferSize = sizeof(struct linger);
break;
/* case SO_CONDITIONAL_ACCEPT: */
case SO_OOBINLINE:
BoolBuffer = (Socket->SharedData.OobInline != 0);
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOL);
break;
case SO_KEEPALIVE:
case SO_DONTROUTE:
/* These guys go directly to the helper */
goto SendToHelper;
case SO_CONDITIONAL_ACCEPT:
BoolBuffer = (Socket->SharedData.UseDelayedAcceptance != 0);
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOL);
break;
case SO_REUSEADDR:
BoolBuffer = (Socket->SharedData.ReuseAddresses != 0);
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOL);
break;
case SO_ERROR:
/* HACK: This needs to be properly tracked */
IntBuffer = 0;
DbgPrint("MSAFD: Hacked SO_ERROR returning error %d\n", IntBuffer);
Buffer = &IntBuffer;
BufferSize = sizeof(INT);
break;
case SO_GROUP_ID:
case SO_GROUP_PRIORITY:
case SO_KEEPALIVE:
case SO_MAX_MSG_SIZE:
case SO_OOBINLINE:
case SO_PROTOCOL_INFO:
case SO_REUSEADDR:
AFD_DbgPrint(MID_TRACE, ("Unimplemented option (%x)\n",
OptionName));
default:
*lpErrno = WSAEINVAL;
DbgPrint("MSAFD: Get unknown optname %x\n", OptionName);
*lpErrno = WSAENOPROTOOPT;
return SOCKET_ERROR;
}
@ -2140,18 +2166,20 @@ WSPGetSockOpt(IN SOCKET Handle,
return 0;
case IPPROTO_TCP: /* FIXME */
default:
*lpErrno = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext,
Handle,
Socket->TdiAddressHandle,
Socket->TdiConnectionHandle,
Level,
OptionName,
OptionValue,
(LPINT)OptionLength);
return (*lpErrno == 0) ? 0 : SOCKET_ERROR;
break;
}
SendToHelper:
*lpErrno = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext,
Handle,
Socket->TdiAddressHandle,
Socket->TdiConnectionHandle,
Level,
OptionName,
OptionValue,
(LPINT)OptionLength);
return (*lpErrno == 0) ? 0 : SOCKET_ERROR;
}
INT
@ -2220,13 +2248,43 @@ WSPSetSockOpt(
AFD_DbgPrint(MIN_TRACE,("Setting send buf to %x is not implemented yet\n", optval));
return 0;
case SO_SNDTIMEO:
if (optlen < sizeof(DWORD))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
RtlCopyMemory(&Socket->SharedData.SendTimeout,
optval,
sizeof(DWORD));
return 0;
case SO_RCVTIMEO:
if (optlen < sizeof(DWORD))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
RtlCopyMemory(&Socket->SharedData.RecvTimeout,
optval,
sizeof(DWORD));
return 0;
case SO_KEEPALIVE:
case SO_DONTROUTE:
/* These go directly to the helper dll */
goto SendToHelper;
default:
AFD_DbgPrint(MIN_TRACE,("Unknown optname %x\n", optname));
break;
/* Obviously this is a hack */
DbgPrint("MSAFD: Set unknown optname %x\n", optname);
return 0;
}
}
SendToHelper:
*lpErrno = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
s,
Socket->TdiAddressHandle,