[WSHTCPIP]
[reactos.git] / reactos / dll / win32 / wshtcpip / wshtcpip.c
index f9393a0..f568f09 100644 (file)
@@ -7,7 +7,7 @@
  * REVISIONS:
  *   CSH 01/09-2000 Created
  */
-#include <wshtcpip.h>
+#include "wshtcpip.h"
 #define NDEBUG
 #include <debug.h>
 
@@ -75,7 +75,7 @@ WSHGetBroadcastSockaddr(
     OUT PSOCKADDR Sockaddr,
     OUT PINT SockaddrLength)
 {
-    DWORD Size = 2 * sizeof(UINT);
+    INT Size = 2 * sizeof(UINT);
 
     if (*SockaddrLength < Size)
     {
@@ -156,38 +156,74 @@ WSHGetSockaddrType(
     return NO_ERROR;
 }
 
-UINT
-GetAddressOption(INT Level, INT OptionName)
+static
+void
+GetTdiTypeId(
+    _In_ INT Level,
+    _In_ INT OptionName,
+    _Out_ PULONG TdiType,
+    _Out_ PULONG TdiId)
 {
     switch (Level)
     {
+       case SOL_SOCKET:
+          *TdiType = INFO_TYPE_ADDRESS_OBJECT;
+          switch (OptionName)
+          {
+             case SO_KEEPALIVE:
+                /* FIXME: Return proper option */
+                ASSERT(FALSE);
+                break;
+             default:
+                break;
+          }
+          break;
+
        case IPPROTO_IP:
+          *TdiType = INFO_TYPE_ADDRESS_OBJECT;
           switch (OptionName)
           {
              case IP_TTL:
-                return AO_OPTION_TTL;
+                *TdiId = AO_OPTION_TTL;
+                return;
 
              case IP_DONTFRAGMENT:
-                return AO_OPTION_IP_DONTFRAGMENT;
+                 *TdiId = AO_OPTION_IP_DONTFRAGMENT;
+                 return;
 
 #if 0
              case IP_RECEIVE_BROADCAST:
-                return AO_OPTION_BROADCAST;
+                 *TdiId = AO_OPTION_BROADCAST;
+                 return;
 #endif
 
              case IP_HDRINCL:
-                return AO_OPTION_IP_HDRINCL;
+                 *TdiId = AO_OPTION_IP_HDRINCL;
+                 return;
 
              default:
-                DPRINT1("Unknown option name for IPPROTO_IP: %d\n", OptionName);
-                return 0;
+                break;
           }
           break;
 
+       case IPPROTO_TCP:
+          switch (OptionName)
+          {
+              *TdiType = INFO_TYPE_CONNECTION;
+             case TCP_NODELAY:
+                 *TdiId = TCP_SOCKET_NODELAY;
+                 return;
+             default:
+                 break;
+          }
+
        default:
-          DPRINT1("Unknown level: %d\n", Level);
-          return 0;
+          break;
     }
+
+    DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
+    *TdiType = 0;
+    *TdiId = 0;
 }
 
 INT
@@ -204,6 +240,10 @@ WSHGetSocketInformation(
 {
     UNIMPLEMENTED
 
+    DPRINT1("Get: Unknown level/option name: %d %d\n", Level, OptionName);
+
+    *OptionLength = 0;
+
     return NO_ERROR;
 }
 
@@ -215,7 +255,7 @@ WSHGetWildcardSockaddr(
     OUT PSOCKADDR Sockaddr,
     OUT PINT SockaddrLength)
 {
-    DWORD Size = 2 * sizeof(UINT);
+    INT Size = 2 * sizeof(UINT);
 
     if (*SockaddrLength < Size)
     {
@@ -313,6 +353,8 @@ WSHIoctl(
 {
     UNIMPLEMENTED
 
+    DPRINT1("Ioctl: Unknown IOCTL code: %d\n", IoControlCode);
+
     return NO_ERROR;
 }
 
@@ -456,7 +498,7 @@ WSHNotify(
             }
             Context->RequestQueue = NULL;
             break;
-            
+
         default:
             DPRINT1("Unwanted notification received! (%d)\n", NotifyEvent);
             break;
@@ -612,7 +654,7 @@ WSHSetSocketInformation(
     IN  INT OptionLength)
 {
     PSOCKET_CONTEXT Context = HelperDllSocketContext;
-    UINT RealOptionName;
+    ULONG TdiType, TdiId;
     INT Status;
     PTCP_REQUEST_SET_INFORMATION_EX Info;
     PQUEUED_REQUEST Queued, NextQueued;
@@ -621,11 +663,73 @@ 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;
+
+        case IPPROTO_TCP:
+            switch (OptionName)
+            {
+                case TCP_NODELAY:
+                    if (OptionLength < sizeof(CHAR))
+                    {
+                        return WSAEFAULT;
+                    }
+                    break;
+
+                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;
+    }
 
-    /* FIXME: Support all options */
-    if (!RealOptionName)
-        return 0; /* return WSAEINVAL; */
+    /* If we get here, GetAddressOption must return something valid */
+    GetTdiTypeId(Level, OptionName, &TdiId, &TdiType);
+    ASSERT((TdiId != 0) && (TdiType != 0));
 
     Info = HeapAlloc(GetProcessHeap(), 0, sizeof(*Info) + OptionLength);
     if (!Info)
@@ -634,8 +738,8 @@ WSHSetSocketInformation(
     Info->ID.toi_entity.tei_entity = Context->AddrFileEntityType;
     Info->ID.toi_entity.tei_instance = Context->AddrFileInstance;
     Info->ID.toi_class = INFO_CLASS_PROTOCOL;
-    Info->ID.toi_type = INFO_TYPE_ADDRESS_OBJECT;
-    Info->ID.toi_id = RealOptionName;
+    Info->ID.toi_type = TdiType;
+    Info->ID.toi_id = TdiId;
     Info->BufferSize = OptionLength;
     memcpy(Info->Buffer, OptionValue, OptionLength);