From a7c62fa529bec8787c80fd1cd5f1a6e682b97b74 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 28 Dec 2004 11:39:05 +0000 Subject: [PATCH] - Fix WSPSelect. - Partial implementation of WSPGetSockOpt. svn path=/trunk/; revision=12376 --- reactos/lib/msafd/include/msafd.h | 8 +- reactos/lib/msafd/misc/dllmain.c | 136 ++++++++++++++++++++++++++---- reactos/lib/msafd/misc/sndrcv.c | 2 +- reactos/lib/msafd/misc/stubs.c | 18 +--- 4 files changed, 127 insertions(+), 37 deletions(-) diff --git a/reactos/lib/msafd/include/msafd.h b/reactos/lib/msafd/include/msafd.h index 46e55c7c21c..8c9c4b40069 100644 --- a/reactos/lib/msafd/include/msafd.h +++ b/reactos/lib/msafd/include/msafd.h @@ -154,7 +154,7 @@ WSPAsyncSelect( INT WSPAPI WSPBind( IN SOCKET s, - IN CONST LPSOCKADDR name, + IN CONST SOCKADDR *name, IN INT namelen, OUT LPINT lpErrno); @@ -178,7 +178,7 @@ INT WSPAPI WSPConnect( IN SOCKET s, - IN CONST LPSOCKADDR name, + IN CONST SOCKADDR *name, IN INT namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, @@ -273,7 +273,7 @@ SOCKET WSPAPI WSPJoinLeaf( IN SOCKET s, - IN CONST LPSOCKADDR name, + IN CONST SOCKADDR *name, IN INT namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, @@ -362,7 +362,7 @@ WSPSendTo( IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesSent, IN DWORD dwFlags, - IN CONST LPSOCKADDR lpTo, + IN CONST SOCKADDR *lpTo, IN INT iTolen, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, diff --git a/reactos/lib/msafd/misc/dllmain.c b/reactos/lib/msafd/misc/dllmain.c index df13911d807..3509949bddc 100644 --- a/reactos/lib/msafd/misc/dllmain.c +++ b/reactos/lib/msafd/misc/dllmain.c @@ -23,7 +23,7 @@ DWORD DebugTraceLevel = 0; HANDLE GlobalHeap; WSPUPCALLTABLE Upcalls; LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest; -ULONG SocketCount; +ULONG SocketCount = 0; PSOCKET_INFORMATION *Sockets = NULL; LIST_ENTRY SockHelpersListHead = {NULL}; ULONG SockAsyncThreadRefCount; @@ -271,7 +271,7 @@ DWORD MsafdReturnWithErrno( NTSTATUS Status, LPINT Errno, DWORD Received, case STATUS_PENDING: *Errno = WSA_IO_PENDING; break; case STATUS_BUFFER_OVERFLOW: *Errno = WSAEMSGSIZE; break; default: { - DbgPrint("MSAFD: Error %d is unknown\n", Errno); + DbgPrint("MSAFD: Error %x is unknown\n", Status); *Errno = WSAEINVAL; break; } break; } @@ -421,7 +421,7 @@ INT WSPAPI WSPBind( SOCKET Handle, - struct sockaddr *SocketAddress, + const struct sockaddr *SocketAddress, int SocketAddressLength, LPINT lpErrno) /* @@ -608,26 +608,29 @@ WSPSelect( if (readfds != NULL) { for (i = 0; i < readfds->fd_count; i++, j++) { PollInfo->Handles[j].Handle = readfds->fd_array[i]; - PollInfo->Handles[j].Events = AFD_EVENT_RECEIVE | AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT; + PollInfo->Handles[j].Events = AFD_EVENT_RECEIVE | + AFD_EVENT_DISCONNECT | + AFD_EVENT_ABORT | + AFD_EVENT_ACCEPT; } } if (writefds != NULL) { for (i = 0; i < writefds->fd_count; i++, j++) { PollInfo->Handles[j].Handle = writefds->fd_array[i]; - PollInfo->Handles[j].Events |= AFD_EVENT_SEND; - } - + PollInfo->Handles[j].Events = AFD_EVENT_SEND | + AFD_EVENT_CONNECT; + } } if (exceptfds != NULL) { for (i = 0; i < exceptfds->fd_count; i++, j++) { PollInfo->Handles[j].Handle = exceptfds->fd_array[i]; - PollInfo->Handles[j].Events |= - AFD_EVENT_OOB_RECEIVE | AFD_EVENT_CONNECT_FAIL; + PollInfo->Handles[j].Events = AFD_EVENT_OOB_RECEIVE | + AFD_EVENT_CONNECT_FAIL; } } /* Send IOCTL */ - Status = NtDeviceIoControlFile( (HANDLE)Sockets[0]->Handle, + Status = NtDeviceIoControlFile( (HANDLE)PollInfo->Handles[0].Handle, SockEvent, NULL, NULL, @@ -988,7 +991,7 @@ int WSPAPI WSPConnect( SOCKET Handle, - struct sockaddr * SocketAddress, + const struct sockaddr * SocketAddress, int SocketAddressLength, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, @@ -1318,12 +1321,115 @@ WSPIoctl( AFD_DbgPrint(MID_TRACE,("[%x] Set nonblocking %d\n", Handle, Socket->SharedData.NonBlocking)); return 0; + default: + *lpErrno = WSAEINVAL; return SOCKET_ERROR; } } +INT +WSPAPI +WSPGetSockOpt( + IN SOCKET Handle, + IN INT Level, + IN INT OptionName, + OUT CHAR FAR* OptionValue, + IN OUT LPINT OptionLength, + OUT LPINT lpErrno) +{ + PSOCKET_INFORMATION Socket = NULL; + PVOID Buffer; + INT BufferSize; + BOOLEAN BoolBuffer; + + /* Get the Socket Structure associate to this Socket*/ + Socket = GetSocketStructure(Handle); + if (Socket == NULL) + { + *lpErrno = WSAENOTSOCK; + return SOCKET_ERROR; + } + + AFD_DbgPrint(MID_TRACE, ("Called\n")); + + switch (Level) + { + case SOL_SOCKET: + switch (OptionName) + { + case SO_TYPE: + Buffer = &Socket->SharedData.SocketType; + BufferSize = sizeof(INT); + break; + + case SO_RCVBUF: + Buffer = &Socket->SharedData.SizeOfRecvBuffer; + BufferSize = sizeof(INT); + break; + + case SO_SNDBUF: + Buffer = &Socket->SharedData.SizeOfSendBuffer; + BufferSize = sizeof(INT); + break; + + case SO_ACCEPTCONN: + BoolBuffer = Socket->SharedData.Listening; + Buffer = &BoolBuffer; + BufferSize = sizeof(BOOLEAN); + break; + + case SO_BROADCAST: + BoolBuffer = Socket->SharedData.Broadcast; + Buffer = &BoolBuffer; + BufferSize = sizeof(BOOLEAN); + break; + + case SO_DEBUG: + BoolBuffer = Socket->SharedData.Debug; + Buffer = &BoolBuffer; + BufferSize = sizeof(BOOLEAN); + break; + + /* case SO_CONDITIONAL_ACCEPT: */ + case SO_DONTLINGER: + case SO_DONTROUTE: + case SO_ERROR: + case SO_GROUP_ID: + case SO_GROUP_PRIORITY: + case SO_KEEPALIVE: + case SO_LINGER: + case SO_MAX_MSG_SIZE: + case SO_OOBINLINE: + case SO_PROTOCOL_INFO: + case SO_REUSEADDR: + AFD_DbgPrint(MID_TRACE, ("Unimplemented option (%x)\n", + OptionName)); + + default: + *lpErrno = WSAEINVAL; + return SOCKET_ERROR; + } + + if (*OptionLength < BufferSize) + { + *lpErrno = WSAEFAULT; + *OptionLength = BufferSize; + return SOCKET_ERROR; + } + RtlCopyMemory(OptionValue, Buffer, BufferSize); + + return 0; + + case IPPROTO_TCP: /* FIXME */ + default: + *lpErrno = WSAEINVAL; + return SOCKET_ERROR; + } +} + + INT WSPAPI WSPStartup( @@ -1356,11 +1462,11 @@ WSPStartup( lpProcTable->lpWSPAccept = WSPAccept; lpProcTable->lpWSPAddressToString = WSPAddressToString; lpProcTable->lpWSPAsyncSelect = WSPAsyncSelect; - lpProcTable->lpWSPBind = (LPWSPBIND)WSPBind; + lpProcTable->lpWSPBind = WSPBind; lpProcTable->lpWSPCancelBlockingCall = WSPCancelBlockingCall; lpProcTable->lpWSPCleanup = WSPCleanup; lpProcTable->lpWSPCloseSocket = WSPCloseSocket; - lpProcTable->lpWSPConnect = (LPWSPCONNECT)WSPConnect; + lpProcTable->lpWSPConnect = WSPConnect; lpProcTable->lpWSPDuplicateSocket = WSPDuplicateSocket; lpProcTable->lpWSPEnumNetworkEvents = WSPEnumNetworkEvents; lpProcTable->lpWSPEventSelect = WSPEventSelect; @@ -1370,7 +1476,7 @@ WSPStartup( lpProcTable->lpWSPGetSockOpt = WSPGetSockOpt; lpProcTable->lpWSPGetQOSByName = WSPGetQOSByName; lpProcTable->lpWSPIoctl = WSPIoctl; - lpProcTable->lpWSPJoinLeaf = (LPWSPJOINLEAF)WSPJoinLeaf; + lpProcTable->lpWSPJoinLeaf = WSPJoinLeaf; lpProcTable->lpWSPListen = WSPListen; lpProcTable->lpWSPRecv = WSPRecv; lpProcTable->lpWSPRecvDisconnect = WSPRecvDisconnect; @@ -1378,7 +1484,7 @@ WSPStartup( lpProcTable->lpWSPSelect = WSPSelect; lpProcTable->lpWSPSend = WSPSend; lpProcTable->lpWSPSendDisconnect = WSPSendDisconnect; - lpProcTable->lpWSPSendTo = (LPWSPSENDTO)WSPSendTo; + lpProcTable->lpWSPSendTo = WSPSendTo; lpProcTable->lpWSPSetSockOpt = WSPSetSockOpt; lpProcTable->lpWSPShutdown = WSPShutdown; lpProcTable->lpWSPSocket = WSPSocket; diff --git a/reactos/lib/msafd/misc/sndrcv.c b/reactos/lib/msafd/misc/sndrcv.c index e5c0a277ea0..8ef096ff07a 100644 --- a/reactos/lib/msafd/misc/sndrcv.c +++ b/reactos/lib/msafd/misc/sndrcv.c @@ -475,7 +475,7 @@ WSPSendTo( DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD iFlags, - struct sockaddr *SocketAddress, + const struct sockaddr *SocketAddress, int SocketAddressLength, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, diff --git a/reactos/lib/msafd/misc/stubs.c b/reactos/lib/msafd/misc/stubs.c index cae6c2dfb21..349a8d11891 100644 --- a/reactos/lib/msafd/misc/stubs.c +++ b/reactos/lib/msafd/misc/stubs.c @@ -81,27 +81,11 @@ WSPGetQOSByName( } -INT -WSPAPI -WSPGetSockOpt( - IN SOCKET s, - IN INT level, - IN INT optname, - OUT CHAR FAR* optval, - IN OUT LPINT optlen, - OUT LPINT lpErrno) -{ - UNIMPLEMENTED - - return 0; -} - - SOCKET WSPAPI WSPJoinLeaf( IN SOCKET s, - IN CONST LPSOCKADDR name, + IN CONST SOCKADDR *name, IN INT namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData,