WSPUPCALLTABLE Upcalls;
LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
PSOCKET_INFORMATION SocketListHead = NULL;
+CRITICAL_SECTION SocketListLock;
LIST_ENTRY SockHelpersListHead = { NULL, NULL };
ULONG SockAsyncThreadRefCount;
HANDLE SockAsyncHelperAfdHandle;
ULONG SizeOfEA;
PAFD_CREATE_PACKET AfdPacket;
HANDLE Sock;
- PSOCKET_INFORMATION Socket = NULL, PrevSocket = NULL;
+ PSOCKET_INFORMATION Socket = NULL;
PFILE_FULL_EA_INFORMATION EABuffer = NULL;
PHELPER_DATA HelperData;
PVOID HelperDLLContext;
/* Save Handle */
Socket->Handle = (SOCKET)Sock;
- /* XXX See if there's a structure we can reuse -- We need to do this
- * more properly. */
- PrevSocket = GetSocketStructure( (SOCKET)Sock );
-
- if( PrevSocket )
- {
- RtlCopyMemory( PrevSocket, Socket, sizeof(*Socket) );
- RtlFreeHeap( GlobalHeap, 0, Socket );
- Socket = PrevSocket;
- }
-
/* Save Group Info */
if (g != 0)
{
NULL);
/* Save in Process Sockets List */
+ EnterCriticalSection(&SocketListLock);
Socket->NextSocket = SocketListHead;
SocketListHead = Socket;
+ LeaveCriticalSection(&SocketListLock);
/* Create the Socket Context */
CreateContext(Socket);
}
}
-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:
NtClose(Socket->TdiConnectionHandle);
Socket->TdiConnectionHandle = NULL;
+ EnterCriticalSection(&SocketListLock);
if (SocketListHead == Socket)
{
SocketListHead = SocketListHead->NextSocket;
CurrentSocket = CurrentSocket->NextSocket;
}
}
+ LeaveCriticalSection(&SocketListLock);
HeapFree(GlobalHeap, 0, Socket);
int
WSPAPI
-WSPSelect(int nfds,
- fd_set *readfds,
- fd_set *writefds,
- fd_set *exceptfds,
- const LPTIMEVAL timeout,
- LPINT lpErrno)
+WSPSelect(IN int nfds,
+ IN OUT fd_set *readfds OPTIONAL,
+ IN OUT fd_set *writefds OPTIONAL,
+ IN OUT fd_set *exceptfds OPTIONAL,
+ IN const struct timeval *timeout OPTIONAL,
+ OUT LPINT lpErrno)
{
IO_STATUS_BLOCK IOSB;
PAFD_POLL_INFO PollInfo;
}
- /* 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,
{
PSOCKET_INFORMATION CurrentSocket;
- if (!SocketListHead)
- return NULL;
-
- /* This is a special case */
- if (SocketListHead->Handle == Handle)
- return SocketListHead;
+ EnterCriticalSection(&SocketListLock);
CurrentSocket = SocketListHead;
- while (CurrentSocket->NextSocket)
+ while (CurrentSocket)
{
if (CurrentSocket->Handle == Handle)
+ {
+ LeaveCriticalSection(&SocketListLock);
return CurrentSocket;
+ }
CurrentSocket = CurrentSocket->NextSocket;
}
+ LeaveCriticalSection(&SocketListLock);
+
return NULL;
}
/* 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;
break;
case DLL_PROCESS_DETACH:
+
+ /* Delete the socket list lock */
+ DeleteCriticalSection(&SocketListLock);
+
break;
}