From 0e8f87ff82bc09c5ffeb865cc94ede0383af6977 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 4 Jul 2011 17:37:45 +0000 Subject: [PATCH] [MSAFD/AFD] - Pass the non-blocking information as a boolean (mswsock_new does this too) [AFD] - Don't block waiting for a connection to accept on a non-blocking listener svn path=/trunk/; revision=52537 --- reactos/dll/win32/msafd/misc/dllmain.c | 25 ++++++++++++++++++----- reactos/dll/win32/msafd/misc/event.c | 6 +++--- reactos/dll/win32/msafd/misc/sndrcv.c | 6 +++--- reactos/dll/win32/msafd/msafd.h | 6 ++++-- reactos/drivers/network/afd/afd/info.c | 6 +++--- reactos/drivers/network/afd/afd/listen.c | 4 ++++ reactos/drivers/network/afd/afd/read.c | 5 +++-- reactos/drivers/network/afd/afd/write.c | 4 ++-- reactos/drivers/network/afd/include/afd.h | 4 ++-- 9 files changed, 44 insertions(+), 22 deletions(-) diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index 0ebb244a529..43f2cdfb4b4 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -264,7 +264,7 @@ WSPSocket(int AddressFamily, /* Save Group Info */ if (g != 0) { - GetSocketInformation(Socket, AFD_INFO_GROUP_ID_TYPE, 0, &GroupData); + GetSocketInformation(Socket, AFD_INFO_GROUP_ID_TYPE, NULL, NULL, &GroupData); Socket->SharedData.GroupID = GroupData.u.LowPart; Socket->SharedData.GroupType = GroupData.u.HighPart; } @@ -272,11 +272,13 @@ WSPSocket(int AddressFamily, /* Get Window Sizes and Save them */ GetSocketInformation (Socket, AFD_INFO_SEND_WINDOW_SIZE, + NULL, &Socket->SharedData.SizeOfSendBuffer, NULL); GetSocketInformation (Socket, AFD_INFO_RECEIVE_WINDOW_SIZE, + NULL, &Socket->SharedData.SizeOfRecvBuffer, NULL); @@ -467,6 +469,7 @@ WSPCloseSocket(IN SOCKET Handle, /* Find out how many Sends are in Progress */ if (GetSocketInformation(Socket, AFD_INFO_SENDS_IN_PROGRESS, + NULL, &SendsInProgress, NULL)) { @@ -1951,6 +1954,7 @@ WSPIoctl(IN SOCKET Handle, { PSOCKET_INFORMATION Socket = NULL; BOOLEAN NeedsCompletion; + BOOLEAN NonBlocking; /* Get the Socket Structure associate to this Socket*/ Socket = GetSocketStructure(Handle); @@ -1970,8 +1974,9 @@ WSPIoctl(IN SOCKET Handle, *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - Socket->SharedData.NonBlocking = *((PULONG)lpvInBuffer) ? 1 : 0; - *lpErrno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, (PULONG)lpvInBuffer, NULL); + NonBlocking = *((PULONG)lpvInBuffer) ? TRUE : FALSE; + Socket->SharedData.NonBlocking = NonBlocking ? 1 : 0; + *lpErrno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &NonBlocking, NULL, NULL); if (*lpErrno != NO_ERROR) return SOCKET_ERROR; else @@ -1982,7 +1987,7 @@ WSPIoctl(IN SOCKET Handle, *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - *lpErrno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, (PULONG)lpvOutBuffer, NULL); + *lpErrno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, NULL, (PULONG)lpvOutBuffer, NULL); if (*lpErrno != NO_ERROR) return SOCKET_ERROR; else @@ -2258,6 +2263,7 @@ WSPCleanup(OUT LPINT lpErrno) int GetSocketInformation(PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, + PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL) { @@ -2309,6 +2315,10 @@ GetSocketInformation(PSOCKET_INFORMATION Socket, { *LargeInteger = InfoData.Information.LargeInteger; } + if (Boolean != NULL) + { + *Boolean = InfoData.Information.Boolean; + } NtClose( SockEvent ); @@ -2319,7 +2329,8 @@ GetSocketInformation(PSOCKET_INFORMATION Socket, int SetSocketInformation(PSOCKET_INFORMATION Socket, - ULONG AfdInformationClass, + ULONG AfdInformationClass, + PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL) { @@ -2349,6 +2360,10 @@ SetSocketInformation(PSOCKET_INFORMATION Socket, { InfoData.Information.LargeInteger = *LargeInteger; } + if (Boolean != NULL) + { + InfoData.Information.Boolean = *Boolean; + } AFD_DbgPrint(MID_TRACE,("XXX Info %x (Data %x)\n", AfdInformationClass, *Ulong)); diff --git a/reactos/dll/win32/msafd/misc/event.c b/reactos/dll/win32/msafd/misc/event.c index a1dc8766148..49ea595c6e0 100644 --- a/reactos/dll/win32/msafd/misc/event.c +++ b/reactos/dll/win32/msafd/misc/event.c @@ -26,7 +26,7 @@ WSPEventSelect( AFD_EVENT_SELECT_INFO EventSelectInfo; PSOCKET_INFORMATION Socket = NULL; NTSTATUS Status; - ULONG BlockMode; + BOOLEAN BlockMode; HANDLE SockEvent; Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE, @@ -44,8 +44,8 @@ WSPEventSelect( } /* Set Socket to Non-Blocking */ - BlockMode = 1; - SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL); + BlockMode = TRUE; + SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL); Socket->SharedData.NonBlocking = TRUE; /* Deactivate Async Select if there is one */ diff --git a/reactos/dll/win32/msafd/misc/sndrcv.c b/reactos/dll/win32/msafd/misc/sndrcv.c index ab74479ff9f..83b67c0c661 100644 --- a/reactos/dll/win32/msafd/misc/sndrcv.c +++ b/reactos/dll/win32/msafd/misc/sndrcv.c @@ -25,7 +25,7 @@ WSPAsyncSelect(IN SOCKET Handle, PSOCKET_INFORMATION Socket = NULL; PASYNC_DATA AsyncData; NTSTATUS Status; - ULONG BlockMode; + BOOLEAN BlockMode; /* Get the Socket Structure associated to this Socket */ Socket = GetSocketStructure(Handle); @@ -44,8 +44,8 @@ WSPAsyncSelect(IN SOCKET Handle, } /* Change the Socket to Non Blocking */ - BlockMode = 1; - SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL); + BlockMode = TRUE; + SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL); Socket->SharedData.NonBlocking = TRUE; /* Deactive WSPEventSelect */ diff --git a/reactos/dll/win32/msafd/msafd.h b/reactos/dll/win32/msafd/msafd.h index 52027581d0b..7f0d7b7b22b 100644 --- a/reactos/dll/win32/msafd/msafd.h +++ b/reactos/dll/win32/msafd/msafd.h @@ -417,14 +417,16 @@ VOID DeleteSocketStructure( SOCKET Handle ); int GetSocketInformation( PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, - PULONG Ulong OPTIONAL, + PBOOLEAN Boolean OPTIONAL, + PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL ); int SetSocketInformation( PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, - PULONG Ulong OPTIONAL, + PBOOLEAN Boolean OPTIONAL, + PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL ); diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index 1d3451c9e7c..523007a50ef 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -48,7 +48,7 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, break; case AFD_INFO_BLOCKING_MODE: - InfoReq->Information.Ulong = FCB->BlockingMode; + InfoReq->Information.Boolean = FCB->NonBlocking; break; case AFD_INFO_RECEIVE_CONTENT_SIZE: @@ -115,8 +115,8 @@ AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, _SEH2_TRY { switch (InfoReq->InformationClass) { case AFD_INFO_BLOCKING_MODE: - AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", InfoReq->Information.Ulong)); - FCB->BlockingMode = InfoReq->Information.Ulong; + AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", InfoReq->Information.Boolean)); + FCB->NonBlocking = InfoReq->Information.Boolean; break; default: AFD_DbgPrint(MIN_TRACE,("Unknown request %d\n", InfoReq->InformationClass)); diff --git a/reactos/drivers/network/afd/afd/listen.c b/reactos/drivers/network/afd/afd/listen.c index 2ba75925a40..27dd572f641 100644 --- a/reactos/drivers/network/afd/afd/listen.c +++ b/reactos/drivers/network/afd/afd/listen.c @@ -315,6 +315,10 @@ NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp, SocketStateUnlock( FCB ); return Status; + } else if (FCB->NonBlocking) { + AFD_DbgPrint(MID_TRACE,("No connection ready on a non-blocking socket\n")); + + return UnlockAndMaybeComplete(FCB, STATUS_CANT_WAIT, Irp, 0); } else { AFD_DbgPrint(MID_TRACE,("Holding\n")); diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index a3fbcbd7ffe..bf9430a3f58 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -346,7 +346,8 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, Status = ReceiveActivity( FCB, Irp ); - if( Status == STATUS_PENDING && (RecvReq->AfdFlags & AFD_IMMEDIATE) ) { + if( Status == STATUS_PENDING && + ((RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking)) ) { AFD_DbgPrint(MID_TRACE,("Nonblocking\n")); Status = STATUS_CANT_WAIT; TotalBytesCopied = 0; @@ -690,7 +691,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, return UnlockAndMaybeComplete ( FCB, Status, Irp, Irp->IoStatus.Information ); } - } else if( RecvReq->AfdFlags & AFD_IMMEDIATE ) { + } else if( (RecvReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking) ) { AFD_DbgPrint(MID_TRACE,("Nonblocking\n")); Status = STATUS_CANT_WAIT; FCB->PollState &= ~AFD_EVENT_RECEIVE; diff --git a/reactos/drivers/network/afd/afd/write.c b/reactos/drivers/network/afd/afd/write.c index 2059d2dace8..f8b62ee1849 100644 --- a/reactos/drivers/network/afd/afd/write.c +++ b/reactos/drivers/network/afd/afd/write.c @@ -340,7 +340,7 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, AFD_DbgPrint(MID_TRACE,("Socket state %d\n", FCB->State)); if( FCB->State != SOCKET_STATE_CONNECTED ) { - if( SendReq->AfdFlags & AFD_IMMEDIATE ) { + if( (SendReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking) ) { AFD_DbgPrint(MID_TRACE,("Nonblocking\n")); UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE ); return UnlockAndMaybeComplete @@ -404,7 +404,7 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, else { FCB->PollState &= ~AFD_EVENT_SEND; - if( SendReq->AfdFlags & AFD_IMMEDIATE ) { + if( (SendReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking) ) { AFD_DbgPrint(MID_TRACE,("Nonblocking\n")); UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE ); return UnlockAndMaybeComplete diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index 3090d83fca4..6fd04e9c822 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -173,8 +173,8 @@ typedef struct _AFD_STORED_DATAGRAM { } AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM; typedef struct _AFD_FCB { - BOOLEAN Locked, Critical, Overread; - UINT State, Flags, BlockingMode, GroupID, GroupType; + BOOLEAN Locked, Critical, Overread, NonBlocking; + UINT State, Flags, GroupID, GroupType; KIRQL OldIrql; UINT LockCount; PVOID CurrentThread;