Revert r64621.
[reactos.git] / reactos / dll / win32 / wshtcpip / wshtcpip.c
index 65d7cb0..546dec1 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)
     {
@@ -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,15 +191,27 @@ 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 IPPROTO_TCP:
+          switch (OptionName)
+          {
+             case TCP_NODELAY:
+                 /* FIXME: Return proper option */
+                 ASSERT(FALSE);
+                 break;
+             default:
+                 break;
+          }
+
        default:
-          DPRINT1("Unknown level: %d\n", Level);
-          return 0;
+          break;
     }
+
+    DPRINT1("Unknown level/option name: %d %d\n", Level, OptionName);
+    return 0;
 }
 
 INT
@@ -204,6 +228,10 @@ WSHGetSocketInformation(
 {
     UNIMPLEMENTED
 
+    DPRINT1("Get: Unknown level/option name: %d %d\n", Level, OptionName);
+
+    *OptionLength = 0;
+
     return NO_ERROR;
 }
 
@@ -215,7 +243,7 @@ WSHGetWildcardSockaddr(
     OUT PSOCKADDR Sockaddr,
     OUT PINT SockaddrLength)
 {
-    DWORD Size = 2 * sizeof(UINT);
+    INT Size = 2 * sizeof(UINT);
 
     if (*SockaddrLength < Size)
     {
@@ -313,6 +341,8 @@ WSHIoctl(
 {
     UNIMPLEMENTED
 
+    DPRINT1("Ioctl: Unknown IOCTL code: %d\n", IoControlCode);
+
     return NO_ERROR;
 }
 
@@ -456,7 +486,7 @@ WSHNotify(
             }
             Context->RequestQueue = NULL;
             break;
-            
+
         default:
             DPRINT1("Unwanted notification received! (%d)\n", NotifyEvent);
             break;
@@ -523,7 +553,6 @@ WSHOpenSocket2(
     UNICODE_STRING TcpDeviceName = RTL_CONSTANT_STRING(DD_TCP_DEVICE_NAME);
     UNICODE_STRING UdpDeviceName = RTL_CONSTANT_STRING(DD_UDP_DEVICE_NAME);
     UNICODE_STRING RawDeviceName = RTL_CONSTANT_STRING(DD_RAW_IP_DEVICE_NAME);
-    NTSTATUS Status;
 
     DPRINT("WSHOpenSocket2 called\n");
 
@@ -562,7 +591,7 @@ WSHOpenSocket2(
         return WSAENOBUFS;
 
     /* Append the transport device name */
-    Status = RtlAppendUnicodeStringToString(TransportDeviceName, &String);
+    RtlAppendUnicodeStringToString(TransportDeviceName, &String);
 
     if (*SocketType == SOCK_RAW) {
         /* Append a separator */
@@ -575,7 +604,7 @@ WSHOpenSocket2(
         String.Length = 0;
         String.MaximumLength = TransportDeviceName->MaximumLength - TransportDeviceName->Length;
 
-        Status = RtlIntegerToUnicodeString((ULONG)*Protocol, 10, &String);
+        RtlIntegerToUnicodeString((ULONG)*Protocol, 10, &String);
 
         TransportDeviceName->Length += String.Length;
     }
@@ -622,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;
+
+        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;
 
-    /* FIXME: Support all options */
-    if (!RealOptionName)
-        return 0; /* return WSAEINVAL; */
+        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)