Index: dll/win32/msafd/misc/dllmain.c =================================================================== --- dll/win32/msafd/misc/dllmain.c (revision 73196) +++ dll/win32/msafd/misc/dllmain.c (working copy) @@ -1320,6 +1320,21 @@ 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 @@ } AcceptSocketInfo->SharedData->State = SocketConnected; + AcceptSocketInfo->SharedData->ConnectTime = GetCurrentTimeInSeconds(); /* Return Address in SOCKADDR FORMAT */ if( SocketAddress ) @@ -1884,6 +1900,7 @@ 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 @@ PVOID Buffer; INT BufferSize; BOOL BoolBuffer; + DWORD DwordBuffer; INT Errno; TRACE("Called\n"); @@ -2542,6 +2560,12 @@ 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); Index: dll/win32/msafd/msafd.h =================================================================== --- dll/win32/msafd/msafd.h (revision 73196) +++ dll/win32/msafd/msafd.h (working copy) @@ -59,6 +59,7 @@ ULONG RecvTimeout; ULONG SizeOfRecvBuffer; ULONG SizeOfSendBuffer; + ULONG ConnectTime; struct { BOOLEAN Listening:1; BOOLEAN Broadcast:1;