[MSAFD]
[reactos.git] / reactos / dll / win32 / msafd / misc / dllmain.c
index b0b1f31..a5e33ae 100644 (file)
@@ -23,6 +23,7 @@ HANDLE GlobalHeap;
 WSPUPCALLTABLE Upcalls;
 LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
 PSOCKET_INFORMATION SocketListHead = NULL;
+CRITICAL_SECTION SocketListLock;
 LIST_ENTRY SockHelpersListHead = { NULL, NULL };
 ULONG SockAsyncThreadRefCount;
 HANDLE SockAsyncHelperAfdHandle;
@@ -280,8 +281,10 @@ WSPSocket(int AddressFamily,
                           NULL);
 
     /* Save in Process Sockets List */
+    EnterCriticalSection(&SocketListLock);
     Socket->NextSocket = SocketListHead;
     SocketListHead = Socket;
+    LeaveCriticalSection(&SocketListLock);
 
     /* Create the Socket Context */
     CreateContext(Socket);
@@ -379,24 +382,6 @@ TranslateNtStatusError(NTSTATUS Status)
     }
 }
 
-DWORD MsafdReturnWithErrno(NTSTATUS Status,
-                           LPINT Errno,
-                           DWORD Received,
-                           LPDWORD ReturnedBytes)
-{
-    *Errno = TranslateNtStatusError(Status);
-
-    if (ReturnedBytes)
-    {
-        if (!*Errno)
-            *ReturnedBytes = Received;
-        else
-            *ReturnedBytes = 0;
-    }
-
-    return *Errno ? SOCKET_ERROR : 0;
-}
-
 /*
  * FUNCTION: Closes an open socket
  * ARGUMENTS:
@@ -556,6 +541,7 @@ WSPCloseSocket(IN SOCKET Handle,
     NtClose(Socket->TdiConnectionHandle);
     Socket->TdiConnectionHandle = NULL;
 
+    EnterCriticalSection(&SocketListLock);
     if (SocketListHead == Socket)
     {
         SocketListHead = SocketListHead->NextSocket;
@@ -574,6 +560,7 @@ WSPCloseSocket(IN SOCKET Handle,
             CurrentSocket = CurrentSocket->NextSocket;
         }
     }
+    LeaveCriticalSection(&SocketListLock);
 
     HeapFree(GlobalHeap, 0, Socket);
 
@@ -2083,7 +2070,16 @@ WSPSetSockOpt(
     }
 
 
-    /* FIXME: We should handle some cases here */
+    /* FIXME: We should handle some more cases here */
+    if (level == SOL_SOCKET)
+    {
+        switch (optname)
+        {
+           case SO_BROADCAST:
+              Socket->SharedData.Broadcast = (*optval != 0) ? 1 : 0;
+              return 0;
+        }
+    }
 
 
     *lpErrno = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext,
@@ -2314,15 +2310,22 @@ GetSocketStructure(SOCKET Handle)
 {
     PSOCKET_INFORMATION CurrentSocket;
 
+    EnterCriticalSection(&SocketListLock);
+
     CurrentSocket = SocketListHead;
     while (CurrentSocket)
     {
         if (CurrentSocket->Handle == Handle)
+        {
+            LeaveCriticalSection(&SocketListLock);
             return CurrentSocket;
+        }
 
         CurrentSocket = CurrentSocket->NextSocket;
     }
 
+    LeaveCriticalSection(&SocketListLock);
+
     return NULL;
 }
 
@@ -2841,6 +2844,9 @@ DllMain(HANDLE hInstDll,
         /* Heap to use when allocating */
         GlobalHeap = GetProcessHeap();
 
+        /* Initialize the lock that protects our socket list */
+        InitializeCriticalSection(&SocketListLock);
+
         AFD_DbgPrint(MAX_TRACE, ("MSAFD.DLL has been loaded\n"));
 
         break;
@@ -2852,6 +2858,10 @@ DllMain(HANDLE hInstDll,
         break;
 
     case DLL_PROCESS_DETACH:
+
+        /* Delete the socket list lock */
+        DeleteCriticalSection(&SocketListLock);
+
         break;
     }