ws2_32: Properly implement getsockopt(SO_CONNECT_TIME).

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-08-18 23:25:50 -05:00 committed by Alexandre Julliard
parent 4af902eb4e
commit eec47af638
3 changed files with 26 additions and 21 deletions

View File

@ -1424,6 +1424,14 @@ int WINAPI getsockopt( SOCKET s, int level, int optname, char *optval, int *optl
return 0;
}
case SO_CONNECT_TIME:
if (!optlen || !optval)
{
SetLastError( WSAEFAULT );
return -1;
}
return server_getsockopt( s, IOCTL_AFD_WINE_GET_SO_CONNECT_TIME, optval, optlen );
case SO_DEBUG:
WARN( "returning 0 for SO_DEBUG\n" );
*(DWORD *)optval = 0;
@ -1450,27 +1458,6 @@ int WINAPI getsockopt( SOCKET s, int level, int optname, char *optval, int *optl
return ret;
}
case SO_CONNECT_TIME:
{
static int pretendtime = 0;
struct sockaddr addr;
int len = sizeof(addr);
if (!optlen || *optlen < sizeof(DWORD) || !optval)
{
SetLastError(WSAEFAULT);
return SOCKET_ERROR;
}
if (getpeername(s, &addr, &len) == SOCKET_ERROR)
*(DWORD *)optval = ~0u;
else
{
if (!pretendtime) FIXME("SO_CONNECT_TIME - faking results\n");
*(DWORD *)optval = pretendtime++;
}
*optlen = sizeof(DWORD);
return ret;
}
/* As mentioned in setsockopt, Windows ignores this, so we
* always return true here */
case SO_DONTROUTE:

View File

@ -233,6 +233,7 @@ struct afd_get_events_params
#define IOCTL_AFD_WINE_SET_IPV6_RECVPKTINFO WINE_AFD_IOC(289)
#define IOCTL_AFD_WINE_GET_IPV6_RECVTCLASS WINE_AFD_IOC(290)
#define IOCTL_AFD_WINE_SET_IPV6_RECVTCLASS WINE_AFD_IOC(291)
#define IOCTL_AFD_WINE_GET_SO_CONNECT_TIME WINE_AFD_IOC(292)
struct afd_create_params
{

View File

@ -2807,6 +2807,23 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
return 0;
}
case IOCTL_AFD_WINE_GET_SO_CONNECT_TIME:
{
DWORD time = ~0u;
if (get_reply_max_size() < sizeof(time))
{
set_error( STATUS_BUFFER_TOO_SMALL );
return 0;
}
if (sock->state == SOCK_CONNECTED)
time = (current_time - sock->connect_time) / 10000000;
set_reply_data( &time, sizeof(time) );
return 1;
}
default:
set_error( STATUS_NOT_SUPPORTED );
return 0;