From: Peter Hater <7element@mail.bg> Date: Thu, 10 Nov 2016 17:55:00 +0000 (+0000) Subject: [MSAFD] Implement SO_CONNECT_TIME. CORE-12104 X-Git-Tag: ReactOS-0.4.4-FOSDEM2017~337 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=ad99a6f7fd581287166749b274401233e2388aee [MSAFD] Implement SO_CONNECT_TIME. CORE-12104 svn path=/trunk/; revision=73197 --- diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index cb80cab888d..00190a8a1b0 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -1320,6 +1320,21 @@ WSPSelect(IN int nfds, return HandleCount; } +DWORD +GetCurrentTimeInSeconds() +{ + FILETIME Time; + FILETIME Adjustment; + ULARGE_INTEGER lTime, lAdj; + SYSTEMTIME st = { 1970,1,0,1,0,0,0 }; + SystemTimeToFileTime(&st, &Adjustment); + memcpy(&lAdj, &Adjustment, sizeof(lAdj)); + GetSystemTimeAsFileTime(&Time); + memcpy(&lTime, &Time, sizeof(lTime)); + lTime.QuadPart -= lAdj.QuadPart; + return (DWORD)(lTime.QuadPart / 10000000LLU); +} + SOCKET WSPAPI WSPAccept(SOCKET Handle, @@ -1666,6 +1681,7 @@ WSPAccept(SOCKET Handle, } AcceptSocketInfo->SharedData->State = SocketConnected; + AcceptSocketInfo->SharedData->ConnectTime = GetCurrentTimeInSeconds(); /* Return Address in SOCKADDR FORMAT */ if( SocketAddress ) @@ -1884,6 +1900,7 @@ WSPConnect(SOCKET Handle, Socket->SharedData->State = SocketConnected; Socket->TdiConnectionHandle = (HANDLE)IOSB.Information; + Socket->SharedData->ConnectTime = GetCurrentTimeInSeconds(); /* Get any pending connect data */ if (lpCalleeData != NULL) @@ -2437,6 +2454,7 @@ WSPGetSockOpt(IN SOCKET Handle, PVOID Buffer; INT BufferSize; BOOL BoolBuffer; + DWORD DwordBuffer; INT Errno; TRACE("Called\n"); @@ -2542,6 +2560,12 @@ WSPGetSockOpt(IN SOCKET Handle, BufferSize = sizeof(INT); break; + case SO_CONNECT_TIME: + DwordBuffer = GetCurrentTimeInSeconds() - Socket->SharedData->ConnectTime; + Buffer = &DwordBuffer; + BufferSize = sizeof(DWORD); + break; + case SO_SNDTIMEO: Buffer = &Socket->SharedData->SendTimeout; BufferSize = sizeof(DWORD); diff --git a/reactos/dll/win32/msafd/msafd.h b/reactos/dll/win32/msafd/msafd.h index fcf70062ea4..fa3396ed004 100644 --- a/reactos/dll/win32/msafd/msafd.h +++ b/reactos/dll/win32/msafd/msafd.h @@ -59,6 +59,7 @@ typedef struct _SOCK_SHARED_INFO { ULONG RecvTimeout; ULONG SizeOfRecvBuffer; ULONG SizeOfSendBuffer; + ULONG ConnectTime; struct { BOOLEAN Listening:1; BOOLEAN Broadcast:1;