Author: cgutman
Date: Mon Jul  4 17:37:45 2011
New Revision: 52537

URL: http://svn.reactos.org/svn/reactos?rev=52537&view=rev
Log:
[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

Modified:
    trunk/reactos/dll/win32/msafd/misc/dllmain.c
    trunk/reactos/dll/win32/msafd/misc/event.c
    trunk/reactos/dll/win32/msafd/misc/sndrcv.c
    trunk/reactos/dll/win32/msafd/msafd.h
    trunk/reactos/drivers/network/afd/afd/info.c
    trunk/reactos/drivers/network/afd/afd/listen.c
    trunk/reactos/drivers/network/afd/afd/read.c
    trunk/reactos/drivers/network/afd/afd/write.c
    trunk/reactos/drivers/network/afd/include/afd.h

Modified: trunk/reactos/dll/win32/msafd/misc/dllmain.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msafd/misc/dllmain.c?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msafd/misc/dllmain.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msafd/misc/dllmain.c [iso-8859-1] Mon Jul  4 
17:37:45 2011
@@ -264,7 +264,7 @@
     /* 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 @@
     /* 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 @@
             /* Find out how many Sends are in Progress */
             if (GetSocketInformation(Socket,
                                      AFD_INFO_SENDS_IN_PROGRESS,
+                                     NULL,
                                      &SendsInProgress,
                                      NULL))
             {
@@ -1951,6 +1954,7 @@
 {
     PSOCKET_INFORMATION Socket = NULL;
        BOOLEAN NeedsCompletion;
+    BOOLEAN NonBlocking;
 
     /* Get the Socket Structure associate to this Socket*/
     Socket = GetSocketStructure(Handle);
@@ -1970,8 +1974,9 @@
                 *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 @@
                 *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 @@
 int 
 GetSocketInformation(PSOCKET_INFORMATION Socket, 
                      ULONG AfdInformationClass, 
+                     PBOOLEAN Boolean OPTIONAL,
                      PULONG Ulong OPTIONAL, 
                      PLARGE_INTEGER LargeInteger OPTIONAL)
 {
@@ -2309,6 +2315,10 @@
     {
         *LargeInteger = InfoData.Information.LargeInteger;
     }
+    if (Boolean != NULL)
+    {
+        *Boolean = InfoData.Information.Boolean;
+    }
 
     NtClose( SockEvent );
 
@@ -2319,7 +2329,8 @@
 
 int 
 SetSocketInformation(PSOCKET_INFORMATION Socket, 
-                     ULONG AfdInformationClass, 
+                     ULONG AfdInformationClass,
+                     PBOOLEAN Boolean OPTIONAL,
                      PULONG Ulong OPTIONAL, 
                      PLARGE_INTEGER LargeInteger OPTIONAL)
 {
@@ -2348,6 +2359,10 @@
     if (LargeInteger != NULL)
     {
         InfoData.Information.LargeInteger = *LargeInteger;
+    }
+    if (Boolean != NULL)
+    {
+        InfoData.Information.Boolean = *Boolean;
     }
 
     AFD_DbgPrint(MID_TRACE,("XXX Info %x (Data %x)\n",

Modified: trunk/reactos/dll/win32/msafd/misc/event.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msafd/misc/event.c?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msafd/misc/event.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msafd/misc/event.c [iso-8859-1] Mon Jul  4 17:37:45 
2011
@@ -26,7 +26,7 @@
        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 @@
        }
 
        /* 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 */

Modified: trunk/reactos/dll/win32/msafd/misc/sndrcv.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msafd/misc/sndrcv.c?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msafd/misc/sndrcv.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msafd/misc/sndrcv.c [iso-8859-1] Mon Jul  4 
17:37:45 2011
@@ -25,7 +25,7 @@
     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 @@
     }
 
     /* 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 */

Modified: trunk/reactos/dll/win32/msafd/msafd.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msafd/msafd.h?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msafd/msafd.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msafd/msafd.h [iso-8859-1] Mon Jul  4 17:37:45 2011
@@ -417,14 +417,16 @@
 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
 );
 

Modified: trunk/reactos/drivers/network/afd/afd/info.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/info.c?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] Mon Jul  4 
17:37:45 2011
@@ -48,7 +48,7 @@
            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 @@
     _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));

Modified: trunk/reactos/drivers/network/afd/afd/listen.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/listen.c?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] Mon Jul  4 
17:37:45 2011
@@ -315,6 +315,10 @@
 
        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"));
 

Modified: trunk/reactos/drivers/network/afd/afd/read.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/read.c?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] Mon Jul  4 
17:37:45 2011
@@ -346,7 +346,8 @@
 
     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 @@
                        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;

Modified: trunk/reactos/drivers/network/afd/afd/write.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/write.c?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] Mon Jul  4 
17:37:45 2011
@@ -340,7 +340,7 @@
     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 @@
     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

Modified: trunk/reactos/drivers/network/afd/include/afd.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/include/afd.h?rev=52537&r1=52536&r2=52537&view=diff
==============================================================================
--- trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] Mon Jul  4 
17:37:45 2011
@@ -173,8 +173,8 @@
 } 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;


Reply via email to