[MSAFD]
authorCameron Gutman <aicommander@gmail.com>
Fri, 24 Aug 2012 06:23:45 +0000 (06:23 +0000)
committerCameron Gutman <aicommander@gmail.com>
Fri, 24 Aug 2012 06:23:45 +0000 (06:23 +0000)
- 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
reactos/dll/win32/wshtcpip/wshtcpip.c
reactos/dll/win32/wshtcpip/wshtcpip.h

index 3b4e65a..7068327 100644 (file)
@@ -2017,6 +2017,19 @@ WSPIoctl(IN  SOCKET Handle,
                                *lpcbBytesReturned = sizeof(ULONG);
                                return NO_ERROR;
                        }
                                *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;
         case SIO_GET_EXTENSION_FUNCTION_POINTER:
             *lpErrno = WSAEINVAL;
             return SOCKET_ERROR;
index f21833c..4c295cc 100644 (file)
@@ -161,6 +161,18 @@ GetAddressOption(INT Level, INT OptionName)
 {
     switch (Level)
     {
 {
     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)
           {
        case IPPROTO_IP:
           switch (OptionName)
           {
@@ -179,19 +191,26 @@ GetAddressOption(INT Level, INT OptionName)
                 return AO_OPTION_IP_HDRINCL;
 
              default:
                 return AO_OPTION_IP_HDRINCL;
 
              default:
-                DPRINT1("Unknown option name for IPPROTO_IP: %d\n", OptionName);
-                return 0;
+                break;
           }
           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:
 
        default:
-          DPRINT1("Unknown level: %d\n", Level);
           break;
     }
           break;
     }
+
+    DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
     return 0;
 }
 
     return 0;
 }
 
@@ -209,6 +228,10 @@ WSHGetSocketInformation(
 {
     UNIMPLEMENTED
 
 {
     UNIMPLEMENTED
 
+    DPRINT1("Get: Unknown level/option name: %d %d\n", Level, OptionName);
+
+    *OptionLength = 0;
+
     return NO_ERROR;
 }
 
     return NO_ERROR;
 }
 
@@ -318,6 +341,8 @@ WSHIoctl(
 {
     UNIMPLEMENTED
 
 {
     UNIMPLEMENTED
 
+    DPRINT1("Ioctl: Unknown IOCTL code: %d\n", IoControlCode);
+
     return NO_ERROR;
 }
 
     return NO_ERROR;
 }
 
@@ -626,11 +651,71 @@ WSHSetSocketInformation(
 
     /* FIXME: We only handle address file object here */
 
 
     /* 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)
 
     Info = HeapAlloc(GetProcessHeap(), 0, sizeof(*Info) + OptionLength);
     if (!Info)
index 6a3ece0..f96a0ec 100644 (file)
@@ -42,6 +42,7 @@ typedef struct _SOCKET_CONTEXT {
     DWORD AddrFileInstance;
     SOCKET_STATE SocketState;
     PQUEUED_REQUEST RequestQueue;
     DWORD AddrFileInstance;
     SOCKET_STATE SocketState;
     PQUEUED_REQUEST RequestQueue;
+    BOOL DontRoute;
 } SOCKET_CONTEXT, *PSOCKET_CONTEXT;
 
 #endif /* __WSHTCPIP_H */
 } SOCKET_CONTEXT, *PSOCKET_CONTEXT;
 
 #endif /* __WSHTCPIP_H */