From afd0458148deb21d2f4c4c42292537cd637160f0 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 24 Aug 2012 06:23:45 +0000 Subject: [PATCH] [MSAFD] - Stubplement support for SIOCATMARK [WSHTCPIP] - Add better debugging for unsupported options - Implement setting SO_DONTROUTE (nop) - Return WSAENOPROTOOPT for invalid SOL_SOCKET options svn path=/trunk/; revision=57149 --- reactos/dll/win32/msafd/misc/dllmain.c | 13 +++ reactos/dll/win32/wshtcpip/wshtcpip.c | 105 ++++++++++++++++++++++--- reactos/dll/win32/wshtcpip/wshtcpip.h | 1 + 3 files changed, 109 insertions(+), 10 deletions(-) diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index 3b4e65a51e2..7068327a095 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -2017,6 +2017,19 @@ WSPIoctl(IN SOCKET Handle, *lpcbBytesReturned = sizeof(ULONG); return NO_ERROR; } + case SIOCATMARK: + if (cbOutBuffer < sizeof(BOOL) || IS_INTRESOURCE(lpvOutBuffer)) + { + *lpErrno = WSAEFAULT; + return SOCKET_ERROR; + } + + /* FIXME: Return false for now */ + *(BOOL*)lpvOutBuffer = FALSE; + + *lpcbBytesReturned = sizeof(BOOL); + *lpErrno = NO_ERROR; + return NO_ERROR; case SIO_GET_EXTENSION_FUNCTION_POINTER: *lpErrno = WSAEINVAL; return SOCKET_ERROR; diff --git a/reactos/dll/win32/wshtcpip/wshtcpip.c b/reactos/dll/win32/wshtcpip/wshtcpip.c index f21833c100e..4c295cc2d2e 100644 --- a/reactos/dll/win32/wshtcpip/wshtcpip.c +++ b/reactos/dll/win32/wshtcpip/wshtcpip.c @@ -161,6 +161,18 @@ GetAddressOption(INT Level, INT OptionName) { switch (Level) { + case SOL_SOCKET: + switch (OptionName) + { + case SO_KEEPALIVE: + /* FIXME: Return proper option */ + ASSERT(FALSE); + break; + default: + break; + } + break; + case IPPROTO_IP: switch (OptionName) { @@ -179,19 +191,26 @@ GetAddressOption(INT Level, INT OptionName) return AO_OPTION_IP_HDRINCL; default: - DPRINT1("Unknown option name for IPPROTO_IP: %d\n", OptionName); - return 0; + break; } break; - case SOL_SOCKET: - DPRINT1("SOL_SOCKET option %d\n", OptionName); - break; + case IPPROTO_TCP: + switch (OptionName) + { + case TCP_NODELAY: + /* FIXME: Return proper option */ + ASSERT(FALSE); + break; + default: + break; + } default: - DPRINT1("Unknown level: %d\n", Level); break; } + + DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName); return 0; } @@ -209,6 +228,10 @@ WSHGetSocketInformation( { UNIMPLEMENTED + DPRINT1("Get: Unknown level/option name: %d %d\n", Level, OptionName); + + *OptionLength = 0; + return NO_ERROR; } @@ -318,6 +341,8 @@ WSHIoctl( { UNIMPLEMENTED + DPRINT1("Ioctl: Unknown IOCTL code: %d\n", IoControlCode); + return NO_ERROR; } @@ -626,11 +651,71 @@ WSHSetSocketInformation( /* FIXME: We only handle address file object here */ - RealOptionName = GetAddressOption(Level, OptionName); + switch (Level) + { + case SOL_SOCKET: + switch (OptionName) + { + case SO_DONTROUTE: + if (OptionLength < sizeof(BOOL)) + { + return WSAEFAULT; + } + Context->DontRoute = *(BOOL*)OptionValue; + /* This is silently ignored on Windows */ + return 0; + + case SO_KEEPALIVE: + /* FIXME -- We'll send this to TCPIP */ + DPRINT1("Set: SO_KEEPALIVE not yet supported\n"); + return 0; + + default: + /* Invalid option */ + DPRINT1("Set: Received unexpected SOL_SOCKET option %d\n", OptionName); + return WSAENOPROTOOPT; + } + break; + + case IPPROTO_IP: + switch (OptionName) + { + case IP_TTL: + case IP_DONTFRAGMENT: + case IP_HDRINCL: + /* Send these to TCPIP */ + break; + + default: + /* Invalid option -- FIXME */ + DPRINT1("Set: Received unsupported IPPROTO_IP option %d\n", OptionName); + return 0; + } + break; - /* FIXME: Support all options */ - if (!RealOptionName) - return 0; /* return WSAEINVAL; */ + case IPPROTO_TCP: + switch (OptionName) + { + case TCP_NODELAY: + /* FIXME -- Send this to TCPIP */ + DPRINT1("Set: TCP_NODELAY not yet supported\n"); + return 0; + + default: + /* Invalid option */ + DPRINT1("Set: Received unexpected IPPROTO_TCP option %d\n", OptionName); + return 0; + } + break; + + default: + DPRINT1("Set: Received unexpected %d option %d\n", Level, OptionName); + return 0; + } + + /* If we get here, GetAddressOption must return something valid */ + RealOptionName = GetAddressOption(Level, OptionName); + ASSERT(RealOptionName != 0); Info = HeapAlloc(GetProcessHeap(), 0, sizeof(*Info) + OptionLength); if (!Info) diff --git a/reactos/dll/win32/wshtcpip/wshtcpip.h b/reactos/dll/win32/wshtcpip/wshtcpip.h index 6a3ece000ee..f96a0eccc60 100644 --- a/reactos/dll/win32/wshtcpip/wshtcpip.h +++ b/reactos/dll/win32/wshtcpip/wshtcpip.h @@ -42,6 +42,7 @@ typedef struct _SOCKET_CONTEXT { DWORD AddrFileInstance; SOCKET_STATE SocketState; PQUEUED_REQUEST RequestQueue; + BOOL DontRoute; } SOCKET_CONTEXT, *PSOCKET_CONTEXT; #endif /* __WSHTCPIP_H */ -- 2.17.1