ReactOS 0.4.15-dev-7958-gcd0bb1a
sock.c File Reference
#include <ntstatus.h>
#include <winsock2.h>
#include <windows.h>
#include <winternl.h>
#include <ws2tcpip.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <mswsock.h>
#include <mstcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include "wine/test.h"
Include dependency graph for sock.c:

Go to the source code of this file.

Classes

struct  thread_info
 
struct  sock_info
 
struct  test_params
 
struct  server_params
 
struct  client_params
 
struct  test_setup
 
struct  server_memory
 
struct  client_memory
 
struct  select_thread_params
 
struct  addr_hint_tests
 
struct  async_message
 
struct  write_watch_thread_args
 
struct  wsa_async_select_info
 
struct  wsa_recv_info
 

Macros

#define WIN32_NO_STATUS
 
#define WSA_CMSG_ALIGN(len)   (((len) + sizeof(SIZE_T) - 1) & ~(sizeof(SIZE_T) - 1))
 
#define MAX_CLIENTS   4 /* Max number of clients */
 
#define FIRST_CHAR   'A' /* First character in transferred pattern */
 
#define BIND_SLEEP   10 /* seconds to wait between attempts to bind() */
 
#define BIND_TRIES   6 /* Number of bind() attempts */
 
#define TEST_TIMEOUT
 
#define NUM_UDP_PEERS   3 /* Number of UDP sockets to create and test > 1 */
 
#define NUM_THREADS   3 /* Number of threads to run getservbyname */
 
#define NUM_QUERIES   250 /* Number of getservbyname queries per thread */
 
#define SERVERIP   "127.0.0.1" /* IP to bind to */
 
#define SERVERPORT   9374 /* Port number to bind to */
 
#define wsa_ok(op, cond, msg)
 
#define make_keepalive(k, enable, time, interval)
 
#define SOCKTIMEOUT1
 
#define SOCKTIMEOUT2   997000 /* 997 seconds */
 
#define IP_PKTINFO_LEN   (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo)))
 
#define STD_STREAM_SOCKET
 
#define FD_ZERO_ALL()   { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }
 
#define FD_SET_ALL(s)   { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }
 
#define WM_SOCKET   (WM_USER+100)
 
#define ok_event_seq   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : ok_event_sequence
 
#define POLL_CLEAR()   ix = 0
 
#define POLL_SET(s, ev)   {fds[ix].fd = s; fds[ix++].events = ev;}
 
#define POLL_ISSET(s, rev)   poll_isset(fds, ix, s, rev)
 
#define compare_file(h, s, o)   compare_file2(h,s,o,__FILE__,__LINE__)
 
#define WM_ASYNCCOMPLETE   (WM_USER + 100)
 

Typedefs

typedef struct thread_info thread_info
 
typedef struct sock_info sock_info
 
typedef struct test_params test_params
 
typedef struct server_params server_params
 
typedef struct client_params client_params
 
typedef struct test_setup test_setup
 
typedef struct server_memory server_memory
 
typedef struct client_memory client_memory
 
typedef struct select_thread_params select_thread_params
 
typedef struct async_message async_message
 

Functions

static void (WINAPI *pfreeaddrinfo)(struct addrinfo *)
 
static int (WINAPI *pgetaddrinfo)(LPCSTR
 
static PCSTR (WINAPI *pInetNtop)(INT
 
static PCWSTR (WINAPI *pInetNtopW)(INT
 
static NTSTATUS (WINAPI *pNtSetInformationFile)(HANDLE
 
static DWORD (WINAPI *pGetAdaptersInfo)(PIP_ADAPTER_INFO
 
static SOCKET setup_server_socket (struct sockaddr_in *addr, int *len)
 
static SOCKET setup_connector_socket (struct sockaddr_in *addr, int len, BOOL nonblock)
 
static int tcp_socketpair (SOCKET *src, SOCKET *dst)
 
static int tcp_socketpair_ovl (SOCKET *src, SOCKET *dst)
 
static void set_so_opentype (BOOL overlapped)
 
static int set_blocking (SOCKET s, BOOL blocking)
 
static void fill_buffer (char *buf, int chunk_size, int n_chunks)
 
static int test_buffer (char *buf, int chunk_size, int n_chunks)
 
static void read_zero_bytes (SOCKET s)
 
static int do_synchronous_send (SOCKET s, char *buf, int buflen, int flags, int sendlen)
 
static int do_synchronous_recv (SOCKET s, char *buf, int buflen, int flags, int recvlen)
 
static int do_synchronous_recvfrom (SOCKET s, char *buf, int buflen, int flags, struct sockaddr *from, int *fromlen, int recvlen)
 
static void check_so_opentype (void)
 
static void compare_addrinfo (ADDRINFO *a, ADDRINFO *b)
 
static void compare_addrinfow (ADDRINFOW *a, ADDRINFOW *b)
 
static void do_bind (SOCKET s, struct sockaddr *addr, int addrlen)
 
static void server_start (server_params *par)
 
static void server_stop (void)
 
static void client_start (client_params *par)
 
static void client_stop (void)
 
static VOID WINAPI simple_server (server_params *par)
 
static VOID WINAPI oob_server (server_params *par)
 
static VOID WINAPI select_server (server_params *par)
 
static VOID WINAPI simple_client (client_params *par)
 
static VOID WINAPI oob_client (client_params *par)
 
static VOID WINAPI simple_mixed_client (client_params *par)
 
static void WINAPI event_client (client_params *par)
 
static void test_WithoutWSAStartup (void)
 
static void test_WithWSAStartup (void)
 
static void Init (void)
 
static void Exit (void)
 
static void StartServer (LPTHREAD_START_ROUTINE routine, test_params *general, server_params *par)
 
static void StartClients (LPTHREAD_START_ROUTINE routine, test_params *general, client_params *par)
 
static void do_test (test_setup *test)
 
static void test_set_getsockopt (void)
 
static void test_so_reuseaddr (void)
 
static void test_ip_pktinfo (void)
 
static void test_UDP (void)
 
static DWORD WINAPI do_getservbyname (void *param)
 
static void test_getservbyname (void)
 
static void test_WSASocket (void)
 
static void test_WSADuplicateSocket (void)
 
static void test_WSAEnumNetworkEvents (void)
 
static void test_WSAAddressToStringA (void)
 
static void test_WSAAddressToStringW (void)
 
static void test_WSAStringToAddressA (void)
 
static void test_WSAStringToAddressW (void)
 
static DWORD WINAPI SelectReadThread (void *param)
 
static DWORD WINAPI SelectCloseThread (void *param)
 
static void test_errors (void)
 
static void test_listen (void)
 
static void test_select (void)
 
static DWORD WINAPI AcceptKillThread (void *param)
 
static int CALLBACK AlwaysDeferConditionFunc (LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos, LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData, GROUP *g, DWORD_PTR dwCallbackData)
 
static void test_accept (void)
 
static void test_extendedSocketOptions (void)
 
static void test_getsockname (void)
 
static void test_dns (void)
 
int WINAPI gethostname (char *name, int namelen)
 
static void test_gethostbyname (void)
 
static void test_gethostbyname_hack (void)
 
static void test_gethostname (void)
 
static void test_inet_addr (void)
 
static void test_addr_to_print (void)
 
static void test_inet_pton (void)
 
static void test_ioctlsocket (void)
 
static DWORD WINAPI drain_socket_thread (LPVOID arg)
 
static void test_send (void)
 
static LRESULT CALLBACK ws2_test_WndProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
 
static void get_event_details (int event, int *bit, char *name)
 
static const chardbgstr_event_seq (const LPARAM *seq)
 
static chardbgstr_event_seq_result (SOCKET s, WSANETWORKEVENTS *netEvents)
 
static void flush_events (SOCKET s, HANDLE hEvent)
 
static int match_event_sequence (SOCKET s, WSANETWORKEVENTS *netEvents, const LPARAM *seq)
 
static void ok_event_sequence (SOCKET s, HANDLE hEvent, const LPARAM *seq, const LPARAM **broken_seqs, int completelyBroken)
 
static void test_events (int useMessages)
 
static void test_ipv6only (void)
 
static void test_WSASendMsg (void)
 
static void test_WSASendTo (void)
 
static DWORD WINAPI recv_thread (LPVOID arg)
 
static void WINAPI io_completion (DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags)
 
static void test_WSARecv (void)
 
static DWORD CALLBACK write_watch_thread (void *arg)
 
static void test_write_watch (void)
 
static BOOL poll_isset (WSAPOLLFD *fds, int max, SOCKET s, int rev)
 
static void test_WSAPoll (void)
 
static void test_GetAddrInfoW (void)
 
static void test_GetAddrInfoExW (void)
 
static void verify_ipv6_addrinfo (ADDRINFOA *result, const char *expectedIp)
 
static void test_getaddrinfo (void)
 
static void test_ConnectEx (void)
 
static void test_AcceptEx (void)
 
static void test_DisconnectEx (void)
 
static void compare_file2 (HANDLE handle, SOCKET sock, int offset, const char *file, int line)
 
static void test_TransmitFile (void)
 
static void test_getpeername (void)
 
static void test_sioRoutingInterfaceQuery (void)
 
static void test_sioAddressListChange (void)
 
static void test_synchronous_WSAIoctl (void)
 
static HWND create_async_message_window (void)
 
static void wait_for_async_message (HWND hwnd, HANDLE handle)
 
static void test_WSAAsyncGetServByPort (void)
 
static void test_WSAAsyncGetServByName (void)
 
static SOCKET setup_iocp_src (struct sockaddr_in *bindAddress)
 
static void test_completion_port (void)
 
static void test_address_list_query (void)
 
static DWORD WINAPI inet_ntoa_thread_proc (void *param)
 
static void test_inet_ntoa (void)
 
static void test_WSALookupService (void)
 
static void test_WSAEnumNameSpaceProvidersA (void)
 
static void test_WSAEnumNameSpaceProvidersW (void)
 
static void sync_read (SOCKET src, SOCKET dst)
 
static void iocp_async_read (SOCKET src, SOCKET dst)
 
static void iocp_async_read_closesocket (SOCKET src, int how_to_close)
 
static void iocp_async_closesocket (SOCKET src)
 
static DWORD WINAPI wsa_async_select_thread (void *param)
 
static DWORD WINAPI wsa_recv_thread (void *param)
 
static void iocp_async_read_thread_closesocket (SOCKET src)
 
static void iocp_async_read_thread (SOCKET src, SOCKET dst)
 
static void test_iocp (void)
 
 START_TEST (sock)
 

Variables

static LPCSTR
 
static LPCWSTR
 
static const ADDRINFOW PADDRINFOW *static const WCHARservname
 
namespace GUIDnamespace_id
 
namespace GUID const ADDRINFOEXW * hints
 
namespace GUID const ADDRINFOEXW ADDRINFOEXW ** result
 
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timevaltimeout
 
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPEDoverlapped
 
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine
 
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLEhandle
 
static LPVOID
 
static LPSTR
 
static ULONG
 
static LPWSTR
 
static DWORD
 
static LPHANDLE
 
static LPDWORD
 
static LPWSAQUERYSETW
 
static LPWSANAMESPACE_INFOA
 
static LPWSANAMESPACE_INFOW
 
static INT
 
static PIO_STATUS_BLOCK
 
static PVOID
 
static FILE_INFORMATION_CLASS
 
static PULONG
 
static BOOL
 
static const struct addr_hint_tests hinttests []
 
static DWORD tls
 
static HANDLE thread [1+MAX_CLIENTS]
 
static DWORD thread_id [1+MAX_CLIENTS]
 
static HANDLE server_ready
 
static HANDLE client_ready [MAX_CLIENTS]
 
static int client_id
 
static const LINGER linger_testvals []
 
static test_setup tests []
 
static BOOL drain_pause = FALSE
 
static struct async_messagemessages_received
 
static int completion_called
 

Macro Definition Documentation

◆ BIND_SLEEP

#define BIND_SLEEP   10 /* seconds to wait between attempts to bind() */

Definition at line 48 of file sock.c.

◆ BIND_TRIES

#define BIND_TRIES   6 /* Number of bind() attempts */

Definition at line 49 of file sock.c.

◆ compare_file

#define compare_file (   h,
  s,
 
)    compare_file2(h,s,o,__FILE__,__LINE__)

Definition at line 8837 of file sock.c.

◆ FD_SET_ALL

#define FD_SET_ALL (   s)    { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }

Definition at line 3779 of file sock.c.

◆ FD_ZERO_ALL

#define FD_ZERO_ALL ( )    { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }

Definition at line 3778 of file sock.c.

◆ FIRST_CHAR

#define FIRST_CHAR   'A' /* First character in transferred pattern */

Definition at line 47 of file sock.c.

◆ IP_PKTINFO_LEN

Definition at line 2001 of file sock.c.

◆ make_keepalive

#define make_keepalive (   k,
  enable,
  time,
  interval 
)
Value:
k.onoff = enable; \
k.keepalivetime = time; \
k.keepaliveinterval = interval;
GLboolean enable
Definition: glext.h:11120
__u16 time
Definition: mkdosfs.c:8
int k
Definition: mpi.c:3369

Definition at line 68 of file sock.c.

◆ MAX_CLIENTS

#define MAX_CLIENTS   4 /* Max number of clients */

Definition at line 46 of file sock.c.

◆ NUM_QUERIES

#define NUM_QUERIES   250 /* Number of getservbyname queries per thread */

Definition at line 55 of file sock.c.

◆ NUM_THREADS

#define NUM_THREADS   3 /* Number of threads to run getservbyname */

Definition at line 54 of file sock.c.

◆ NUM_UDP_PEERS

#define NUM_UDP_PEERS   3 /* Number of UDP sockets to create and test > 1 */

Definition at line 52 of file sock.c.

◆ ok_event_seq

#define ok_event_seq   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : ok_event_sequence

Definition at line 5774 of file sock.c.

◆ POLL_CLEAR

#define POLL_CLEAR ( )    ix = 0

Definition at line 7120 of file sock.c.

◆ POLL_ISSET

#define POLL_ISSET (   s,
  rev 
)    poll_isset(fds, ix, s, rev)

Definition at line 7122 of file sock.c.

◆ POLL_SET

#define POLL_SET (   s,
  ev 
)    {fds[ix].fd = s; fds[ix++].events = ev;}

Definition at line 7121 of file sock.c.

◆ SERVERIP

#define SERVERIP   "127.0.0.1" /* IP to bind to */

Definition at line 57 of file sock.c.

◆ SERVERPORT

#define SERVERPORT   9374 /* Port number to bind to */

Definition at line 58 of file sock.c.

◆ SOCKTIMEOUT1

#define SOCKTIMEOUT1
Value:
63000 /* 63 seconds. Do not test fractional part because of a
bug in the linux kernel (fixed in 2.6.8) */

Definition at line 1405 of file sock.c.

◆ SOCKTIMEOUT2

#define SOCKTIMEOUT2   997000 /* 997 seconds */

Definition at line 1406 of file sock.c.

◆ STD_STREAM_SOCKET

#define STD_STREAM_SOCKET
Value:
0, \
#define SOCK_STREAM
Definition: tcpip.h:118
#define SERVERIP
Definition: sock.c:57
#define SERVERPORT
Definition: sock.c:58

Definition at line 2184 of file sock.c.

◆ TEST_TIMEOUT

#define TEST_TIMEOUT
Value:
30 /* seconds to wait before killing child threads
after server initialization, if something hangs */

Definition at line 50 of file sock.c.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 30 of file sock.c.

◆ WM_ASYNCCOMPLETE

#define WM_ASYNCCOMPLETE   (WM_USER + 100)

Definition at line 9503 of file sock.c.

◆ WM_SOCKET

#define WM_SOCKET   (WM_USER+100)

Definition at line 5504 of file sock.c.

◆ WSA_CMSG_ALIGN

#define WSA_CMSG_ALIGN (   len)    (((len) + sizeof(SIZE_T) - 1) & ~(sizeof(SIZE_T) - 1))

Definition at line 44 of file sock.c.

◆ wsa_ok

#define wsa_ok (   op,
  cond,
  msg 
)
Value:
do { \
int tmp, err = 0; \
tmp = op; \
if ( !(cond tmp) ) err = WSAGetLastError(); \
ok ( cond tmp, msg, GetCurrentThreadId(), err); \
} while (0);
#define msg(x)
Definition: auth_time.c:54
UINT op
Definition: effect.c:236
#define err(...)
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
int PASCAL FAR WSAGetLastError(void)
Definition: dllmain.c:112

Definition at line 60 of file sock.c.

Typedef Documentation

◆ async_message

◆ client_memory

◆ client_params

◆ select_thread_params

◆ server_memory

◆ server_params

◆ sock_info

◆ test_params

◆ test_setup

◆ thread_info

Function Documentation

◆ AcceptKillThread()

static DWORD WINAPI AcceptKillThread ( void param)
static

Definition at line 4158 of file sock.c.

4161{
4163 struct sockaddr_in address;
4164 int len = sizeof(address);
4165 SOCKET client_socket;
4166
4168 client_socket = accept(par->s, (struct sockaddr*) &address, &len);
4169 if (client_socket != INVALID_SOCKET)
4170 closesocket(client_socket);
4171 par->ReadKilled = (client_socket == INVALID_SOCKET);
GLuint address
Definition: glext.h:9393
GLfloat param
Definition: glext.h:5796
GLenum GLsizei len
Definition: glext.h:6722
#define closesocket
Definition: ncftp.h:477
static HANDLE server_ready
Definition: sock.c:232
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
#define INVALID_SOCKET
Definition: winsock.h:332
UINT_PTR SOCKET
Definition: winsock.h:47

◆ AlwaysDeferConditionFunc()

static int CALLBACK AlwaysDeferConditionFunc ( LPWSABUF  lpCallerId,
LPWSABUF  lpCallerData,
LPQOS  pQos,
LPQOS  lpGQOS,
LPWSABUF  lpCalleeId,
LPWSABUF  lpCalleeData,
GROUP g,
DWORD_PTR  dwCallbackData 
)
static

Definition at line 4174 of file sock.c.

4179{

◆ check_so_opentype()

static void check_so_opentype ( void  )
static

Definition at line 436 of file sock.c.

438{
439 int tmp = 1, len;
440 len = sizeof (tmp);
442 ok ( tmp == 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp );
#define ok(value,...)
Definition: atltest.h:57
#define SO_OPENTYPE
Definition: ws2_32.h:40
INT WSAAPI getsockopt(IN SOCKET s, IN INT level, IN INT optname, OUT CHAR FAR *optval, IN OUT INT FAR *optlen)
Definition: sockctrl.c:271
#define SOL_SOCKET
Definition: winsock.h:398

Referenced by oob_client(), simple_client(), and simple_mixed_client().

◆ client_start()

static void client_start ( client_params par)
static

Definition at line 566 of file sock.c.

568{
569 test_params *gen = par->general;
571
572 TlsSetValue ( tls, mem );
573
575
576 mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot,
577 NULL, 0, par->sock_flags );
578
579 mem->addr.sin_family = AF_INET;
580 mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr );
581 mem->addr.sin_port = htons ( gen->inet_port );
582
583 ok ( mem->s != INVALID_SOCKET, "Client: WSASocket failed\n" );
584
585 mem->send_buf = LocalAlloc ( LPTR, 2 * gen->n_chunks * gen->chunk_size );
586 mem->recv_buf = mem->send_buf + gen->n_chunks * gen->chunk_size;
587 fill_buffer ( mem->send_buf, gen->chunk_size, gen->n_chunks );
588
590 /* Wait for the other clients to come up */
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1276
#define AF_INET
Definition: tcpip.h:117
#define INFINITE
Definition: serial.h:102
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
#define inet_addr(cp)
Definition: inet.h:98
#define htons(x)
Definition: module.h:215
#define min(a, b)
Definition: monoChain.cc:55
#define MAX_CLIENTS
Definition: sock.c:46
static HANDLE client_ready[MAX_CLIENTS]
Definition: sock.c:233
static void fill_buffer(char *buf, int chunk_size, int n_chunks)
Definition: sock.c:361
static int client_id
Definition: sock.c:234
static DWORD tls
Definition: sock.c:229
SOCKET WSAAPI WSASocketA(IN INT af, IN INT type, IN INT protocol, IN LPWSAPROTOCOL_INFOA lpProtocolInfo, IN GROUP g, IN DWORD dwFlags)
Definition: socklife.c:444
DWORD sock_flags
Definition: sock.c:149
test_params * general
Definition: sock.c:148
Definition: mem.c:156
int sock_type
Definition: sock.c:128
const char * inet_addr
Definition: sock.c:130
int sock_prot
Definition: sock.c:129
int n_chunks
Definition: sock.c:133
short inet_port
Definition: sock.c:131
int n_clients
Definition: sock.c:134
int chunk_size
Definition: sock.c:132
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define LPTR
Definition: winbase.h:381

Referenced by event_client(), oob_client(), simple_client(), and simple_mixed_client().

◆ client_stop()

static void client_stop ( void  )
static

Definition at line 593 of file sock.c.

595{
597 wsa_ok ( closesocket ( mem->s ), 0 ==, "closesocket error (%x): %d\n" );
598 LocalFree ( mem->send_buf );
599 LocalFree ( mem );
600 ExitThread(0);
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1240
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:365
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define wsa_ok(op, cond, msg)
Definition: sock.c:60

Referenced by event_client(), oob_client(), simple_client(), and simple_mixed_client().

◆ compare_addrinfo()

static void compare_addrinfo ( ADDRINFO a,
ADDRINFO b 
)
static

Definition at line 444 of file sock.c.

446{
447 for (; a && b ; a = a->ai_next, b = b->ai_next)
448 {
449 ok(a->ai_flags == b->ai_flags,
450 "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
451 ok(a->ai_family == b->ai_family,
452 "Wrong family %d != %d\n", a->ai_family, b->ai_family);
453 ok(a->ai_socktype == b->ai_socktype,
454 "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
455 ok(a->ai_protocol == b->ai_protocol,
456 "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
457 ok(a->ai_addrlen == b->ai_addrlen,
458 "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
459 ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
460 "Wrong address data\n");
461 if (a->ai_canonname && b->ai_canonname)
462 {
463 ok(!strcmp(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
464 a->ai_canonname, b->ai_canonname);
465 }
466 else
467 ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
468 a->ai_canonname, b->ai_canonname);
469 }
470 ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define b
Definition: ke_i.h:79

◆ compare_addrinfow()

static void compare_addrinfow ( ADDRINFOW a,
ADDRINFOW b 
)
static

Definition at line 472 of file sock.c.

474{
475 for (; a && b ; a = a->ai_next, b = b->ai_next)
476 {
477 ok(a->ai_flags == b->ai_flags,
478 "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
479 ok(a->ai_family == b->ai_family,
480 "Wrong family %d != %d\n", a->ai_family, b->ai_family);
481 ok(a->ai_socktype == b->ai_socktype,
482 "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
483 ok(a->ai_protocol == b->ai_protocol,
484 "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
485 ok(a->ai_addrlen == b->ai_addrlen,
486 "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
487 ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
488 "Wrong address data\n");
489 if (a->ai_canonname && b->ai_canonname)
490 {
491 ok(!lstrcmpW(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
492 wine_dbgstr_w(a->ai_canonname), wine_dbgstr_w(b->ai_canonname));
493 }
494 else
495 ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
496 a->ai_canonname, b->ai_canonname);
497 }
498 ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
#define wine_dbgstr_w
Definition: kernel32.h:34
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170

Referenced by test_GetAddrInfoW().

◆ compare_file2()

static void compare_file2 ( HANDLE  handle,
SOCKET  sock,
int  offset,
const char file,
int  line 
)
static

Definition at line 8839 of file sock.c.

8842{
8843 char buf1[256], buf2[256];
8844 BOOL success;
8845 int i = 0;
8846
8848 while (1)
8849 {
8850 DWORD n1 = 0, n2 = 0;
8851
8852 success = ReadFile(handle, buf1, sizeof(buf1), &n1, NULL);
8853 ok_(file,line)(success, "Failed to read from file.\n");
8854 if (success && n1 == 0)
8855 break;
8856 else if(!success)
8857 return;
8858 n2 = recv(sock, buf2, n1, 0);
8859 ok_(file,line)(n1 == n2, "Block %d size mismatch (%d != %d)\n", i, n1, n2);
8860 ok_(file,line)(memcmp(buf1, buf2, n2) == 0, "Block %d failed\n", i);
8861 i++;
#define ok_(x1, x2)
Definition: atltest.h:61
#define FILE_BEGIN
Definition: compat.h:761
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetFilePointer
Definition: compat.h:743
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
Definition: recv.c:23
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLintptr offset
Definition: glext.h:5920
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int n2
Definition: dwarfget.c:147
int n1
Definition: dwarfget.c:147
Definition: fci.c:127
Definition: parser.c:49
Definition: tcpcore.h:1455
#define success(from, fromstr, to, tostr)

◆ create_async_message_window()

static HWND create_async_message_window ( void  )
static

Definition at line 9504 of file sock.c.

9507{
9508 static const char class_name[] = "ws2_32 async message window class";
9509
9510 WNDCLASSEXA wndclass;
9511 HWND hWnd;
9512
9513 wndclass.cbSize = sizeof(wndclass);
9514 wndclass.style = CS_HREDRAW | CS_VREDRAW;
9515 wndclass.lpfnWndProc = DefWindowProcA;
9516 wndclass.cbClsExtra = 0;
9517 wndclass.cbWndExtra = 0;
9518 wndclass.hInstance = GetModuleHandleA(NULL);
9521 wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
9522 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
9523 wndclass.lpszClassName = class_name;
9524 wndclass.lpszMenuName = NULL;
9525
9526 RegisterClassExA(&wndclass);
9527
9528 hWnd = CreateWindowA(class_name, "ws2_32 async message window", WS_OVERLAPPEDWINDOW,
9529 0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL);
9530 if (!hWnd)
9531 {
9532 ok(0, "failed to create window: %u\n", GetLastError());
9533 return NULL;
9534 }
9535
HWND hWnd
Definition: settings.c:17
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
int cbClsExtra
Definition: winuser.h:3204
HINSTANCE hInstance
Definition: winuser.h:3206
HCURSOR hCursor
Definition: winuser.h:3208
LPCSTR lpszMenuName
Definition: winuser.h:3210
HICON hIconSm
Definition: winuser.h:3212
UINT style
Definition: winuser.h:3202
int cbWndExtra
Definition: winuser.h:3205
UINT cbSize
Definition: winuser.h:3201
WNDPROC lpfnWndProc
Definition: winuser.h:3203
LPCSTR lpszClassName
Definition: winuser.h:3211
HICON hIcon
Definition: winuser.h:3207
HBRUSH hbrBackground
Definition: winuser.h:3209
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CS_VREDRAW
Definition: winuser.h:658
#define COLOR_WINDOW
Definition: winuser.h:918
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4315
#define CS_HREDRAW
Definition: winuser.h:653
#define IDC_ARROW
Definition: winuser.h:687
#define IDI_APPLICATION
Definition: winuser.h:704
ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA *)
HICON WINAPI LoadIconA(_In_opt_ HINSTANCE hInstance, _In_ LPCSTR lpIconName)
Definition: cursoricon.c:2060
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2090
const char * LPCSTR
Definition: xmlstorage.h:183

◆ dbgstr_event_seq()

static const char * dbgstr_event_seq ( const LPARAM seq)
static

Definition at line 5565 of file sock.c.

5568{
5569 static char message[1024];
5570 char name[12];
5571 int len = 1;
5572
5573 message[0] = '[';
5574 message[1] = 0;
5575 while (*seq)
5576 {
5578 len += sprintf(message + len, "%s(%d) ", name, WSAGETSELECTERROR(*seq));
5579 seq++;
5580 }
5581 if (len > 1) len--;
5582 strcpy( message + len, "]" );
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define sprintf(buf, format,...)
Definition: sprintf.c:55
static void get_event_details(int event, int *bit, char *name)
Definition: sock.c:5531
Definition: tftpd.h:60
Definition: name.c:39
#define WSAGETSELECTERROR(l)
Definition: winsock.h:482
#define WSAGETSELECTEVENT(l)
Definition: winsock.h:481

Referenced by ok_event_sequence().

◆ dbgstr_event_seq_result()

static char * dbgstr_event_seq_result ( SOCKET  s,
WSANETWORKEVENTS netEvents 
)
static

Definition at line 5584 of file sock.c.

5587{
5588 static char message[1024];
5589 struct async_message *curr = messages_received;
5590 int index, error, bit = 0;
5591 char name[12];
5592 int len = 1;
5593
5594 message[0] = '[';
5595 message[1] = 0;
5596 while (1)
5597 {
5598 if (netEvents)
5599 {
5600 if (bit >= FD_MAX_EVENTS) break;
5601 if ( !(netEvents->lNetworkEvents & (1 << bit)) )
5602 {
5603 bit++;
5604 continue;
5605 }
5606 get_event_details(1 << bit, &index, name);
5607 error = netEvents->iErrorCode[index];
5608 bit++;
5609 }
5610 else
5611 {
5612 if (!curr) break;
5613 if (curr->socket != s)
5614 {
5615 curr = curr->next;
5616 continue;
5617 }
5620 curr = curr->next;
5621 }
5622
5623 len += sprintf(message + len, "%s(%d) ", name, error);
5624 }
5625 if (len > 1) len--;
5626 strcpy( message + len, "]" );
#define index(s, c)
Definition: various.h:29
GLdouble s
Definition: gl.h:2039
GLuint index
Definition: glext.h:6031
#define error(str)
Definition: mkdosfs.c:1605
static struct async_message * messages_received
Definition: sock.c:5502
int iErrorCode[FD_MAX_EVENTS]
Definition: winsock2.h:644
SOCKET socket
Definition: sock.c:5497
LPARAM lparam
Definition: sock.c:5498
struct async_message * next
Definition: sock.c:5499
#define FD_MAX_EVENTS
Definition: winsock2.h:313

Referenced by ok_event_sequence().

◆ do_bind()

static void do_bind ( SOCKET  s,
struct sockaddr addr,
int  addrlen 
)
static

Definition at line 507 of file sock.c.

509{
510 int err, wsaerr = 0, n_try = BIND_TRIES;
511
512 while ( ( err = bind ( s, addr, addrlen ) ) != 0 &&
513 ( wsaerr = WSAGetLastError () ) == WSAEADDRINUSE &&
514 n_try-- >= 0)
515 {
516 trace ( "address in use, waiting ...\n" );
517 Sleep ( 1000 * BIND_SLEEP );
518 }
519 ok ( err == 0, "failed to bind: %d\n", wsaerr );
#define trace
Definition: atltest.h:70
GLenum const GLvoid * addr
Definition: glext.h:9621
#define BIND_TRIES
Definition: sock.c:49
#define BIND_SLEEP
Definition: sock.c:48
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
#define WSAEADDRINUSE
Definition: winerror.h:1961

Referenced by server_start().

◆ do_getservbyname()

static DWORD WINAPI do_getservbyname ( void param)
static

Definition at line 2347 of file sock.c.

2350{
2351 struct {
2352 const char *name;
2353 const char *proto;
2354 int port;
2355 } serv[2] = { {"domain", "udp", 53}, {"telnet", "tcp", 23} };
2356
2357 HANDLE *starttest = param;
2358 int i, j;
2359 struct servent *pserv[2];
2360
2361 ok ( WaitForSingleObject ( *starttest, TEST_TIMEOUT * 1000 ) != WAIT_TIMEOUT,
2362 "test_getservbyname: timeout waiting for start signal\n" );
2363
2364 /* ensure that necessary buffer resizes are completed */
2365 for ( j = 0; j < 2; j++) {
2366 pserv[j] = getservbyname ( serv[j].name, serv[j].proto );
2367 }
2368
2369 for ( i = 0; i < NUM_QUERIES / 2; i++ ) {
2370 for ( j = 0; j < 2; j++ ) {
2371 pserv[j] = getservbyname ( serv[j].name, serv[j].proto );
2372 ok ( pserv[j] != NULL || broken(pserv[j] == NULL) /* win8, fixed in win81 */,
2373 "getservbyname could not retrieve information for %s: %d\n", serv[j].name, WSAGetLastError() );
2374 if ( !pserv[j] ) continue;
2375 ok ( pserv[j]->s_port == htons(serv[j].port),
2376 "getservbyname returned the wrong port for %s: %d\n", serv[j].name, ntohs(pserv[j]->s_port) );
2377 ok ( !strcmp ( pserv[j]->s_proto, serv[j].proto ),
2378 "getservbyname returned the wrong protocol for %s: %s\n", serv[j].name, pserv[j]->s_proto );
2379 ok ( !strcmp ( pserv[j]->s_name, serv[j].name ),
2380 "getservbyname returned the wrong name for %s: %s\n", serv[j].name, pserv[j]->s_name );
2381 }
2382
2383 ok ( pserv[0] == pserv[1] || broken(pserv[0] != pserv[1]) /* win8, fixed in win81 */,
2384 "getservbyname: winsock resized servent buffer when not necessary\n" );
2385 }
2386
static const CHAR s_name[]
Definition: ShowWindow.c:19
#define broken(x)
Definition: _sntprintf.h:21
#define WAIT_TIMEOUT
Definition: dderror.h:14
USHORT port
Definition: uri.c:228
PSERVENT WSAAPI getservbyname(IN const char FAR *name, IN const char FAR *proto)
Definition: getxbyxx.c:500
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define ntohs(x)
Definition: module.h:210
#define NUM_QUERIES
Definition: sock.c:55
#define TEST_TIMEOUT
Definition: sock.c:50
short s_port
Definition: winsock.h:165
char * s_proto
Definition: winsock.h:166

◆ do_synchronous_recv()

static int do_synchronous_recv ( SOCKET  s,
char buf,
int  buflen,
int  flags,
int  recvlen 
)
static

Definition at line 406 of file sock.c.

408{
409 char* last = buf + buflen, *p;
410 int n = 1;
411 for ( p = buf; n > 0 && p < last; )
412 {
413 n = recv ( s, p, min ( recvlen, last - p ), flags );
414 if (n > 0) p += n;
415 }
416 wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
417 return p - buf;
GLdouble n
Definition: glext.h:7729
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
static UINT UINT last
Definition: font.c:45

Referenced by oob_client(), oob_server(), simple_client(), and simple_server().

◆ do_synchronous_recvfrom()

static int do_synchronous_recvfrom ( SOCKET  s,
char buf,
int  buflen,
int  flags,
struct sockaddr from,
int fromlen,
int  recvlen 
)
static

Definition at line 419 of file sock.c.

421{
422 char* last = buf + buflen, *p;
423 int n = 1;
424 for ( p = buf; n > 0 && p < last; )
425 {
426 n = recvfrom ( s, p, min ( recvlen, last - p ), flags, from, fromlen );
427 if (n > 0) p += n;
428 }
429 wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
430 return p - buf;
INT WSAAPI recvfrom(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags, OUT LPSOCKADDR from, IN OUT INT FAR *fromlen)
Definition: recv.c:87
CardRegion * from
Definition: spigame.cpp:19

Referenced by simple_mixed_client().

◆ do_synchronous_send()

static int do_synchronous_send ( SOCKET  s,
char buf,
int  buflen,
int  flags,
int  sendlen 
)
static

Definition at line 393 of file sock.c.

395{
396 char* last = buf + buflen, *p;
397 int n = 1;
398 for ( p = buf; n > 0 && p < last; )
399 {
400 n = send ( s, p, min ( sendlen, last - p ), flags );
401 if (n > 0) p += n;
402 }
403 wsa_ok ( n, 0 <=, "do_synchronous_send (%x): error %d\n" );
404 return p - buf;
INT WSAAPI send(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags)
Definition: send.c:23

Referenced by oob_client(), oob_server(), simple_client(), simple_mixed_client(), and simple_server().

◆ do_test()

static void do_test ( test_setup test)
static

Definition at line 1362 of file sock.c.

1364{
1365 DWORD i, n = min (test->general.n_clients, MAX_CLIENTS);
1366 DWORD wait;
1367
1369 for (i = 0; i <= n; i++)
1371
1372 StartServer ( test->srv, &test->general, &test->srv_params );
1373 StartClients ( test->clt, &test->general, &test->clt_params );
1375
1376 wait = WaitForMultipleObjects ( 1 + n, thread, TRUE, 1000 * TEST_TIMEOUT );
1377 ok ( wait <= WAIT_OBJECT_0 + n ,
1378 "some threads have not completed: %x\n", wait );
1379
1380 if ( ! ( wait <= WAIT_OBJECT_0 + n ) )
1381 {
1382 for (i = 0; i <= n; i++)
1383 {
1384 if ( WaitForSingleObject ( thread[i], 0 ) != WAIT_OBJECT_0 )
1385 {
1386 trace ("terminating thread %08x\n", thread_id[i]);
1387 TerminateThread ( thread [i], 0 );
1388 }
1389 }
1390 }
1392 for (i = 0; i <= n; i++)
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
#define test
Definition: rosglue.h:37
static DWORD thread_id[1+MAX_CLIENTS]
Definition: sock.c:231
static HANDLE thread[1+MAX_CLIENTS]
Definition: sock.c:230
static void StartClients(LPTHREAD_START_ROUTINE routine, test_params *general, client_params *par)
Definition: sock.c:1347
static void StartServer(LPTHREAD_START_ROUTINE routine, test_params *general, server_params *par)
Definition: sock.c:1339
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:637
#define WAIT_OBJECT_0
Definition: winbase.h:406

◆ drain_socket_thread()

static DWORD WINAPI drain_socket_thread ( LPVOID  arg)
static

Definition at line 5328 of file sock.c.

5331{
5332 char buffer[1024];
5333 SOCKET sock = *(SOCKET*)arg;
5334 int ret;
5335
5336 while ((ret = recv(sock, buffer, sizeof(buffer), 0)) != 0)
5337 {
5338 if (ret < 0)
5339 {
5341 {
5342 fd_set readset;
5343 FD_ZERO(&readset);
5344 FD_SET(sock, &readset);
5345 select(sock+1, &readset, NULL, NULL, NULL);
5346 while (drain_pause)
5347 Sleep(100);
5348 }
5349 else
5350 break;
5351 }
5352 }
INT WSAAPI select(IN INT s, IN OUT LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST struct timeval *timeout)
Definition: select.c:41
GLuint buffer
Definition: glext.h:5915
static BOOL drain_pause
Definition: sock.c:5327
Definition: winsock.h:66
int ret
#define WSAEWOULDBLOCK
Definition: winerror.h:1948
#define FD_ZERO(set)
Definition: winsock.h:96
#define FD_SET(fd, set)
Definition: winsock.h:89

Referenced by test_events().

◆ DWORD()

static DWORD ( WINAPI pGetAdaptersInfo)
static

◆ event_client()

static void WINAPI event_client ( client_params par)
static

Definition at line 1043 of file sock.c.

1045{
1046 test_params *gen = par->general;
1048 int id = GetCurrentThreadId(), n_expected = gen->n_chunks * gen->chunk_size,
1049 tmp, err, n;
1050 HANDLE event;
1051 WSANETWORKEVENTS wsa_events;
1052 char *send_last, *recv_last, *send_p, *recv_p;
1054
1055 trace ( "event_client (%x): starting\n", id );
1056 client_start ( par );
1057 trace ( "event_client (%x): server ready\n", id );
1058
1059 mem = TlsGetValue ( tls );
1060
1061 /* Prepare event notification for connect, makes socket nonblocking */
1062 event = WSACreateEvent ();
1064 tmp = connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) );
1065 if ( tmp != 0 ) {
1066 err = WSAGetLastError ();
1067 ok ( err == WSAEWOULDBLOCK, "event_client (%x): connect error: %d\n", id, err );
1069 ok ( tmp == WAIT_OBJECT_0, "event_client (%x): wait for connect event failed: %d\n", id, tmp );
1070 err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events );
1071 ok ( err == 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id, err );
1072 err = wsa_events.iErrorCode[ FD_CONNECT_BIT ];
1073 ok ( err == 0, "event_client (%x): connect error: %d\n", id, err );
1074 if ( err ) goto out;
1075 }
1076
1077 trace ( "event_client (%x) connected\n", id );
1078
1079 WSAEventSelect ( mem->s, event, mask );
1080
1081 recv_p = mem->recv_buf;
1082 recv_last = mem->recv_buf + n_expected;
1083 send_p = mem->send_buf;
1084 send_last = mem->send_buf + n_expected;
1085
1086 while ( TRUE )
1087 {
1089 ok ( err == WAIT_OBJECT_0, "event_client (%x): wait failed\n", id );
1090
1091 err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events );
1092 ok( err == 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id, err );
1093
1094 if ( wsa_events.lNetworkEvents & FD_WRITE )
1095 {
1096 err = wsa_events.iErrorCode[ FD_WRITE_BIT ];
1097 ok ( err == 0, "event_client (%x): FD_WRITE error code: %d\n", id, err );
1098
1099 if ( err== 0 )
1100 do
1101 {
1102 n = send ( mem->s, send_p, min ( send_last - send_p, par->buflen ), 0 );
1103 if ( n < 0 )
1104 {
1105 err = WSAGetLastError ();
1106 ok ( err == WSAEWOULDBLOCK, "event_client (%x): send error: %d\n", id, err );
1107 }
1108 else
1109 send_p += n;
1110 }
1111 while ( n >= 0 && send_p < send_last );
1112
1113 if ( send_p == send_last )
1114 {
1115 trace ( "event_client (%x): all data sent - shutdown\n", id );
1116 shutdown ( mem->s, SD_SEND );
1117 mask &= ~FD_WRITE;
1118 WSAEventSelect ( mem->s, event, mask );
1119 }
1120 }
1121 if ( wsa_events.lNetworkEvents & FD_READ )
1122 {
1123 err = wsa_events.iErrorCode[ FD_READ_BIT ];
1124 ok ( err == 0, "event_client (%x): FD_READ error code: %d\n", id, err );
1125 if ( err != 0 ) break;
1126
1127 /* First read must succeed */
1128 n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
1129 wsa_ok ( n, 0 <=, "event_client (%x): recv error: %d\n" );
1130
1131 while ( n >= 0 ) {
1132 recv_p += n;
1133 if ( recv_p == recv_last )
1134 {
1135 mask &= ~FD_READ;
1136 trace ( "event_client (%x): all data received\n", id );
1137 WSAEventSelect ( mem->s, event, mask );
1138 break;
1139 }
1140 n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
1141 if ( n < 0 && ( err = WSAGetLastError()) != WSAEWOULDBLOCK )
1142 ok ( 0, "event_client (%x): read error: %d\n", id, err );
1143
1144 }
1145 }
1146 if ( wsa_events.lNetworkEvents & FD_CLOSE )
1147 {
1148 trace ( "event_client (%x): close event\n", id );
1149 err = wsa_events.iErrorCode[ FD_CLOSE_BIT ];
1150 ok ( err == 0, "event_client (%x): FD_CLOSE error code: %d\n", id, err );
1151 break;
1152 }
1153 }
1154
1155 n = send_p - mem->send_buf;
1156 ok ( send_p == send_last,
1157 "simple_client (%x): sent less data than expected: %d of %d\n", id, n, n_expected );
1158 n = recv_p - mem->recv_buf;
1159 ok ( recv_p == recv_last,
1160 "simple_client (%x): received less data than expected: %d of %d\n", id, n, n_expected );
1161 n = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
1162 ok ( n == -1, "event_client (%x): test pattern error: %d\n", id, n);
1163
1164out:
1165 WSACloseEvent ( event );
1166 trace ( "event_client (%x) exiting\n", id );
1167 client_stop ();
static TCHAR test_buffer[TEST_BUFFER_SIZE]
Definition: _tfileio.c:53
BOOL WSAAPI WSACloseEvent(IN WSAEVENT hEvent)
Definition: event.c:23
INT WSAAPI WSAEnumNetworkEvents(IN SOCKET s, IN WSAEVENT hEventObject, OUT LPWSANETWORKEVENTS lpNetworkEvents)
Definition: event.c:94
INT WSAAPI WSAEventSelect(IN SOCKET s, IN WSAEVENT hEventObject, IN LONG lNetworkEvents)
Definition: select.c:182
struct _cl_event * event
Definition: glext.h:7739
GLenum GLint GLuint mask
Definition: glext.h:6028
long LONG
Definition: pedump.c:60
static FILE * out
Definition: regtests2xml.c:44
static void client_stop(void)
Definition: sock.c:593
static void client_start(client_params *par)
Definition: sock.c:566
INT WSAAPI shutdown(IN SOCKET s, IN INT how)
Definition: sockctrl.c:506
int buflen
Definition: sock.c:150
#define FD_CONNECT_BIT
Definition: winsock2.h:301
#define FD_CLOSE_BIT
Definition: winsock2.h:303
#define FD_READ_BIT
Definition: winsock2.h:293
WINSOCK_API_LINKAGE WSAEVENT WSAAPI WSACreateEvent(void)
Definition: event.c:42
#define FD_WRITE_BIT
Definition: winsock2.h:295
#define FD_READ
Definition: winsock.h:405
#define FD_WRITE
Definition: winsock.h:406
#define FD_CLOSE
Definition: winsock.h:410
#define SD_SEND
Definition: winsock.h:55
#define FD_CONNECT
Definition: winsock.h:409
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList

◆ Exit()

static void Exit ( void  )
static

Definition at line 1330 of file sock.c.

1332{
1333 INT ret, err;
1334 TlsFree ( tls );
1335 ret = WSACleanup();
1336 err = WSAGetLastError();
1337 ok ( ret == 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret, err);
BOOL WINAPI TlsFree(IN DWORD Index)
Definition: thread.c:1166
int32_t INT
Definition: typedefs.h:58
int PASCAL FAR WSACleanup(void)
Definition: startup.c:60

Referenced by _bdf_add_comment(), _bdf_add_property(), _bdf_list_ensure(), _bdf_list_split(), _bdf_parse_glyphs(), _bdf_parse_properties(), _bdf_parse_start(), _bdf_readstream(), _bdf_set_default_spacing(), _Function_class_(), _Success_(), AcpiDsEvaluateNamePath(), AcpiEvaluateObjectTyped(), AcpiEvExecuteOrphanRegMethod(), AcpiExCreateMethod(), AcpiExInsertIntoField(), AcpiExReadDataFromField(), AcpiExResolveMultiple(), AcpiHwClearAcpiStatus(), AcpiHwRegisterWrite(), AcpiInstallSciHandler(), AcpiNsCheckReturnValue(), AcpiRsConvertAmlToResource(), AcpiRsConvertResourceToAml(), AcpiTbInstallAndLoadTable(), AcpiUtAllocateOwnerId(), af_autofitter_load_glyph(), af_axis_hints_new_edge(), af_axis_hints_new_segment(), af_face_globals_compute_style_coverage(), af_face_globals_get_metrics(), af_face_globals_new(), af_glyph_hints_reload(), af_latin_hints_apply(), af_latin_hints_compute_edges(), af_latin_hints_compute_segments(), af_latin_metrics_init_widths(), af_loader_embolden_glyph_in_slot(), af_loader_load_glyph(), bdf_cmap_char_next(), bdf_create_property(), BDF_Face_Init(), BDF_Glyph_Load(), bdf_load_font(), cff_blend_build_vector(), cff_blend_doBlend(), cff_charset_compute_cids(), cff_charset_load(), cff_decoder_prepare(), cff_encoding_load(), cff_face_init(), cff_fd_select_get(), cff_font_load(), cff_get_glyph_name(), cff_index_access_element(), cff_index_get_name(), cff_index_get_pointers(), cff_index_init(), cff_index_load_offsets(), CFF_Load_FD_Select(), cff_load_private_dict(), cff_parse_blend(), cff_parse_font_matrix(), cff_parse_integer(), cff_parse_maxstack(), cff_parse_real(), cff_parse_vsindex(), cff_parser_init(), cff_parser_run(), cff_size_init(), cff_subfont_load(), cff_vstore_load(), check_table_dir(), check_type1_format(), cid_face_init(), cid_face_open(), cid_hex_to_binary(), cid_load_glyph(), cid_load_keyword(), cid_parser_new(), cid_read_subrs(), cid_slot_load_glyph(), classic_kern_validate(), ClasspAccessAlignmentProperty(), ClasspDeviceGetBlockDeviceCharacteristicsVPDPage(), ClasspDeviceGetBlockLimitsVPDPage(), ClasspDeviceGetLBAStatus(), ClasspDeviceGetLBAStatusWorker(), ClasspDeviceGetLBProvisioningVPDPage(), ClasspDeviceLBProvisioningProperty(), ClasspDeviceSeekPenaltyProperty(), ClasspDeviceTrimProcess(), ClasspDeviceTrimProperty(), ClassReadWrite(), CmpCreateLinkNode(), CmpDoCreate(), CmpGetSymbolicLink(), CmpRemoveSubKey(), co_HOOK_CallHooks(), co_IntProcessKeyboardMessage(), co_MsqDispatchOneSentMessage(), CommonInstall(), CreateDIBitmap(), DefSetText(), DeviceProcessDsmTrimRequest(), FxInterrupt::Disconnect(), DispTdiQueryIpHwAddress(), DoAppSwitch(), DriverEvtDeviceAdd(), EngCreateWnd(), EnumHKCRKey(), EnumHKCRValue(), fnt_face_get_dll_font(), FNT_Face_Init(), fnt_font_load(), FNT_Load_Glyph(), FreeDeviceData(), FsRtlIsDbcsInExpression(), FsRtlIsNameInExpressionPrivate(), FT_Add_Module(), ft_add_renderer(), FT_Attach_Stream(), ft_bitmap_glyph_init(), FT_ClassicKern_Validate(), FT_CMap_New(), FT_DEFINE_GLYPH(), FT_Done_Library(), FT_Face_Properties(), FT_Get_Gasp(), FT_Get_Glyph(), FT_Get_Postscript_Name(), FT_Glyph_Copy(), FT_Glyph_Stroke(), FT_Glyph_StrokeBorder(), FT_Glyph_To_Bitmap(), FT_GlyphLoader_CheckPoints(), FT_GlyphLoader_CheckSubGlyphs(), ft_glyphslot_init(), FT_Load_Glyph(), FT_Lookup_Renderer(), ft_lzwstate_io(), FT_New_GlyphSlot(), FT_New_Size(), ft_open_face_internal(), FT_OpenType_Validate(), FT_Outline_Decompose(), FT_Raccess_Get_DataOffsets(), ft_raster1_render(), ft_raster1_transform(), FT_Set_Renderer(), ft_smooth_render_generic(), ft_smooth_transform(), FT_Stream_EnterFrame(), FT_Stream_New(), FT_Stream_ReadFields(), FT_Stream_TryRead(), ft_stroke_border_get_counts(), ft_stroke_border_grow(), ft_stroker_add_reverse_left(), ft_stroker_cap(), FT_Stroker_ConicTo(), FT_Stroker_CubicTo(), FT_Stroker_EndSubPath(), FT_Stroker_GetBorderCounts(), FT_Stroker_GetCounts(), FT_Stroker_LineTo(), ft_stroker_outside(), FT_Stroker_ParseOutline(), ft_stroker_process_corner(), ft_stroker_subpath_start(), FT_TrueTypeGX_Validate(), ftc_basic_family_load_glyph(), FTC_CMapCache_Lookup(), FTC_ImageCache_Lookup(), FTC_ImageCache_LookupScaler(), FTC_Manager_New(), FTC_Manager_RegisterCache(), FTC_MruList_New(), FTC_SBitCache_Lookup(), FTC_SBitCache_LookupScaler(), ftc_scaler_lookup_size(), FTC_SNode_New(), ftGdiGetTextCharsetInfo(), GdiConvertEnhMetaFile(), GdiConvertMetaFilePict(), GdiCreateLocalEnhMetaFile(), GdiCreateLocalMetaFilePict(), gxv_feat_registry_validate(), gxv_kern_coverage_validate(), gxv_kern_subtable_validate(), gxv_lcar_partial_validate(), gxv_load_table(), gxv_prop_validate(), gxv_sfntName_validate(), gxv_validate(), gxv_XEntryTable_validate(), HalpGetRootInterruptVector(), hash_insert(), hash_rehash(), Horizontal_Sweep_Drop(), IntCallWindowProcA(), IntCallWindowProcW(), IntFixUpDevModeNames(), KiNmiInterruptHandler(), LdrpCreateDllSection(), CSettings::Load(), load_truetype_glyph(), main(), MapAnsiQuerySetToUnicode(), MapUnicodeQuerySetToAnsi(), MiDoMappedCopy(), MiDoPoolCopy(), MmMapViewOfSection(), MmPapAllocatePagesInRange(), NtAreMappedFilesTheSame(), NtGdiExtEscape(), NtGdiGetFontUnicodeRanges(), NtGdiGetGlyphOutline(), NtGdiSelectClipPath(), NtGdiSetDIBitsToDeviceInternal(), NtGdiSetPixelFormat(), NtGdiSwapBuffers(), NtSetSystemPowerState(), NtStopProfile(), NtUserAttachThreadInput(), NtUserBuildPropList(), NtUserCallHwndLock(), NtUserCallHwndParamLock(), NtUserCallNextHookEx(), NtUserCloseDesktop(), NtUserCopyAcceleratorTable(), NtUserCreateAcceleratorTable(), NtUserCreateCaret(), NtUserCreateDesktop(), NtUserDeferWindowPos(), NtUserDefSetText(), NtUserDestroyMenu(), NtUserDragDetect(), NtUserDrawCaptionTemp(), NtUserDrawMenuBarTemp(), NtUserFillWindow(), NtUserFindWindowEx(), NtUserFlashWindowEx(), NtUserGetClipCursor(), NtUserGetComboBoxInfo(), NtUserGetDCEx(), NtUserGetGuiResources(), NtUserGetGUIThreadInfo(), NtUserGetInternalWindowPos(), NtUserGetLayeredWindowAttributes(), NtUserGetListBoxInfo(), NtUserGetMenuIndex(), NtUserGetMenuItemRect(), NtUserGetObjectInformation(), NtUserGetScrollBarInfo(), NtUserGetSystemMenu(), NtUserGetUpdateRect(), NtUserGetWindowPlacement(), NtUserHideCaret(), NtUserHiliteMenuItem(), NtUserInternalGetWindowText(), NtUserMenuItemFromPoint(), NtUserMinMaximize(), NtUserPrintWindow(), NtUserQueryWindow(), NtUserRedrawWindow(), NtUserRegisterWindowMessage(), NtUserRemoveProp(), NtUserSBGetParms(), NtUserScrollDC(), NtUserSetActiveWindow(), NtUserSetCursorIconData(), NtUserSetFocus(), NtUserSetInternalWindowPos(), NtUserSetLayeredWindowAttributes(), NtUserSetMenu(), NtUserSetProp(), NtUserSetShellWindowEx(), NtUserSetSystemCursor(), NtUserSetSystemMenu(), NtUserSetWindowFNID(), NtUserSetWindowPlacement(), NtUserSetWindowPos(), NtUserSetWindowRgn(), NtUserSetWindowWord(), NtUserShowCaret(), NtUserShowWindow(), NtUserShowWindowAsync(), NtUserSwitchDesktop(), NtUserTrackPopupMenuEx(), NtUserUnhookWindowsHookEx(), NtUserUpdateLayeredWindow(), NtUserValidateHandleSecure(), NtUserVkKeyScanEx(), otv_load_table(), otv_validate(), parse_blend_axis_types(), parse_blend_design_map(), parse_blend_design_positions(), parse_dict(), parse_fd_array(), parse_weight_vector(), pcf_cmap_char_next(), PCF_Face_Init(), pcf_get_metric(), PCF_Glyph_Load(), pcf_load_font(), pcf_read_TOC(), pfr_aux_name_load(), pfr_cmap_char_next(), pfr_cmap_init(), pfr_extra_item_load_bitmap_info(), pfr_extra_item_load_font_id(), pfr_extra_item_load_kerning_pairs(), pfr_extra_item_load_stem_snaps(), pfr_extra_items_parse(), pfr_face_get_kerning(), pfr_face_init(), pfr_get_advance(), pfr_glyph_curve_to(), pfr_glyph_line_to(), pfr_glyph_load_compound(), pfr_glyph_load_rec(), pfr_glyph_load_simple(), pfr_load_bitmap_metrics(), pfr_log_font_count(), pfr_log_font_load(), pfr_phy_font_load(), pfr_slot_load(), PreloadGlobalMessageTable(), ProgressCountdown(), PS_Conv_ToFixed(), ps_dimension_add_counter(), ps_dimension_add_t1stem(), ps_dimension_set_mask_bits(), ps_hint_table_alloc(), ps_hints_apply(), ps_mask_set_bit(), ps_mask_table_alloc(), ps_mask_table_last(), ps_mask_table_merge(), ps_mask_table_merge_all(), ps_mask_table_set_bits(), ps_parser_load_field(), ps_parser_load_field_table(), ps_parser_skip_PS_token(), ps_parser_to_bytes(), ps_table_new(), ps_tocoordarray(), ps_tofixedarray(), psh_glyph_init(), psh_hint_table_init(), RegCreateKeyExA(), RegEnumKeyExA(), RegEnumValueA(), RegLoadKeyA(), RegOpenKeyExW(), RegReplaceKeyA(), RtlGetNtProductType(), RtlpLookupDynamicFunctionEntry(), RtlVirtualUnwind(), SetDIBitsToDevice(), sfnt_load_face(), SRomFindMasterAdapter(), SRomRegisterMasterAdapter(), START_TEST(), StretchDIBits(), t1_allocate_blend(), t1_cmap_custom_char_next(), t1_cmap_std_char_next(), T1_Face_Init(), T1_Get_MM_Var(), T1_Get_Private_Dict(), T1_Load_Glyph(), t1_load_keyword(), T1_New_Parser(), T1_Open_Face(), T1_Read_Metrics(), T1_Read_PFM(), T42_Face_Init(), t42_load_keyword(), T42_Open_Face(), t42_parse_dict(), t42_parse_sfnts(), t42_parser_init(), Test_Overread(), TestIrpHandler(), TreeListKeyDown(), tt_face_get_name(), tt_face_goto_table(), tt_face_init(), tt_face_load_any(), tt_face_load_cmap(), tt_face_load_cvt(), tt_face_load_font_dir(), tt_face_load_fpgm(), tt_face_load_gasp(), tt_face_load_generic_header(), tt_face_load_hdmx(), tt_face_load_kern(), tt_face_load_loca(), tt_face_load_maxp(), tt_face_load_name(), tt_face_load_os2(), tt_face_load_pclt(), tt_face_load_prep(), TT_Load_Glyph(), USBH_ChangeIndicationWorker(), USBH_CheckDeviceLanguage(), USBH_CheckHubIdle(), USBH_CreateDevice(), USBH_FdoCleanup(), USBH_FdoPower(), USBH_GetSerialNumberString(), USBH_IoctlGetDescriptor(), USBH_IoctlGetNodeConnectionAttributes(), USBH_IoctlGetNodeConnectionDriverKeyName(), USBH_IoctlGetNodeConnectionInformation(), USBH_IoctlGetNodeName(), USBH_PdoInternalControl(), USBH_PdoQueryDeviceText(), USBH_ResetDevice(), USBH_ResetPortWorker(), USBH_StartHubFdoDevice(), USBH_SyncResetPort(), USBPORT_AllocateCommonBuffer(), USBPORT_FdoPnP(), USBPORT_FindCompanionControllers(), USBPORT_GetSymbolicName(), USBPORT_HandleSelectConfiguration(), USBPORT_MiniportCompleteTransfer(), USBPORT_OpenInterface(), USBPORT_PdoInternalDeviceControl(), USBPORT_SplitBulkInterruptTransfer(), USBPORT_TimerDpc(), UserSetCursorIconData(), Vertical_Sweep_Drop(), woff_open_font(), WsAsyncCheckAndInitThread(), and WsNqLookupServiceBegin().

◆ fill_buffer()

static void fill_buffer ( char buf,
int  chunk_size,
int  n_chunks 
)
static

Definition at line 361 of file sock.c.

363{
364 char c, *p;
365 for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size )
366 memset ( p, c, chunk_size );
const GLubyte * c
Definition: glext.h:8905
#define c
Definition: ke_i.h:80
#define memset(x, y, z)
Definition: compat.h:39
#define FIRST_CHAR
Definition: sock.c:47

Referenced by client_start().

◆ flush_events()

static void flush_events ( SOCKET  s,
HANDLE  hEvent 
)
static

Definition at line 5628 of file sock.c.

5631{
5632 WSANETWORKEVENTS netEvents;
5633 struct async_message *prev = NULL, *curr = messages_received;
5634 int ret;
5635 DWORD dwRet;
5636
5638 {
5639 dwRet = WaitForSingleObject(hEvent, 100);
5640 if (dwRet == WAIT_OBJECT_0)
5641 {
5642 ret = WSAEnumNetworkEvents(s, hEvent, &netEvents);
5643 if (ret)
5644 ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret);
5645 }
5646 }
5647 else
5648 {
5649 while (curr)
5650 {
5651 if (curr->socket == s)
5652 {
5653 if (prev) prev->next = curr->next;
5654 else messages_received = curr->next;
5655
5656 HeapFree(GetProcessHeap(), 0, curr);
5657
5658 if (prev) curr = prev->next;
5659 else curr = messages_received;
5660 }
5661 else
5662 {
5663 prev = curr;
5664 curr = curr->next;
5665 }
5666 }
#define GetProcessHeap()
Definition: compat.h:736
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapFree(x, y, z)
Definition: compat.h:735
static HANDLE hEvent
Definition: comm.c:54

◆ get_event_details()

static void get_event_details ( int  event,
int bit,
char name 
)
static

Definition at line 5531 of file sock.c.

5534{
5535 switch (event)
5536 {
5537 case FD_ACCEPT:
5538 if (bit) *bit = FD_ACCEPT_BIT;
5539 if (name) strcpy(name, "FD_ACCEPT");
5540 break;
5541 case FD_CONNECT:
5542 if (bit) *bit = FD_CONNECT_BIT;
5543 if (name) strcpy(name, "FD_CONNECT");
5544 break;
5545 case FD_READ:
5546 if (bit) *bit = FD_READ_BIT;
5547 if (name) strcpy(name, "FD_READ");
5548 break;
5549 case FD_OOB:
5550 if (bit) *bit = FD_OOB_BIT;
5551 if (name) strcpy(name, "FD_OOB");
5552 break;
5553 case FD_WRITE:
5554 if (bit) *bit = FD_WRITE_BIT;
5555 if (name) strcpy(name, "FD_WRITE");
5556 break;
5557 case FD_CLOSE:
5558 if (bit) *bit = FD_CLOSE_BIT;
5559 if (name) strcpy(name, "FD_CLOSE");
5560 break;
5561 default:
5562 if (bit) *bit = -1;
5563 if (name) sprintf(name, "bad%x", event);
#define FD_OOB_BIT
Definition: winsock2.h:297
#define FD_ACCEPT_BIT
Definition: winsock2.h:299
#define FD_OOB
Definition: winsock.h:407
#define FD_ACCEPT
Definition: winsock.h:408

◆ gethostname()

int WINAPI gethostname ( char name,
int  namelen 
)

Referenced by test_gethostbyname().

◆ inet_ntoa_thread_proc()

static DWORD WINAPI inet_ntoa_thread_proc ( void param)
static

Definition at line 10550 of file sock.c.

10553{
10554 ULONG addr;
10555 const char *str;
10556 HANDLE *event = param;
10557
10558 addr = inet_addr("4.3.2.1");
10559 ok(addr == htonl(0x04030201), "expected 0x04030201, got %08x\n", addr);
10560 str = inet_ntoa(*(struct in_addr *)&addr);
10561 ok(!strcmp(str, "4.3.2.1"), "expected 4.3.2.1, got %s\n", str);
10562
10563 SetEvent(event[0]);
10564 WaitForSingleObject(event[1], 3000);
10565
#define inet_ntoa(addr)
Definition: inet.h:100
#define htonl(x)
Definition: module.h:214
const WCHAR * str
Definition: tcpip.h:126
uint32_t ULONG
Definition: typedefs.h:59

◆ Init()

static void Init ( void  )
static

Definition at line 1287 of file sock.c.

1289{
1290 WORD ver = MAKEWORD (2, 2);
1291 WSADATA data;
1292 HMODULE hws2_32 = GetModuleHandleA("ws2_32.dll"), hiphlpapi, ntdll;
1293
1294 pfreeaddrinfo = (void *)GetProcAddress(hws2_32, "freeaddrinfo");
1295 pgetaddrinfo = (void *)GetProcAddress(hws2_32, "getaddrinfo");
1296 pFreeAddrInfoW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoW");
1297 pFreeAddrInfoExW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoExW");
1298 pGetAddrInfoW = (void *)GetProcAddress(hws2_32, "GetAddrInfoW");
1299 pGetAddrInfoExW = (void *)GetProcAddress(hws2_32, "GetAddrInfoExW");
1300 pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(hws2_32, "GetAddrInfoExOverlappedResult");
1301 pInetNtop = (void *)GetProcAddress(hws2_32, "inet_ntop");
1302 pInetNtopW = (void *)GetProcAddress(hws2_32, "InetNtopW");
1303 pInetPtonA = (void *)GetProcAddress(hws2_32, "inet_pton");
1304 pInetPtonW = (void *)GetProcAddress(hws2_32, "InetPtonW");
1305 pWSALookupServiceBeginW = (void *)GetProcAddress(hws2_32, "WSALookupServiceBeginW");
1306 pWSALookupServiceEnd = (void *)GetProcAddress(hws2_32, "WSALookupServiceEnd");
1307 pWSALookupServiceNextW = (void *)GetProcAddress(hws2_32, "WSALookupServiceNextW");
1308 pWSAEnumNameSpaceProvidersA = (void *)GetProcAddress(hws2_32, "WSAEnumNameSpaceProvidersA");
1309 pWSAEnumNameSpaceProvidersW = (void *)GetProcAddress(hws2_32, "WSAEnumNameSpaceProvidersW");
1310 pWSAPoll = (void *)GetProcAddress(hws2_32, "WSAPoll");
1311
1312 hiphlpapi = LoadLibraryA("iphlpapi.dll");
1313 if (hiphlpapi)
1314 {
1315 pGetIpForwardTable = (void *)GetProcAddress(hiphlpapi, "GetIpForwardTable");
1316 pGetAdaptersInfo = (void *)GetProcAddress(hiphlpapi, "GetAdaptersInfo");
1317 }
1318
1319 ntdll = LoadLibraryA("ntdll.dll");
1320 if (ntdll)
1321 {
1322 pNtClose = (void *)GetProcAddress(ntdll, "NtClose");
1323 pNtSetInformationFile = (void *)GetProcAddress(ntdll, "NtSetInformationFile");
1324 pNtQueryInformationFile = (void *)GetProcAddress(ntdll, "NtQueryInformationFile");
1325 }
1326
1327 ok ( WSAStartup ( ver, &data ) == 0, "WSAStartup failed\n" );
1328 tls = TlsAlloc();
#define GetProcAddress(x, y)
Definition: compat.h:753
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
DWORD WINAPI TlsAlloc(VOID)
Definition: thread.c:1100
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define MAKEWORD(a, b)
Definition: typedefs.h:248

◆ int()

static int ( WINAPI pgetaddrinfo)
static

◆ io_completion()

static void WINAPI io_completion ( DWORD  error,
DWORD  transferred,
WSAOVERLAPPED overlapped,
DWORD  flags 
)
static

Definition at line 6740 of file sock.c.

6743{

◆ iocp_async_closesocket()

static void iocp_async_closesocket ( SOCKET  src)
static

Definition at line 11151 of file sock.c.

11154{
11155 HANDLE port;
11156 WSAOVERLAPPED *ovl_iocp;
11157 int ret;
11158 DWORD bytes;
11159 ULONG_PTR key;
11160 HWND hwnd;
11161 MSG msg;
11162
11163 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11164 0, 0, 0, 0, NULL, NULL, 0, NULL);
11165 ok(hwnd != 0, "CreateWindowEx failed\n");
11166
11168 ok(!ret, "got %d\n", ret);
11169
11170 Sleep(100);
11171 memset(&msg, 0, sizeof(msg));
11173 ok(ret, "got %d\n", ret);
11174 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11175 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11176 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11177 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11178
11179 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11180 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11181
11182 Sleep(100);
11184 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11185
11186 bytes = 0xdeadbeef;
11187 key = 0xdeadbeef;
11188 ovl_iocp = (void *)0xdeadbeef;
11189 SetLastError(0xdeadbeef);
11190 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11191 ok(!ret, "got %d\n", ret);
11192 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11193 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11194 ok(key == 0xdeadbeef, "got key %lu\n", key);
11195 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11196
11197 Sleep(100);
11199 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11200
11202
11203 Sleep(100);
11204 memset(&msg, 0, sizeof(msg));
11206 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11207
11208 bytes = 0xdeadbeef;
11209 key = 0xdeadbeef;
11210 ovl_iocp = (void *)0xdeadbeef;
11211 SetLastError(0xdeadbeef);
11212 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11213 ok(!ret, "got %d\n", ret);
11214 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11215 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11216 ok(key == 0xdeadbeef, "got key %lu\n", key);
11217 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11218
11220
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define SetLastError(x)
Definition: compat.h:752
INT WSAAPI WSAAsyncSelect(IN SOCKET s, IN HWND hWnd, IN UINT wMsg, IN LONG lEvent)
Definition: select.c:134
GLenum src
Definition: glext.h:6340
HANDLE WINAPI CreateIoCompletionPort(IN HANDLE FileHandle, IN HANDLE ExistingCompletionPort, IN ULONG_PTR CompletionKey, IN DWORD NumberOfConcurrentThreads)
Definition: iocompl.c:65
BOOL WINAPI GetQueuedCompletionStatus(IN HANDLE CompletionHandle, IN LPDWORD lpNumberOfBytesTransferred, OUT PULONG_PTR lpCompletionKey, OUT LPOVERLAPPED *lpOverlapped, IN DWORD dwMilliseconds)
Definition: iocompl.c:131
#define WS_POPUP
Definition: pedump.c:616
#define WM_SOCKET
Definition: sock.c:5504
Definition: copy.c:22
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
uint32_t ULONG_PTR
Definition: typedefs.h:65
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define PM_REMOVE
Definition: winuser.h:1196
BOOL WINAPI PeekMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)

◆ iocp_async_read()

static void iocp_async_read ( SOCKET  src,
SOCKET  dst 
)
static

Definition at line 10940 of file sock.c.

10943{
10944 HANDLE port;
10945 WSAOVERLAPPED ovl, *ovl_iocp;
10946 WSABUF buf;
10947 int ret;
10948 char data[512];
10949 DWORD flags, bytes;
10950 ULONG_PTR key;
10951
10952 memset(data, 0, sizeof(data));
10953 memset(&ovl, 0, sizeof(ovl));
10954
10955 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
10956 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
10957
10958 buf.len = sizeof(data);
10959 buf.buf = data;
10960 bytes = 0xdeadbeef;
10961 flags = 0;
10962 SetLastError(0xdeadbeef);
10963 ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL);
10964 ok(ret == SOCKET_ERROR, "got %d\n", ret);
10965 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
10966 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10967
10968 bytes = 0xdeadbeef;
10969 key = 0xdeadbeef;
10970 ovl_iocp = (void *)0xdeadbeef;
10971 SetLastError(0xdeadbeef);
10972 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10973 ok(!ret, "got %d\n", ret);
10974 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
10975 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10976 ok(key == 0xdeadbeef, "got key %#lx\n", key);
10977 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
10978
10979 ret = send(dst, "Hello World!", 12, 0);
10980 ok(ret == 12, "send returned %d\n", ret);
10981
10982 bytes = 0xdeadbeef;
10983 key = 0xdeadbeef;
10984 ovl_iocp = NULL;
10985 SetLastError(0xdeadbeef);
10986 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10987 ok(ret, "got %d\n", ret);
10988 ok(bytes == 12, "got bytes %u\n", bytes);
10989 ok(key == 0x12345678, "got key %#lx\n", key);
10990 ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp);
10991 if (ovl_iocp)
10992 {
10993 ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh);
10994 ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal);
10995 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data);
10996 }
10997
10998 bytes = 0xdeadbeef;
10999 key = 0xdeadbeef;
11000 ovl_iocp = (void *)0xdeadbeef;
11001 SetLastError(0xdeadbeef);
11002 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11003 ok(!ret, "got %d\n", ret);
11004 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11005 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11006 ok(key == 0xdeadbeef, "got key %#lx\n", key);
11007 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11008
#define ERROR_IO_PENDING
Definition: dderror.h:15
INT WSAAPI WSARecv(IN SOCKET s, IN OUT LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesRecvd, IN OUT LPDWORD lpFlags, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
Definition: recv.c:155
GLenum GLenum dst
Definition: glext.h:6340
DWORD InternalHigh
Definition: winsock2.h:610
DWORD Internal
Definition: winsock2.h:609
#define SOCKET_ERROR
Definition: winsock.h:333

◆ iocp_async_read_closesocket()

static void iocp_async_read_closesocket ( SOCKET  src,
int  how_to_close 
)
static

Definition at line 11010 of file sock.c.

11013{
11014 HANDLE port;
11015 WSAOVERLAPPED ovl, *ovl_iocp;
11016 WSABUF buf;
11017 int ret;
11018 char data[512];
11019 DWORD flags, bytes;
11020 ULONG_PTR key;
11021 HWND hwnd;
11022 MSG msg;
11023
11024 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11025 0, 0, 0, 0, NULL, NULL, 0, NULL);
11026 ok(hwnd != 0, "CreateWindowEx failed\n");
11027
11029 ok(!ret, "got %d\n", ret);
11030
11031 Sleep(100);
11032 memset(&msg, 0, sizeof(msg));
11034 ok(ret, "got %d\n", ret);
11035 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11036 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11037 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11038 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11039
11040 memset(data, 0, sizeof(data));
11041 memset(&ovl, 0, sizeof(ovl));
11042
11043 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11044 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11045
11046 Sleep(100);
11048 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11049
11050 buf.len = sizeof(data);
11051 buf.buf = data;
11052 bytes = 0xdeadbeef;
11053 flags = 0;
11054 SetLastError(0xdeadbeef);
11055 ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL);
11056 ok(ret == SOCKET_ERROR, "got %d\n", ret);
11057 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
11058 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11059
11060 Sleep(100);
11062 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11063
11064 bytes = 0xdeadbeef;
11065 key = 0xdeadbeef;
11066 ovl_iocp = (void *)0xdeadbeef;
11067 SetLastError(0xdeadbeef);
11068 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11069 ok(!ret, "got %d\n", ret);
11070 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11071 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11072 ok(key == 0xdeadbeef, "got key %#lx\n", key);
11073 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11074
11075 Sleep(100);
11077 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11078
11079 switch (how_to_close)
11080 {
11081 case 0:
11083 break;
11084 case 1:
11086 break;
11087 case 2:
11088 pNtClose((HANDLE)src);
11089 break;
11090 default:
11091 ok(0, "wrong value %d\n", how_to_close);
11092 break;
11093 }
11094
11095 Sleep(200);
11096 memset(&msg, 0, sizeof(msg));
11098 switch (how_to_close)
11099 {
11100 case 0:
11101 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11102 break;
11103 case 1:
11104 case 2:
11106{
11107 ok(ret, "got %d\n", ret);
11108 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11109 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11110 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11111 ok(msg.lParam == 0x20, "got %08lx\n", msg.lParam);
11112}
11113 break;
11114 default:
11115 ok(0, "wrong value %d\n", how_to_close);
11116 break;
11117 }
11118
11119 bytes = 0xdeadbeef;
11120 key = 0xdeadbeef;
11121 ovl_iocp = NULL;
11122 SetLastError(0xdeadbeef);
11123 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11124 ok(!ret, "got %d\n", ret);
11127 ok(!bytes, "got bytes %u\n", bytes);
11128 ok(key == 0x12345678, "got key %#lx\n", key);
11129 ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp);
11130 if (ovl_iocp)
11131 {
11132 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11134 ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal);
11135 }
11136
11137 bytes = 0xdeadbeef;
11138 key = 0xdeadbeef;
11139 ovl_iocp = (void *)0xdeadbeef;
11140 SetLastError(0xdeadbeef);
11141 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11142 ok(!ret, "got %d\n", ret);
11143 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11144 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11145 ok(key == 0xdeadbeef, "got key %#lx\n", key);
11146 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11147
11149
#define todo_wine
Definition: custom.c:79
#define STATUS_CONNECTION_ABORTED
Definition: ntstatus.h:709
#define STATUS_LOCAL_DISCONNECT
Definition: ntstatus.h:551
#define ERROR_CONNECTION_ABORTED
Definition: winerror.h:739
#define ERROR_NETNAME_DELETED
Definition: winerror.h:156

◆ iocp_async_read_thread()

static void iocp_async_read_thread ( SOCKET  src,
SOCKET  dst 
)
static

Definition at line 11391 of file sock.c.

11394{
11395 struct wsa_async_select_info select_info;
11396 struct wsa_recv_info recv_info;
11398 WSAOVERLAPPED *ovl_iocp;
11399 int ret;
11400 char data[512];
11401 DWORD bytes, tid;
11402 ULONG_PTR key;
11403 HWND hwnd;
11404 MSG msg;
11405
11406 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11407 0, 0, 0, 0, NULL, NULL, 0, NULL);
11408 ok(hwnd != 0, "CreateWindowEx failed\n");
11409
11410 select_info.sock = src;
11411 select_info.hwnd = hwnd;
11412 thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid);
11413 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11414 ret = WaitForSingleObject(thread, 10000);
11415 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11416
11417 Sleep(100);
11418 memset(&msg, 0, sizeof(msg));
11420 ok(ret, "got %d\n", ret);
11421 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11422 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11423 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11424 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11425
11426 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11427 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11428
11429 Sleep(100);
11431 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11432
11433 memset(data, 0, sizeof(data));
11434 memset(&recv_info.ovl, 0, sizeof(recv_info.ovl));
11435 recv_info.sock = src;
11436 recv_info.wsa_buf.len = sizeof(data);
11437 recv_info.wsa_buf.buf = data;
11438 thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid);
11439 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11440 ret = WaitForSingleObject(thread, 10000);
11441 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11442
11443 Sleep(100);
11445 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11446
11447 bytes = 0xdeadbeef;
11448 key = 0xdeadbeef;
11449 ovl_iocp = (void *)0xdeadbeef;
11450 SetLastError(0xdeadbeef);
11451 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11452 ok(!ret, "got %d\n", ret);
11454 if (GetLastError() == WAIT_TIMEOUT)
11455 {
11456 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11457 ok(key == 0xdeadbeef, "got key %lu\n", key);
11458 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11459 }
11460 else /* document XP behaviour */
11461 {
11462 ok(bytes == 0, "got bytes %u\n", bytes);
11463 ok(key == 0x12345678, "got key %#lx\n", key);
11464 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11465 if (ovl_iocp)
11466 {
11467 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11468 ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal);
11469 }
11470 }
11471
11472 Sleep(100);
11473 memset(&msg, 0, sizeof(msg));
11475 ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11476 if (ret) /* document XP behaviour */
11477 {
11478 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11479 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11480 ok(msg.lParam == 1, "got %08lx\n", msg.lParam);
11481 }
11482
11483 ret = send(dst, "Hello World!", 12, 0);
11484 ok(ret == 12, "send returned %d\n", ret);
11485
11486 Sleep(100);
11487 memset(&msg, 0, sizeof(msg));
11489 ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11490 if (ret) /* document XP behaviour */
11491 {
11492 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11493 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11494 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11495 ok(msg.lParam == 1, "got %08lx\n", msg.lParam);
11496 }
11497
11498 bytes = 0xdeadbeef;
11499 key = 0xdeadbeef;
11500 ovl_iocp = (void *)0xdeadbeef;
11501 SetLastError(0xdeadbeef);
11502 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11503 ok(ret || broken(GetLastError() == WAIT_TIMEOUT) /* XP */, "got %u\n", GetLastError());
11504 if (ret)
11505 {
11506 ok(bytes == 12, "got bytes %u\n", bytes);
11507 ok(key == 0x12345678, "got key %#lx\n", key);
11508 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11509 if (ovl_iocp)
11510 {
11511 ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh);
11512 ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal);
11513 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data);
11514 }
11515 }
11516 else /* document XP behaviour */
11517 {
11518 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11519 ok(key == 0xdeadbeef, "got key %lu\n", key);
11520 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11521 }
11522
11524
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
static TfClientId tid
static DWORD WINAPI wsa_recv_thread(void *param)
Definition: sock.c:11246
static DWORD WINAPI wsa_async_select_thread(void *param)
Definition: sock.c:11228
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define ERROR_OPERATION_ABORTED
Definition: winerror.h:575

◆ iocp_async_read_thread_closesocket()

static void iocp_async_read_thread_closesocket ( SOCKET  src)
static

Definition at line 11263 of file sock.c.

11266{
11267 struct wsa_async_select_info select_info;
11268 struct wsa_recv_info recv_info;
11270 WSAOVERLAPPED *ovl_iocp;
11271 int ret;
11272 char data[512];
11273 DWORD bytes, tid;
11274 ULONG_PTR key;
11275 HWND hwnd;
11276 MSG msg;
11277
11278 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11279 0, 0, 0, 0, NULL, NULL, 0, NULL);
11280 ok(hwnd != 0, "CreateWindowEx failed\n");
11281
11282 select_info.sock = src;
11283 select_info.hwnd = hwnd;
11284 thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid);
11285 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11286 ret = WaitForSingleObject(thread, 10000);
11287 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11288
11289 Sleep(100);
11290 memset(&msg, 0, sizeof(msg));
11292 ok(ret, "got %d\n", ret);
11293 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11294 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11295 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11296 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11297
11298 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11299 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11300
11301 Sleep(100);
11303 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11304
11305 memset(data, 0, sizeof(data));
11306 memset(&recv_info.ovl, 0, sizeof(recv_info.ovl));
11307 recv_info.sock = src;
11308 recv_info.wsa_buf.len = sizeof(data);
11309 recv_info.wsa_buf.buf = data;
11310 thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid);
11311 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11312 ret = WaitForSingleObject(thread, 10000);
11313 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11314
11315 Sleep(100);
11317 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11318
11319 bytes = 0xdeadbeef;
11320 key = 0xdeadbeef;
11321 ovl_iocp = (void *)0xdeadbeef;
11322 SetLastError(0xdeadbeef);
11323 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11324 ok(!ret, "got %d\n", ret);
11326 "got %u\n", GetLastError());
11327 if (GetLastError() == WAIT_TIMEOUT)
11328 {
11329 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11330 ok(key == 0xdeadbeef, "got key %lx\n", key);
11331 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11332 }
11333 else /* document XP behaviour */
11334 {
11335 ok(!bytes, "got bytes %u\n", bytes);
11336 ok(key == 0x12345678, "got key %#lx\n", key);
11337 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11338 if (ovl_iocp)
11339 {
11340 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11341 ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal);
11342 }
11343
11345 goto xp_is_broken;
11346 }
11347
11348 Sleep(100);
11350 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11351
11353
11354 Sleep(100);
11356 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11357
11358 bytes = 0xdeadbeef;
11359 key = 0xdeadbeef;
11360 ovl_iocp = NULL;
11361 SetLastError(0xdeadbeef);
11362 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11363 ok(!ret, "got %d\n", ret);
11366 ok(!bytes, "got bytes %u\n", bytes);
11367 ok(key == 0x12345678, "got key %#lx\n", key);
11368 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11369 if (ovl_iocp)
11370 {
11371 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11373 ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal);
11374 }
11375
11376xp_is_broken:
11377 bytes = 0xdeadbeef;
11378 key = 0xdeadbeef;
11379 ovl_iocp = (void *)0xdeadbeef;
11380 SetLastError(0xdeadbeef);
11381 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11382 ok(!ret, "got %d\n", ret);
11383 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11384 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11385 ok(key == 0xdeadbeef, "got key %lu\n", key);
11386 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11387
11389

◆ match_event_sequence()

static int match_event_sequence ( SOCKET  s,
WSANETWORKEVENTS netEvents,
const LPARAM seq 
)
static

Definition at line 5668 of file sock.c.

5671{
5672 int event, index, error, events;
5673 struct async_message *curr;
5674
5675 if (netEvents)
5676 {
5677 events = netEvents->lNetworkEvents;
5678 while (*seq)
5679 {
5680 event = WSAGETSELECTEVENT(*seq);
5681 error = WSAGETSELECTERROR(*seq);
5683
5684 if (!(events & event) && index != -1)
5685 return 0;
5686 if (events & event && index != -1)
5687 {
5688 if (netEvents->iErrorCode[index] != error)
5689 return 0;
5690 }
5691 events &= ~event;
5692 seq++;
5693 }
5694 if (events)
5695 return 0;
5696 }
5697 else
5698 {
5699 curr = messages_received;
5700 while (curr)
5701 {
5702 if (curr->socket == s)
5703 {
5704 if (!*seq) return 0;
5705 if (*seq != curr->lparam) return 0;
5706 seq++;
5707 }
5708 curr = curr->next;
5709 }
5710 if (*seq)
5711 return 0;
5712 }
HANDLE events[2]
Definition: event.c:4

Referenced by ok_event_sequence().

◆ NTSTATUS()

static NTSTATUS ( WINAPI pNtSetInformationFile)
static

◆ ok_event_sequence()

static void ok_event_sequence ( SOCKET  s,
HANDLE  hEvent,
const LPARAM seq,
const LPARAM **  broken_seqs,
int  completelyBroken 
)
static

Definition at line 5715 of file sock.c.

5718{
5719 MSG msg;
5720 WSANETWORKEVENTS events, *netEvents = NULL;
5721 int ret;
5722 DWORD dwRet;
5723
5725 {
5726 netEvents = &events;
5727
5728 dwRet = WaitForSingleObject(hEvent, 200);
5729 if (dwRet == WAIT_OBJECT_0)
5730 {
5731 ret = WSAEnumNetworkEvents(s, hEvent, netEvents);
5732 if (ret)
5733 {
5734 winetest_ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret);
5735 return;
5736 }
5737 }
5738 else
5739 memset(netEvents, 0, sizeof(*netEvents));
5740 }
5741 else
5742 {
5743 Sleep(200);
5744 /* Run the message loop a little */
5745 while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE ))
5746 {
5748 }
5749 }
5750
5751 if (match_event_sequence(s, netEvents, seq))
5752 {
5753 winetest_ok(1, "Sequence matches expected: %s\n", dbgstr_event_seq(seq));
5755 return;
5756 }
5757
5758 if (broken_seqs)
5759 {
5760 for (; *broken_seqs; broken_seqs++)
5761 {
5762 if (match_event_sequence(s, netEvents, *broken_seqs))
5763 {
5764 winetest_ok(broken(1), "Sequence matches broken: %s, expected %s\n", dbgstr_event_seq_result(s, netEvents), dbgstr_event_seq(seq));
5766 return;
5767 }
5768 }
5769 }
5770
5771 winetest_ok(broken(completelyBroken), "Expected event sequence %s, got %s\n", dbgstr_event_seq(seq),
5772 dbgstr_event_seq_result(s, netEvents));
static void flush_events(void)
Definition: SystemMenu.c:167
void __winetest_cdecl winetest_ok(int condition, const char *msg,...)
static char * dbgstr_event_seq_result(SOCKET s, WSANETWORKEVENTS *netEvents)
Definition: sock.c:5584
static const char * dbgstr_event_seq(const LPARAM *seq)
Definition: sock.c:5565
static int match_event_sequence(SOCKET s, WSANETWORKEVENTS *netEvents, const LPARAM *seq)
Definition: sock.c:5668
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)

◆ oob_client()

static VOID WINAPI oob_client ( client_params par)
static

Definition at line 921 of file sock.c.

923{
924 test_params *gen = par->general;
926 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
927
928 id = GetCurrentThreadId();
929 trace ( "oob_client (%x): starting\n", id );
930 /* wait here because we want to call set_so_opentype before creating a socket */
932 trace ( "oob_client (%x): server ready\n", id );
933
935 set_so_opentype ( FALSE ); /* non-overlapped */
936 client_start ( par );
937 mem = TlsGetValue ( tls );
938
939 /* Connect */
940 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
941 0 ==, "oob_client (%x): connect error: %d\n" );
942 ok ( set_blocking ( mem->s, TRUE ) == 0,
943 "oob_client (%x): failed to set blocking mode\n", id );
944 trace ( "oob_client (%x) connected\n", id );
945
946 /* send data to server */
947 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen );
948 ok ( n_sent == n_expected,
949 "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
950
951 /* Receive data echoed back & check it */
952 n_recvd = do_synchronous_recv ( mem->s, mem->recv_buf, n_expected, 0, par->buflen );
953 ok ( n_recvd == n_expected,
954 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
955 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
956 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
957
958 /* send out-of-band data to server */
959 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, MSG_OOB, par->buflen );
960 ok ( n_sent == n_expected,
961 "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
962
963 /* shutdown send direction */
964 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
965
966 /* cleanup */
967 read_zero_bytes ( mem->s );
968 trace ( "oob_client (%x) exiting\n", id );
969 client_stop ();
GLuint id
Definition: glext.h:5910
static void read_zero_bytes(SOCKET s)
Definition: sock.c:384
static int do_synchronous_send(SOCKET s, char *buf, int buflen, int flags, int sendlen)
Definition: sock.c:393
static int set_blocking(SOCKET s, BOOL blocking)
Definition: sock.c:355
static void check_so_opentype(void)
Definition: sock.c:436
static void set_so_opentype(BOOL overlapped)
Definition: sock.c:342
static int do_synchronous_recv(SOCKET s, char *buf, int buflen, int flags, int recvlen)
Definition: sock.c:406
#define MSG_OOB
Definition: winsock.h:221

◆ oob_server()

static VOID WINAPI oob_server ( server_params par)
static

Definition at line 663 of file sock.c.

665{
666 test_params *gen = par->general;
668 u_long atmark = 0;
669 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, tmp,
670 id = GetCurrentThreadId();
671
672 trace ( "oob_server (%x) starting\n", id );
673
674 set_so_opentype ( FALSE ); /* non-overlapped */
675 server_start ( par );
676 mem = TlsGetValue ( tls );
677
678 wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "oob_server (%x): failed to set blocking mode: %d\n");
679 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "oob_server (%x): listen failed: %d\n");
680
681 trace ( "oob_server (%x) ready\n", id );
682 SetEvent ( server_ready ); /* notify clients */
683
684 trace ( "oob_server (%x): waiting for client\n", id );
685
686 /* accept a single connection */
687 tmp = sizeof ( mem->sock[0].peer );
688 mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp );
689 wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "oob_server (%x): accept failed: %d\n" );
690
691 ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
692 "oob_server (%x): strange peer address\n", id );
693
694 /* check initial atmark state */
695 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
696 ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark );
697
698 /* Receive normal data */
699 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
700 ok ( n_recvd == n_expected,
701 "oob_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
702 pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks );
703 ok ( pos == -1, "oob_server (%x): test pattern error: %d\n", id, pos);
704
705 /* check atmark state */
706 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
707 ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark );
708
709 /* Echo data back */
710 n_sent = do_synchronous_send ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
711 ok ( n_sent == n_expected,
712 "oob_server (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
713
714 /* Receive a part of the out-of-band data and print atmark state */
715 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, 8, 0, par->buflen );
716 ok ( n_recvd == 8,
717 "oob_server (%x): received less data than expected: %d of %d\n", id, n_recvd, 8 );
718 n_expected -= 8;
719
720 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
721 trace( "oob_server (%x): %s the OOB mark: %i\n", id, atmark == 1 ? "not at" : "at", atmark );
722
723 /* Receive the rest of the out-of-band data and check atmark state */
724 do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
725
726 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
727 todo_wine ok ( atmark == 0, "oob_server (%x): not at the OOB mark: %i\n", id, atmark );
728
729 /* cleanup */
730 wsa_ok ( closesocket ( mem->sock[0].s ), 0 ==, "oob_server (%x): closesocket error: %d\n" );
731 mem->sock[0].s = INVALID_SOCKET;
732
733 trace ( "oob_server (%x) exiting\n", id );
734 server_stop ();
unsigned long u_long
Definition: linux.h:269
#define ioctlsocket
Definition: ncftp.h:481
static void server_stop(void)
Definition: sock.c:548
static void server_start(server_params *par)
Definition: sock.c:521
INT WSAAPI listen(IN SOCKET s, IN INT backlog)
Definition: sockctrl.c:123
test_params * general
Definition: sock.c:140
int buflen
Definition: sock.c:142
#define SOMAXCONN
Definition: winsock.h:399
#define SIOCATMARK
Definition: winsock.h:253

◆ PCSTR()

static PCSTR ( WINAPI pInetNtop)
static

◆ PCWSTR()

static PCWSTR ( WINAPI pInetNtopW)
static

◆ poll_isset()

static BOOL poll_isset ( WSAPOLLFD *  fds,
int  max,
SOCKET  s,
int  rev 
)
static

Definition at line 7123 of file sock.c.

7123 {fds[ix].fd = s; fds[ix++].events = ev;}
7124#define POLL_ISSET(s, rev) poll_isset(fds, ix, s, rev)
7125static BOOL poll_isset(WSAPOLLFD *fds, int max, SOCKET s, int rev)
7126{
7127 int k;
7128 for (k = 0; k < max; k++)
7129 if (fds[k].fd == s && (fds[k].revents == rev)) return TRUE;
int rev
Definition: sort.c:17
static int fd
Definition: io.c:51
static BOOL poll_isset(WSAPOLLFD *fds, int max, SOCKET s, int rev)
Definition: sock.c:7123
#define max(a, b)
Definition: svc.c:63

◆ read_zero_bytes()

static void read_zero_bytes ( SOCKET  s)
static

Definition at line 384 of file sock.c.

386{
387 char buf[256];
388 int tmp, n = 0;
389 while ( ( tmp = recv ( s, buf, 256, 0 ) ) > 0 )
390 n += tmp;
391 ok ( n <= 0, "garbage data received: %d bytes\n", n );

Referenced by oob_client(), select_server(), simple_client(), simple_mixed_client(), and simple_server().

◆ recv_thread()

static DWORD WINAPI recv_thread ( LPVOID  arg)
static

Definition at line 6720 of file sock.c.

6723{
6724 SOCKET sock = *(SOCKET *)arg;
6725 char buffer[32];
6726 WSABUF wsa;
6727 WSAOVERLAPPED ov;
6728 DWORD flags = 0;
6729
6730 wsa.buf = buffer;
6731 wsa.len = sizeof(buffer);
6732 ov.hEvent = WSACreateEvent();
6733 WSARecv(sock, &wsa, 1, NULL, &flags, &ov, NULL);
6734
6735 WaitForSingleObject(ov.hEvent, 1000);
ULONG len
Definition: ws2def.h:519
CHAR FAR * buf
Definition: ws2def.h:520
WSAEVENT hEvent
Definition: winsock2.h:613

◆ select_server()

static VOID WINAPI select_server ( server_params par)
static

Definition at line 739 of file sock.c.

741{
742 test_params *gen = par->general;
744 int n_expected = gen->n_chunks * gen->chunk_size, tmp, i,
745 id = GetCurrentThreadId(), n_connections = 0, n_sent, n_recvd,
746 n_set, delta, n_ready;
747 struct timeval timeout = {0,10}; /* wait for 10 milliseconds */
748 fd_set fds_recv, fds_send, fds_openrecv, fds_opensend;
749
750 trace ( "select_server (%x) starting\n", id );
751
752 set_so_opentype ( FALSE ); /* non-overlapped */
753 server_start ( par );
754 mem = TlsGetValue ( tls );
755
756 wsa_ok ( set_blocking ( mem->s, FALSE ), 0 ==, "select_server (%x): failed to set blocking mode: %d\n");
757 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "select_server (%x): listen failed: %d\n");
758
759 trace ( "select_server (%x) ready\n", id );
760 SetEvent ( server_ready ); /* notify clients */
761
762 FD_ZERO ( &fds_openrecv );
763 FD_ZERO ( &fds_recv );
764 FD_ZERO ( &fds_send );
765 FD_ZERO ( &fds_opensend );
766
767 FD_SET ( mem->s, &fds_openrecv );
768
769 while(1)
770 {
771 fds_recv = fds_openrecv;
772 fds_send = fds_opensend;
773
774 n_set = 0;
775
776 wsa_ok ( ( n_ready = select ( 0, &fds_recv, &fds_send, NULL, &timeout ) ), SOCKET_ERROR !=,
777 "select_server (%x): select() failed: %d\n" );
778
779 /* check for incoming requests */
780 if ( FD_ISSET ( mem->s, &fds_recv ) ) {
781 n_set += 1;
782
783 trace ( "select_server (%x): accepting client connection\n", id );
784
785 /* accept a single connection */
786 tmp = sizeof ( mem->sock[n_connections].peer );
787 mem->sock[n_connections].s = accept ( mem->s, (struct sockaddr*) &mem->sock[n_connections].peer, &tmp );
788 wsa_ok ( mem->sock[n_connections].s, INVALID_SOCKET !=, "select_server (%x): accept() failed: %d\n" );
789
790 ok ( mem->sock[n_connections].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
791 "select_server (%x): strange peer address\n", id );
792
793 /* add to list of open connections */
794 FD_SET ( mem->sock[n_connections].s, &fds_openrecv );
795 FD_SET ( mem->sock[n_connections].s, &fds_opensend );
796
797 n_connections++;
798 }
799
800 /* handle open requests */
801
802 for ( i = 0; i < n_connections; i++ )
803 {
804 if ( FD_ISSET( mem->sock[i].s, &fds_recv ) ) {
805 n_set += 1;
806
807 if ( mem->sock[i].n_recvd < n_expected ) {
808 /* Receive data & check it */
809 n_recvd = recv ( mem->sock[i].s, mem->sock[i].buf + mem->sock[i].n_recvd, min ( n_expected - mem->sock[i].n_recvd, par->buflen ), 0 );
810 ok ( n_recvd != SOCKET_ERROR, "select_server (%x): error in recv(): %d\n", id, WSAGetLastError() );
811 mem->sock[i].n_recvd += n_recvd;
812
813 if ( mem->sock[i].n_recvd == n_expected ) {
814 int pos = test_buffer ( mem->sock[i].buf, gen->chunk_size, gen->n_chunks );
815 ok ( pos == -1, "select_server (%x): test pattern error: %d\n", id, pos );
816 FD_CLR ( mem->sock[i].s, &fds_openrecv );
817 }
818
819 ok ( mem->sock[i].n_recvd <= n_expected, "select_server (%x): received too many bytes: %d\n", id, mem->sock[i].n_recvd );
820 }
821 }
822
823 /* only echo back what we've received */
824 delta = mem->sock[i].n_recvd - mem->sock[i].n_sent;
825
826 if ( FD_ISSET ( mem->sock[i].s, &fds_send ) ) {
827 n_set += 1;
828
829 if ( ( delta > 0 ) && ( mem->sock[i].n_sent < n_expected ) ) {
830 /* Echo data back */
831 n_sent = send ( mem->sock[i].s, mem->sock[i].buf + mem->sock[i].n_sent, min ( delta, par->buflen ), 0 );
832 ok ( n_sent != SOCKET_ERROR, "select_server (%x): error in send(): %d\n", id, WSAGetLastError() );
833 mem->sock[i].n_sent += n_sent;
834
835 if ( mem->sock[i].n_sent == n_expected ) {
836 FD_CLR ( mem->sock[i].s, &fds_opensend );
837 }
838
839 ok ( mem->sock[i].n_sent <= n_expected, "select_server (%x): sent too many bytes: %d\n", id, mem->sock[i].n_sent );
840 }
841 }
842 }
843
844 /* check that select returned the correct number of ready sockets */
845 ok ( ( n_set == n_ready ), "select_server (%x): select() returns wrong number of ready sockets\n", id );
846
847 /* check if all clients are done */
848 if ( ( fds_opensend.fd_count == 0 )
849 && ( fds_openrecv.fd_count == 1 ) /* initial socket that accepts clients */
850 && ( n_connections == min ( gen->n_clients, MAX_CLIENTS ) ) ) {
851 break;
852 }
853 }
854
855 for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ )
856 {
857 /* cleanup */
858 read_zero_bytes ( mem->sock[i].s );
859 wsa_ok ( closesocket ( mem->sock[i].s ), 0 ==, "select_server (%x): closesocket error: %d\n" );
860 mem->sock[i].s = INVALID_SOCKET;
861 }
862
863 trace ( "select_server (%x) exiting\n", id );
864 server_stop ();
u_int fd_count
Definition: winsock.h:67
Definition: dhcpd.h:245
#define FD_ISSET(fd, set)
Definition: winsock.h:100
#define FD_CLR(fd, set)
Definition: winsock.h:74

◆ SelectCloseThread()

static DWORD WINAPI SelectCloseThread ( void param)
static

Definition at line 3648 of file sock.c.

3651{
3652 SOCKET s = *(SOCKET*)param;
3653 Sleep(500);
3654 closesocket(s);

Referenced by test_select().

◆ SelectReadThread()

static DWORD WINAPI SelectReadThread ( void param)
static

Definition at line 3621 of file sock.c.

3624{
3626 fd_set readfds;
3627 int ret;
3628 struct sockaddr_in addr;
3629 struct timeval select_timeout;
3630
3631 memset(&readfds, 0, sizeof(readfds));
3632 FD_ZERO(&readfds);
3633 FD_SET(par->s, &readfds);
3634 select_timeout.tv_sec=5;
3635 select_timeout.tv_usec=0;
3636 addr.sin_family = AF_INET;
3637 addr.sin_addr.s_addr = inet_addr(SERVERIP);
3638 addr.sin_port = htons(SERVERPORT);
3639
3640 do_bind(par->s, (struct sockaddr *)&addr, sizeof(addr));
3641 wsa_ok(listen(par->s, SOMAXCONN ), 0 ==, "SelectReadThread (%x): listen failed: %d\n");
3642
3644 ret = select(par->s+1, &readfds, NULL, NULL, &select_timeout);
3645 par->ReadKilled = (ret == 1);
3646
static void do_bind(SOCKET s, struct sockaddr *addr, int addrlen)
Definition: sock.c:507

Referenced by test_select().

◆ server_start()

static void server_start ( server_params par)
static

Definition at line 521 of file sock.c.

523{
524 int i;
525 test_params *gen = par->general;
526 server_memory *mem = LocalAlloc ( LPTR, sizeof ( server_memory ) );
527
528 TlsSetValue ( tls, mem );
529 mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot,
530 NULL, 0, par->sock_flags );
531 ok ( mem->s != INVALID_SOCKET, "Server: WSASocket failed\n" );
532
533 mem->addr.sin_family = AF_INET;
534 mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr );
535 mem->addr.sin_port = htons ( gen->inet_port );
536
537 for (i = 0; i < MAX_CLIENTS; i++)
538 {
539 mem->sock[i].s = INVALID_SOCKET;
540 mem->sock[i].buf = LocalAlloc ( LPTR, gen->n_chunks * gen->chunk_size );
541 mem->sock[i].n_recvd = 0;
542 mem->sock[i].n_sent = 0;
543 }
544
545 if ( gen->sock_type == SOCK_STREAM )
546 do_bind ( mem->s, (struct sockaddr*) &mem->addr, sizeof (mem->addr) );
DWORD sock_flags
Definition: sock.c:141

Referenced by nfs41_lookup(), oob_server(), select_server(), and simple_server().

◆ server_stop()

static void server_stop ( void  )
static

Definition at line 548 of file sock.c.

550{
551 int i;
553
554 for (i = 0; i < MAX_CLIENTS; i++ )
555 {
556 LocalFree ( mem->sock[i].buf );
557 if ( mem->sock[i].s != INVALID_SOCKET )
558 closesocket ( mem->sock[i].s );
559 }
560 ok ( closesocket ( mem->s ) == 0, "closesocket failed\n" );
561 LocalFree ( mem );

Referenced by oob_server(), select_server(), and simple_server().

◆ set_blocking()

static int set_blocking ( SOCKET  s,
BOOL  blocking 
)
static

Definition at line 355 of file sock.c.

357{
358 u_long val = !blocking;
359 return ioctlsocket ( s, FIONBIO, &val );
GLuint GLfloat * val
Definition: glext.h:7180
#define FIONBIO
Definition: winsock.h:149

Referenced by oob_client(), oob_server(), select_server(), setup_iocp_src(), simple_client(), simple_mixed_client(), simple_server(), and test_events().

◆ set_so_opentype()

static void set_so_opentype ( BOOL  overlapped)
static

Definition at line 342 of file sock.c.

344{
345 int optval = !overlapped, newval, len = sizeof (int);
346
348 (LPVOID) &optval, sizeof (optval) ) == 0,
349 "setting SO_OPENTYPE failed\n" );
351 (LPVOID) &newval, &len ) == 0,
352 "getting SO_OPENTYPE failed\n" );
353 ok ( optval == newval, "failed to set SO_OPENTYPE\n" );
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED * overlapped
Definition: sock.c:81
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
Definition: sockctrl.c:421

Referenced by oob_client(), oob_server(), select_server(), simple_client(), simple_mixed_client(), and simple_server().

◆ setup_connector_socket()

static SOCKET setup_connector_socket ( struct sockaddr_in addr,
int  len,
BOOL  nonblock 
)
static

Definition at line 4227 of file sock.c.

4230{
4231 int ret;
4232 SOCKET connector;
4233
4234 connector = socket(AF_INET, SOCK_STREAM, 0);
4235 ok(connector != INVALID_SOCKET, "failed to create connector socket %d\n", WSAGetLastError());
4236
4237 if (nonblock)
4238 set_blocking(connector, !nonblock);
4239
4240 ret = connect(connector, (struct sockaddr *)addr, len);
4241 if (!nonblock)
4242 ok(!ret, "connecting to accepting socket failed %d\n", WSAGetLastError());
4243 else if (ret == SOCKET_ERROR)
4244 {
4247 "expected 10035 or 10036, got %d\n", error);
4248 }
4249
static int nonblock(int fd, int isnonblock)
Definition: adnsresfilter.c:86
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
#define WSAEINPROGRESS
Definition: winerror.h:1949

Referenced by test_select().

◆ setup_iocp_src()

static SOCKET setup_iocp_src ( struct sockaddr_in bindAddress)
static

Definition at line 9617 of file sock.c.

9620{
9622 int iret, socklen;
9623
9625 if (src == INVALID_SOCKET)
9626 {
9627 skip("could not create listener socket, error %d\n", WSAGetLastError());
9628 goto end;
9629 }
9630
9631 memset(bindAddress, 0, sizeof(*bindAddress));
9632 bindAddress->sin_family = AF_INET;
9633 bindAddress->sin_addr.s_addr = inet_addr("127.0.0.1");
9634 iret = bind(src, (struct sockaddr*)bindAddress, sizeof(*bindAddress));
9635 if (iret != 0)
9636 {
9637 skip("failed to bind, error %d\n", WSAGetLastError());
9638 goto end;
9639 }
9640
9641 socklen = sizeof(*bindAddress);
9642 iret = getsockname(src, (struct sockaddr*)bindAddress, &socklen);
9643 if (iret != 0) {
9644 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
9645 goto end;
9646 }
9647
9648 if (set_blocking(src, FALSE))
9649 {
9650 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
9651 goto end;
9652 }
9653
9654 iret = listen(src, 5);
9655 if (iret != 0)
9656 {
9657 skip("listening failed, errno = %d\n", WSAGetLastError());
9658 goto end;
9659 }
9660
9661 ret = src;
9662end:
9663 if (src != ret && ret == INVALID_SOCKET)
#define skip(...)
Definition: atltest.h:64
GLuint GLuint end
Definition: gl.h:1545
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213
struct in_addr sin_addr
Definition: winsock.h:512
short sin_family
Definition: winsock.h:510

◆ setup_server_socket()

static SOCKET setup_server_socket ( struct sockaddr_in addr,
int len 
)
static

Definition at line 4181 of file sock.c.

4184{
4185 int ret, val;
4187
4190 {
4191 trace("error creating server socket: %d\n", WSAGetLastError());
4192 return INVALID_SOCKET;
4193 }
4194
4195 val = 1;
4196 ret = setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
4197 if (ret)
4198 {
4199 trace("error setting SO_REUSEADDR: %d\n", WSAGetLastError());
4201 return INVALID_SOCKET;
4202 }
4203
4204 ret = bind(server_socket, (struct sockaddr *)addr, *len);
4205 if (ret)
4206 {
4207 trace("error binding server socket: %d\n", WSAGetLastError());
4208 }
4209
4211 if (ret)
4212 {
4213 skip("failed to lookup bind address: %d\n", WSAGetLastError());
4215 return INVALID_SOCKET;
4216 }
4217
4218 ret = listen(server_socket, 5);
4219 if (ret)
4220 {
4221 trace("error making server socket listen: %d\n", WSAGetLastError());
4223 return INVALID_SOCKET;
4224 }
4225
static int server_socket
Definition: notification.c:641
#define SO_REUSEADDR
Definition: winsock.h:180

Referenced by test_select().

◆ simple_client()

static VOID WINAPI simple_client ( client_params par)
static

Definition at line 871 of file sock.c.

873{
874 test_params *gen = par->general;
876 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
877
878 id = GetCurrentThreadId();
879 trace ( "simple_client (%x): starting\n", id );
880 /* wait here because we want to call set_so_opentype before creating a socket */
882 trace ( "simple_client (%x): server ready\n", id );
883
885 set_so_opentype ( FALSE ); /* non-overlapped */
886 client_start ( par );
887 mem = TlsGetValue ( tls );
888
889 /* Connect */
890 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
891 0 ==, "simple_client (%x): connect error: %d\n" );
892 ok ( set_blocking ( mem->s, TRUE ) == 0,
893 "simple_client (%x): failed to set blocking mode\n", id );
894 trace ( "simple_client (%x) connected\n", id );
895
896 /* send data to server */
897 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen );
898 ok ( n_sent == n_expected,
899 "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
900
901 /* shutdown send direction */
902 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
903
904 /* Receive data echoed back & check it */
905 n_recvd = do_synchronous_recv ( mem->s, mem->recv_buf, n_expected, 0, par->buflen );
906 ok ( n_recvd == n_expected,
907 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
908
909 /* check data */
910 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
911 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
912
913 /* cleanup */
914 read_zero_bytes ( mem->s );
915 trace ( "simple_client (%x) exiting\n", id );
916 client_stop ();

◆ simple_mixed_client()

static VOID WINAPI simple_mixed_client ( client_params par)
static

Definition at line 974 of file sock.c.

976{
977 test_params *gen = par->general;
979 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
980 int fromLen = sizeof(mem->addr);
981 struct sockaddr test;
982
983 id = GetCurrentThreadId();
984 trace ( "simple_client (%x): starting\n", id );
985 /* wait here because we want to call set_so_opentype before creating a socket */
987 trace ( "simple_client (%x): server ready\n", id );
988
990 set_so_opentype ( FALSE ); /* non-overlapped */
991 client_start ( par );
992 mem = TlsGetValue ( tls );
993
994 /* Connect */
995 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
996 0 ==, "simple_client (%x): connect error: %d\n" );
997 ok ( set_blocking ( mem->s, TRUE ) == 0,
998 "simple_client (%x): failed to set blocking mode\n", id );
999 trace ( "simple_client (%x) connected\n", id );
1000
1001 /* send data to server */
1002 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen );
1003 ok ( n_sent == n_expected,
1004 "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
1005
1006 /* shutdown send direction */
1007 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
1008
1009 /* this shouldn't change, since lpFrom, is not updated on
1010 connection oriented sockets - exposed by bug 11640
1011 */
1012 ((struct sockaddr_in*)&test)->sin_addr.s_addr = inet_addr("0.0.0.0");
1013
1014 /* Receive data echoed back & check it */
1015 n_recvd = do_synchronous_recvfrom ( mem->s,
1016 mem->recv_buf,
1017 n_expected,
1018 0,
1019 (struct sockaddr *)&test,
1020 &fromLen,
1021 par->buflen );
1022 ok ( n_recvd == n_expected,
1023 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
1024
1025 /* check that lpFrom was not updated */
1026 ok(0 ==
1027 strcmp(
1028 inet_ntoa(((struct sockaddr_in*)&test)->sin_addr),
1029 "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n");
1030
1031 /* check data */
1032 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
1033 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
1034
1035 /* cleanup */
1036 read_zero_bytes ( mem->s );
1037 trace ( "simple_client (%x) exiting\n", id );
1038 client_stop ();
static int do_synchronous_recvfrom(SOCKET s, char *buf, int buflen, int flags, struct sockaddr *from, int *fromlen, int recvlen)
Definition: sock.c:419

◆ simple_server()

static VOID WINAPI simple_server ( server_params par)
static

Definition at line 607 of file sock.c.

609{
610 test_params *gen = par->general;
612 int pos, n_recvd, n_sent, n_expected = gen->n_chunks * gen->chunk_size, tmp, i,
613 id = GetCurrentThreadId();
614
615 trace ( "simple_server (%x) starting\n", id );
616
617 set_so_opentype ( FALSE ); /* non-overlapped */
618 server_start ( par );
619 mem = TlsGetValue ( tls );
620
621 wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "simple_server (%x): failed to set blocking mode: %d\n");
622 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "simple_server (%x): listen failed: %d\n");
623
624 trace ( "simple_server (%x) ready\n", id );
625 SetEvent ( server_ready ); /* notify clients */
626
627 for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ )
628 {
629 trace ( "simple_server (%x): waiting for client\n", id );
630
631 /* accept a single connection */
632 tmp = sizeof ( mem->sock[0].peer );
633 mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp );
634 wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "simple_server (%x): accept failed: %d\n" );
635
636 ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
637 "simple_server (%x): strange peer address\n", id );
638
639 /* Receive data & check it */
640 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
641 ok ( n_recvd == n_expected,
642 "simple_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
643 pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks );
644 ok ( pos == -1, "simple_server (%x): test pattern error: %d\n", id, pos);
645
646 /* Echo data back */
647 n_sent = do_synchronous_send ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
648 ok ( n_sent == n_expected,
649 "simple_server (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
650
651 /* cleanup */
652 read_zero_bytes ( mem->sock[0].s );
653 wsa_ok ( closesocket ( mem->sock[0].s ), 0 ==, "simple_server (%x): closesocket error: %d\n" );
654 mem->sock[0].s = INVALID_SOCKET;
655 }
656
657 trace ( "simple_server (%x) exiting\n", id );
658 server_stop ();

◆ START_TEST()

START_TEST ( sock  )

Definition at line 11563 of file sock.c.

11566{
11567 int i;
11568
11569/* Leave these tests at the beginning. They depend on WSAStartup not having been
11570 * called, which is done by Init() below. */
11573
11574 Init();
11575
11582
11583 for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
11584 {
11585 trace ( " **** STARTING TEST %d ****\n", i );
11586 do_test ( &tests[i] );
11587 trace ( " **** TEST %d COMPLETE ****\n", i );
11588 }
11589
11590 test_UDP();
11591
11596
11599
11602
11603 test_errors();
11604 test_listen();
11605 test_select();
11606 test_accept();
11612 test_dns();
11616
11619 test_WSARecv();
11620 test_WSAPoll();
11622 test_iocp();
11623
11624 test_events(0);
11625 test_events(1);
11626
11627 test_ipv6only();
11632
11633#ifdef __REACTOS__
11635 {
11636 skip("WSPAcceptEx(), WSPConnectEx() and WSPDisconnectEx() are UNIMPLEMENTED on ReactOS\n");
11637 skip("Skipping tests due to hang. See ROSTESTS-385\n");
11638 }
11639 else
11640 {
11641#endif
11642 test_AcceptEx();
11645#ifdef __REACTOS__
11646 }
11647#endif
11648
11651
11655
11658
11661
11662 /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */
11663 test_send();
11665
static void do_test(void)
Definition: ftrandom.c:516
static void test_events(void)
Definition: itemdlg.c:1172
int winetest_interactive
static void test_WSAAddressToStringW(void)
Definition: sock.c:3191
static void test_WithWSAStartup(void)
Definition: sock.c:1185
static void test_WSAAsyncGetServByName(void)
Definition: sock.c:9583
static void test_send(void)
Definition: sock.c:5354
static void test_WSAStringToAddressA(void)
Definition: sock.c:3359
static void test_UDP(void)
Definition: sock.c:2299
static void test_GetAddrInfoExW(void)
Definition: sock.c:7622
static void test_inet_pton(void)
Definition: sock.c:5003
static void test_getpeername(void)
Definition: sock.c:9096
static void test_write_watch(void)
Definition: sock.c:6971
static void test_gethostbyname_hack(void)
Definition: sock.c:4774
static void test_WSADuplicateSocket(void)
Definition: sock.c:2795
static void test_TransmitFile(void)
Definition: sock.c:8863
static void test_WSAStringToAddressW(void)
Definition: sock.c:3483
static void test_ipv6only(void)
Definition: sock.c:6347
static void test_GetAddrInfoW(void)
Definition: sock.c:7341
static void Init(void)
Definition: sock.c:1287
static void test_synchronous_WSAIoctl(void)
Definition: sock.c:9470
static void test_inet_ntoa(void)
Definition: sock.c:10567
static void test_dns(void)
Definition: sock.c:4621
static void test_WSAEnumNetworkEvents(void)
Definition: sock.c:2956
static void test_completion_port(void)
Definition: sock.c:9666
static void test_gethostbyname(void)
Definition: sock.c:4677
static void test_listen(void)
Definition: sock.c:3693
static void test_WithoutWSAStartup(void)
Definition: sock.c:1170
static void test_so_reuseaddr(void)
Definition: sock.c:1924
static void test_getsockname(void)
Definition: sock.c:4530
static void test_WSAPoll(void)
Definition: sock.c:7131
static void test_WSAEnumNameSpaceProvidersW(void)
Definition: sock.c:10841
static void test_select(void)
Definition: sock.c:3780
static void test_accept(void)
Definition: sock.c:4251
static void test_inet_addr(void)
Definition: sock.c:4864
static void test_iocp(void)
Definition: sock.c:11526
static void test_DisconnectEx(void)
Definition: sock.c:8741
static void test_WSAEnumNameSpaceProvidersA(void)
Definition: sock.c:10756
static void test_WSARecv(void)
Definition: sock.c:6745
static void test_WSASocket(void)
Definition: sock.c:2409
static void test_ioctlsocket(void)
Definition: sock.c:5148
static void test_set_getsockopt(void)
Definition: sock.c:1408
static void test_WSAAddressToStringA(void)
Definition: sock.c:3029
static void test_WSALookupService(void)
Definition: sock.c:10595
static void test_ip_pktinfo(void)
Definition: sock.c:2003
static test_setup tests[]
Definition: sock.c:2190
static void test_errors(void)
Definition: sock.c:3656
static void test_sioAddressListChange(void)
Definition: sock.c:9234
static void test_getaddrinfo(void)
Definition: sock.c:7737
static void test_WSASendTo(void)
Definition: sock.c:6681
static void test_AcceptEx(void)
Definition: sock.c:8233
static void test_getservbyname(void)
Definition: sock.c:2388
static void test_gethostname(void)
Definition: sock.c:4831
static void test_extendedSocketOptions(void)
Definition: sock.c:4413
static void test_addr_to_print(void)
Definition: sock.c:4872
static void test_ConnectEx(void)
Definition: sock.c:8022
static void test_address_list_query(void)
Definition: sock.c:10493
static void test_WSASendMsg(void)
Definition: sock.c:6496
static void test_WSAAsyncGetServByPort(void)
Definition: sock.c:9553
static void test_sioRoutingInterfaceQuery(void)
Definition: sock.c:9186

◆ StartClients()

static void StartClients ( LPTHREAD_START_ROUTINE  routine,
test_params general,
client_params par 
)
static

Definition at line 1347 of file sock.c.

1350{
1351 int i;
1352 par->general = general;
1353 for ( i = 1; i <= min ( general->n_clients, MAX_CLIENTS ); i++ )
1354 {
1355 client_id = i - 1;
1356 thread[i] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[i] );
1357 ok ( thread[i] != NULL, "Failed to create client thread\n" );
1358 /* Make sure the client is up and running */
1360 };
int jpeg_marker_parser_method routine
Definition: jpeglib.h:1093

Referenced by do_test().

◆ StartServer()

static void StartServer ( LPTHREAD_START_ROUTINE  routine,
test_params general,
server_params par 
)
static

Definition at line 1339 of file sock.c.

1342{
1343 par->general = general;
1344 thread[0] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[0] );
1345 ok ( thread[0] != NULL, "Failed to create server thread\n" );

Referenced by do_test().

◆ sync_read()

static void sync_read ( SOCKET  src,
SOCKET  dst 
)
static

Definition at line 10926 of file sock.c.

10929{
10930 int ret;
10931 char data[512];
10932
10933 ret = send(dst, "Hello World!", 12, 0);
10934 ok(ret == 12, "send returned %d\n", ret);
10935
10936 memset(data, 0, sizeof(data));
10937 ret = recv(src, data, sizeof(data), 0);
10938 ok(ret == 12, "expected 12, got %d\n", ret);

◆ tcp_socketpair()

static int tcp_socketpair ( SOCKET src,
SOCKET dst 
)
static

Definition at line 241 of file sock.c.

243{
245 struct sockaddr_in addr;
246 int len;
247 int ret;
248
251
253 if (*src == INVALID_SOCKET)
254 goto end;
255
257 if (server == INVALID_SOCKET)
258 goto end;
259
260 memset(&addr, 0, sizeof(addr));
261 addr.sin_family = AF_INET;
262 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
263 ret = bind(server, (struct sockaddr*)&addr, sizeof(addr));
264 if (ret != 0)
265 goto end;
266
267 len = sizeof(addr);
268 ret = getsockname(server, (struct sockaddr*)&addr, &len);
269 if (ret != 0)
270 goto end;
271
272 ret = listen(server, 1);
273 if (ret != 0)
274 goto end;
275
276 ret = connect(*src, (struct sockaddr*)&addr, sizeof(addr));
277 if (ret != 0)
278 goto end;
279
280 len = sizeof(addr);
281 *dst = accept(server, (struct sockaddr*)&addr, &len);
282
283end:
284 if (server != INVALID_SOCKET)
286 if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET)
287 return 0;
290 return -1;
#define IPPROTO_TCP
Definition: ip.h:196
static rfbScreenInfoPtr server
Definition: vnc.c:74

Referenced by test_select(), and test_WithWSAStartup().

◆ tcp_socketpair_ovl()

static int tcp_socketpair_ovl ( SOCKET src,
SOCKET dst 
)
static

Definition at line 292 of file sock.c.

294{
296 struct sockaddr_in addr;
297 int len, ret;
298
301
303 if (*src == INVALID_SOCKET)
304 goto end;
305
307 if (server == INVALID_SOCKET)
308 goto end;
309
310 memset(&addr, 0, sizeof(addr));
311 addr.sin_family = AF_INET;
312 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
313 ret = bind(server, (struct sockaddr *)&addr, sizeof(addr));
314 if (ret != 0)
315 goto end;
316
317 len = sizeof(addr);
318 ret = getsockname(server, (struct sockaddr *)&addr, &len);
319 if (ret != 0)
320 goto end;
321
322 ret = listen(server, 1);
323 if (ret != 0)
324 goto end;
325
326 ret = connect(*src, (struct sockaddr *)&addr, sizeof(addr));
327 if (ret != 0)
328 goto end;
329
330 len = sizeof(addr);
331 *dst = accept(server, (struct sockaddr *)&addr, &len);
332
333end:
334 if (server != INVALID_SOCKET)
336 if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET)
337 return 0;
340 return -1;
SOCKET WSAAPI WSASocketW(IN INT af, IN INT type, IN INT protocol, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, IN GROUP g, IN DWORD dwFlags)
Definition: socklife.c:490
#define WSA_FLAG_OVERLAPPED
Definition: winsock2.h:466

◆ test_accept()

static void test_accept ( void  )
static

Definition at line 4251 of file sock.c.

4254{
4255 int ret;
4257 struct sockaddr_in address;
4258 SOCKADDR_STORAGE ss, ss_empty;
4259 int socklen;
4260 select_thread_params thread_params;
4261 HANDLE thread_handle = NULL;
4262 DWORD id;
4263
4264 memset(&address, 0, sizeof(address));
4265 address.sin_addr.s_addr = inet_addr("127.0.0.1");
4266 address.sin_family = AF_INET;
4267
4268 socklen = sizeof(address);
4271 {
4272 trace("error creating server socket: %d\n", WSAGetLastError());
4273 return;
4274 }
4275
4276 connector = setup_connector_socket(&address, socklen, FALSE);
4277 if (connector == INVALID_SOCKET) goto done;
4278
4279 trace("Blocking accept next\n");
4280
4282 ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError());
4283
4285 ok(accepted != INVALID_SOCKET, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
4286
4289 {
4290 trace("error creating event: %d\n", GetLastError());
4291 goto done;
4292 }
4293
4294 thread_params.s = server_socket;
4295 thread_params.ReadKilled = FALSE;
4296 thread_handle = CreateThread(NULL, 0, AcceptKillThread, &thread_params, 0, &id);
4297 if (thread_handle == NULL)
4298 {
4299 trace("error creating thread: %d\n", GetLastError());
4300 goto done;
4301 }
4302
4304 Sleep(200);
4306 if (ret != 0)
4307 {
4308 trace("closesocket failed: %d\n", WSAGetLastError());
4309 goto done;
4310 }
4311
4312 WaitForSingleObject(thread_handle, 1000);
4313 ok(thread_params.ReadKilled, "closesocket did not wake up accept\n");
4314
4316 closesocket(connector);
4317 accepted = connector = INVALID_SOCKET;
4318
4319 socklen = sizeof(address);
4321 if (server_socket == INVALID_SOCKET) goto done;
4322
4323 connector = setup_connector_socket(&address, socklen, FALSE);
4324 if (connector == INVALID_SOCKET) goto done;
4325
4326 socklen = 0;
4327 accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0);
4329 ok(!socklen, "got %d\n", socklen);
4330 closesocket(connector);
4331 connector = INVALID_SOCKET;
4332
4333 socklen = sizeof(address);
4334 connector = setup_connector_socket(&address, socklen, FALSE);
4335 if (connector == INVALID_SOCKET) goto done;
4336
4338 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4340 closesocket(connector);
4341 accepted = connector = INVALID_SOCKET;
4342
4343 socklen = sizeof(address);
4344 connector = setup_connector_socket(&address, socklen, FALSE);
4345 if (connector == INVALID_SOCKET) goto done;
4346
4347 socklen = sizeof(ss);
4348 memset(&ss, 0, sizeof(ss));
4349 accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0);
4350 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4351 ok(socklen != sizeof(ss), "unexpected length\n");
4352 ok(ss.ss_family, "family not set\n");
4354 closesocket(connector);
4355 accepted = connector = INVALID_SOCKET;
4356
4357 socklen = sizeof(address);
4358 connector = setup_connector_socket(&address, socklen, FALSE);
4359 if (connector == INVALID_SOCKET) goto done;
4360
4361 socklen = 0;
4362 accepted = accept(server_socket, (struct sockaddr *)&ss, &socklen);
4364 ok(!socklen, "got %d\n", socklen);
4365 closesocket(connector);
4366 accepted = connector = INVALID_SOCKET;
4367
4368 socklen = sizeof(address);
4369 connector = setup_connector_socket(&address, socklen, FALSE);
4370 if (connector == INVALID_SOCKET) goto done;
4371
4373 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4375 closesocket(connector);
4376 accepted = connector = INVALID_SOCKET;
4377
4378 socklen = sizeof(address);
4379 connector = setup_connector_socket(&address, socklen, FALSE);
4380 if (connector == INVALID_SOCKET) goto done;
4381
4382 socklen = sizeof(ss);
4383 memset(&ss, 0, sizeof(ss));
4384 accepted = accept(server_socket, (struct sockaddr *)&ss, &socklen);
4385 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4386 ok(socklen != sizeof(ss), "unexpected length\n");
4387 ok(ss.ss_family, "family not set\n");
4389 closesocket(connector);
4390 accepted = connector = INVALID_SOCKET;
4391
4392 socklen = sizeof(address);
4393 connector = setup_connector_socket(&address, socklen, FALSE);
4394 if (connector == INVALID_SOCKET) goto done;
4395
4396 memset(&ss, 0, sizeof(ss));
4397 memset(&ss_empty, 0, sizeof(ss_empty));
4398 accepted = accept(server_socket, (struct sockaddr *)&ss, NULL);
4399 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4400 ok(!memcmp(&ss, &ss_empty, sizeof(ss)), "structure is different\n");
4401
4402done:
4403 if (accepted != INVALID_SOCKET)
4405 if (connector != INVALID_SOCKET)
4406 closesocket(connector);
4407 if (thread_handle != NULL)
4408 CloseHandle(thread_handle);
#define ss
Definition: i386-dis.c:441
static void accepted(enum accept_stat, struct rpc_err *)
Definition: rpc_prot.c:280
static DWORD WINAPI AcceptKillThread(void *param)
Definition: sock.c:4158
static int CALLBACK AlwaysDeferConditionFunc(LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos, LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData, GROUP *g, DWORD_PTR dwCallbackData)
Definition: sock.c:4174
static SOCKET setup_connector_socket(struct sockaddr_in *addr, int len, BOOL nonblock)
Definition: sock.c:4227
static SOCKET setup_server_socket(struct sockaddr_in *addr, int *len)
Definition: sock.c:4181
SOCKET WSAAPI WSAAccept(IN SOCKET s, OUT LPSOCKADDR addr, IN OUT LPINT addrlen, IN LPCONDITIONPROC lpfnCondition, IN DWORD_PTR dwCallbackData)
Definition: socklife.c:302
#define WSATRY_AGAIN
Definition: winerror.h:2001
#define WSAEFAULT
Definition: winerror.h:1945

◆ test_AcceptEx()

static void test_AcceptEx ( void  )
static

Definition at line 8233 of file sock.c.

8236{
8237 SOCKET listener = INVALID_SOCKET;
8238 SOCKET acceptor = INVALID_SOCKET;
8239 SOCKET connector = INVALID_SOCKET;
8240 SOCKET connector2 = INVALID_SOCKET;
8241 struct sockaddr_in bindAddress, peerAddress, *readBindAddress, *readRemoteAddress;
8242 int socklen, optlen;
8243 GUID acceptExGuid = WSAID_ACCEPTEX, getAcceptExGuid = WSAID_GETACCEPTEXSOCKADDRS;
8244 LPFN_ACCEPTEX pAcceptEx = NULL;
8245 LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs = NULL;
8246 fd_set fds_accept, fds_send;
8247 struct timeval timeout = {0,10}; /* wait for 10 milliseconds */
8248 int got, conn1, i;
8249 DWORD bytesReturned, connect_time;
8250 char buffer[1024], ipbuffer[32];
8252 int iret, localSize = sizeof(struct sockaddr_in), remoteSize = localSize;
8253 BOOL bret;
8254 DWORD dwret;
8255
8256 memset(&overlapped, 0, sizeof(overlapped));
8257
8258 listener = socket(AF_INET, SOCK_STREAM, 0);
8259 if (listener == INVALID_SOCKET) {
8260 skip("could not create listener socket, error %d\n", WSAGetLastError());
8261 goto end;
8262 }
8263
8264 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8265 if (acceptor == INVALID_SOCKET) {
8266 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8267 goto end;
8268 }
8269
8270 connector = socket(AF_INET, SOCK_STREAM, 0);
8271 if (connector == INVALID_SOCKET) {
8272 skip("could not create connector socket, error %d\n", WSAGetLastError());
8273 goto end;
8274 }
8275
8276 memset(&bindAddress, 0, sizeof(bindAddress));
8277 bindAddress.sin_family = AF_INET;
8278 bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8279 iret = bind(listener, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8280 if (iret != 0) {
8281 skip("failed to bind, error %d\n", WSAGetLastError());
8282 goto end;
8283 }
8284
8285 socklen = sizeof(bindAddress);
8286 iret = getsockname(listener, (struct sockaddr*)&bindAddress, &socklen);
8287 if (iret != 0) {
8288 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8289 goto end;
8290 }
8291
8292 if (set_blocking(listener, FALSE)) {
8293 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8294 goto end;
8295 }
8296
8297 iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid),
8298 &pAcceptEx, sizeof(pAcceptEx), &bytesReturned, NULL, NULL);
8299 if (iret) {
8300 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError());
8301 goto end;
8302 }
8303
8304 iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &getAcceptExGuid, sizeof(getAcceptExGuid),
8305 &pGetAcceptExSockaddrs, sizeof(pGetAcceptExSockaddrs), &bytesReturned, NULL, NULL);
8306 if (iret) {
8307 skip("WSAIoctl failed to get GetAcceptExSockaddrs with ret %d + errno %d\n", iret, WSAGetLastError());
8308 goto end;
8309 }
8310
8311 bret = pAcceptEx(INVALID_SOCKET, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8312 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8313 &bytesReturned, &overlapped);
8314 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid listening socket "
8315 "returned %d + errno %d\n", bret, WSAGetLastError());
8316
8317 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8318 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8319 &bytesReturned, &overlapped);
8321 ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "AcceptEx on a non-listening socket "
8322 "returned %d + errno %d\n", bret, WSAGetLastError());
8323
8324 iret = listen(listener, 5);
8325 if (iret != 0) {
8326 skip("listening failed, errno = %d\n", WSAGetLastError());
8327 goto end;
8328 }
8329
8330 bret = pAcceptEx(listener, INVALID_SOCKET, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8331 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8332 &bytesReturned, &overlapped);
8333 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid accepting socket "
8334 "returned %d + errno %d\n", bret, WSAGetLastError());
8335
8336 bret = pAcceptEx(listener, acceptor, NULL, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8337 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8338 &bytesReturned, &overlapped);
8339 todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEFAULT,
8340 "AcceptEx on NULL buffer returned %d + errno %d\n", bret, WSAGetLastError());
8341
8342 bret = pAcceptEx(listener, acceptor, buffer, 0, 0, sizeof(struct sockaddr_in) + 16,
8343 &bytesReturned, &overlapped);
8344 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING,
8345 "AcceptEx on too small local address size returned %d + errno %d\n",
8346 bret, WSAGetLastError());
8347 bret = CancelIo((HANDLE) listener);
8348 ok(bret, "Failed to cancel pending accept socket\n");
8349
8350 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 15,
8351 sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped);
8352 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx on too small local address "
8353 "size returned %d + errno %d\n",
8354 bret, WSAGetLastError());
8355 bret = CancelIo((HANDLE) listener);
8356 ok(bret, "Failed to cancel pending accept socket\n");
8357
8358 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, 0,
8359 &bytesReturned, &overlapped);
8360 ok(bret == FALSE && WSAGetLastError() == WSAEFAULT,
8361 "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError());
8362
8363 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16,
8364 sizeof(struct sockaddr_in) + 15, &bytesReturned, &overlapped);
8365 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING,
8366 "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError());
8367 bret = CancelIo((HANDLE) listener);
8368 ok(bret, "Failed to cancel pending accept socket\n");
8369
8370 bret = pAcceptEx(listener, acceptor, buffer, 0,
8371 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8372 &bytesReturned, NULL);
8373 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped "
8374 "returned %d + errno %d\n", bret, WSAGetLastError());
8375
8376 bret = pAcceptEx(listener, acceptor, buffer, 0, 0, 0, &bytesReturned, NULL);
8377 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped "
8378 "returned %d + errno %d\n", bret, WSAGetLastError());
8379
8381 if (overlapped.hEvent == NULL) {
8382 skip("could not create event object, errno = %d\n", GetLastError());
8383 goto end;
8384 }
8385
8386 bret = pAcceptEx(listener, acceptor, buffer, 0,
8387 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8388 &bytesReturned, &overlapped);
8389 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8390
8391 bret = pAcceptEx(listener, acceptor, buffer, 0,
8392 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8393 &bytesReturned, &overlapped);
8394 todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEINVAL,
8395 "AcceptEx on already pending socket returned %d + errno %d\n", bret, WSAGetLastError());
8396 if (bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING) {
8397 /* We need to cancel this call, otherwise things fail */
8398 bret = CancelIo((HANDLE) listener);
8399 ok(bret, "Failed to cancel failed test. Bailing...\n");
8400 if (!bret) return;
8402
8403 bret = pAcceptEx(listener, acceptor, buffer, 0,
8404 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8405 &bytesReturned, &overlapped);
8406 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8407 }
8408
8409 iret = connect(acceptor, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8411 "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret, WSAGetLastError());
8412 if (!iret || (iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)) {
8413 /* We need to cancel this call, otherwise things fail */
8414 closesocket(acceptor);
8415 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8416 if (acceptor == INVALID_SOCKET) {
8417 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8418 goto end;
8419 }
8420
8421 bret = CancelIo((HANDLE) listener);
8422 ok(bret, "Failed to cancel failed test. Bailing...\n");
8423 if (!bret) return;
8424
8425 bret = pAcceptEx(listener, acceptor, buffer, 0,
8426 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8427 &bytesReturned, &overlapped);
8428 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8429 }
8430
8431 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8432 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8433
8434 dwret = WaitForSingleObject(overlapped.hEvent, INFINITE);
8435 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8436
8437 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8438 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8439 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8440
8441 closesocket(connector);
8442 connector = INVALID_SOCKET;
8443 closesocket(acceptor);
8444
8445 /* Test short reads */
8446
8447 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8448 if (acceptor == INVALID_SOCKET) {
8449 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8450 goto end;
8451 }
8452 connector = socket(AF_INET, SOCK_STREAM, 0);
8453 if (connector == INVALID_SOCKET) {
8454 skip("could not create connector socket, error %d\n", WSAGetLastError());
8455 goto end;
8456 }
8457 bret = pAcceptEx(listener, acceptor, buffer, 2,
8458 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8459 &bytesReturned, &overlapped);
8460 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8461
8462 connect_time = 0xdeadbeef;
8463 optlen = sizeof(connect_time);
8464 iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
8465 ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
8466 ok(connect_time == ~0u, "unexpected connect time %u\n", connect_time);
8467
8468 /* AcceptEx() still won't complete until we send data */
8469 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8470 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8471
8472 connect_time = 0xdeadbeef;
8473 optlen = sizeof(connect_time);
8474 iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
8475 ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
8476 ok(connect_time < 0xdeadbeef, "unexpected connect time %u\n", connect_time);
8477
8478 dwret = WaitForSingleObject(overlapped.hEvent, 0);
8479 ok(dwret == WAIT_TIMEOUT, "Waiting for accept event timeout failed with %d + errno %d\n", dwret, GetLastError());
8480
8481 iret = getsockname( connector, (struct sockaddr *)&peerAddress, &remoteSize);
8482 ok( !iret, "getsockname failed.\n");
8483
8484 /* AcceptEx() could complete any time now */
8485 iret = send(connector, buffer, 1, 0);
8486 ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError());
8487
8488 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8489 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8490
8491 /* Check if the buffer from AcceptEx is decoded correctly */
8492 pGetAcceptExSockaddrs(buffer, 2, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8493 (struct sockaddr **)&readBindAddress, &localSize,
8494 (struct sockaddr **)&readRemoteAddress, &remoteSize);
8495 strcpy( ipbuffer, inet_ntoa(readBindAddress->sin_addr));
8496 ok( readBindAddress->sin_addr.s_addr == bindAddress.sin_addr.s_addr,
8497 "Local socket address is different %s != %s\n",
8498 ipbuffer, inet_ntoa(bindAddress.sin_addr));
8499 ok( readBindAddress->sin_port == bindAddress.sin_port,
8500 "Local socket port is different: %d != %d\n",
8501 readBindAddress->sin_port, bindAddress.sin_port);
8502 strcpy( ipbuffer, inet_ntoa(readRemoteAddress->sin_addr));
8503 ok( readRemoteAddress->sin_addr.s_addr == peerAddress.sin_addr.s_addr,
8504 "Remote socket address is different %s != %s\n",
8505 ipbuffer, inet_ntoa(peerAddress.sin_addr));
8506 ok( readRemoteAddress->sin_port == peerAddress.sin_port,
8507 "Remote socket port is different: %d != %d\n",
8508 readRemoteAddress->sin_port, peerAddress.sin_port);
8509
8510 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8511 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8512 ok(bytesReturned == 1, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8513
8514 closesocket(connector);
8515 connector = INVALID_SOCKET;
8516 closesocket(acceptor);
8517
8518 /* Test CF_DEFER & AcceptEx interaction */
8519
8520 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8521 if (acceptor == INVALID_SOCKET) {
8522 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8523 goto end;
8524 }
8525 connector = socket(AF_INET, SOCK_STREAM, 0);
8526 if (connector == INVALID_SOCKET) {
8527 skip("could not create connector socket, error %d\n", WSAGetLastError());
8528 goto end;
8529 }
8530 connector2 = socket(AF_INET, SOCK_STREAM, 0);
8531 if (connector == INVALID_SOCKET) {
8532 skip("could not create connector socket, error %d\n", WSAGetLastError());
8533 goto end;
8534 }
8535
8536 if (set_blocking(connector, FALSE)) {
8537 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8538 goto end;
8539 }
8540
8541 if (set_blocking(connector2, FALSE)) {
8542 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8543 goto end;
8544 }
8545
8546 /* Connect socket #1 */
8547 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8548 ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8549
8550 FD_ZERO ( &fds_accept );
8551 FD_ZERO ( &fds_send );
8552
8553 FD_SET ( listener, &fds_accept );
8554 FD_SET ( connector, &fds_send );
8555
8556 buffer[0] = '0';
8557 got = 0;
8558 conn1 = 0;
8559
8560 for (i = 0; i < 4000; ++i)
8561 {
8562 fd_set fds_openaccept = fds_accept, fds_opensend = fds_send;
8563
8564 wsa_ok ( ( select ( 0, &fds_openaccept, &fds_opensend, NULL, &timeout ) ), SOCKET_ERROR !=,
8565 "acceptex test(%d): could not select on socket, errno %d\n" );
8566
8567 /* check for incoming requests */
8568 if ( FD_ISSET ( listener, &fds_openaccept ) ) {
8569 got++;
8570 if (got == 1) {
8572 ok(tmp == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError());
8573 bret = pAcceptEx(listener, acceptor, buffer, 0,
8574 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8575 &bytesReturned, &overlapped);
8576 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8577 }
8578 else if (got == 2) {
8579 /* this should be socket #2 */
8580 SOCKET tmp = accept(listener, NULL, NULL);
8581 ok(tmp != INVALID_SOCKET, "accept failed %d\n", WSAGetLastError());
8582 closesocket(tmp);
8583 }
8584 else {
8585 ok(FALSE, "Got more than 2 connections?\n");
8586 }
8587 }
8588 if ( conn1 && FD_ISSET ( connector2, &fds_opensend ) ) {
8589 /* Send data on second socket, and stop */
8590 send(connector2, "2", 1, 0);
8591 FD_CLR ( connector2, &fds_send );
8592
8593 break;
8594 }
8595 if ( FD_ISSET ( connector, &fds_opensend ) ) {
8596 /* Once #1 is connected, allow #2 to connect */
8597 conn1 = 1;
8598
8599 send(connector, "1", 1, 0);
8600 FD_CLR ( connector, &fds_send );
8601
8602 iret = connect(connector2, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8603 ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8604 FD_SET ( connector2, &fds_send );
8605 }
8606 }
8607
8608 ok (got == 2 || broken(got == 1) /* NT4 */,
8609 "Did not get both connections, got %d\n", got);
8610
8611 dwret = WaitForSingleObject(overlapped.hEvent, 0);
8612 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8613
8614 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8615 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8616 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8617
8618 set_blocking(acceptor, TRUE);
8619 iret = recv( acceptor, buffer, 2, 0);
8620 ok(iret == 1, "Failed to get data, %d, errno: %d\n", iret, WSAGetLastError());
8621
8622 ok(buffer[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer[0]);
8623
8624 closesocket(connector);
8625 connector = INVALID_SOCKET;
8626 closesocket(acceptor);
8627
8628 /* clean up in case of failures */
8629 while ((acceptor = accept(listener, NULL, NULL)) != INVALID_SOCKET)
8630 closesocket(acceptor);
8631
8632 /* Disconnect during receive? */
8633
8634 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8635 if (acceptor == INVALID_SOCKET) {
8636 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8637 goto end;
8638 }
8639 connector = socket(AF_INET, SOCK_STREAM, 0);
8640 if (connector == INVALID_SOCKET) {
8641 skip("could not create connector socket, error %d\n", WSAGetLastError());
8642 goto end;
8643 }
8644 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8645 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8646 &bytesReturned, &overlapped);
8647 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8648
8649 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8650 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8651
8652 closesocket(connector);
8653 connector = INVALID_SOCKET;
8654
8655 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8656 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8657
8658 bytesReturned = 123456;
8659 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8660 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8661 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8662
8663 closesocket(acceptor);
8664
8665 /* Test closing with pending requests */
8666
8667 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8668 if (acceptor == INVALID_SOCKET) {
8669 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8670 goto end;
8671 }
8672 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8673 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8674 &bytesReturned, &overlapped);
8675 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8676
8677 closesocket(acceptor);
8678
8679 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8680 todo_wine ok(dwret == WAIT_OBJECT_0,
8681 "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8682
8683 if (dwret != WAIT_TIMEOUT) {
8684 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8685 ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError());
8686 }
8687 else {
8688 bret = CancelIo((HANDLE) listener);
8689 ok(bret, "Failed to cancel failed test. Bailing...\n");
8690 if (!bret) return;
8692 }
8693
8694 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8695 if (acceptor == INVALID_SOCKET) {
8696 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8697 goto end;
8698 }
8699 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8700 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8701 &bytesReturned, &overlapped);
8702 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8703
8704 CancelIo((HANDLE) acceptor);
8705
8706 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8707 ok(dwret == WAIT_TIMEOUT, "Waiting for timeout failed with %d + errno %d\n", dwret, GetLastError());
8708
8709 closesocket(acceptor);
8710
8711 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8712 if (acceptor == INVALID_SOCKET) {
8713 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8714 goto end;
8715 }
8716 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8717 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8718 &bytesReturned, &overlapped);
8719 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8720
8721 closesocket(listener);
8722 listener = INVALID_SOCKET;
8723
8724 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8725 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8726
8727 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8728 ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError());
8729
8730end:
8731 if (overlapped.hEvent)
8732 WSACloseEvent(overlapped.hEvent);
8733 if (listener != INVALID_SOCKET)
8734 closesocket(listener);
8735 if (acceptor != INVALID_SOCKET)
8736 closesocket(acceptor);
8737 if (connector != INVALID_SOCKET)
8738 closesocket(connector);
8739 if (connector2 != INVALID_SOCKET)
BOOL WINAPI CancelIo(IN HANDLE hFile)
Definition: deviceio.c:290
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
INT WSAAPI WSAIoctl(IN SOCKET s, IN DWORD dwIoControlCode, IN LPVOID lpvInBuffer, IN DWORD cbInBuffer, OUT LPVOID lpvOutBuffer, IN DWORD cbOutBuffer, OUT LPDWORD lpcbBytesReturned, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
Definition: ioctl.c:46
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
Definition: iocompl.c:221
#define WSAID_GETACCEPTEXSOCKADDRS
Definition: mswsock.h:77
#define SO_CONNECT_TIME
Definition: mswsock.h:36
#define WSAID_ACCEPTEX
Definition: mswsock.h:74
u_short sin_port
Definition: winsock.h:511
#define WSAEINVAL
Definition: winerror.h:1946
#define WSAENOTSOCK
Definition: winerror.h:1951
int(CALLBACK * LPCONDITIONPROC)(IN LPWSABUF lpCallerId, IN LPWSABUF lpCallerData, IN OUT LPQOS lpSQOS, IN OUT LPQOS lpGQOS, IN LPWSABUF lpCalleeId, IN LPWSABUF lpCalleeData, OUT GROUP FAR *g, IN DWORD_PTR dwCallbackData)
Definition: winsock2.h:711
#define SIO_GET_EXTENSION_FUNCTION_POINTER
Definition: ws2def.h:167

◆ test_addr_to_print()

static void test_addr_to_print ( void  )
static

Definition at line 4872 of file sock.c.

4875{
4876 char dst[16];
4877 char dst6[64];
4878 const char * pdst;
4879 struct in_addr in;
4880 struct in6_addr in6;
4881
4882 u_long addr0_Num = 0x00000000;
4883 PCSTR addr0_Str = "0.0.0.0";
4884 u_long addr1_Num = 0x20201015;
4885 PCSTR addr1_Str = "21.16.32.32";
4886 u_char addr2_Num[16] = {0,0,0,0,0,0,0,0,0,0,0xff,0xfe,0xcC,0x98,0xbd,0x74};
4887 PCSTR addr2_Str = "::fffe:cc98:bd74";
4888 u_char addr3_Num[16] = {0x20,0x30,0xa4,0xb1};
4889 PCSTR addr3_Str = "2030:a4b1::";
4890 u_char addr4_Num[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0xcC,0x98,0xbd,0x74};
4891 PCSTR addr4_Str = "::204.152.189.116";
4892
4893 /* Test IPv4 addresses */
4894 in.s_addr = addr0_Num;
4895
4896 pdst = inet_ntoa(*((struct in_addr*)&in.s_addr));
4897 ok(pdst != NULL, "inet_ntoa failed %s\n", dst);
4898 ok(!strcmp(pdst, addr0_Str),"Address %s != %s\n", pdst, addr0_Str);
4899
4900 /* Test that inet_ntoa and inet_ntop return the same value */
4901 in.S_un.S_addr = addr1_Num;
4902 pdst = inet_ntoa(*((struct in_addr*)&in.s_addr));
4903 ok(pdst != NULL, "inet_ntoa failed %s\n", dst);
4904 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
4905
4906 /* InetNtop became available in Vista and Win2008 */
4907 if (!pInetNtop)
4908 {
4909 win_skip("InetNtop not present, not executing tests\n");
4910 return;
4911 }
4912
4913 /* Second part of test */
4914 pdst = pInetNtop(AF_INET,(void*)&in.s_addr, dst, sizeof(dst));
4915 ok(pdst != NULL, "InetNtop failed %s\n", dst);
4916 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
4917
4918 /* Test invalid parm conditions */
4919 pdst = pInetNtop(1, (void*)&in.s_addr, dst, sizeof(dst));
4920 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4921 ok(WSAGetLastError() == WSAEAFNOSUPPORT, "Should be WSAEAFNOSUPPORT\n");
4922
4923 /* Test Null destination */
4924 pdst = NULL;
4925 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, NULL, sizeof(dst));
4926 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4928 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4929
4930 /* Test zero length passed */
4931 WSASetLastError(0);
4932 pdst = NULL;
4933 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, 0);
4934 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4936 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4937
4938 /* Test length one shorter than the address length */
4939 WSASetLastError(0);
4940 pdst = NULL;
4941 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, 6);
4942 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4944 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4945
4946 /* Test longer length is ok */
4947 WSASetLastError(0);
4948 pdst = NULL;
4949 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, sizeof(dst)+1);
4950 ok(pdst != NULL, "The pointer should be returned (%p)\n", pdst);
4951 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
4952
4953 /* Test the IPv6 addresses */
4954
4955 /* Test an zero prefixed IPV6 address */
4956 memcpy(in6.u.Byte, addr2_Num, sizeof(addr2_Num));
4957 pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6));
4958 ok(pdst != NULL, "InetNtop failed %s\n", dst6);
4959 ok(!strcmp(pdst, addr2_Str),"Address %s != %s\n", pdst, addr2_Str);
4960
4961 /* Test an zero suffixed IPV6 address */
4962 memcpy(in6.s6_addr, addr3_Num, sizeof(addr3_Num));
4963 pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6));
4964 ok(pdst != NULL, "InetNtop failed %s\n", dst6);
4965 ok(!strcmp(pdst, addr3_Str),"Address %s != %s\n", pdst, addr3_Str);
4966
4967 /* Test the IPv6 address contains the IPv4 address in IPv4 notation */
4968 memcpy(in6.s6_addr, addr4_Num, sizeof(addr4_Num));
4969 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, sizeof(dst6));
4970 ok(pdst != NULL, "InetNtop failed %s\n", dst6);
4971 ok(!strcmp(pdst, addr4_Str),"Address %s != %s\n", pdst, addr4_Str);
4972
4973 /* Test invalid parm conditions */
4974 memcpy(in6.u.Byte, addr2_Num, sizeof(addr2_Num));
4975
4976 /* Test Null destination */
4977 pdst = NULL;
4978 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, NULL, sizeof(dst6));
4979 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4981 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4982
4983 /* Test zero length passed */
4984 WSASetLastError(0);
4985 pdst = NULL;
4986 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 0);
4987 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4989 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4990
4991 /* Test length one shorter than the address length */
4992 WSASetLastError(0);
4993 pdst = NULL;
4994 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 16);
4995 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4997 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4998
4999 /* Test longer length is ok */
5000 WSASetLastError(0);
5001 pdst = NULL;
5002 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 18);
UCHAR u_char
Definition: types.h:80
VOID WSAAPI WSASetLastError(IN INT iError)
Definition: dllmain.c:123
GLuint in
Definition: glext.h:9616
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define win_skip
Definition: test.h:160
const char * PCSTR
Definition: typedefs.h:52
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define WSAEAFNOSUPPORT
Definition: winerror.h:1960
#define AF_INET6
Definition: winsock.h:369

◆ test_address_list_query()

static void test_address_list_query ( void  )
static

Definition at line 10493 of file sock.c.

10496{
10497 SOCKET_ADDRESS_LIST *address_list;
10498 DWORD bytes_returned, size;
10499 unsigned int i;
10500 SOCKET s;
10501 int ret;
10502
10504 ok(s != INVALID_SOCKET, "Failed to create socket, error %d.\n", WSAGetLastError());
10505
10506 bytes_returned = 0;
10507 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, 0, &bytes_returned, NULL, NULL);
10508 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10509 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10510 ok(bytes_returned >= FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]),
10511 "Got unexpected bytes_returned %u.\n", bytes_returned);
10512
10513 size = bytes_returned;
10514 bytes_returned = 0;
10515 address_list = HeapAlloc(GetProcessHeap(), 0, size * 2);
10516 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size * 2, &bytes_returned, NULL, NULL);
10517 ok(!ret, "Got unexpected ret %d, error %d.\n", ret, WSAGetLastError());
10518 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10519
10520 bytes_returned = FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[address_list->iAddressCount]);
10521 for (i = 0; i < address_list->iAddressCount; ++i)
10522 {
10523 bytes_returned += address_list->Address[i].iSockaddrLength;
10524 }
10525 ok(size == bytes_returned, "Got unexpected size %u, expected %u.\n", size, bytes_returned);
10526
10527 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size, NULL, NULL, NULL);
10528 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10529 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10530
10531 bytes_returned = 0xdeadbeef;
10532 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, size, &bytes_returned, NULL, NULL);
10533 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10534 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10535 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10536
10537 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, 1, &bytes_returned, NULL, NULL);
10538 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10539 ok(WSAGetLastError() == WSAEINVAL, "Got unexpected error %d.\n", WSAGetLastError());
10540 ok(bytes_returned == 0, "Got unexpected bytes_returned %u.\n", bytes_returned);
10541
10542 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list,
10543 FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]), &bytes_returned, NULL, NULL);
10544 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10545 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10546 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10547
10548 HeapFree(GetProcessHeap(), 0, address_list);
#define HeapAlloc
Definition: compat.h:733
GLsizeiptr size
Definition: glext.h:5919
static WCHAR Address[46]
Definition: ping.c:68
SOCKET_ADDRESS Address[1]
Definition: ws2def.h:381
INT iSockaddrLength
Definition: ws2def.h:376
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define SIO_ADDRESS_LIST_QUERY
Definition: ws2def.h:177

◆ test_buffer()

static int test_buffer ( char buf,
int  chunk_size,
int  n_chunks 
)
static

Definition at line 368 of file sock.c.

370{
371 char c, *p;
372 int i;
373 for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size )
374 {
375 for ( i = 0; i < chunk_size; i++ )
376 if ( p[i] != c ) return i;
377 }
378 return -1;

◆ test_completion_port()

static void test_completion_port ( void  )
static

Definition at line 9666 of file sock.c.

9669{
9671 HANDLE previous_port, io_port;
9672 WSAOVERLAPPED ov, *olp;
9673 SOCKET src, dest, dup, connector = INVALID_SOCKET;
9677 char buf[1024];
9678 WSABUF bufs;
9679 DWORD num_bytes, flags;
9680 struct linger ling;
9681 int iret;
9682 BOOL bret;
9683 ULONG_PTR key;
9684 struct sockaddr_in bindAddress;
9685 GUID acceptExGuid = WSAID_ACCEPTEX;
9686 LPFN_ACCEPTEX pAcceptEx = NULL;
9687 fd_set fds_recv;
9688
9689 memset(buf, 0, sizeof(buf));
9690 previous_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
9691 ok( previous_port != NULL, "Failed to create completion port %u\n", GetLastError());
9692
9693 memset(&ov, 0, sizeof(ov));
9694
9697 {
9698 skip("failed to create sockets\n");
9699 goto end;
9700 }
9701
9702 bufs.len = sizeof(buf);
9703 bufs.buf = buf;
9704 flags = 0;
9705
9706 ling.l_onoff = 1;
9707 ling.l_linger = 0;
9708 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9709 ok(!iret, "Failed to set linger %d\n", GetLastError());
9710
9711 io_port = CreateIoCompletionPort( (HANDLE)dest, previous_port, 125, 0 );
9712 ok(io_port != NULL, "Failed to create completion port %u\n", GetLastError());
9713
9714 SetLastError(0xdeadbeef);
9715
9716 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9717 ok(iret == SOCKET_ERROR, "WSARecv returned %d\n", iret);
9718 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
9719
9720 Sleep(100);
9721
9724
9725 SetLastError(0xdeadbeef);
9726 key = 0xdeadbeef;
9727 num_bytes = 0xdeadbeef;
9728 olp = (WSAOVERLAPPED *)0xdeadbeef;
9729
9730 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9731 todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret);
9732 todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "Last error was %d\n", GetLastError());
9733 ok(key == 125, "Key is %lu\n", key);
9734 ok(num_bytes == 0, "Number of bytes received is %u\n", num_bytes);
9735 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9736
9737 SetLastError(0xdeadbeef);
9738 key = 0xdeadbeef;
9739 num_bytes = 0xdeadbeef;
9740 olp = (WSAOVERLAPPED *)0xdeadbeef;
9741
9742 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9743 ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret );
9744 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9745 ok(key == 0xdeadbeef, "Key is %lu\n", key);
9746 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9747 ok(!olp, "Overlapped structure is at %p\n", olp);
9748
9749 if (dest != INVALID_SOCKET)
9751
9752 memset(&ov, 0, sizeof(ov));
9753
9756 {
9757 skip("failed to create sockets\n");
9758 goto end;
9759 }
9760
9761 bufs.len = sizeof(buf);
9762 bufs.buf = buf;
9763 flags = 0;
9764
9765 ling.l_onoff = 1;
9766 ling.l_linger = 0;
9767 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9768 ok(!iret, "Failed to set linger %d\n", GetLastError());
9769
9770 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9771 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9772
9774
9777
9778 Sleep(100);
9779
9780 num_bytes = 0xdeadbeef;
9781 SetLastError(0xdeadbeef);
9782
9783 iret = WSASend(dest, &bufs, 1, &num_bytes, 0, &ov, NULL);
9784 ok(iret == SOCKET_ERROR, "WSASend failed - %d\n", iret);
9785 ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError());
9786 ok(num_bytes == 0xdeadbeef, "Managed to send %d\n", num_bytes);
9787
9788 SetLastError(0xdeadbeef);
9789 key = 0xdeadbeef;
9790 num_bytes = 0xdeadbeef;
9791 olp = (WSAOVERLAPPED *)0xdeadbeef;
9792
9793 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9794 ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9795 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9796 ok(key == 0xdeadbeef, "Key is %lu\n", key);
9797 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9798 ok(!olp, "Overlapped structure is at %p\n", olp);
9799
9800 if (dest != INVALID_SOCKET)
9802
9803 /* Test IOCP response on successful immediate read. */
9806 {
9807 skip("failed to create sockets\n");
9808 goto end;
9809 }
9810
9811 bufs.len = sizeof(buf);
9812 bufs.buf = buf;
9813 flags = 0;
9814 SetLastError(0xdeadbeef);
9815
9816 iret = WSASend(src, &bufs, 1, &num_bytes, 0, &ov, NULL);
9817 ok(!iret, "WSASend failed - %d, last error %u\n", iret, GetLastError());
9818 ok(num_bytes == sizeof(buf), "Managed to send %d\n", num_bytes);
9819
9820 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9821 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9823
9824 FD_ZERO(&fds_recv);
9825 FD_SET(dest, &fds_recv);
9826 select(dest + 1, &fds_recv, NULL, NULL, NULL);
9827
9828 num_bytes = 0xdeadbeef;
9829 flags = 0;
9830
9831 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9832 ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError());
9833 ok(num_bytes == sizeof(buf), "Managed to read %d\n", num_bytes);
9834
9835 SetLastError(0xdeadbeef);
9836 key = 0xdeadbeef;
9837 num_bytes = 0xdeadbeef;
9838 olp = (WSAOVERLAPPED *)0xdeadbeef;
9839
9840 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9841 ok(bret == TRUE, "failed to get completion status %u\n", bret);
9842 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9843 ok(key == 125, "Key is %lu\n", key);
9844 ok(num_bytes == sizeof(buf), "Number of bytes transferred is %u\n", num_bytes);
9845 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9846
9847 /* Test IOCP response on graceful shutdown. */
9849
9850 FD_ZERO(&fds_recv);
9851 FD_SET(dest, &fds_recv);
9852 select(dest + 1, &fds_recv, NULL, NULL, NULL);
9853
9854 num_bytes = 0xdeadbeef;
9855 flags = 0;
9856 memset(&ov, 0, sizeof(ov));
9857
9858 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9859 ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError());
9860 ok(!num_bytes, "Managed to read %d\n", num_bytes);
9861
9862 SetLastError(0xdeadbeef);
9863 key = 0xdeadbeef;
9864 num_bytes = 0xdeadbeef;
9865 olp = (WSAOVERLAPPED *)0xdeadbeef;
9866
9867 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9868 ok(bret == TRUE, "failed to get completion status %u\n", bret);
9869 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9870 ok(key == 125, "Key is %lu\n", key);
9871 ok(!num_bytes, "Number of bytes transferred is %u\n", num_bytes);
9872 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9873
9878
9879 /* Test IOCP response on hard shutdown. This was the condition that triggered
9880 * a crash in an actual app (bug 38980). */
9883 {
9884 skip("failed to create sockets\n");
9885 goto end;
9886 }
9887
9888 bufs.len = sizeof(buf);
9889 bufs.buf = buf;
9890 flags = 0;
9891 memset(&ov, 0, sizeof(ov));
9892
9893 ling.l_onoff = 1;
9894 ling.l_linger = 0;
9895 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9896 ok(!iret, "Failed to set linger %d\n", GetLastError());
9897
9898 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9899 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9901
9904
9905 FD_ZERO(&fds_recv);
9906 FD_SET(dest, &fds_recv);
9907 select(dest + 1, &fds_recv, NULL, NULL, NULL);
9908
9909 num_bytes = 0xdeadbeef;
9910 SetLastError(0xdeadbeef);
9911
9912 /* Somehow a hard shutdown doesn't work on my Linux box. It seems SO_LINGER is ignored. */
9913 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9914 todo_wine ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret);
9915 todo_wine ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError());
9916 todo_wine ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes);
9917
9918 SetLastError(0xdeadbeef);
9919 key = 0xdeadbeef;
9920 num_bytes = 0xdeadbeef;
9921 olp = (WSAOVERLAPPED *)0xdeadbeef;
9922
9923 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9924 todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9925 todo_wine ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9926 todo_wine ok(key == 0xdeadbeef, "Key is %lu\n", key);
9927 todo_wine ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9928 todo_wine ok(!olp, "Overlapped structure is at %p\n", olp);
9929
9931
9932 /* Test reading from a non-connected socket, mostly because the above test is marked todo. */
9934 ok(dest != INVALID_SOCKET, "socket() failed\n");
9935
9936 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9937 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9939
9940 num_bytes = 0xdeadbeef;
9941 SetLastError(0xdeadbeef);
9942 memset(&ov, 0, sizeof(ov));
9943
9944 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9945 ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret);
9946 ok(GetLastError() == WSAENOTCONN, "Last error was %d\n", GetLastError());
9947 ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes);
9948
9949 SetLastError(0xdeadbeef);
9950 key = 0xdeadbeef;
9951 num_bytes = 0xdeadbeef;
9952 olp = (WSAOVERLAPPED *)0xdeadbeef;
9953
9954 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9955 ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9956 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9957 ok(key == 0xdeadbeef, "Key is %lu\n", key);
9958 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9959 ok(!olp, "Overlapped structure is at %p\n", olp);
9960
9961 num_bytes = 0xdeadbeef;
9963
9965 if (dest == INVALID_SOCKET)
9966 {
9967 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
9968 goto end;
9969 }
9970
9971 iret = WSAIoctl(dest, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid),
9972 &pAcceptEx, sizeof(pAcceptEx), &num_bytes, NULL, NULL);
9973 if (iret)
9974 {
9975 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError());
9976 goto end;
9977 }
9978
9979 /* Test IOCP response on socket close (IOCP created after AcceptEx) */
9980
9981 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
9982 goto end;
9983
9984 SetLastError(0xdeadbeef);
9985
9986 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
9987 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
9988 &num_bytes, &ov);
9989 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
9990 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
9991
9992 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
9993 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9994
9997
9998 SetLastError(0xdeadbeef);
9999 key = 0xdeadbeef;
10000 num_bytes = 0xdeadbeef;
10001 olp = (WSAOVERLAPPED *)0xdeadbeef;
10002
10003 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10004 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10005 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10006 ok(key == 125, "Key is %lu\n", key);
10007 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10008 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10009 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10010
10011 SetLastError(0xdeadbeef);
10012 key = 0xdeadbeef;
10013 num_bytes = 0xdeadbeef;
10014 olp = (WSAOVERLAPPED *)0xdeadbeef;
10015 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10016 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10017 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10018 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10019 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10020 ok(!olp, "Overlapped structure is at %p\n", olp);
10021
10022 /* Test IOCP response on socket close (IOCP created before AcceptEx) */
10023
10024 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10025 goto end;
10026
10027 SetLastError(0xdeadbeef);
10028
10029 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10030 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10031
10032 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10033 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10034 &num_bytes, &ov);
10035 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10036 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10037
10040
10041 SetLastError(0xdeadbeef);
10042 key = 0xdeadbeef;
10043 num_bytes = 0xdeadbeef;
10044 olp = (WSAOVERLAPPED *)0xdeadbeef;
10045
10046 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10047 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10048 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10049 ok(key == 125, "Key is %lu\n", key);
10050 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10051 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10052 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10053
10054 SetLastError(0xdeadbeef);
10055 key = 0xdeadbeef;
10056 num_bytes = 0xdeadbeef;
10057 olp = (WSAOVERLAPPED *)0xdeadbeef;
10058 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10059 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10060 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10061 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10062 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10063 ok(!olp, "Overlapped structure is at %p\n", olp);
10064
10065 /* Test IOCP with duplicated handle */
10066
10067 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10068 goto end;
10069
10070 SetLastError(0xdeadbeef);
10071
10072 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10073 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10074
10077 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10078
10079 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10080 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10081 &num_bytes, &ov);
10082 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10083 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10084
10085 SetLastError(0xdeadbeef);
10086 key = 0xdeadbeef;
10087 num_bytes = 0xdeadbeef;
10088 olp = (WSAOVERLAPPED *)0xdeadbeef;
10089 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10090 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10091 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10092 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10093 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10094 ok(!olp, "Overlapped structure is at %p\n", olp);
10095
10100
10101 SetLastError(0xdeadbeef);
10102 key = 0xdeadbeef;
10103 num_bytes = 0xdeadbeef;
10104 olp = (WSAOVERLAPPED *)0xdeadbeef;
10105 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10106 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10107 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10108 ok(key == 125, "Key is %lu\n", key);
10109 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10110 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10111 ok(olp && olp->Internal == (ULONG)STATUS_CANCELLED, "Internal status is %lx\n", olp ? olp->Internal : 0);
10112
10113 SetLastError(0xdeadbeef);
10114 key = 0xdeadbeef;
10115 num_bytes = 0xdeadbeef;
10116 olp = (WSAOVERLAPPED *)0xdeadbeef;
10117 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10118 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10119 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10120 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10121 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10122 ok(!olp, "Overlapped structure is at %p\n", olp);
10123
10124 /* Test IOCP with duplicated handle (closing duplicated handle) */
10125
10126 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10127 goto end;
10128
10129 SetLastError(0xdeadbeef);
10130
10131 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10132 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10133
10136 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10137
10138 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10139 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10140 &num_bytes, &ov);
10141 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10142 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10143
10146
10147 SetLastError(0xdeadbeef);
10148 key = 0xdeadbeef;
10149 num_bytes = 0xdeadbeef;
10150 olp = (WSAOVERLAPPED *)0xdeadbeef;
10151 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10152 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10153 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10154 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10155 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10156 ok(!olp, "Overlapped structure is at %p\n", olp);
10157
10158 SetLastError(0xdeadbeef);
10159 key = 0xdeadbeef;
10160 num_bytes = 0xdeadbeef;
10161 olp = (WSAOVERLAPPED *)0xdeadbeef;
10162 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10163 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10164 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10165 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10166 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10167 ok(!olp, "Overlapped structure is at %p\n", olp);
10168
10171
10172 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10173 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10174 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10175 ok(key == 125, "Key is %lu\n", key);
10176 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10177 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10178 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10179
10180 SetLastError(0xdeadbeef);
10181 key = 0xdeadbeef;
10182 num_bytes = 0xdeadbeef;
10183 olp = (WSAOVERLAPPED *)0xdeadbeef;
10184 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10185 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10186 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10187 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10188 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10189 ok(!olp, "Overlapped structure is at %p\n", olp);
10190
10191 /* Test IOCP with duplicated handle (closing original handle) */
10192
10193 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10194 goto end;
10195
10196 SetLastError(0xdeadbeef);
10197
10198 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10199 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10200
10203 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10204
10205 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10206 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10207 &num_bytes, &ov);
10208 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10209 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10210
10213
10214 SetLastError(0xdeadbeef);
10215 key = 0xdeadbeef;
10216 num_bytes = 0xdeadbeef;
10217 olp = (WSAOVERLAPPED *)0xdeadbeef;
10218 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10219 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10220 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10221 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10222 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10223 ok(!olp, "Overlapped structure is at %p\n", olp);
10224
10227
10228 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10229 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10230 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10231 ok(key == 125, "Key is %lu\n", key);
10232 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10233 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10234 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10235
10236 SetLastError(0xdeadbeef);
10237 key = 0xdeadbeef;
10238 num_bytes = 0xdeadbeef;
10239 olp = (WSAOVERLAPPED *)0xdeadbeef;
10240 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10241 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10242 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10243 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10244 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10245 ok(!olp, "Overlapped structure is at %p\n", olp);
10246
10247 /* Test IOCP without AcceptEx */
10248
10249 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10250 goto end;
10251
10252 SetLastError(0xdeadbeef);
10253
10254 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10255 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10256
10259
10260 SetLastError(0xdeadbeef);
10261 key = 0xdeadbeef;
10262 num_bytes = 0xdeadbeef;
10263 olp = (WSAOVERLAPPED *)0xdeadbeef;
10264 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10265 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10266 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10267 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10268 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10269 ok(!olp, "Overlapped structure is at %p\n", olp);
10270
10271 /* */
10272
10273 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10274 goto end;
10275
10276 connector = socket(AF_INET, SOCK_STREAM, 0);
10277 if (connector == INVALID_SOCKET) {
10278 skip("could not create connector socket, error %d\n", WSAGetLastError());
10279 goto end;
10280 }
10281
10282 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10283 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10284
10285 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10286 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10287
10288 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10289 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10290 &num_bytes, &ov);
10291 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10292 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10293
10294 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10295 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10296
10297 closesocket(connector);
10298 connector = INVALID_SOCKET;
10299
10300 SetLastError(0xdeadbeef);
10301 key = 0xdeadbeef;
10302 num_bytes = 0xdeadbeef;
10303 olp = (WSAOVERLAPPED *)0xdeadbeef;
10304
10305 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10306 ok(bret == TRUE, "failed to get completion status %u\n", bret);
10307 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
10308 ok(key == 125, "Key is %lu\n", key);
10309 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10310 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10311 ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0);
10312
10313 SetLastError(0xdeadbeef);
10314 key = 0xdeadbeef;
10315 num_bytes = 0xdeadbeef;
10316 olp = (WSAOVERLAPPED *)0xdeadbeef;
10317 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10318 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10319 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10320 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10321 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10322 ok(!olp, "Overlapped structure is at %p\n", olp);
10323
10324 if (dest != INVALID_SOCKET)
10326 if (src != INVALID_SOCKET)
10328
10329 /* */
10330
10331 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10332 goto end;
10333
10335 if (dest == INVALID_SOCKET)
10336 {
10337 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
10338 goto end;
10339 }
10340
10341 connector = socket(AF_INET, SOCK_STREAM, 0);
10342 if (connector == INVALID_SOCKET) {
10343 skip("could not create connector socket, error %d\n", WSAGetLastError());
10344 goto end;
10345 }
10346
10347 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10348 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10349
10350 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10351 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10352
10354 status = pNtSetInformationFile((HANDLE)src, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation);
10356 "expected STATUS_SUCCESS, got %08x\n", status);
10357
10359 status = pNtSetInformationFile((HANDLE)dest, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation);
10361 "expected STATUS_SUCCESS, got %08x\n", status);
10362
10363 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10364 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10365 &num_bytes, &ov);
10366 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10367 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10368
10369 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10370 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10371
10372 iret = send(connector, buf, 1, 0);
10373 ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError());
10374
10375 Sleep(100);
10376
10379
10380 SetLastError(0xdeadbeef);
10381 key = 0xdeadbeef;
10382 num_bytes = 0xdeadbeef;
10383 olp = (WSAOVERLAPPED *)0xdeadbeef;
10384
10385 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10386 ok(bret == TRUE, "failed to get completion status %u\n", bret);
10387 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
10388 ok(key == 125, "Key is %lu\n", key);
10389 ok(num_bytes == 1, "Number of bytes transferred is %u\n", num_bytes);
10390 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10391 ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0);
10392
10393 io_info.Flags = 0;
10394 status = pNtQueryInformationFile((HANDLE)dest, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation);
10396 "expected STATUS_SUCCESS, got %08x\n", status);
10397 if (status == STATUS_SUCCESS)
10398 ok((io_info.Flags & FILE_SKIP_COMPLETION_PORT_ON_SUCCESS) != 0, "got %08x\n", io_info.Flags);
10399
10400 SetLastError(0xdeadbeef);
10401 key = 0xdeadbeef;
10402 num_bytes = 0xdeadbeef;
10403 olp = (WSAOVERLAPPED *)0xdeadbeef;
10404 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10405 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10406 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10407 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10408 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10409 ok(!olp, "Overlapped structure is at %p\n", olp);
10410
10411 if (src != INVALID_SOCKET)
10413 if (connector != INVALID_SOCKET)
10414 closesocket(connector);
10415
10416 /* */
10417
10418 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10419 goto end;
10420
10422 if (dest == INVALID_SOCKET)
10423 {
10424 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
10425 goto end;
10426 }
10427
10428 connector = socket(AF_INET, SOCK_STREAM, 0);
10429 if (connector == INVALID_SOCKET) {
10430 skip("could not create connector socket, error %d\n", WSAGetLastError());
10431 goto end;
10432 }
10433
10434 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10435 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10436
10437 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10438 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10439
10440 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10441 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10442 &num_bytes, &ov);
10443 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10444 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10445
10446 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10447 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10448
10451
10452 SetLastError(0xdeadbeef);
10453 key = 0xdeadbeef;
10454 num_bytes = 0xdeadbeef;
10455 olp = (WSAOVERLAPPED *)0xdeadbeef;
10456
10457 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10458 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10462 GetLastError() == ERROR_PIPE_NOT_CONNECTED /* win 2000 */,
10463 "Last error was %d\n", GetLastError());
10464 ok(key == 125, "Key is %lu\n", key);
10465 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10466 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10468 olp->Internal == (ULONG)STATUS_CANCELLED ||
10470 olp->Internal == (ULONG)STATUS_PIPE_DISCONNECTED /* win 2000 */),
10471 "Internal status is %lx\n", olp ? olp->Internal : 0);
10472
10473 SetLastError(0xdeadbeef);
10474 key = 0xdeadbeef;
10475 num_bytes = 0xdeadbeef;
10476 olp = (WSAOVERLAPPED *)0xdeadbeef;
10477 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10478 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10479 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10480 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10481 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10482 ok(!olp, "Overlapped structure is at %p\n", olp);
10483
10484
10485 end:
10486 if (dest != INVALID_SOCKET)
10488 if (src != INVALID_SOCKET)
10490 if (connector != INVALID_SOCKET)
10491 closesocket(connector);
LONG NTSTATUS
Definition: precomp.h:26
INT WSAAPI WSASend(IN SOCKET s, IN LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesSent, IN DWORD dwFlags, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
Definition: send.c:145
INT WSAAPI WSADuplicateSocketA(IN SOCKET s, IN DWORD dwProcessId, OUT LPWSAPROTOCOL_INFOA lpProtocolInfo)
Definition: dupsock.c:23
@ FileIoCompletionNotificationInformation
Definition: from_kernel.h:102
const GLenum * bufs
Definition: glext.h:6026
#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
Definition: iocompl.c:22
#define dup
Definition: syshdrs.h:51
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:100
static char * dest
Definition: rtl.c:135
#define STATUS_PIPE_DISCONNECTED
Definition: ntstatus.h:412
#define STATUS_INVALID_INFO_CLASS
Definition: ntstatus.h:240
#define STATUS_SUCCESS
Definition: shellext.h:65
static int tcp_socketpair(SOCKET *src, SOCKET *dst)
Definition: sock.c:241
static SOCKET setup_iocp_src(struct sockaddr_in *bindAddress)
Definition: sock.c:9617
Definition: ps.c:97
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
#define ERROR_PIPE_NOT_CONNECTED
Definition: winerror.h:285
#define WSAECONNRESET
Definition: winerror.h:1967
#define WSAENOTCONN
Definition: winerror.h:1970
#define SO_LINGER
Definition: winsock.h:185

◆ test_ConnectEx()

static void test_ConnectEx ( void  )
static

Definition at line 8022 of file sock.c.

8025{
8026 SOCKET listener = INVALID_SOCKET;
8027 SOCKET acceptor = INVALID_SOCKET;
8028 SOCKET connector = INVALID_SOCKET;
8029 struct sockaddr_in address, conaddress;
8030 int addrlen;
8032 LPFN_CONNECTEX pConnectEx;
8033 GUID connectExGuid = WSAID_CONNECTEX;
8034 DWORD bytesReturned;
8035 char buffer[1024];
8036 BOOL bret;
8037 DWORD dwret;
8038 int iret;
8039
8040 memset(&overlapped, 0, sizeof(overlapped));
8041
8042 listener = socket(AF_INET, SOCK_STREAM, 0);
8043 if (listener == INVALID_SOCKET) {
8044 skip("could not create listener socket, error %d\n", WSAGetLastError());
8045 goto end;
8046 }
8047
8048 connector = socket(AF_INET, SOCK_STREAM, 0);
8049 if (connector == INVALID_SOCKET) {
8050 skip("could not create connector socket, error %d\n", WSAGetLastError());
8051 goto end;
8052 }
8053
8054 memset(&address, 0, sizeof(address));
8055 address.sin_family = AF_INET;
8056 address.sin_addr.s_addr = inet_addr("127.0.0.1");
8057 iret = bind(listener, (struct sockaddr*)&address, sizeof(address));
8058 if (iret != 0) {
8059 skip("failed to bind, error %d\n", WSAGetLastError());
8060 goto end;
8061 }
8062
8063 addrlen = sizeof(address);
8064 iret = getsockname(listener, (struct sockaddr*)&address, &addrlen);
8065 if (iret != 0) {
8066 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8067 goto end;
8068 }
8069
8070 if (set_blocking(listener, TRUE)) {
8071 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8072 goto end;
8073 }
8074
8075 bytesReturned = 0xdeadbeef;
8076 iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectExGuid, sizeof(connectExGuid),
8077 &pConnectEx, sizeof(pConnectEx), &bytesReturned, NULL, NULL);
8078 if (iret) {
8079 win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", iret, WSAGetLastError());
8080 goto end;
8081 }
8082
8083 ok(bytesReturned == sizeof(pConnectEx), "expected sizeof(pConnectEx), got %u\n", bytesReturned);
8084
8085 bret = pConnectEx(INVALID_SOCKET, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8086 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "ConnectEx on invalid socket "
8087 "returned %d + errno %d\n", bret, WSAGetLastError());
8088
8089 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8090 ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "ConnectEx on a unbound socket "
8091 "returned %d + errno %d\n", bret, WSAGetLastError());
8092 if (bret == TRUE || WSAGetLastError() != WSAEINVAL)
8093 {
8094 acceptor = accept(listener, NULL, NULL);
8095 if (acceptor != INVALID_SOCKET) {
8096 closesocket(acceptor);
8097 acceptor = INVALID_SOCKET;
8098 }
8099
8100 closesocket(connector);
8101 connector = socket(AF_INET, SOCK_STREAM, 0);
8102 if (connector == INVALID_SOCKET) {
8103 skip("could not create connector socket, error %d\n", WSAGetLastError());
8104 goto end;
8105 }
8106 }
8107
8108 /* ConnectEx needs a bound socket */
8109 memset(&conaddress, 0, sizeof(conaddress));
8110 conaddress.sin_family = AF_INET;
8111 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8112 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8113 if (iret != 0) {
8114 skip("failed to bind, error %d\n", WSAGetLastError());
8115 goto end;
8116 }
8117
8118 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, NULL);
8119 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "ConnectEx on a NULL overlapped "
8120 "returned %d + errno %d\n", bret, WSAGetLastError());
8121
8123 if (overlapped.hEvent == NULL) {
8124 skip("could not create event object, errno = %d\n", GetLastError());
8125 goto end;
8126 }
8127
8128 iret = listen(listener, 1);
8129 if (iret != 0) {
8130 skip("listening failed, errno = %d\n", WSAGetLastError());
8131 goto end;
8132 }
8133
8134 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8135 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: "
8136 "returned %d + errno %d\n", bret, WSAGetLastError());
8137 dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8138 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8139
8140 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8141 ok(bret, "Connecting failed, error %d\n", GetLastError());
8142 ok(bytesReturned == 0, "Bytes sent is %d\n", bytesReturned);
8143
8144 closesocket(connector);
8145 connector = socket(AF_INET, SOCK_STREAM, 0);
8146 if (connector == INVALID_SOCKET) {
8147 skip("could not create connector socket, error %d\n", WSAGetLastError());
8148 goto end;
8149 }
8150 /* ConnectEx needs a bound socket */
8151 memset(&conaddress, 0, sizeof(conaddress));
8152 conaddress.sin_family = AF_INET;
8153 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8154 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8155 if (iret != 0) {
8156 skip("failed to bind, error %d\n", WSAGetLastError());
8157 goto end;
8158 }
8159
8160 acceptor = accept(listener, NULL, NULL);
8161 if (acceptor != INVALID_SOCKET) {
8162 closesocket(acceptor);
8163 }
8164
8165 buffer[0] = '1';
8166 buffer[1] = '2';
8167 buffer[2] = '3';
8168 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, buffer, 3, &bytesReturned, &overlapped);
8169 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: "
8170 "returned %d + errno %d\n", bret, WSAGetLastError());
8171 dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8172 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8173
8174 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8175 ok(bret, "Connecting failed, error %d\n", GetLastError());
8176 ok(bytesReturned == 3, "Bytes sent is %d\n", bytesReturned);
8177
8178 acceptor = accept(listener, NULL, NULL);
8179 ok(acceptor != INVALID_SOCKET, "could not accept socket error %d\n", WSAGetLastError());
8180
8181 bytesReturned = recv(acceptor, buffer, 3, 0);
8182 buffer[4] = 0;
8183 ok(bytesReturned == 3, "Didn't get all sent data, got only %d\n", bytesReturned);
8184 ok(buffer[0] == '1' && buffer[1] == '2' && buffer[2] == '3',
8185 "Failed to get the right data, expected '123', got '%s'\n", buffer);
8186
8187 closesocket(connector);
8188 connector = socket(AF_INET, SOCK_STREAM, 0);
8189 if (connector == INVALID_SOCKET) {
8190 skip("could not create connector socket, error %d\n", WSAGetLastError());
8191 goto end;
8192 }
8193 /* ConnectEx needs a bound socket */
8194 memset(&conaddress, 0, sizeof(conaddress));
8195 conaddress.sin_family = AF_INET;
8196 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8197 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8198 if (iret != 0) {
8199 skip("failed to bind, error %d\n", WSAGetLastError());
8200 goto end;
8201 }
8202
8203 if (acceptor != INVALID_SOCKET) {
8204 closesocket(acceptor);
8205 acceptor = INVALID_SOCKET;
8206 }
8207
8208 /* Connect with error */
8209 closesocket(listener);
8210 listener = INVALID_SOCKET;
8211
8212 address.sin_port = htons(1);
8213
8214 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8215 ok(bret == FALSE && GetLastError() == ERROR_IO_PENDING, "ConnectEx to bad destination failed: "
8216 "returned %d + errno %d\n", bret, GetLastError());
8217 dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8218 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8219
8220 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8222 "Connecting to a disconnected host returned error %d - %d\n", bret, WSAGetLastError());
8223
8224end:
8225 if (overlapped.hEvent)
8226 WSACloseEvent(overlapped.hEvent);
8227 if (listener != INVALID_SOCKET)
8228 closesocket(listener);
8229 if (acceptor != INVALID_SOCKET)
8230 closesocket(acceptor);
8231 if (connector != INVALID_SOCKET)
#define ERROR_CONNECTION_REFUSED
Definition: winerror.h:728

◆ test_DisconnectEx()

static void test_DisconnectEx ( void  )
static

Definition at line 8741 of file sock.c.

8744{
8745 SOCKET listener, acceptor, connector;
8746 LPFN_DISCONNECTEX pDisconnectEx;
8747 GUID disconnectExGuid = WSAID_DISCONNECTEX;
8748 struct sockaddr_in address;
8749 DWORD num_bytes, flags;
8751 int addrlen, iret;
8752 BOOL bret;
8753
8754 connector = socket(AF_INET, SOCK_STREAM, 0);
8755 ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError());
8756
8757 iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &disconnectExGuid, sizeof(disconnectExGuid),
8758 &pDisconnectEx, sizeof(pDisconnectEx), &num_bytes, NULL, NULL);
8759 if (iret)
8760 {
8761 win_skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError());
8762 closesocket(connector);
8763 return;
8764 }
8765
8766 listener = socket(AF_INET, SOCK_STREAM, 0);
8767 ok(listener != INVALID_SOCKET, "failed to create listener socket, error %d\n", WSAGetLastError());
8768
8769 memset(&address, 0, sizeof(address));
8770 address.sin_family = AF_INET;
8771 address.sin_addr.s_addr = inet_addr("127.0.0.1");
8772 iret = bind(listener, (struct sockaddr *)&address, sizeof(address));
8773 ok(iret == 0, "failed to bind, error %d\n", WSAGetLastError());
8774
8775 addrlen = sizeof(address);
8776 iret = getsockname(listener, (struct sockaddr *)&address, &addrlen);
8777 ok(iret == 0, "failed to lookup bind address, error %d\n", WSAGetLastError());
8778
8779 iret = listen(listener, 1);
8780 ok(iret == 0, "failed to listen, error %d\n", WSAGetLastError());
8781
8782 set_blocking(listener, TRUE);
8783
8784 memset(&overlapped, 0, sizeof(overlapped));
8785 bret = pDisconnectEx(INVALID_SOCKET, &overlapped, 0, 0);
8786 ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n");
8787 ok(WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %d\n", WSAGetLastError());
8788
8789 memset(&overlapped, 0, sizeof(overlapped));
8790 bret = pDisconnectEx(connector, &overlapped, 0, 0);
8791 ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n");
8792 todo_wine ok(WSAGetLastError() == WSAENOTCONN, "expected WSAENOTCONN, got %d\n", WSAGetLastError());
8793
8794 iret = connect(connector, (struct sockaddr *)&address, addrlen);
8795 ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError());
8796
8797 acceptor = accept(listener, NULL, NULL);
8798 ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError());
8799
8800 memset(&overlapped, 0, sizeof(overlapped));
8801 overlapped.hEvent = WSACreateEvent();
8802 ok(overlapped.hEvent != WSA_INVALID_EVENT, "WSACreateEvent failed, error %d\n", WSAGetLastError());
8803 bret = pDisconnectEx(connector, &overlapped, 0, 0);
8804 if (bret)
8805 ok(overlapped.Internal == STATUS_PENDING, "expected STATUS_PENDING, got %08lx\n", overlapped.Internal);
8806 else if (WSAGetLastError() == ERROR_IO_PENDING)
8807 bret = WSAGetOverlappedResult(connector, &overlapped, &num_bytes, TRUE, &flags);
8808 ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError());
8809 WSACloseEvent(overlapped.hEvent);
8810
8811 iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
8812 ok(iret != 0, "connect unexpectedly succeeded\n");
8813 ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError());
8814
8815 closesocket(acceptor);
8816 closesocket(connector);
8817
8818 connector = socket(AF_INET, SOCK_STREAM, 0);
8819 ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError());
8820
8821 iret = connect(connector, (struct sockaddr *)&address, addrlen);
8822 ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError());
8823
8824 acceptor = accept(listener, NULL, NULL);
8825 ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError());
8826
8827 bret = pDisconnectEx(connector, NULL, 0, 0);
8828 ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError());
8829
8830 iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
8831 ok(iret != 0, "connect unexpectedly succeeded\n");
8832 ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError());
8833
8834 closesocket(acceptor);
8835 closesocket(connector);
#define STATUS_PENDING
Definition: ntstatus.h:82
BOOL WSAAPI WSAGetOverlappedResult(IN SOCKET s, IN LPWSAOVERLAPPED lpOverlapped, OUT LPDWORD lpcbTransfer, IN BOOL fWait, OUT LPDWORD lpdwFlags)
Definition: sockctrl.c:603
#define WSAEISCONN
Definition: winerror.h:1969
#define WSA_INVALID_EVENT
Definition: winsock2.h:623

◆ test_dns()

static void test_dns ( void  )
static

Definition at line 4621 of file sock.c.

4624{
4625 struct hostent *h;
4626 union memaddress
4627 {
4628 char *chr;
4629 void *mem;
4630 } addr;
4631 char **ptr;
4632 int acount;
4633
4634 h = gethostbyname("");
4635 ok(h != NULL, "gethostbyname(\"\") failed with %d\n", h_errno);
4636
4637 /* Use an address with valid alias names if possible */
4638 h = gethostbyname("source.winehq.org");
4639 if(!h)
4640 {
4641 skip("Can't test the hostent structure because gethostbyname failed\n");
4642 return;
4643 }
4644
4645 /* The returned struct must be allocated in a very strict way. First we need to
4646 * count how many aliases there are because they must be located right after
4647 * the struct hostent size. Knowing the amount of aliases we know the exact
4648 * location of the first IP returned. Rule valid for >= XP, for older OS's
4649 * it's somewhat the opposite. */
4650 addr.mem = h + 1;
4651 if(h->h_addr_list == addr.mem) /* <= W2K */
4652 {
4653 win_skip("Skipping hostent tests since this OS is unsupported\n");
4654 return;
4655 }
4656
4657 ok(h->h_aliases == addr.mem,
4658 "hostent->h_aliases should be in %p, it is in %p\n", addr.mem, h->h_aliases);
4659
4660 for(ptr = h->h_aliases, acount = 1; *ptr; ptr++) acount++;
4661 addr.chr += sizeof(*ptr) * acount;
4662 ok(h->h_addr_list == addr.mem,
4663 "hostent->h_addr_list should be in %p, it is in %p\n", addr.mem, h->h_addr_list);
4664
4665 for(ptr = h->h_addr_list, acount = 1; *ptr; ptr++) acount++;
4666
4667 addr.chr += sizeof(*ptr) * acount;
4668 ok(h->h_addr_list[0] == addr.mem,
PHOSTENT WSAAPI gethostbyname(IN const char FAR *name)
Definition: getxbyxx.c:221
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
static PVOID ptr
Definition: dispmode.c:27
#define h_errno
Definition: winsock.h:225

◆ test_errors()

static void test_errors ( void  )
static

Definition at line 3656 of file sock.c.

3659{
3660 SOCKET sock;
3661 SOCKADDR_IN SockAddr;
3662 int ret, err;
3663
3666 ok( (sock != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3667 memset(&SockAddr, 0, sizeof(SockAddr));
3668 SockAddr.sin_family = AF_INET;
3669 SockAddr.sin_port = htons(6924);
3670 SockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
3671
3672 ret = connect(sock, (PSOCKADDR)&SockAddr, sizeof(SockAddr));
3673 ok( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got: %d\n", ret );
3674 if (ret == SOCKET_ERROR)
3675 {
3676 err = WSAGetLastError();
3677 ok( (err == WSAECONNREFUSED), "expected WSAECONNREFUSED, got: %d\n", err );
3678 }
3679
3680 {
3682 fd_set set = {1, {sock}};
3683
3684 timeval.tv_sec = 0;
3685 timeval.tv_usec = 50000;
3686
3687 ret = select(1, NULL, &set, NULL, &timeval);
3688 ok( (ret == 0), "expected 0 (timeout), got: %d\n", ret );
3689 }
3690
3691 ret = closesocket(sock);
Definition: _set.h:50
#define NO_ERROR
Definition: dderror.h:5
unsigned long tv_sec
Definition: linux.h:1738
unsigned long tv_usec
Definition: linux.h:1739
#define WSAECONNREFUSED
Definition: winerror.h:1974
#define PF_INET
Definition: winsock.h:373

◆ test_events()

static void test_events ( int  useMessages)
static

Definition at line 5776 of file sock.c.

5777
5778static void test_events(int useMessages)
5779{
5783 struct sockaddr_in addr;
5786 WNDCLASSEXA wndclass;
5787 HWND hWnd = NULL;
5788 char *buffer = NULL;
5789 int bufferSize = 1024*1024;
5790 WSABUF bufs;
5791 OVERLAPPED ov, ov2;
5792 DWORD flags = 0;
5793 DWORD bytesReturned;
5794 DWORD id;
5795 int len;
5796 int ret;
5797 DWORD dwRet;
5798 BOOL bret;
5799 static char szClassName[] = "wstestclass";
5800 const LPARAM *broken_seq[3];
5801 static const LPARAM empty_seq[] = { 0 };
5802 static const LPARAM close_seq[] = { WSAMAKESELECTREPLY(FD_CLOSE, 0), 0 };
5803 static const LPARAM write_seq[] = { WSAMAKESELECTREPLY(FD_WRITE, 0), 0 };
5804 static const LPARAM read_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0), 0 };
5805 static const LPARAM oob_seq[] = { WSAMAKESELECTREPLY(FD_OOB, 0), 0 };
5806 static const LPARAM connect_seq[] = { WSAMAKESELECTREPLY(FD_CONNECT, 0),
5808 static const LPARAM read_read_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0),
5809 WSAMAKESELECTREPLY(FD_READ, 0), 0 };
5810 static const LPARAM read_write_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0),
5812 static const LPARAM read_close_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0),
5814
5815 memset(&ov, 0, sizeof(ov));
5816 memset(&ov2, 0, sizeof(ov2));
5817
5818 /* don't use socketpair, we want connection event */
5820 if (src == INVALID_SOCKET)
5821 {
5822 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5823 goto end;
5824 }
5825
5827 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
5828
5829 src2 = socket(AF_INET, SOCK_STREAM, 0);
5830 if (src2 == INVALID_SOCKET)
5831 {
5832 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5833 goto end;
5834 }
5835
5836 ret = set_blocking(src2, TRUE);
5837 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
5838
5839 len = sizeof(BOOL);
5840 if (getsockopt(src, SOL_SOCKET, SO_OOBINLINE, (void *)&bret, &len) == SOCKET_ERROR)
5841 {
5842 ok(0, "failed to get oobinline status, %d\n", GetLastError());
5843 goto end;
5844 }
5845 ok(bret == FALSE, "OOB not inline\n");
5846
5847 if (useMessages)
5848 {
5849 trace("Event test using messages\n");
5850
5851 wndclass.cbSize = sizeof(wndclass);
5852 wndclass.style = CS_HREDRAW | CS_VREDRAW;
5853 wndclass.lpfnWndProc = ws2_test_WndProc;
5854 wndclass.cbClsExtra = 0;
5855 wndclass.cbWndExtra = 0;
5856 wndclass.hInstance = GetModuleHandleA(NULL);
5859 wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
5860 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
5861 wndclass.lpszClassName = szClassName;
5862 wndclass.lpszMenuName = NULL;
5863 RegisterClassExA(&wndclass);
5864
5866 0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL);
5867 if (!hWnd)
5868 {
5869 ok(0, "failed to create window: %d\n", GetLastError());
5870 return;
5871 }
5872
5874 if (ret)
5875 {
5876 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
5877 goto end;
5878 }
5879
5880 ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5881 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5882
5884 if (ret)
5885 {
5886 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
5887 goto end;
5888 }
5889
5890 ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5891 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5892 }
5893 else
5894 {
5895 trace("Event test using events\n");
5896
5899 {
5900 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5901 goto end;
5902 }
5903
5904 hEvent2 = WSACreateEvent();
5905 if (hEvent2 == INVALID_HANDLE_VALUE)
5906 {
5907 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5908 goto end;
5909 }
5910
5912 if (ret)
5913 {
5914 ok(0, "WSAEventSelect failed, error %d\n", ret);
5915 goto end;
5916 }
5917
5918 ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5919 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5920
5921 ret = WSAEventSelect(src2, hEvent2, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
5922 if (ret)
5923 {
5924 ok(0, "WSAEventSelect failed, error %d\n", ret);
5925 goto end;
5926 }
5927
5928 ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5929 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5930 }
5931
5933 if (server == INVALID_SOCKET)
5934 {
5935 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5936 goto end;
5937 }
5938
5939 memset(&addr, 0, sizeof(addr));
5940 addr.sin_family = AF_INET;
5941 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
5942 ret = bind(server, (struct sockaddr*)&addr, sizeof(addr));
5943 if (ret != 0)
5944 {
5945 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5946 goto end;
5947 }
5948
5949 len = sizeof(addr);
5950 ret = getsockname(server, (struct sockaddr*)&addr, &len);
5951 if (ret != 0)
5952 {
5953 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5954 goto end;
5955 }
5956
5957 ret = listen(server, 2);
5958 if (ret != 0)
5959 {
5960 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5961 goto end;
5962 }
5963
5964 SetLastError(0xdeadbeef);
5965 ret = connect(src, NULL, 0);
5966 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5967 ok(GetLastError() == WSAEFAULT, "expected 10014, got %d\n", GetLastError());
5968
5969 ret = connect(src, (struct sockaddr*)&addr, sizeof(addr));
5971 {
5972 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5973 goto end;
5974 }
5975
5976 ret = connect(src2, (struct sockaddr*)&addr, sizeof(addr));
5978 {
5979 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5980 goto end;
5981 }
5982
5983 len = sizeof(addr);
5984 dst = accept(server, (struct sockaddr*)&addr, &len);
5985 if (dst == INVALID_SOCKET)
5986 {
5987 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5988 goto end;
5989 }
5990
5991 len = sizeof(addr);
5992 dst2 = accept(server, (struct sockaddr*)&addr, &len);
5993 if (dst2 == INVALID_SOCKET)
5994 {
5995 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5996 goto end;
5997 }
5998
6001
6002 /* On Windows it seems when a non-blocking socket sends to a
6003 blocking socket on the same host, the send() is BLOCKING,
6004 so make both sockets non-blocking. src is already non-blocking
6005 from the async select */
6006
6007 if (set_blocking(dst, FALSE))
6008 {
6009 ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError());
6010 goto end;
6011 }
6012
6014 if (buffer == NULL)
6015 {
6016 ok(0, "could not allocate memory for test\n");
6017 goto end;
6018 }
6019
6021 if (ov.hEvent == NULL)
6022 {
6023 ok(0, "could not create event object, errno = %d\n", GetLastError());
6024 goto end;
6025 }
6026
6028 if (ov2.hEvent == NULL)
6029 {
6030 ok(0, "could not create event object, errno = %d\n", GetLastError());
6031 goto end;
6032 }
6033
6034 /* FD_WRITE should be set initially, and allow us to send at least 1 byte */
6035 ok_event_seq(src, hEvent, connect_seq, NULL, 1);
6036 ok_event_seq(src2, hEvent2, connect_seq, NULL, 1);
6037 /* broken on all windows - FD_CONNECT error is garbage */
6038
6039 /* Test simple send/recv */
6040 SetLastError(0xdeadbeef);
6041 ret = send(dst, buffer, 100, 0);
6042 ok(ret == 100, "Failed to send buffer %d err %d\n", ret, GetLastError());
6043 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6044 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6045
6046 SetLastError(0xdeadbeef);
6047 ret = recv(src, buffer, 1, MSG_PEEK);
6048 ok(ret == 1, "Failed to peek at recv buffer %d err %d\n", ret, GetLastError());
6049 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6050 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6051
6052 SetLastError(0xdeadbeef);
6053 ret = recv(src, buffer, 50, 0);
6054 ok(ret == 50, "Failed to recv buffer %d err %d\n", ret, GetLastError());
6055 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6056 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6057
6058 ret = recv(src, buffer, 50, 0);
6059 ok(ret == 50, "Failed to recv buffer %d err %d\n", ret, GetLastError());
6061
6062 /* fun fact - events are re-enabled even on failure, but only for messages */
6063 ret = send(dst, "1", 1, 0);
6064 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6065 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6066
6067 ret = recv(src, buffer, -1, 0);
6069 "Failed to recv buffer %d err %d\n", ret, GetLastError());
6070 if (useMessages)
6071 {
6072 broken_seq[0] = empty_seq; /* win9x */
6073 broken_seq[1] = NULL;
6074 todo_wine ok_event_seq(src, hEvent, read_seq, broken_seq, 0);
6075 }
6076 else
6078
6079 SetLastError(0xdeadbeef);
6080 ret = recv(src, buffer, 1, 0);
6081 ok(ret == 1, "Failed to recv buffer %d err %d\n", ret, GetLastError());
6082 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6084
6085 /* Interaction with overlapped */
6086 bufs.len = sizeof(char);
6087 bufs.buf = buffer;
6088 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov, NULL);
6090 "WSARecv failed - %d error %d\n", ret, GetLastError());
6091
6092 bufs.len = sizeof(char);
6093 bufs.buf = buffer+1;
6094 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov2, NULL);
6096 "WSARecv failed - %d error %d\n", ret, GetLastError());
6097
6098 ret = send(dst, "12", 2, 0);
6099 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError());
6100 broken_seq[0] = read_read_seq; /* win9x */
6101 broken_seq[1] = NULL;
6102 ok_event_seq(src, hEvent, empty_seq, broken_seq, 0);
6103
6104 dwRet = WaitForSingleObject(ov.hEvent, 100);
6105 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
6106 if (dwRet == WAIT_OBJECT_0)
6107 {
6108 bret = GetOverlappedResult((HANDLE)src, &ov, &bytesReturned, FALSE);
6109 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */,
6110 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError());
6111 ok(buffer[0] == '1', "Got %c instead of 1\n", buffer[0]);
6112 }
6113
6114 dwRet = WaitForSingleObject(ov2.hEvent, 100);
6115 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
6116 if (dwRet == WAIT_OBJECT_0)
6117 {
6118 bret = GetOverlappedResult((HANDLE)src, &ov2, &bytesReturned, FALSE);
6119 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */,
6120 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError());
6121 ok(buffer[1] == '2', "Got %c instead of 2\n", buffer[1]);
6122 }
6123
6124 SetLastError(0xdeadbeef);
6125 ret = send(dst, "1", 1, 0);
6126 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6127 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6128 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6129
6130 ret = recv(src, buffer, 1, 0);
6131 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6133
6134 /* Notifications are delivered as soon as possible, blocked only on
6135 * async requests on the same type */
6136 bufs.len = sizeof(char);
6137 bufs.buf = buffer;
6138 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov, NULL);
6140 "WSARecv failed - %d error %d\n", ret, GetLastError());
6141
6142 if (0) {
6143 ret = send(dst, "1", 1, MSG_OOB);
6144 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6145 ok_event_seq(src, hEvent, oob_seq, NULL, 0);
6146 }
6147
6148 dwRet = WaitForSingleObject(ov.hEvent, 100);
6149 ok(dwRet == WAIT_TIMEOUT, "OOB message activated read?: %d - %d\n", dwRet, GetLastError());
6150
6151 ret = send(dst, "2", 1, 0);
6152 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6153 broken_seq[0] = read_seq; /* win98 */
6154 broken_seq[1] = NULL;
6155 ok_event_seq(src, hEvent, empty_seq, broken_seq, 0);
6156
6157 dwRet = WaitForSingleObject(ov.hEvent, 100);
6158 ok(dwRet == WAIT_OBJECT_0 || broken(dwRet == WAIT_TIMEOUT),
6159 "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
6160 if (dwRet == WAIT_OBJECT_0)
6161 {
6162 bret = GetOverlappedResult((HANDLE)src, &ov, &bytesReturned, FALSE);
6163 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */,
6164 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError());
6165 ok(buffer[0] == '2', "Got %c instead of 2\n", buffer[0]);
6166 }
6167
6168 if (0) {
6169 ret = recv(src, buffer, 1, MSG_OOB);
6170 todo_wine ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6171 /* We get OOB notification, but no data on wine */
6173 }
6174
6175 /* Flood the send queue */
6177 if (hThread == NULL)
6178 {
6179 ok(0, "CreateThread failed, error %d\n", GetLastError());
6180 goto end;
6181 }
6182
6183 /* Now FD_WRITE should not be set, because the socket send buffer isn't full yet */
6185
6186 /* Now if we send a ton of data and the 'server' does not drain it fast
6187 * enough (set drain_pause to be sure), the socket send buffer will only
6188 * take some of it, and we will get a short write. This will trigger
6189 * another FD_WRITE event as soon as data is sent and more space becomes
6190 * available, but not any earlier. */
6191 drain_pause = TRUE;
6192 do
6193 {
6194 ret = send(src, buffer, bufferSize, 0);
6195 } while (ret == bufferSize);
6197 if (ret >= 0 || WSAGetLastError() == WSAEWOULDBLOCK)
6198 {
6199 Sleep(400); /* win9x */
6200 broken_seq[0] = read_write_seq;
6201 broken_seq[1] = NULL;
6202 ok_event_seq(src, hEvent, write_seq, broken_seq, 0);
6203 }
6204 else
6205 {
6206 ok(0, "sending a lot of data failed with error %d\n", WSAGetLastError());
6207 }
6208
6209 /* Test how FD_CLOSE is handled */
6210 ret = send(dst, "12", 2, 0);
6211 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError());
6212
6213 /* Wait a little and let the send complete */
6214 Sleep(100);
6217 Sleep(100);
6218
6219 /* We can never implement this in wine, best we can hope for is
6220 sending FD_CLOSE after the reads complete */
6221 broken_seq[0] = read_seq; /* win9x */
6222 broken_seq[1] = NULL;
6223 todo_wine ok_event_seq(src, hEvent, read_close_seq, broken_seq, 0);
6224
6225 ret = recv(src, buffer, 1, 0);
6226 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6227 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6228
6229 ret = recv(src, buffer, 1, 0);
6230 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6231 /* want it? it's here, but you can't have it */
6232 broken_seq[0] = close_seq; /* win9x */
6233 broken_seq[1] = NULL;
6234 todo_wine ok_event_seq(src, hEvent, empty_seq, /* wine sends FD_CLOSE here */
6235 broken_seq, 0);
6236
6237 /* Test how FD_CLOSE is handled */
6238 ret = send(dst2, "12", 2, 0);
6239 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError());
6240
6241 Sleep(200);
6242 shutdown(dst2, SD_SEND);
6243 Sleep(200);
6244
6245 /* Some of the below are technically todo_wine, but our event sequence is still valid, so to prevent
6246 regressions, don't mark them as todo_wine, and mark windows as broken */
6247 broken_seq[0] = read_close_seq;
6248 broken_seq[1] = close_seq;
6249 broken_seq[2] = NULL;
6250 ok_event_seq(src2, hEvent2, read_seq, broken_seq, 0);
6251
6252 ret = recv(src2, buffer, 1, 0);
6253 ok(ret == 1 || broken(!ret), "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6254 broken_seq[0] = close_seq; /* win98 */
6255 broken_seq[1] = NULL;
6256 ok_event_seq(src2, hEvent2, read_seq, broken_seq, 0);
6257
6258 ret = recv(src2, buffer, 1, 0);
6259 ok(ret == 1 || broken(!ret), "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6260 broken_seq[0] = empty_seq;
6261 broken_seq[1] = NULL;
6262 ok_event_seq(src2, hEvent2, close_seq, broken_seq, 0);
6263
6264 ret = send(src2, "1", 1, 0);
6265 ok(ret == 1, "Sending to half-closed socket failed %d err %d\n", ret, GetLastError());
6266 ok_event_seq(src2, hEvent2, empty_seq, NULL, 0);
6267
6268 ret = send(src2, "1", 1, 0);
6269 ok(ret == 1, "Sending to half-closed socket failed %d err %d\n", ret, GetLastError());
6270 ok_event_seq(src2, hEvent2, empty_seq, NULL, 0);
6271
6272 if (useMessages)
6273 {
6275 if (ret)
6276 {
6277 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6278 goto end;
6279 }
6280
6282 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6283
6284 ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, 0);
6285 if (ret)
6286 {
6287 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6288 goto end;
6289 }
6290
6291 ret = set_blocking(src2, TRUE);
6292 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6293 }
6294 else
6295 {
6296 ret = WSAEventSelect(src, hEvent2, 0);
6297 if (ret)
6298 {
6299 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6300 goto end;
6301 }
6302
6304 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6305
6306 ret = WSAEventSelect(src2, hEvent2, 0);
6307 if (ret)
6308 {
6309 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6310 goto end;
6311 }
6312
6313 ret = set_blocking(src2, TRUE);
6314 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6315 }
6316
6317end:
6318 if (src != INVALID_SOCKET)
6319 {
6322 }
6323 if (src2 != INVALID_SOCKET)
6324 {
6325 flush_events(src2, hEvent2);
6326 closesocket(src2);
6327 }
6329 if (server != INVALID_SOCKET)
6331 if (dst != INVALID_SOCKET)
6333 if (dst2 != INVALID_SOCKET)
6334 closesocket(dst2);
6335 if (hThread != NULL)
6337 if (hWnd != NULL)
6339 if (hEvent != NULL)
6341 if (hEvent2 != NULL)
6342 CloseHandle(hEvent2);
6343 if (ov.hEvent != NULL)
6344 CloseHandle(ov.hEvent);
6345 if (ov2.hEvent != NULL)
static const WCHAR szClassName[]
Definition: clipbrd.c:11
#define ERROR_SUCCESS
Definition: deptool.c:10
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned char
Definition: typeof.h:29
size_t bufferSize
static const struct message empty_seq[]
Definition: listbox.c:2398
HANDLE hThread
Definition: wizard.c:28
static DWORD WINAPI drain_socket_thread(LPVOID arg)
Definition: sock.c:5328
static BOOL
Definition: sock.c:101
static LRESULT CALLBACK ws2_test_WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: sock.c:5505
static void ok_event_sequence(SOCKET s, HANDLE hEvent, const LPARAM *seq, const LPARAM **broken_seqs, int completelyBroken)
Definition: sock.c:5715
#define ok_event_seq
Definition: sock.c:5774
HANDLE hEvent
Definition: winbase.h:820
LONG_PTR LPARAM
Definition: windef.h:208
#define ERROR_IO_INCOMPLETE
Definition: winerror.h:576
#define WSAENOBUFS
Definition: winerror.h:1968
#define SO_OOBINLINE
Definition: winsock.h:186
#define MSG_PEEK
Definition: winsock.h:222
#define WSAMAKESELECTREPLY(e, error)
Definition: winsock.h:478
BOOL WINAPI DestroyWindow(_In_ HWND)

◆ test_extendedSocketOptions()

static void test_extendedSocketOptions ( void  )
static

Definition at line 4413 of file sock.c.

4416{
4417 WSADATA wsa;
4418 SOCKET sock;
4419 struct sockaddr_in sa;
4420 int sa_len = sizeof(struct sockaddr_in);
4421 int optval, optlen = sizeof(int), ret;
4422 BOOL bool_opt_val;
4423 LINGER linger_val;
4424
4425 if(WSAStartup(MAKEWORD(2,0), &wsa)){
4426 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4427 return;
4428 }
4429
4430 memset(&sa, 0, sa_len);
4431
4432 sa.sin_family = AF_INET;
4433 sa.sin_port = htons(0);
4434 sa.sin_addr.s_addr = htonl(INADDR_ANY);
4435
4437 trace("Creating the socket failed: %d\n", WSAGetLastError());
4438 WSACleanup();
4439 return;
4440 }
4441
4442 if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
4443 trace("Failed to bind socket: %d\n", WSAGetLastError());
4445 WSACleanup();
4446 return;
4447 }
4448
4449 ret = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4450
4451 ok(ret == 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret);
4452 ok((optval == 65507) || (optval == 65527),
4453 "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval);
4454
4455 /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */
4456 SetLastError(0xdeadbeef);
4457 optval = 0xdeadbeef;
4458 optlen = sizeof(int);
4459 ret = getsockopt(sock, 0xffffffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4461 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4462 ret, WSAGetLastError(), optval, optval);
4463
4464 /* more invalid values for level */
4465 SetLastError(0xdeadbeef);
4466 optval = 0xdeadbeef;
4467 optlen = sizeof(int);
4468 ret = getsockopt(sock, 0x1234ffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4470 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4471 ret, WSAGetLastError(), optval, optval);
4472
4473 SetLastError(0xdeadbeef);
4474 optval = 0xdeadbeef;
4475 optlen = sizeof(int);
4476 ret = getsockopt(sock, 0x8000ffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4478 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4479 ret, WSAGetLastError(), optval, optval);
4480
4481 SetLastError(0xdeadbeef);
4482 optval = 0xdeadbeef;
4483 optlen = sizeof(int);
4484 ret = getsockopt(sock, 0x00008000, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4486 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4487 ret, WSAGetLastError(), optval, optval);
4488
4489 SetLastError(0xdeadbeef);
4490 optval = 0xdeadbeef;
4491 optlen = sizeof(int);
4492 ret = getsockopt(sock, 0x00000800, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4494 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4495 ret, WSAGetLastError(), optval, optval);
4496
4497 SetLastError(0xdeadbeef);
4498 optlen = sizeof(LINGER);
4499 ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
4501 "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n",
4502 ret, WSAGetLastError());
4504
4506 trace("Creating the socket failed: %d\n", WSAGetLastError());
4507 WSACleanup();
4508 return;
4509 }
4510
4511 if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
4512 trace("Failed to bind socket: %d\n", WSAGetLastError());
4514 WSACleanup();
4515 return;
4516 }
4517
4518 ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
4519 ok(ret == 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret);
4520
4521 optlen = sizeof(BOOL);
4522 ret = getsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (char *)&bool_opt_val, &optlen);
4523 ok(ret == 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret);
4524 ok((linger_val.l_onoff && !bool_opt_val) || (!linger_val.l_onoff && bool_opt_val),
4525 "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
4526 bool_opt_val, linger_val.l_onoff);
4527
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
#define INADDR_ANY
Definition: inet.h:53
u_short l_onoff
Definition: winsock.h:142
#define WSAENOPROTOOPT
Definition: winerror.h:1955
struct linger LINGER
Definition: winsock.h:490
#define SOCK_DGRAM
Definition: winsock.h:336
#define IPPROTO_IP
Definition: winsock.h:255
#define SO_DONTLINGER
Definition: winsock.h:187
#define SO_MAX_MSG_SIZE
Definition: ws2def.h:119

◆ test_getaddrinfo()

static void test_getaddrinfo ( void  )
static

Definition at line 7737 of file sock.c.

7740{
7741 int i, ret;
7742 ADDRINFOA *result, *result2, *p, hint;
7744 CHAR name[256], *ip;
7745 DWORD size = sizeof(name);
7746
7747 if (!pgetaddrinfo || !pfreeaddrinfo)
7748 {
7749 win_skip("getaddrinfo and/or freeaddrinfo not present\n");
7750 return;
7751 }
7752 memset(&hint, 0, sizeof(ADDRINFOA));
7753 GetComputerNameExA( ComputerNamePhysicalDnsHostname, name, &size );
7754
7755 result = (ADDRINFOA *)0xdeadbeef;
7756 WSASetLastError(0xdeadbeef);
7757 ret = pgetaddrinfo(NULL, NULL, NULL, &result);
7758 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7759 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7760 ok(result == NULL, "got %p\n", result);
7761
7762 result = NULL;
7763 WSASetLastError(0xdeadbeef);
7764 ret = pgetaddrinfo("", NULL, NULL, &result);
7765 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7766 ok(result != NULL, "getaddrinfo failed\n");
7767 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7768 pfreeaddrinfo(result);
7769
7770 result = NULL;
7771 ret = pgetaddrinfo(NULL, "0", NULL, &result);
7772 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7773 ok(result != NULL, "getaddrinfo failed\n");
7774
7775 result2 = NULL;
7776 ret = pgetaddrinfo(NULL, "", NULL, &result2);
7777 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7778 ok(result2 != NULL, "getaddrinfo failed\n");
7779 compare_addrinfo(result, result2);
7780 pfreeaddrinfo(result);
7781 pfreeaddrinfo(result2);
7782
7783 result = NULL;
7784 WSASetLastError(0xdeadbeef);
7785 ret = pgetaddrinfo("", "0", NULL, &result);
7786 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7787 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7788 ok(result != NULL, "getaddrinfo failed\n");
7789
7790 result2 = NULL;
7791 ret = pgetaddrinfo("", "", NULL, &result2);
7792 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7793 ok(result2 != NULL, "getaddrinfo failed\n");
7794 compare_addrinfo(result, result2);
7795 pfreeaddrinfo(result);
7796 pfreeaddrinfo(result2);
7797
7798 result = NULL;
7799 ret = pgetaddrinfo("localhost", NULL, NULL, &result);
7800 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7801 pfreeaddrinfo(result);
7802
7803 result = NULL;
7804 ret = pgetaddrinfo("localhost", "", NULL, &result);
7805 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7806 pfreeaddrinfo(result);
7807
7808 result = NULL;
7809 ret = pgetaddrinfo("localhost", "0", NULL, &result);
7810 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7811 pfreeaddrinfo(result);
7812
7813 result = NULL;
7814 ret = pgetaddrinfo("localhost", "80", NULL, &result);
7815 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7816 pfreeaddrinfo(result);
7817
7818 result = NULL;
7819 ret = pgetaddrinfo("localhost", NULL, &hint, &result);
7820 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7821 pfreeaddrinfo(result);
7822
7823 result = NULL;
7824 WSASetLastError(0xdeadbeef);
7825 ret = pgetaddrinfo("localhost", "80", &hint, &result);
7826 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7827 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7828 pfreeaddrinfo(result);
7829
7830 hint.ai_flags = AI_NUMERICHOST;
7831 result = (void*)0xdeadbeef;
7832 ret = pgetaddrinfo("localhost", "80", &hint, &result);
7833 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", WSAGetLastError());
7834 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected WSAHOST_NOT_FOUND, got %d\n", WSAGetLastError());
7835 ok(!result, "result = %p\n", result);
7836 hint.ai_flags = 0;
7837
7838 /* try to get information from the computer name, result is the same
7839 * as if requesting with an empty host name. */
7840 ret = pgetaddrinfo(name, NULL, NULL, &result);
7841 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7842#ifdef __REACTOS__
7843 ok(result != NULL, "getaddrinfo failed\n");
7844#else
7845 ok(result != NULL, "GetAddrInfoW failed\n");
7846#endif
7847
7848 ret = pgetaddrinfo("", NULL, NULL, &result2);
7849 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7850#ifdef __REACTOS__
7851 ok(result2 != NULL, "getaddrinfo failed\n");
7852#else
7853 ok(result != NULL, "GetAddrInfoW failed\n");
7854#endif
7855 compare_addrinfo(result, result2);
7856 pfreeaddrinfo(result);
7857 pfreeaddrinfo(result2);
7858
7859 ret = pgetaddrinfo(name, "", NULL, &result);
7860 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7861#ifdef __REACTOS__
7862 ok(result != NULL, "getaddrinfo failed\n");
7863#else
7864 ok(result != NULL, "GetAddrInfoW failed\n");
7865#endif
7866
7867 ret = pgetaddrinfo("", "", NULL, &result2);
7868 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7869#ifdef __REACTOS__
7870 ok(result2 != NULL, "getaddrinfo failed\n");
7871#else
7872 ok(result != NULL, "GetAddrInfoW failed\n");
7873#endif
7874 compare_addrinfo(result, result2);
7875 pfreeaddrinfo(result);
7876 pfreeaddrinfo(result2);
7877
7878 result = (ADDRINFOA *)0xdeadbeef;
7879 WSASetLastError(0xdeadbeef);
7880 ret = pgetaddrinfo("nxdomain.codeweavers.com", NULL, NULL, &result);
7881 if(ret == 0)
7882 {
7883 skip("nxdomain returned success. Broken ISP redirects?\n");
7884 return;
7885 }
7886 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7887 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7888 ok(result == NULL, "got %p\n", result);
7889
7890 /* Test IPv4 address conversion */
7891 result = NULL;
7892 ret = pgetaddrinfo("192.168.1.253", NULL, NULL, &result);
7893 ok(!ret, "getaddrinfo failed with %d\n", ret);
7894 ok(result->ai_family == AF_INET, "ai_family == %d\n", result->ai_family);
7895 ok(result->ai_addrlen >= sizeof(struct sockaddr_in), "ai_addrlen == %d\n", (int)result->ai_addrlen);
7896 ok(result->ai_addr != NULL, "ai_addr == NULL\n");
7897 sockaddr = (SOCKADDR_IN *)result->ai_addr;
7898 ok(sockaddr->sin_family == AF_INET, "ai_addr->sin_family == %d\n", sockaddr->sin_family);
7899 ok(sockaddr->sin_port == 0, "ai_addr->sin_port == %d\n", sockaddr->sin_port);
7900
7901 ip = inet_ntoa(sockaddr->sin_addr);
7902 ok(strcmp(ip, "192.168.1.253") == 0, "sockaddr->ai_addr == '%s'\n", ip);
7903 pfreeaddrinfo(result);
7904
7905 /* Test IPv4 address conversion with port */
7906 result = NULL;
7907 hint.ai_flags = AI_NUMERICHOST;
7908 ret = pgetaddrinfo("192.168.1.253:1024", NULL, &hint, &result);
7909 hint.ai_flags = 0;
7910 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo returned unexpected result: %d\n", ret);
7911 ok(result == NULL, "expected NULL, got %p\n", result);
7912
7913 /* Test IPv6 address conversion */
7914 result = NULL;
7915 SetLastError(0xdeadbeef);
7916 ret = pgetaddrinfo("2a00:2039:dead:beef:cafe::6666", NULL, NULL, &result);
7917
7918 if (result != NULL)
7919 {
7920 ok(!ret, "getaddrinfo failed with %d\n", ret);
7921 verify_ipv6_addrinfo(result, "2a00:2039:dead:beef:cafe::6666");
7922 pfreeaddrinfo(result);
7923
7924 /* Test IPv6 address conversion with brackets */
7925 result = NULL;
7926 ret = pgetaddrinfo("[beef::cafe]", NULL, NULL, &result);
7927 ok(!ret, "getaddrinfo failed with %d\n", ret);
7928 verify_ipv6_addrinfo(result, "beef::cafe");
7929 pfreeaddrinfo(result);
7930
7931 /* Test IPv6 address conversion with brackets and hints */
7932 memset(&hint, 0, sizeof(ADDRINFOA));
7933 hint.ai_flags = AI_NUMERICHOST;
7934 hint.ai_family = AF_INET6;
7935 result = NULL;
7936 ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
7937 ok(!ret, "getaddrinfo failed with %d\n", ret);
7938 verify_ipv6_addrinfo(result, "beef::cafe");
7939 pfreeaddrinfo(result);
7940
7941 memset(&hint, 0, sizeof(ADDRINFOA));
7942 hint.ai_flags = AI_NUMERICHOST;
7943 hint.ai_family = AF_INET;
7944 result = NULL;
7945 ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
7946 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7947
7948 /* Test IPv6 address conversion with brackets and port */
7949 result = NULL;
7950 ret = pgetaddrinfo("[beef::cafe]:10239", NULL, NULL, &result);
7951 ok(!ret, "getaddrinfo failed with %d\n", ret);
7952 verify_ipv6_addrinfo(result, "beef::cafe");
7953 pfreeaddrinfo(result);
7954
7955 /* Test IPv6 address conversion with unmatched brackets */
7956 result = NULL;
7957 hint.ai_flags = AI_NUMERICHOST;
7958 ret = pgetaddrinfo("[beef::cafe", NULL, &hint, &result);
7959 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7960
7961 ret = pgetaddrinfo("beef::cafe]", NULL, &hint, &result);
7962 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7963 }
7964 else
7965 {
7966 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7967 win_skip("getaddrinfo does not support IPV6\n");
7968 }
7969
7970 hint.ai_flags = 0;
7971
7972 for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
7973 {
7974 hint.ai_family = hinttests[i].family;
7975 hint.ai_socktype = hinttests[i].socktype;
7976 hint.ai_protocol = hinttests[i].protocol;
7977
7978 result = NULL;
7979 SetLastError(0xdeadbeef);
7980 ret = pgetaddrinfo("localhost", NULL, &hint, &result);
7981 if(!ret)
7982 {
7983 if (hinttests[i].error)
7984 ok(0, "test %d: getaddrinfo succeeded unexpectedly\n", i);
7985 else
7986 {
7987 p = result;
7988 do
7989 {
7990 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7991 if (hinttests[i].family == AF_UNSPEC)
7992 ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
7993 "test %d: expected AF_INET or AF_INET6, got %d\n",
7994 i, p->ai_family);
7995 else
7996 ok(p->ai_family == hinttests[i].family,
7997 "test %d: expected family %d, got %d\n",
7998 i, hinttests[i].family, p->ai_family);
7999
8000 ok(p->ai_socktype == hinttests[i].socktype,
8001 "test %d: expected type %d, got %d\n",
8002 i, hinttests[i].socktype, p->ai_socktype);
8003 ok(p->ai_protocol == hinttests[i].protocol,
8004 "test %d: expected protocol %d, got %d\n",
8005 i, hinttests[i].protocol, p->ai_protocol);
8006 p = p->ai_next;
8007 }
8008 while (p);
8009 }
8010 pfreeaddrinfo(result);
8011 }
8012 else
8013 {
8015 if (hinttests[i].error)
8016 ok(hinttests[i].error == err, "test %d: getaddrinfo failed with error %d, expected %d\n",
8017 i, err, hinttests[i].error);
8018 else
8019 ok(0, "test %d: getaddrinfo failed with %d (err %d)\n", i, ret, err);
8020 }
GLuint64EXT * result
Definition: glext.h:11304
BOOL WINAPI GetComputerNameExA(COMPUTER_NAME_FORMAT, LPSTR, LPDWORD)
Definition: compname.c:376
static void verify_ipv6_addrinfo(ADDRINFOA *result, const char *expectedIp)
Definition: sock.c:7714
namespace GUID const ADDRINFOEXW ADDRINFOEXW ** result
Definition: sock.c:80
static void compare_addrinfo(ADDRINFO *a, ADDRINFO *b)
Definition: sock.c:444
static const struct addr_hint_tests hinttests[]
Definition: dhcpd.h:62
DWORD hint
Definition: vfdcmd.c:88
#define WSAHOST_NOT_FOUND
Definition: winerror.h:2000
#define AF_UNSPEC
Definition: winsock.h:344
#define AI_NUMERICHOST
Definition: ws2def.h:295
char CHAR
Definition: xmlstorage.h:175

◆ test_GetAddrInfoExW()

static void test_GetAddrInfoExW ( void  )
static

Definition at line 7622 of file sock.c.

7625{
7626 static const WCHAR empty[] = {0};
7627 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
7628 static const WCHAR winehq[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
7629 ADDRINFOEXW *result;
7631 HANDLE event;
7632 int ret;
7633
7634 if (!pGetAddrInfoExW || !pGetAddrInfoExOverlappedResult)
7635 {
7636 win_skip("GetAddrInfoExW and/or GetAddrInfoExOverlappedResult not present\n");
7637 return;
7638 }
7639
7640 event = WSACreateEvent();
7641
7642 result = (ADDRINFOEXW *)0xdeadbeef;
7643 WSASetLastError(0xdeadbeef);
7644 ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7645 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7646 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7647 ok(result == NULL, "got %p\n", result);
7648
7649 result = NULL;
7650 WSASetLastError(0xdeadbeef);
7651 ret = pGetAddrInfoExW(empty, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7652 ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7653 ok(result != NULL, "GetAddrInfoW failed\n");
7654 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7655 pFreeAddrInfoExW(result);
7656
7657 result = NULL;
7658 ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7659 ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7660 pFreeAddrInfoExW(result);
7661
7662 result = (void*)0xdeadbeef;
7663 memset(&overlapped, 0xcc, sizeof(overlapped));
7664 overlapped.hEvent = event;
7666 ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7667 ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7668 ok(!result, "result != NULL\n");
7669 ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
7670 ret = pGetAddrInfoExOverlappedResult(&overlapped);
7671 ok(!ret, "overlapped result is %d\n", ret);
7672 pFreeAddrInfoExW(result);
7673
7674 result = (void*)0xdeadbeef;
7675 memset(&overlapped, 0xcc, sizeof(overlapped));
7677 overlapped.hEvent = event;
7678 WSASetLastError(0xdeadbeef);
7679 ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7680 ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7681 ok(WSAGetLastError() == ERROR_IO_PENDING, "expected 11001, got %d\n", WSAGetLastError());
7682 ret = overlapped.Internal;
7683 ok(ret == WSAEINPROGRESS || ret == ERROR_SUCCESS, "overlapped.Internal = %u\n", ret);
7684 ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
7685 ret = pGetAddrInfoExOverlappedResult(&overlapped);
7686 ok(!ret, "overlapped result is %d\n", ret);
7687 ok(overlapped.hEvent == event, "hEvent changed %p\n", overlapped.hEvent);
7688 ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal);
7689 ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
7690 ok(result != NULL, "result == NULL\n");
7691 if (result != NULL)
7692 {
7693 ok(!result->ai_blob, "ai_blob != NULL\n");
7694 ok(!result->ai_bloblen, "ai_bloblen != 0\n");
7695 ok(!result->ai_provider, "ai_provider = %s\n", wine_dbgstr_guid(result->ai_provider));
7696 pFreeAddrInfoExW(result);
7697 }
7698
7699 result = (void*)0xdeadbeef;
7700 memset(&overlapped, 0xcc, sizeof(overlapped));
7702 overlapped.hEvent = event;
7703 ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7704 todo_wine
7705 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7706 todo_wine
7707 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7708 ok(result == NULL, "got %p\n", result);
7710 todo_wine_if(ret != WAIT_TIMEOUT) /* Remove when abowe todo_wines are fixed */
7711 ok(ret == WAIT_TIMEOUT, "wait failed\n");
7712
static const WCHAR empty[]
Definition: main.c:47
static const BYTE localhost[]
Definition: encode.c:1442
#define todo_wine_if(is_todo)
Definition: custom.c:76
static WCHAR winehq[]
Definition: url.c:31
#define NS_DNS
Definition: nspapi.h:16
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:714
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ test_GetAddrInfoW()

static void test_GetAddrInfoW ( void  )
static

Definition at line 7341 of file sock.c.

7344{
7345 static const WCHAR port[] = {'8','0',0};
7346 static const WCHAR empty[] = {0};
7347 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
7348 static const WCHAR nxdomain[] =
7349 {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
7350 static const WCHAR zero[] = {'0',0};
7351 int i, ret;
7352 ADDRINFOW *result, *result2, *p, hint;
7353 WCHAR name[256];
7354 DWORD size = sizeof(name)/sizeof(WCHAR);
7355 /* te su to.winehq.org written in katakana */
7356 static const WCHAR idn_domain[] =
7357 {0x30C6,0x30B9,0x30C8,'.','w','i','n','e','h','q','.','o','r','g',0};
7358 static const WCHAR idn_punycode[] =
7359 {'x','n','-','-','z','c','k','z','a','h','.','w','i','n','e','h','q','.','o','r','g',0};
7360
7361 if (!pGetAddrInfoW || !pFreeAddrInfoW)
7362 {
7363 win_skip("GetAddrInfoW and/or FreeAddrInfoW not present\n");
7364 return;
7365 }
7366 memset(&hint, 0, sizeof(ADDRINFOW));
7367 name[0] = 0;
7368 GetComputerNameExW( ComputerNamePhysicalDnsHostname, name, &size );
7369
7370 result = (ADDRINFOW *)0xdeadbeef;
7371 WSASetLastError(0xdeadbeef);
7372 ret = pGetAddrInfoW(NULL, NULL, NULL, &result);
7373 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7374 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7375 ok(result == NULL, "got %p\n", result);
7376
7377 result = NULL;
7378 WSASetLastError(0xdeadbeef);
7379 ret = pGetAddrInfoW(empty, NULL, NULL, &result);
7380 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7381 ok(result != NULL, "GetAddrInfoW failed\n");
7382 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7383 pFreeAddrInfoW(result);
7384
7385 result = NULL;
7386 ret = pGetAddrInfoW(NULL, zero, NULL, &result);
7387 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7388 ok(result != NULL, "GetAddrInfoW failed\n");
7389
7390 result2 = NULL;
7391 ret = pGetAddrInfoW(NULL, empty, NULL, &result2);
7392 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7393 ok(result2 != NULL, "GetAddrInfoW failed\n");
7394 compare_addrinfow(result, result2);
7395 pFreeAddrInfoW(result);
7396 pFreeAddrInfoW(result2);
7397
7398 result = NULL;
7399 ret = pGetAddrInfoW(empty, zero, NULL, &result);
7400 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7401 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7402 ok(result != NULL, "GetAddrInfoW failed\n");
7403
7404 result2 = NULL;
7405 ret = pGetAddrInfoW(empty, empty, NULL, &result2);
7406 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7407 ok(result2 != NULL, "GetAddrInfoW failed\n");
7408 compare_addrinfow(result, result2);
7409 pFreeAddrInfoW(result);
7410 pFreeAddrInfoW(result2);
7411
7412 result = NULL;
7413 ret = pGetAddrInfoW(localhost, NULL, NULL, &result);
7414 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7415 pFreeAddrInfoW(result);
7416
7417 result = NULL;
7418 ret = pGetAddrInfoW(localhost, empty, NULL, &result);
7419 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7420 pFreeAddrInfoW(result);
7421
7422 result = NULL;
7423 ret = pGetAddrInfoW(localhost, zero, NULL, &result);
7424 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7425 pFreeAddrInfoW(result);
7426
7427 result = NULL;
7428 ret = pGetAddrInfoW(localhost, port, NULL, &result);
7429 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7430 pFreeAddrInfoW(result);
7431
7432 result = NULL;
7433 ret = pGetAddrInfoW(localhost, NULL, &hint, &result);
7434 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7435 pFreeAddrInfoW(result);
7436
7437 result = NULL;
7438 SetLastError(0xdeadbeef);
7439 ret = pGetAddrInfoW(localhost, port, &hint, &result);
7440 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7441 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7442 pFreeAddrInfoW(result);
7443
7444 /* try to get information from the computer name, result is the same
7445 * as if requesting with an empty host name. */
7446 ret = pGetAddrInfoW(name, NULL, NULL, &result);
7447 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7448 ok(result != NULL, "GetAddrInfoW failed\n");
7449
7450 ret = pGetAddrInfoW(empty, NULL, NULL, &result2);
7451 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7452#ifdef __REACTOS__
7453 ok(result2 != NULL, "GetAddrInfoW failed\n");
7454#else
7455 ok(result != NULL, "GetAddrInfoW failed\n");
7456#endif
7457 compare_addrinfow(result, result2);
7458 pFreeAddrInfoW(result);
7459 pFreeAddrInfoW(result2);
7460
7461 ret = pGetAddrInfoW(name, empty, NULL, &result);
7462 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7463 ok(result != NULL, "GetAddrInfoW failed\n");
7464
7465 ret = pGetAddrInfoW(empty, empty, NULL, &result2);
7466 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7467#ifdef __REACTOS__
7468 ok(result2 != NULL, "GetAddrInfoW failed\n");
7469#else
7470 ok(result != NULL, "GetAddrInfoW failed\n");
7471#endif
7472 compare_addrinfow(result, result2);
7473 pFreeAddrInfoW(result);
7474 pFreeAddrInfoW(result2);
7475
7476 result = (ADDRINFOW *)0xdeadbeef;
7477 WSASetLastError(0xdeadbeef);
7478 ret = pGetAddrInfoW(NULL, NULL, NULL, &result);
7479 if(ret == 0)
7480 {
7481 skip("nxdomain returned success. Broken ISP redirects?\n");
7482 return;
7483 }
7484 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7485 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7486 ok(result == NULL, "got %p\n", result);
7487
7488 result = (ADDRINFOW *)0xdeadbeef;
7489 WSASetLastError(0xdeadbeef);
7490 ret = pGetAddrInfoW(nxdomain, NULL, NULL, &result);
7491 if(ret == 0)
7492 {
7493 skip("nxdomain returned success. Broken ISP redirects?\n");
7494 return;
7495 }
7496 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7497 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7498 ok(result == NULL, "got %p\n", result);
7499
7500 for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
7501 {
7502 hint.ai_family = hinttests[i].family;
7503 hint.ai_socktype = hinttests[i].socktype;
7504 hint.ai_protocol = hinttests[i].protocol;
7505
7506 result = NULL;
7507 SetLastError(0xdeadbeef);
7508 ret = pGetAddrInfoW(localhost, NULL, &hint, &result);
7509 if (!ret)
7510 {
7511 if (hinttests[i].error)
7512 ok(0, "test %d: GetAddrInfoW succeeded unexpectedly\n", i);
7513 else
7514 {
7515 p = result;
7516 do
7517 {
7518 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7519 if (hinttests[i].family == AF_UNSPEC)
7520 ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
7521 "test %d: expected AF_INET or AF_INET6, got %d\n",
7522 i, p->ai_family);
7523 else
7524 ok(p->ai_family == hinttests[i].family,
7525 "test %d: expected family %d, got %d\n",
7526 i, hinttests[i].family, p->ai_family);
7527
7528 ok(p->ai_socktype == hinttests[i].socktype,
7529 "test %d: expected type %d, got %d\n",
7530 i, hinttests[i].socktype, p->ai_socktype);
7531 ok(p->ai_protocol == hinttests[i].protocol,
7532 "test %d: expected protocol %d, got %d\n",
7533 i, hinttests[i].protocol, p->ai_protocol);
7534 p = p->ai_next;
7535 }
7536 while (p);
7537 }
7538 pFreeAddrInfoW(result);
7539 }
7540 else
7541 {
7543 if (hinttests[i].error)
7544 ok(hinttests[i].error == err, "test %d: GetAddrInfoW failed with error %d, expected %d\n",
7545 i, err, hinttests[i].error);
7546 else
7547 ok(0, "test %d: GetAddrInfoW failed with %d (err %d)\n", i, ret, err);
7548 }
7549 }
7550
7551 /* Test IDN resolution (Internationalized Domain Names) present since Windows 8 */
7552 trace("Testing punycode IDN %s\n", wine_dbgstr_w(idn_punycode));
7553 result = NULL;
7554 ret = pGetAddrInfoW(idn_punycode, NULL, NULL, &result);
7555 ok(!ret, "got %d expected success\n", ret);
7556 ok(result != NULL, "got %p\n", result);
7557 pFreeAddrInfoW(result);
7558
7559 hint.ai_family = AF_INET;
7560 hint.ai_socktype = 0;
7561 hint.ai_protocol = 0;
7562 hint.ai_flags = 0;
7563
7564 result = NULL;
7565 ret = pGetAddrInfoW(idn_punycode, NULL, &hint, &result);
7566 ok(!ret, "got %d expected success\n", ret);
7567 ok(result != NULL, "got %p\n", result);
7568
7569 trace("Testing unicode IDN %s\n", wine_dbgstr_w(idn_domain));
7570 result2 = NULL;
7571 ret = pGetAddrInfoW(idn_domain, NULL, NULL, &result2);
7572 if (ret == WSAHOST_NOT_FOUND && broken(1))
7573 {
7574 pFreeAddrInfoW(result);
7575 win_skip("IDN resolution not supported in Win <= 7\n");
7576 return;
7577 }
7578
7579 ok(!ret, "got %d expected success\n", ret);
7580 ok(result2 != NULL, "got %p\n", result2);
7581 pFreeAddrInfoW(result2);
7582
7583 hint.ai_family = AF_INET;
7584 hint.ai_socktype = 0;
7585 hint.ai_protocol = 0;
7586 hint.ai_flags = 0;
7587
7588 result2 = NULL;
7589 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7590 ok(!ret, "got %d expected success\n", ret);
7591 ok(result2 != NULL, "got %p\n", result2);
7592
7593 /* ensure manually resolved punycode and unicode hosts result in same data */
7594 compare_addrinfow(result, result2);
7595
7596 pFreeAddrInfoW(result);
7597 pFreeAddrInfoW(result2);
7598
7599 hint.ai_family = AF_INET;
7600 hint.ai_socktype = 0;
7601 hint.ai_protocol = 0;
7602 hint.ai_flags = 0;
7603
7604 result2 = NULL;
7605 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7606 ok(!ret, "got %d expected success\n", ret);
7607 ok(result2 != NULL, "got %p\n", result2);
7608 pFreeAddrInfoW(result2);
7609
7610 /* Disable IDN resolution and test again*/
7611 hint.ai_family = AF_INET;
7612 hint.ai_socktype = 0;
7613 hint.ai_protocol = 0;
7614 hint.ai_flags = AI_DISABLE_IDN_ENCODING;
7615
7616 SetLastError(0xdeadbeef);
7617 result2 = NULL;
7618 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7619 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7620 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
BOOL WINAPI GetComputerNameExW(COMPUTER_NAME_FORMAT NameType, LPWSTR lpBuffer, LPDWORD nSize)
Definition: compname.c:216
int zero
Definition: sehframes.cpp:29
static void compare_addrinfow(ADDRINFOW *a, ADDRINFOW *b)
Definition: sock.c:472
#define AI_DISABLE_IDN_ENCODING
Definition: ws2def.h:309

◆ test_gethostbyname()

static void test_gethostbyname ( void  )
static

Definition at line 4677 of file sock.c.

4680{
4681 struct hostent *he;
4682 struct in_addr **addr_list;
4683 char name[256], first_ip[16];
4684 int ret, i, count;
4685 PMIB_IPFORWARDTABLE routes = NULL;
4686 PIP_ADAPTER_INFO adapters = NULL, k;
4687 DWORD adap_size = 0, route_size = 0;
4688 BOOL found_default = FALSE;
4689 BOOL local_ip = FALSE;
4690
4691 ret = gethostname(name, sizeof(name));
4692 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4693
4694 he = gethostbyname(name);
4695 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
4696#ifdef __REACTOS__ /* ROSTESTS-233 */
4697 count = 0;
4698 if (he != NULL)
4699 {
4700#endif
4701 addr_list = (struct in_addr **)he->h_addr_list;
4702 strcpy(first_ip, inet_ntoa(*addr_list[0]));
4703
4704 trace("List of local IPs:\n");
4705 for(count = 0; addr_list[count] != NULL; count++)
4706 {
4707 char *ip = inet_ntoa(*addr_list[count]);
4708 if (!strcmp(ip, "127.0.0.1"))
4709 local_ip = TRUE;
4710 trace("%s\n", ip);
4711 }
4712#ifdef __REACTOS__ /* ROSTESTS-233 */
4713 }
4714#endif
4715
4716 if (local_ip)
4717 {
4718 ok (count == 1, "expected 127.0.0.1 to be the only IP returned\n");
4719 skip("Only the loopback address is present, skipping tests\n");
4720 return;
4721 }
4722
4723 if (!pGetAdaptersInfo || !pGetIpForwardTable)
4724 {
4725 win_skip("GetAdaptersInfo and/or GetIpForwardTable not found, skipping tests\n");
4726 return;
4727 }
4728
4729 ret = pGetAdaptersInfo(NULL, &adap_size);
4730 ok (ret == ERROR_BUFFER_OVERFLOW, "GetAdaptersInfo failed with a different error: %d\n", ret);
4731 ret = pGetIpForwardTable(NULL, &route_size, FALSE);
4732 ok (ret == ERROR_INSUFFICIENT_BUFFER, "GetIpForwardTable failed with a different error: %d\n", ret);
4733
4734 adapters = HeapAlloc(GetProcessHeap(), 0, adap_size);
4735 routes = HeapAlloc(GetProcessHeap(), 0, route_size);
4736
4737 ret = pGetAdaptersInfo(adapters, &adap_size);
4738 ok (ret == NO_ERROR, "GetAdaptersInfo failed, error: %d\n", ret);
4739 ret = pGetIpForwardTable(routes, &route_size, FALSE);
4740 ok (ret == NO_ERROR, "GetIpForwardTable failed, error: %d\n", ret);
4741
4742 /* This test only has meaning if there is more than one IP configured */
4743 if (adapters->Next == NULL && count == 1)
4744 {
4745 skip("Only one IP is present, skipping tests\n");
4746 goto cleanup;
4747 }
4748
4749 for (i = 0; !found_default && i < routes->dwNumEntries; i++)
4750 {
4751 /* default route (ip 0.0.0.0) ? */
4752 if (routes->table[i].dwForwardDest) continue;
4753
4754 for (k = adapters; k != NULL; k = k->Next)
4755 {
4756 char *ip;
4757
4758 if (k->Index != routes->table[i].dwForwardIfIndex) continue;
4759
4760 /* the first IP returned from gethostbyname must be a default route */
4761 ip = k->IpAddressList.IpAddress.String;
4762 if (!strcmp(first_ip, ip))
4763 {
4764 found_default = TRUE;
4765 break;
4766 }
4767 }
4768 }
4769 ok (found_default, "failed to find the first IP from gethostbyname!\n");
4770
4771cleanup:
4772 HeapFree(GetProcessHeap(), 0, adapters);
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
static void cleanup(void)
Definition: main.c:1335
GLuint GLuint GLsizei count
Definition: gl.h:1545
int WINAPI gethostname(char *name, int namelen)
struct _IP_ADAPTER_INFO * Next
Definition: iptypes.h:53
IF_INDEX dwForwardIfIndex
Definition: ipmib.h:75
DWORD dwForwardDest
Definition: ipmib.h:71
DWORD dwNumEntries
Definition: ipmib.h:97
MIB_IPFORWARDROW table[1]
Definition: ipmib.h:98
char ** h_addr_list
Definition: winsock.h:138
#define ERROR_BUFFER_OVERFLOW
Definition: winerror.h:185

◆ test_gethostbyname_hack()

static void test_gethostbyname_hack ( void  )
static

Definition at line 4774 of file sock.c.

4777{
4778 struct hostent *he;
4779 char name[256];
4780 static BYTE loopback[] = {127, 0, 0, 1};
4781 static BYTE magic_loopback[] = {127, 12, 34, 56};
4782 int ret;
4783
4784 ret = gethostname(name, 256);
4785 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4786
4787 he = gethostbyname("localhost");
4788 ok(he != NULL, "gethostbyname(\"localhost\") failed: %d\n", h_errno);
4789 if(he)
4790 {
4791 if(he->h_length != 4)
4792 {
4793 skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
4794 return;
4795 }
4796
4797 ok(memcmp(he->h_addr_list[0], loopback, he->h_length) == 0,
4798 "gethostbyname(\"localhost\") returned %u.%u.%u.%u\n",
4799 he->h_addr_list[0][0], he->h_addr_list[0][1], he->h_addr_list[0][2],
4800 he->h_addr_list[0][3]);
4801 }
4802
4803 if(strcmp(name, "localhost") == 0)
4804 {
4805 skip("hostname seems to be \"localhost\", skipping test.\n");
4806 return;
4807 }
4808
4809 he = gethostbyname(name);
4810 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, h_errno);
4811 if(he)
4812 {
4813 if(he->h_length != 4)
4814 {
4815 skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
4816 return;
4817 }
4818
4819 if (he->h_addr_list[0][0] == 127)
4820 {
4821 ok(memcmp(he->h_addr_list[0], magic_loopback, he->h_length) == 0,
4822 "gethostbyname(\"%s\") returned %u.%u.%u.%u not 127.12.34.56\n",
4823 name, he->h_addr_list[0][0], he->h_addr_list[0][1],
4824 he->h_addr_list[0][2], he->h_addr_list[0][3]);
4825 }
4826 }
4827
4828 gethostbyname("nonexistent.winehq.org");
4829 /* Don't check for the return value, as some braindead ISPs will kindly
short h_length
Definition: winsock.h:137
unsigned char BYTE
Definition: xxhash.c:193

◆ test_gethostname()

static void test_gethostname ( void  )
static

Definition at line 4831 of file sock.c.

4834{
4835 struct hostent *he;
4836 char name[256];
4837 int ret, len;
4838
4839 WSASetLastError(0xdeadbeef);
4840 ret = gethostname(NULL, 256);
4841 ok(ret == -1, "gethostname() returned %d\n", ret);
4842 ok(WSAGetLastError() == WSAEFAULT, "gethostname with null buffer "
4843 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT);
4844
4845 ret = gethostname(name, sizeof(name));
4846 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4847 he = gethostbyname(name);
4848 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
4849
4850 len = strlen(name);
4851 WSASetLastError(0xdeadbeef);
4852 strcpy(name, "deadbeef");
4853 ret = gethostname(name, len);
4854 ok(ret == -1, "gethostname() returned %d\n", ret);
4855 ok(!strcmp(name, "deadbeef"), "name changed unexpected!\n");
4856 ok(WSAGetLastError() == WSAEFAULT, "gethostname with insufficient length "
4857 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT);
4858
4859 len++;
4860 ret = gethostname(name, len);
4861 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4862 he = gethostbyname(name);
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269

◆ test_getpeername()

static void test_getpeername ( void  )
static

Definition at line 9096 of file sock.c.

9099{
9100 SOCKET sock;
9101 struct sockaddr_in sa, sa_out;
9102 SOCKADDR_STORAGE ss;
9103 int sa_len;
9104 const char buf[] = "hello world";
9105 int ret;
9106
9107 /* Test the parameter validation order. */
9109 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9111 "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError());
9112
9114 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9115 if (sock == INVALID_SOCKET)
9116 {
9117 skip("Socket creation failed with %d\n", WSAGetLastError());
9118 return;
9119 }
9120
9122 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9124 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9125
9126 memset(&sa, 0, sizeof(sa));
9127 sa.sin_family = AF_INET;
9128 sa.sin_port = htons(139);
9129 sa.sin_addr.s_addr = inet_addr("127.0.0.1");
9130
9131 /* sendto does not change a socket's connection state. */
9132 ret = sendto(sock, buf, sizeof(buf), 0, (struct sockaddr*)&sa, sizeof(sa));
9133 ok(ret != SOCKET_ERROR,
9134 "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9135
9137 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9139 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9140
9141 ret = connect(sock, (struct sockaddr*)&sa, sizeof(sa));
9142 ok(ret == 0,
9143 "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9144
9146 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9148 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9149
9150 /* Test crashes on Wine. */
9151 if (0)
9152 {
9153 ret = getpeername(sock, (void*)0xdeadbeef, (void*)0xcafebabe);
9154 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9156 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9157 }
9158
9159 ret = getpeername(sock, (struct sockaddr*)&sa_out, NULL);
9160 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9162 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9163
9164 sa_len = 0;
9165 ret = getpeername(sock, NULL, &sa_len);
9166 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9168 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9169 ok(!sa_len, "got %d\n", sa_len);
9170
9171 sa_len = 0;
9172 ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len);
9173 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9175 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9176 ok(!sa_len, "got %d\n", sa_len);
9177
9178 sa_len = sizeof(ss);
9179 ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len);
9180 ok(ret == 0, "Expected getpeername to return 0, got %d\n", ret);
9181 ok(!memcmp(&sa, &ss, sizeof(sa)),
9182 "Expected the returned structure to be identical to the connect structure\n");
9183 ok(sa_len == sizeof(sa), "got %d\n", sa_len);
9184
INT WSAAPI sendto(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags, IN CONST struct sockaddr *to, IN INT tolen)
Definition: send.c:82
INT WSAAPI getpeername(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:167

◆ test_getservbyname()

static void test_getservbyname ( void  )
static

Definition at line 2388 of file sock.c.

2391{
2392 int i;
2393 HANDLE starttest, thread[NUM_THREADS];
2395
2396 starttest = CreateEventA ( NULL, 1, 0, "test_getservbyname_starttest" );
2397
2398 /* create threads */
2399 for ( i = 0; i < NUM_THREADS; i++ ) {
2400 thread[i] = CreateThread ( NULL, 0, do_getservbyname, &starttest, 0, &thread_id[i] );
2401 }
2402
2403 /* signal threads to start */
2404 SetEvent ( starttest );
2405
2406 for ( i = 0; i < NUM_THREADS; i++) {
static DWORD WINAPI do_getservbyname(void *param)
Definition: sock.c:2347
#define NUM_THREADS
Definition: sock.c:54

◆ test_getsockname()

static void test_getsockname ( void  )
static

Definition at line 4530 of file sock.c.

4533{
4534 WSADATA wsa;
4535 SOCKET sock;
4536 struct sockaddr_in sa_set, sa_get;
4537 int sa_set_len = sizeof(struct sockaddr_in);
4538 int sa_get_len = sa_set_len;
4539 static const unsigned char null_padding[] = {0,0,0,0,0,0,0,0};
4540 int ret;
4541 struct hostent *h;
4542
4543 if(WSAStartup(MAKEWORD(2,0), &wsa)){
4544 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4545 return;
4546 }
4547
4548 memset(&sa_set, 0, sa_set_len);
4549
4550 sa_set.sin_family = AF_INET;
4551 sa_set.sin_port = htons(0);
4552 sa_set.sin_addr.s_addr = htonl(INADDR_ANY);
4553
4555 trace("Creating the socket failed: %d\n", WSAGetLastError());
4556 WSACleanup();
4557 return;
4558 }
4559
4560 sa_get = sa_set;
4561 if (getsockname(sock, (struct sockaddr*) &sa_get, &sa_get_len) == 0)
4562 ok(0, "getsockname on unbound socket should fail\n");
4563 else {
4564 ok(WSAGetLastError() == WSAEINVAL, "getsockname on unbound socket "
4565 "failed with %d, expected %d\n", WSAGetLastError(), WSAEINVAL);
4566 ok(memcmp(&sa_get, &sa_set, sizeof(sa_get)) == 0,
4567 "failed getsockname modified sockaddr when it shouldn't\n");
4568 }
4569
4570 if(bind(sock, (struct sockaddr *) &sa_set, sa_set_len) < 0){
4571 trace("Failed to bind socket: %d\n", WSAGetLastError());
4573 WSACleanup();
4574 return;
4575 }
4576
4577 if(getsockname(sock, (struct sockaddr *) &sa_get, &sa_get_len) != 0){
4578 trace("Failed to call getsockname: %d\n", WSAGetLastError());
4580 WSACleanup();
4581 return;
4582 }
4583
4584 ret = memcmp(sa_get.sin_zero, null_padding, 8);
4585 ok(ret == 0, "getsockname did not zero the sockaddr_in structure\n");
4586
4588
4589 h = gethostbyname("");
4590 if (h && h->h_length == 4) /* this test is only meaningful in IPv4 */
4591 {
4592 int i;
4593 for (i = 0; h->h_addr_list[i]; i++)
4594 {
4595 char ipstr[32];
4596 struct in_addr ip;
4597 ip.s_addr = *(ULONG *) h->h_addr_list[i];
4598
4600 ok(sock != INVALID_SOCKET, "socket failed with %d\n", GetLastError());
4601
4602 memset(&sa_set, 0, sizeof(sa_set));
4603 sa_set.sin_family = AF_INET;
4604 sa_set.sin_addr.s_addr = ip.s_addr;
4605 /* The same address we bind must be the same address we get */
4606 ret = bind(sock, (struct sockaddr*)&sa_set, sizeof(sa_set));
4607 ok(ret == 0, "bind failed with %d\n", GetLastError());
4608 sa_get_len = sizeof(sa_get);
4609 ret = getsockname(sock, (struct sockaddr*)&sa_get, &sa_get_len);
4610 ok(ret == 0, "getsockname failed with %d\n", GetLastError());
4611 strcpy(ipstr, inet_ntoa(sa_get.sin_addr));
4612 trace("testing bind on interface %s\n", ipstr);
4613 ok(sa_get.sin_addr.s_addr == sa_set.sin_addr.s_addr,
4614 "address does not match: %s != %s\n", ipstr, inet_ntoa(sa_set.sin_addr));
4615
4617 }
4618 }
4619

◆ test_inet_addr()

static void test_inet_addr ( void  )
static

Definition at line 4864 of file sock.c.

4867{
4868 u_long addr;
4869
4870 addr = inet_addr(NULL);

◆ test_inet_ntoa()

static void test_inet_ntoa ( void  )
static

Definition at line 10567 of file sock.c.

10570{
10571 ULONG addr;
10572 const char *str;
10573 HANDLE thread, event[2];
10574 DWORD tid;
10575
10576 addr = inet_addr("1.2.3.4");
10577 ok(addr == htonl(0x01020304), "expected 0x01020304, got %08x\n", addr);
10578 str = inet_ntoa(*(struct in_addr *)&addr);
10579 ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str);
10580
10581 event[0] = CreateEventW(NULL, TRUE, FALSE, NULL);
10582 event[1] = CreateEventW(NULL, TRUE, FALSE, NULL);
10583
10585 WaitForSingleObject(event[0], 3000);
10586
10587 ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str);
10588
10589 SetEvent(event[1]);
10591
10592 CloseHandle(event[0]);
10593 CloseHandle(event[1]);
static DWORD WINAPI inet_ntoa_thread_proc(void *param)
Definition: sock.c:10550
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651

◆ test_inet_pton()

static void test_inet_pton ( void  )
static

Definition at line 5003 of file sock.c.

5006{
5007 struct TEST_DATA
5008 {
5009 int family, ret;
5010 DWORD err;
5011 const char *printable, *collapsed, *raw_data;
5012 } tests[] = {
5013 {AF_UNSPEC, -1, WSAEFAULT, /* Test 0 */
5014 NULL, NULL, NULL},
5015 {AF_INET, -1, WSAEFAULT,
5016 NULL, NULL, NULL},
5017 {AF_INET6, -1, WSAEFAULT,
5018 NULL, NULL, NULL},
5020 "127.0.0.1", NULL, NULL},
5021 {AF_INET, 1, 0,
5022 "127.0.0.1", "127.0.0.1",
5023 "\x7f\x00\x00\x01"},
5024 {AF_INET6, 0, 0,
5025 "127.0.0.1", "127.0.0.1", NULL},
5026 {AF_INET, 0, 0,
5027 "::1/128", NULL, NULL},
5028 {AF_INET6, 0, 0,
5029 "::1/128", NULL, NULL},
5031 "broken", NULL, NULL},
5032 {AF_INET, 0, 0,
5033 "broken", NULL, NULL},
5034 {AF_INET6, 0, 0, /* Test 10 */
5035 "broken", NULL, NULL},
5037 "177.32.45.20", NULL, NULL},
5038 {AF_INET, 1, 0,
5039 "177.32.45.20", "177.32.45.20",
5040 "\xb1\x20\x2d\x14"},
5041 {AF_INET6, 0, 0,
5042 "177.32.45.20", NULL, NULL},
5043 {AF_INET, 0, 0,
5044 "2607:f0d0:1002:51::4", NULL, NULL},
5045 {AF_INET6, 1, 0,
5046 "2607:f0d0:1002:51::4", "2607:f0d0:1002:51::4",
5047 "\x26\x07\xf0\xd0\x10\x02\x00\x51\x00\x00\x00\x00\x00\x00\x00\x04"},
5048 {AF_INET, 0, 0,
5049 "::177.32.45.20", NULL, NULL},
5050 {AF_INET6, 1, 0,
5051 "::177.32.45.20", "::177.32.45.20",
5052 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x20\x2d\x14"},
5053 {AF_INET, 0, 0,
5054 "fe80::0202:b3ff:fe1e:8329", NULL, NULL},
5055 {AF_INET6, 1, 0,
5056 "fe80::0202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
5057 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
5058 {AF_INET6, 1, 0, /* Test 20 */
5059 "fe80::202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
5060 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
5061 {AF_INET, 0, 0,
5062 "a", NULL, NULL},
5063 {AF_INET, 0, 0,
5064 "a.b", NULL, NULL},
5065 {AF_INET, 0, 0,
5066 "a.b.c", NULL, NULL},
5067 {AF_INET, 0, 0,
5068 "a.b.c.d", NULL, NULL},
5069 {AF_INET6, 1, 0,
5070 "2001:cdba:0000:0000:0000:0000:3257:9652", "2001:cdba::3257:9652",
5071 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
5072 {AF_INET6, 1, 0,
5073 "2001:cdba::3257:9652", "2001:cdba::3257:9652",
5074 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
5075 {AF_INET6, 1, 0,
5076 "2001:cdba:0:0:0:0:3257:9652", "2001:cdba::3257:9652",
5077 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}
5078 };
5079 int i, ret;
5080 DWORD err;
5081 char buffer[64],str[64];
5082 WCHAR printableW[64], collapsedW[64];
5083 const char *ptr;
5084 const WCHAR *ptrW;
5085
5086 /* InetNtop and InetPton became available in Vista and Win2008 */
5087 if (!pInetNtop || !pInetNtopW || !pInetPtonA || !pInetPtonW)
5088 {
5089 win_skip("InetNtop and/or InetPton not present, not executing tests\n");
5090 return;
5091 }
5092
5093 for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
5094 {
5095 WSASetLastError(0xdeadbeef);
5096 ret = pInetPtonA(tests[i].family, tests[i].printable, buffer);
5097 ok (ret == tests[i].ret, "Test [%d]: Expected %d, got %d\n", i, tests[i].ret, ret);
5098 if (tests[i].ret == -1)
5099 {
5100 err = WSAGetLastError();
5101 ok (tests[i].err == err, "Test [%d]: Expected 0x%x, got 0x%x\n", i, tests[i].err, err);
5102 }
5103 if (tests[i].ret != 1) continue;
5104 ok (memcmp(buffer, tests[i].raw_data,
5105 tests[i].family == AF_INET ? sizeof(struct in_addr) : sizeof(struct in6_addr)) == 0,
5106 "Test [%d]: Expected binary data differs\n", i);
5107
5108 /* Test the result from Pton with Ntop */
5109 strcpy (str, "deadbeef");
5110 ptr = pInetNtop(tests[i].family, buffer, str, sizeof(str));
5111 ok (ptr != NULL, "Test [%d]: Failed with NULL\n", i);
5112 ok (ptr == str, "Test [%d]: Pointers differ (%p != %p)\n", i, ptr, str);
5113 if (!ptr) continue;
5114 ok (strcmp(ptr, tests[i].collapsed) == 0, "Test [%d]: Expected '%s', got '%s'\n",
5115 i, tests[i].collapsed, ptr);
5116 }
5117
5118 for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
5119 {
5120 if (tests[i].printable)
5121 MultiByteToWideChar(CP_ACP, 0, tests[i].printable, -1, printableW,
5122 sizeof(printableW) / sizeof(printableW[0]));
5123 WSASetLastError(0xdeadbeef);
5124 ret = pInetPtonW(tests[i].family, tests[i].printable ? printableW : NULL, buffer);
5125 ok(ret == tests[i].ret, "Test [%d]: Expected %d, got %d\n", i, tests[i].ret, ret);
5126 if (tests[i].ret == -1)
5127 {
5128 err = WSAGetLastError();
5129 ok(tests[i].err == err, "Test [%d]: Expected 0x%x, got 0x%x\n", i, tests[i].err, err);
5130 }
5131 if (tests[i].ret != 1) continue;
5132 ok(memcmp(buffer, tests[i].raw_data,
5133 tests[i].family == AF_INET ? sizeof(struct in_addr) : sizeof(struct in6_addr)) == 0,
5134 "Test [%d]: Expected binary data differs\n", i);
5135
5136 /* Test the result from Pton with Ntop */
5137 printableW[0] = 0xdead;
5138 ptrW = pInetNtopW(tests[i].family, buffer, printableW, sizeof(printableW) / sizeof(printableW[0]));
5139 ok (ptrW != NULL, "Test [%d]: Failed with NULL\n", i);
5140 ok (ptrW == printableW, "Test [%d]: Pointers differ (%p != %p)\n", i, ptrW, printableW);
5141 if (!ptrW) continue;
5142
5143 MultiByteToWideChar(CP_ACP, 0, tests[i].collapsed, -1, collapsedW,
5144 sizeof(collapsedW) / sizeof(collapsedW[0]));
5145 ok (lstrcmpW(ptrW, collapsedW) == 0, "Test [%d]: Expected '%s', got '%s'\n",
5146 i, tests[i].collapsed, wine_dbgstr_w(ptrW));
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110

◆ test_iocp()

static void test_iocp ( void  )
static

Definition at line 11526 of file sock.c.

11529{
11530 SOCKET src, dst;
11531 int i, ret;
11532
11534 ok(!ret, "creating socket pair failed\n");
11535 sync_read(src, dst);
11539
11541 ok(!ret, "creating socket pair failed\n");
11545
11546 for (i = 0; i <= 2; i++)
11547 {
11549 ok(!ret, "creating socket pair failed\n");
11552 }
11553
11555 ok(!ret, "creating socket pair failed\n");
11558
11560 ok(!ret, "creating socket pair failed\n");
static void iocp_async_read(SOCKET src, SOCKET dst)
Definition: sock.c:10940
static int tcp_socketpair_ovl(SOCKET *src, SOCKET *dst)
Definition: sock.c:292
static void iocp_async_read_thread(SOCKET src, SOCKET dst)
Definition: sock.c:11391
static void iocp_async_read_closesocket(SOCKET src, int how_to_close)
Definition: sock.c:11010
static void sync_read(SOCKET src, SOCKET dst)
Definition: sock.c:10926
static void iocp_async_closesocket(SOCKET src)
Definition: sock.c:11151
static void iocp_async_read_thread_closesocket(SOCKET src)
Definition: sock.c:11263

◆ test_ioctlsocket()

static void test_ioctlsocket ( void  )
static

Definition at line 5148 of file sock.c.

5151{
5152 SOCKET sock, src, dst;
5153 struct tcp_keepalive kalive;
5154 struct sockaddr_in address;
5155 int ret, optval;
5156 static const LONG cmds[] = {FIONBIO, FIONREAD, SIOCATMARK};
5157 UINT i, bytes_rec;
5158 char data;
5159 WSABUF bufs;
5160 u_long arg = 0;
5161
5163 ok(sock != INVALID_SOCKET, "Creating the socket failed: %d\n", WSAGetLastError());
5164 if(sock == INVALID_SOCKET)
5165 {
5166 skip("Can't continue without a socket.\n");
5167 return;
5168 }
5169
5170 for(i = 0; i < sizeof(cmds)/sizeof(cmds[0]); i++)
5171 {
5172 /* broken apps like defcon pass the argp value directly instead of a pointer to it */
5173 ret = ioctlsocket(sock, cmds[i], (u_long *)1);
5174 ok(ret == SOCKET_ERROR, "ioctlsocket succeeded unexpectedly\n");
5175 ret = WSAGetLastError();
5176 ok(ret == WSAEFAULT, "expected WSAEFAULT, got %d instead\n", ret);
5177 }
5178
5179 /* A fresh and not connected socket has no urgent data, this test shows
5180 * that normal(not urgent) data returns a non-zero value for SIOCATMARK. */
5181
5183 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n");
5184 ok(arg, "SIOCATMARK expected a non-zero value\n");
5185
5186 /* when SO_OOBINLINE is set SIOCATMARK must always return TRUE */
5187 optval = 1;
5188 ret = setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval));
5189 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n");
5190 arg = 0;
5192 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n");
5193 ok(arg, "SIOCATMARK expected a non-zero value\n");
5194
5195 /* disable SO_OOBINLINE and get the same old behavior */
5196 optval = 0;
5197 ret = setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval));
5198 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n");
5199 arg = 0;
5201 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n");
5202 ok(arg, "SIOCATMARK expected a non-zero value\n");
5203
5205 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
5206 ret = WSAGetLastError();
5207 ok(ret == WSAEFAULT || broken(ret == WSAEINVAL), "expected WSAEFAULT, got %d instead\n", ret);
5208
5209 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, NULL, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5210 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
5211 ret = WSAGetLastError();
5212 ok(ret == WSAEFAULT || broken(ret == WSAEINVAL), "expected WSAEFAULT, got %d instead\n", ret);
5213
5214 make_keepalive(kalive, 0, 0, 0);
5215 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5216 ok(ret == 0, "WSAIoctl failed unexpectedly\n");
5217
5218 make_keepalive(kalive, 1, 0, 0);
5219 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5220 ok(ret == 0, "WSAIoctl failed unexpectedly\n");
5221
5222 make_keepalive(kalive, 1, 1000, 1000);
5223 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5224 ok(ret == 0, "WSAIoctl failed unexpectedly\n");
5225
5226 make_keepalive(kalive, 1, 10000, 10000);
5227 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5228 ok(ret == 0, "WSAIoctl failed unexpectedly\n");
5229
5230 make_keepalive(kalive, 1, 100, 100);
5231 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5232 ok(ret == 0, "WSAIoctl failed unexpectedly\n");
5233
5234 make_keepalive(kalive, 0, 100, 100);
5235 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5236 ok(ret == 0, "WSAIoctl failed unexpectedly\n");
5237
5239
5241 ok(sock != INVALID_SOCKET, "Creating the socket failed: %d\n", WSAGetLastError());
5242 if(sock == INVALID_SOCKET)
5243 {
5244 skip("Can't continue without a socket.\n");
5245 return;
5246 }
5247
5248 /* test FIONREAD with a fresh and non-connected socket */
5249 arg = 0xdeadbeef;
5251 ok(ret == 0, "ioctlsocket failed unexpectedly with error %d\n", WSAGetLastError());
5252 ok(arg == 0, "expected 0, got %u\n", arg);
5253
5254 memset(&address, 0, sizeof(address));
5255 address.sin_family = AF_INET;
5256 address.sin_addr.s_addr = inet_addr( SERVERIP );
5257 address.sin_port = htons( SERVERPORT );
5258 ret = bind(sock, (struct sockaddr *)&address, sizeof(address));
5259 ok(ret == 0, "bind failed unexpectedly with error %d\n", WSAGetLastError());
5260
5262 ok(ret == 0, "listen failed unexpectedly with error %d\n", WSAGetLastError());
5263
5264 /* test FIONREAD with listening socket */
5265 arg = 0xdeadbeef;
5267 ok(ret == 0, "ioctlsocket failed unexpectedly with error %d\n", WSAGetLastError());
5268 ok(arg == 0, "expected 0, got %u\n", arg);
5269
5271
5272 if (tcp_socketpair(&src, &dst) != 0)
5273 {
5274 ok(0, "creating socket pair failed, skipping test\n");
5275 return;
5276 }
5277
5278 /* test FIONREAD on TCP sockets */
5279 optval = 0xdeadbeef;
5280 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL);
5281 ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5282 ok(optval == 0, "FIONREAD should have returned 0 bytes, got %d instead\n", optval);
5283
5284 optval = 0xdeadbeef;
5285 ok(send(src, "TEST", 4, 0) == 4, "failed to send test data\n");
5286 Sleep(100);
5287 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL);
5288 ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5289 ok(optval == 4, "FIONREAD should have returned 4 bytes, got %d instead\n", optval);
5290
5291 /* trying to read from an OOB inlined socket with MSG_OOB results in WSAEINVAL */
5293 i = MSG_OOB;
5294 SetLastError(0xdeadbeef);
5295 ret = recv(dst, &data, 1, i);
5296 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5297 ret = GetLastError();
5298 ok(ret == WSAEWOULDBLOCK, "expected 10035, got %d\n", ret);
5299 bufs.len = sizeof(char);
5300 bufs.buf = &data;
5301 ret = WSARecv(dst, &bufs, 1, &bytes_rec, &i, NULL, NULL);
5302 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5303 ret = GetLastError();
5304 ok(ret == WSAEWOULDBLOCK, "expected 10035, got %d\n", ret);
5305 optval = 1;
5306 ret = setsockopt(dst, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval));
5307 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n");
5308 i = MSG_OOB;
5309 SetLastError(0xdeadbeef);
5310 ret = recv(dst, &data, 1, i);
5311 ok(ret == SOCKET_ERROR, "expected SOCKET_ERROR, got %d\n", ret);
5312 ret = GetLastError();
5313 ok(ret == WSAEINVAL, "expected 10022, got %d\n", ret);
5314 bufs.len = sizeof(char);
5315 bufs.buf = &data;
5316 ret = WSARecv(dst, &bufs, 1, &bytes_rec, &i, NULL, NULL);
5317 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5318 ret = GetLastError();
5319 ok(ret == WSAEINVAL, "expected 10022, got %d\n", ret);
5320
5322 optval = 0xdeadbeef;
5323 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL);
5324 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
5325 ok(optval == 0xdeadbeef, "FIONREAD should not have changed last error, got %d instead\n", optval);
COMMAND cmds[]
Definition: main.c:21
#define SIO_KEEPALIVE_VALS
Definition: mstcpip.h:29
unsigned int UINT
Definition: ndis.h:50
#define make_keepalive(k, enable, time, interval)
Definition: sock.c:68
#define FIONREAD
Definition: winsock.h:247

◆ test_ip_pktinfo()

static void test_ip_pktinfo ( void  )
static

Definition at line 2003 of file sock.c.

2006{
2007 ULONG addresses[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY)};
2008 char recvbuf[10], pktbuf[512], msg[] = "HELLO";
2009 struct sockaddr_in s1addr, s2addr, s3addr;
2010 GUID WSARecvMsg_GUID = WSAID_WSARECVMSG;
2011 LPFN_WSARECVMSG pWSARecvMsg = NULL;
2012 unsigned int rc, yes = 1;
2013 BOOL foundhdr;
2014 DWORD dwBytes, dwSize, dwFlags;
2015 socklen_t addrlen;
2016 WSACMSGHDR *cmsg;
2017 WSAOVERLAPPED ov;
2018 WSABUF iovec[1];
2019 SOCKET s1, s2;
2020 WSAMSG hdr;
2021 int i, err;
2022
2023 memset(&ov, 0, sizeof(ov));
2025 if (ov.hEvent == INVALID_HANDLE_VALUE)
2026 {
2027 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
2028 return;
2029 }
2030
2031 memset(&hdr, 0x00, sizeof(hdr));
2032 s1addr.sin_family = AF_INET;
2033 s1addr.sin_port = htons(0);
2034 /* Note: s1addr.sin_addr is set below */
2035 iovec[0].buf = recvbuf;
2036 iovec[0].len = sizeof(recvbuf);
2037 hdr.name = (struct sockaddr*)&s3addr;
2038 hdr.namelen = sizeof(s3addr);
2039 hdr.lpBuffers = &iovec[0];
2040 hdr.dwBufferCount = 1;
2041 hdr.Control.buf = pktbuf;
2042 /* Note: hdr.Control.len is set below */
2043 hdr.dwFlags = 0;
2044
2045 for (i=0;i<sizeof(addresses)/sizeof(UINT32);i++)
2046 {
2047 s1addr.sin_addr.s_addr = addresses[i];
2048
2049 /* Build "server" side socket */
2051 if (s1 == INVALID_SOCKET)
2052 {
2053 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
2054 goto cleanup;
2055 }
2056
2057 /* Obtain the WSARecvMsg function */
2058 WSAIoctl(s1, SIO_GET_EXTENSION_FUNCTION_POINTER, &WSARecvMsg_GUID, sizeof(WSARecvMsg_GUID),
2059 &pWSARecvMsg, sizeof(pWSARecvMsg), &dwBytes, NULL, NULL);
2060 if (!pWSARecvMsg)
2061 {
2062 win_skip("WSARecvMsg is unsupported, some tests will be skipped.\n");
2063 closesocket(s1);
2064 goto cleanup;
2065 }
2066
2067 /* Setup the server side socket */
2068 rc=bind(s1, (struct sockaddr*)&s1addr, sizeof(s1addr));
2069 ok(rc != SOCKET_ERROR, "bind() failed error: %d\n", WSAGetLastError());
2070 rc=setsockopt(s1, IPPROTO_IP, IP_PKTINFO, (const char*)&yes, sizeof(yes));
2071 ok(rc == 0, "failed to set IPPROTO_IP flag IP_PKTINFO!\n");
2072
2073 /* Build "client" side socket */
2074 addrlen = sizeof(s2addr);
2075 if (getsockname(s1, (struct sockaddr *) &s2addr, &addrlen) != 0)
2076 {
2077 skip("Failed to call getsockname, some tests skipped: %d\n", WSAGetLastError());
2078 closesocket(s1);
2079 goto cleanup;
2080 }
2081 s2addr.sin_addr.s_addr = addresses[0]; /* Always target the local adapter address */
2083 if (s2 == INVALID_SOCKET)
2084 {
2085 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
2086 closesocket(s1);
2087 goto cleanup;
2088 }
2089
2090 /* Test an empty message header */
2091 rc=pWSARecvMsg(s1, NULL, NULL, NULL, NULL);
2093 ok(rc == SOCKET_ERROR && err == WSAEFAULT, "WSARecvMsg() failed error: %d (ret = %d)\n", err, rc);
2094
2095 /*
2096 * Send a packet from the client to the server and test for specifying
2097 * a short control header.
2098 */
2099 SetLastError(0xdeadbeef);
2100 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr));
2101 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError());
2102 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
2103 hdr.Control.len = 1;
2104 rc=pWSARecvMsg(s1, &hdr, &dwSize, NULL, NULL);
2106 ok(rc == SOCKET_ERROR && err == WSAEMSGSIZE && (hdr.dwFlags & MSG_CTRUNC),
2107 "WSARecvMsg() failed error: %d (ret: %d, flags: %d)\n", err, rc, hdr.dwFlags);
2108 hdr.dwFlags = 0; /* Reset flags */
2109
2110 /* Perform another short control header test, this time with an overlapped receive */
2111 hdr.Control.len = 1;
2112 rc=pWSARecvMsg(s1, &hdr, NULL, &ov, NULL);
2114 ok(rc != 0 && err == WSA_IO_PENDING, "WSARecvMsg() failed error: %d\n", err);
2115 SetLastError(0xdeadbeef);
2116 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr));
2117 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError());
2118 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
2120 {
2121 skip("Server side did not receive packet, some tests skipped.\n");
2122 closesocket(s2);
2123 closesocket(s1);
2124 continue;
2125 }
2126 dwFlags = 0;
2128 ok(dwFlags == 0,
2129 "WSAGetOverlappedResult() returned unexpected flags %d!\n", dwFlags);
2130 ok(hdr.dwFlags == MSG_CTRUNC,
2131 "WSARecvMsg() overlapped operation set unexpected flags %d.\n", hdr.dwFlags);
2132 hdr.dwFlags = 0; /* Reset flags */
2133
2134 /*
2135 * Setup an overlapped receive, send a packet, then wait for the packet to be retrieved
2136 * on the server end and check that the returned packet matches what was sent.
2137 */
2138 hdr.Control.len = sizeof(pktbuf);
2139 rc=pWSARecvMsg(s1, &hdr, NULL, &ov, NULL);
2141 ok(rc != 0 && err == WSA_IO_PENDING, "WSARecvMsg() failed error: %d\n", err);
2142 ok(hdr.Control.len == sizeof(pktbuf),
2143 "WSARecvMsg() control length mismatch (%d != sizeof pktbuf).\n", hdr.Control.len);
2144 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr));
2145 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError());
2147 {
2148 skip("Server side did not receive packet, some tests skipped.\n");
2149 closesocket(s2);
2150 closesocket(s1);
2151 continue;
2152 }
2153 dwSize = 0;
2155 ok(dwSize == sizeof(msg),
2156 "WSARecvMsg() buffer length does not match transmitted data!\n");
2157 ok(strncmp(iovec[0].buf, msg, sizeof(msg)) == 0,
2158 "WSARecvMsg() buffer does not match transmitted data!\n");
2159 ok(hdr.Control.len == IP_PKTINFO_LEN,
2160 "WSARecvMsg() control length mismatch (%d).\n", hdr.Control.len);
2161
2162 /* Test for the expected IP_PKTINFO return information. */
2163 foundhdr = FALSE;
2164 for (cmsg = WSA_CMSG_FIRSTHDR(&hdr); cmsg != NULL; cmsg = WSA_CMSG_NXTHDR(&hdr, cmsg))
2165 {
2166 if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO)
2167 {
2168 struct in_pktinfo *pi = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
2169
2170 ok(pi->ipi_addr.s_addr == s2addr.sin_addr.s_addr, "destination ip mismatch!\n");
2171 foundhdr = TRUE;
2172 }
2173 }
2174 ok(foundhdr, "IP_PKTINFO header information was not returned!\n");
2175
2176 closesocket(s2);
2177 closesocket(s1);
2178 }
2179
2180cleanup:
unsigned int UINT32
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
static WCHAR yes[MAX_STRING_RESOURCE_LEN]
Definition: object.c:2339
char hdr[14]
Definition: iptest.cpp:33
struct S1 s1
struct S2 s2
int socklen_t
Definition: tcp.c:35
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static refpint_t pi[]
Definition: server.c:96
#define IP_PKTINFO_LEN
Definition: sock.c:2001
INT cmsg_type
Definition: ws2def.h:547
INT cmsg_level
Definition: ws2def.h:546
Definition: linux.h:1700
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define WSAEMSGSIZE
Definition: winerror.h:1953
#define WSA_IO_PENDING
Definition: winsock2.h:616
#define WSA_CMSG_DATA(cmsg)
Definition: ws2def.h:628
#define WSA_CMSG_FIRSTHDR(msg)
Definition: ws2def.h:577
#define MSG_CTRUNC
Definition: ws2def.h:289
#define WSA_CMSG_NXTHDR(msg, cmsg)
Definition: ws2def.h:597
#define IP_PKTINFO
Definition: ws2ipdef.h:41

◆ test_ipv6only()

static void test_ipv6only ( void  )
static

Definition at line 6347 of file sock.c.

6350{
6351 SOCKET v4 = INVALID_SOCKET, v6;
6352 struct sockaddr_in sin4;
6353 struct sockaddr_in6 sin6;
6354 int ret, enabled, len = sizeof(enabled);
6355
6356 memset(&sin4, 0, sizeof(sin4));
6357 sin4.sin_family = AF_INET;
6358 sin4.sin_port = htons(SERVERPORT);
6359
6360 memset(&sin6, 0, sizeof(sin6));
6361 sin6.sin6_family = AF_INET6;
6362 sin6.sin6_port = htons(SERVERPORT);
6363
6365 if (v6 == INVALID_SOCKET)
6366 {
6367 skip("Could not create IPv6 socket (LastError: %d)\n", WSAGetLastError());
6368 goto end;
6369 }
6370
6371 enabled = 2;
6372 ret = getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6373 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6374 ok(enabled == 1, "expected 1, got %d\n", enabled);
6375
6376 ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6));
6377 if (ret)
6378 {
6379 skip("Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError());
6380 goto end;
6381 }
6382
6384 ok(v4 != INVALID_SOCKET, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
6385
6386todo_wine {
6387 enabled = 2;
6388 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6389 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6390 ok(enabled == 1, "expected 1, got %d\n", enabled);
6391}
6392
6393 enabled = 0;
6394 len = sizeof(enabled);
6395 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6396 ok(!ret, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6397
6398todo_wine {
6399 enabled = 2;
6400 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6401 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6402 ok(!enabled, "expected 0, got %d\n", enabled);
6403}
6404
6405 enabled = 1;
6406 len = sizeof(enabled);
6407 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6408 ok(!ret, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6409
6410 /* bind on IPv4 socket should succeed - IPV6_V6ONLY is enabled by default */
6411 ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4));
6412 ok(!ret, "Could not bind IPv4 address (LastError: %d)\n", WSAGetLastError());
6413
6414todo_wine {
6415 enabled = 2;
6416 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6417 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6418 ok(enabled == 1, "expected 1, got %d\n", enabled);
6419}
6420
6421 enabled = 0;
6422 len = sizeof(enabled);
6423 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6424 ok(ret, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
6425
6426todo_wine {
6427 enabled = 0;
6428 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6429 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6430 ok(enabled == 1, "expected 1, got %d\n", enabled);
6431}
6432
6433 enabled = 1;
6434 len = sizeof(enabled);
6435 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6436 ok(ret, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
6437
6438 closesocket(v4);
6439 closesocket(v6);
6440
6441 /* Test again, this time disabling IPV6_V6ONLY. */
6442 sin4.sin_port = htons(SERVERPORT+2);
6443 sin6.sin6_port = htons(SERVERPORT+2);
6444
6446 ok(v6 != INVALID_SOCKET, "Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
6448
6449 enabled = 0;
6450 ret = setsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6451 ok(!ret, "Could not disable IPV6_V6ONLY (LastError: %d).\n", WSAGetLastError());
6452
6453 enabled = 2;
6454 ret = getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6455 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6456 ok(!enabled, "expected 0, got %d\n", enabled);
6457
6458 /*
6459 Observaition:
6460 On Windows, bind on both IPv4 and IPv6 with IPV6_V6ONLY disabled succeeds by default.
6461 Application must set SO_EXCLUSIVEADDRUSE on first socket to disallow another successful bind.
6462 In general, a standard application should not use SO_REUSEADDR.
6463 Setting both SO_EXCLUSIVEADDRUSE and SO_REUSEADDR on the same socket is not possible in
6464 either order, the later setsockopt call always fails.
6465 */
6466 enabled = 1;
6468 ok(!ret, "Could not set SO_EXCLUSIVEADDRUSE on IPv6 socket (LastError: %d)\n", WSAGetLastError());
6469
6470 ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6));
6471 ok(!ret, "Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError());
6472
6473 enabled = 2;
6474 len = sizeof(enabled);
6475 getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6476 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6477 ok(!enabled, "IPV6_V6ONLY is enabled after bind\n");
6478
6480 ok(v4 != INVALID_SOCKET, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
6481
6482 enabled = 1;
6483 ret = setsockopt(v4, SOL_SOCKET, SO_REUSEADDR, (char*)&enabled, len);
6484 ok(!ret, "Could not set SO_REUSEADDR on IPv4 socket (LastError: %d)\n", WSAGetLastError());
6485
6486 WSASetLastError(0xdeadbeef);
6487 ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4));
6488 ok(ret, "bind succeeded unexpectedly for the IPv4 socket\n");
6489 ok(WSAGetLastError() == WSAEACCES, "Expected 10013, got %d\n", WSAGetLastError());
6490
6491end:
6492 if (v4 != INVALID_SOCKET)
6493 closesocket(v4);
6494 if (v6 != INVALID_SOCKET)
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glext.h:7750
#define WSAEACCES
Definition: winerror.h:1944
#define SO_EXCLUSIVEADDRUSE
Definition: ws2def.h:105
#define IPV6_V6ONLY
Definition: ws2ipdef.h:108

◆ test_listen()

static void test_listen ( void  )
static

Definition at line 3693 of file sock.c.

3696{
3697 SOCKET fdA, fdB;
3698 int ret, acceptc, olen = sizeof(acceptc);
3699 struct sockaddr_in address;
3700
3701 memset(&address, 0, sizeof(address));
3702 address.sin_addr.s_addr = inet_addr("127.0.0.1");
3703 address.sin_family = AF_INET;
3704 address.sin_port = htons(SERVERPORT);
3705
3706 /* invalid socket tests */
3707 SetLastError(0xdeadbeef);
3708 ok ((listen(0, 0) == SOCKET_ERROR), "listen did not fail\n");
3709 ret = WSAGetLastError();
3710 ok (ret == WSAENOTSOCK, "expected 10038, received %d\n", ret);
3711
3712 SetLastError(0xdeadbeef);
3713 ok ((listen(0xdeadbeef, 0) == SOCKET_ERROR), "listen did not fail\n");
3714 ret = WSAGetLastError();
3715 ok (ret == WSAENOTSOCK, "expected 10038, received %d\n", ret);
3716
3717 /* tcp tests */
3718 fdA = socket(AF_INET, SOCK_STREAM, 0);
3719 ok ((fdA != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3720
3721 fdB = socket(AF_INET, SOCK_STREAM, 0);
3722 ok ((fdB != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3723
3724 SetLastError(0xdeadbeef);
3725 ok ((listen(fdA, -2) == SOCKET_ERROR), "listen did not fail\n");
3726 ret = WSAGetLastError();
3727 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3728
3729 SetLastError(0xdeadbeef);
3730 ok ((listen(fdA, 1) == SOCKET_ERROR), "listen did not fail\n");
3731 ret = WSAGetLastError();
3732 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3733
3734 SetLastError(0xdeadbeef);
3735 ok ((listen(fdA, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
3736 ret = WSAGetLastError();
3737 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3738
3739 ok (!bind(fdA, (struct sockaddr*) &address, sizeof(address)), "bind failed\n");
3740
3741 SetLastError(0xdeadbeef);
3742 ok (bind(fdB, (struct sockaddr*) &address, sizeof(address)), "bind should have failed\n");
3743 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3744
3745 acceptc = 0xdead;
3746 ret = getsockopt(fdA, SOL_SOCKET, SO_ACCEPTCONN, (char*)&acceptc, &olen);
3747 ok (!ret, "getsockopt failed\n");
3748 ok (acceptc == 0, "SO_ACCEPTCONN should be 0, received %d\n", acceptc);
3749
3750 ok (!listen(fdA, 0), "listen failed\n");
3751 ok (!listen(fdA, SOMAXCONN), "double listen failed\n");
3752
3753 acceptc = 0xdead;
3754 ret = getsockopt(fdA, SOL_SOCKET, SO_ACCEPTCONN, (char*)&acceptc, &olen);
3755 ok (!ret, "getsockopt failed\n");
3756 ok (acceptc == 1, "SO_ACCEPTCONN should be 1, received %d\n", acceptc);
3757
3758 SetLastError(0xdeadbeef);
3759 ok ((listen(fdB, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
3760 ret = WSAGetLastError();
3761 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3762
3763 ret = closesocket(fdB);
3764 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret);
3765
3766 fdB = socket(AF_INET, SOCK_STREAM, 0);
3767 ok ((fdB != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3768
3769 SetLastError(0xdeadbeef);
3770 ok (bind(fdB, (struct sockaddr*) &address, sizeof(address)), "bind should have failed\n");
3771 ret = WSAGetLastError();
3772 ok (ret == WSAEADDRINUSE, "expected 10048, received %d\n", ret);
3773
3774 ret = closesocket(fdA);
3775 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret);
3776 ret = closesocket(fdB);
#define SO_ACCEPTCONN
Definition: winsock.h:179

◆ test_select()

static void test_select ( void  )
static

Definition at line 3780 of file sock.c.

3780 { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }
3781#define FD_SET_ALL(s) { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }
3782static void test_select(void)
3783{
3784 static char tmp_buf[1024];
3785
3786 SOCKET fdListen, fdRead, fdWrite;
3787 fd_set readfds, writefds, exceptfds;
3788 unsigned int maxfd;
3789 int ret, len;
3790 char buffer;
3791 struct timeval select_timeout;
3792 struct sockaddr_in address;
3793 select_thread_params thread_params;
3794 HANDLE thread_handle;
3795 DWORD ticks, id;
3796
3797 fdRead = socket(AF_INET, SOCK_STREAM, 0);
3798 ok( (fdRead != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3799 fdWrite = socket(AF_INET, SOCK_STREAM, 0);
3800 ok( (fdWrite != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3801
3802 maxfd = fdRead;
3803 if (fdWrite > maxfd)
3804 maxfd = fdWrite;
3805
3806 FD_ZERO_ALL();
3807 FD_SET_ALL(fdRead);
3808 FD_SET_ALL(fdWrite);
3809 select_timeout.tv_sec=0;
3810 select_timeout.tv_usec=0;
3811
3812 ticks = GetTickCount();
3813 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3814 ticks = GetTickCount() - ticks;
3815 ok(ret == 0, "select should not return any socket handles\n");
3816 ok(ticks < 10, "select was blocking for %u ms, expected < 10 ms\n", ticks);
3817 ok(!FD_ISSET(fdRead, &readfds), "FD should not be set\n");
3818 ok(!FD_ISSET(fdWrite, &writefds), "FD should not be set\n");
3819 ok(!FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
3820 ok(!FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n");
3821
3822 FD_ZERO_ALL();
3823 FD_SET_ALL(fdRead);
3824 FD_SET_ALL(fdWrite);
3825 select_timeout.tv_sec=0;
3826 select_timeout.tv_usec=500;
3827
3828 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3829 ok(ret == 0, "select should not return any socket handles\n");
3830 ok(!FD_ISSET(fdRead, &readfds), "FD should not be set\n");
3831 ok(!FD_ISSET(fdWrite, &writefds), "FD should not be set\n");
3832 ok(!FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
3833 ok(!FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n");
3834
3835 ok ((listen(fdWrite, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
3836 ret = closesocket(fdWrite);
3837 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
3838
3839 thread_params.s = fdRead;
3840 thread_params.ReadKilled = FALSE;
3842 thread_handle = CreateThread (NULL, 0, SelectReadThread, &thread_params, 0, &id );
3843 ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError());
3844
3846 Sleep(200);
3847 ret = closesocket(fdRead);
3848 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
3849
3850 WaitForSingleObject (thread_handle, 1000);
3851 ok ( thread_params.ReadKilled, "closesocket did not wake up select\n");
3852 ret = recv(fdRead, &buffer, 1, MSG_PEEK);
3853 ok( (ret == -1), "peek at closed socket expected -1 got %d\n", ret);
3854
3855 /* Test selecting invalid handles */
3856 FD_ZERO_ALL();
3857
3858 SetLastError(0);
3859 ret = select(maxfd+1, 0, 0, 0, &select_timeout);
3860 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3861 ok ( WSAGetLastError() == WSAEINVAL, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3862
3863 SetLastError(0);
3864 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3865 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3866 ok ( WSAGetLastError() == WSAEINVAL, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3867
3868 FD_SET(INVALID_SOCKET, &readfds);
3869 SetLastError(0);
3870 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3871 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3872 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3873 ok ( !FD_ISSET(fdRead, &readfds), "FD should not be set\n");
3874
3875 FD_ZERO(&readfds);
3876 FD_SET(INVALID_SOCKET, &writefds);
3877 SetLastError(0);
3878 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3879 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3880 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3881 ok ( !FD_ISSET(fdRead, &writefds), "FD should not be set\n");
3882
3883 FD_ZERO(&writefds);
3884 FD_SET(INVALID_SOCKET, &exceptfds);
3885 SetLastError(0);
3886 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3887 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3888 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3889 ok ( !FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
3890
3891 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
3892 maxfd = fdRead;
3893 if(fdWrite > maxfd) maxfd = fdWrite;
3894
3895 FD_ZERO(&readfds);
3896 FD_SET(fdRead, &readfds);
3897 ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout);
3898 ok(!ret, "select returned %d\n", ret);
3899
3900 FD_ZERO(&writefds);
3901 FD_SET(fdWrite, &writefds);
3902 ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout);
3903 ok(ret == 1, "select returned %d\n", ret);
3904 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n");
3905
3906 /* tests for overlapping fd_set pointers */
3907 FD_ZERO(&readfds);
3908 FD_SET(fdWrite, &readfds);
3909 ret = select(fdWrite+1, &readfds, &readfds, NULL, &select_timeout);
3910 ok(ret == 1, "select returned %d\n", ret);
3911 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
3912
3913 FD_ZERO(&readfds);
3914 FD_SET(fdWrite, &readfds);
3915 FD_SET(fdRead, &readfds);
3916 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3917 ok(ret == 2, "select returned %d\n", ret);
3918 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
3919 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3920
3921 ok(send(fdWrite, "test", 4, 0) == 4, "failed to send data\n");
3922 FD_ZERO(&readfds);
3923 FD_SET(fdRead, &readfds);
3924 ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout);
3925 ok(ret == 1, "select returned %d\n", ret);
3926 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3927
3928 FD_ZERO(&readfds);
3929 FD_SET(fdWrite, &readfds);
3930 FD_SET(fdRead, &readfds);
3931 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3932 ok(ret == 2, "select returned %d\n", ret);
3933 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
3934 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3935
3936#if ROSTESTS_233_IS_FIXED
3937 while(1) {
3938 FD_ZERO(&writefds);
3939 FD_SET(fdWrite, &writefds);
3940 ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout);
3941 if(!ret) break;
3942 ok(send(fdWrite, tmp_buf, sizeof(tmp_buf), 0) > 0, "failed to send data\n");
3943 }
3944#endif /* ROSTESTS_233_IS_FIXED */
3945
3946 FD_ZERO(&readfds);
3947 FD_SET(fdWrite, &readfds);
3948 FD_SET(fdRead, &readfds);
3949 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3950 ok(ret == 1, "select returned %d\n", ret);
3951 ok(!FD_ISSET(fdWrite, &readfds), "fdWrite socket is in the set\n");
3952 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3953
3954 ok(send(fdRead, "test", 4, 0) == 4, "failed to send data\n");
3955 Sleep(100);
3956 FD_ZERO(&readfds);
3957 FD_SET(fdWrite, &readfds);
3958 FD_SET(fdRead, &readfds);
3959 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3960 ok(ret == 2, "select returned %d\n", ret);
3961 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
3962 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3963
3964 closesocket(fdRead);
3965 closesocket(fdWrite);
3966
3967 /* select() works in 3 distinct states:
3968 * - to check if a connection attempt ended with success or error;
3969 * - to check if a pending connection is waiting for acceptance;
3970 * - to check for data to read, availability for write and OOB data
3971 *
3972 * The tests below ensure that all conditions are tested.
3973 */
3974 memset(&address, 0, sizeof(address));
3975 address.sin_addr.s_addr = inet_addr("127.0.0.1");
3976 address.sin_family = AF_INET;
3977 len = sizeof(address);
3978 fdListen = setup_server_socket(&address, &len);
3979 select_timeout.tv_sec = 1;
3980 select_timeout.tv_usec = 250000;
3981
3982 /* When no events are pending select returns 0 with no error */
3983 FD_ZERO_ALL();
3984 FD_SET_ALL(fdListen);
3985 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
3986 ok(ret == 0, "expected 0, got %d\n", ret);
3987
3988 /* When a socket is attempting to connect the listening socket receives the read descriptor */
3989 fdWrite = setup_connector_socket(&address, len, TRUE);
3990 FD_ZERO_ALL();
3991 FD_SET_ALL(fdListen);
3992 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
3993 ok(ret == 1, "expected 1, got %d\n", ret);
3994 ok(FD_ISSET(fdListen, &readfds), "fdListen socket is not in the set\n");
3995 len = sizeof(address);
3996 fdRead = accept(fdListen, (struct sockaddr*) &address, &len);
3997 ok(fdRead != INVALID_SOCKET, "expected a valid socket\n");
3998
3999 /* The connector is signaled through the write descriptor */
4000 FD_ZERO_ALL();
4001 FD_SET_ALL(fdListen);
4002 FD_SET_ALL(fdRead);
4003 FD_SET_ALL(fdWrite);
4004 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4005 ok(ret == 2, "expected 2, got %d\n", ret);
4006 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n");
4007 ok(FD_ISSET(fdRead, &writefds), "fdRead socket is not in the set\n");
4008 len = sizeof(id);
4009 id = 0xdeadbeef;
4010 ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
4011 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError());
4012 ok(id == 0, "expected 0, got %d\n", id);
4013
4014 /* When data is received the receiver gets the read descriptor */
4015 ret = send(fdWrite, "1234", 4, 0);
4016 ok(ret == 4, "expected 4, got %d\n", ret);
4017 FD_ZERO_ALL();
4018 FD_SET_ALL(fdListen);
4019 FD_SET(fdRead, &readfds);
4020 FD_SET(fdRead, &exceptfds);
4021 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4022 ok(ret == 1, "expected 1, got %d\n", ret);
4023 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
4024 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
4025 ok(ret == 4, "expected 4, got %d\n", ret);
4026 ok(!strcmp(tmp_buf, "1234"), "data received differs from sent\n");
4027
4028 /* When OOB data is received the socket is set in the except descriptor */
4029 ret = send(fdWrite, "A", 1, MSG_OOB);
4030 ok(ret == 1, "expected 1, got %d\n", ret);
4031 FD_ZERO_ALL();
4032 FD_SET_ALL(fdListen);
4033 FD_SET(fdRead, &readfds);
4034 FD_SET(fdRead, &exceptfds);
4035 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4036 ok(ret == 1, "expected 1, got %d\n", ret);
4037 ok(FD_ISSET(fdRead, &exceptfds), "fdRead socket is not in the set\n");
4038 tmp_buf[0] = 0xAF;
4039 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
4040 ok(ret == 1, "expected 1, got %d\n", ret);
4041 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
4042
4043 /* If the socket is OOBINLINED it will not receive the OOB in except fds */
4044 ret = 1;
4045 ret = setsockopt(fdRead, SOL_SOCKET, SO_OOBINLINE, (char*) &ret, sizeof(ret));
4046 ok(ret == 0, "expected 0, got %d\n", ret);
4047 ret = send(fdWrite, "A", 1, MSG_OOB);
4048 ok(ret == 1, "expected 1, got %d\n", ret);
4049 FD_ZERO_ALL();
4050 FD_SET_ALL(fdListen);
4051 FD_SET(fdRead, &readfds);
4052 FD_SET(fdRead, &exceptfds);
4053 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4054 ok(ret == 1, "expected 1, got %d\n", ret);
4055 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
4056 tmp_buf[0] = 0xAF;
4057 SetLastError(0xdeadbeef);
4058 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
4059 ok(ret == SOCKET_ERROR, "expected SOCKET_ERROR, got %d\n", ret);
4060 ok(GetLastError() == WSAEINVAL, "expected 10022, got %d\n", GetLastError());
4061 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
4062 ok(ret == 1, "expected 1, got %d\n", ret);
4063 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
4064
4065 /* When the connection is closed the socket is set in the read descriptor */
4066 ret = closesocket(fdRead);
4067 ok(ret == 0, "expected 0, got %d\n", ret);
4068 FD_ZERO_ALL();
4069 FD_SET_ALL(fdListen);
4070 FD_SET(fdWrite, &readfds);
4071 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4072 ok(ret == 1, "expected 1, got %d\n", ret);
4073 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
4074 ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0);
4075 ok(ret == 0, "expected 0, got %d\n", ret);
4076
4077 /* When a connection is attempted to a non-listening socket it will get to the except descriptor */
4078 ret = closesocket(fdWrite);
4079 ok(ret == 0, "expected 0, got %d\n", ret);
4080 ret = closesocket(fdListen);
4081 ok(ret == 0, "expected 0, got %d\n", ret);
4082 len = sizeof(address);
4083 fdWrite = setup_connector_socket(&address, len, TRUE);
4084 FD_ZERO_ALL();
4085 FD_SET(fdWrite, &writefds);
4086 FD_SET(fdWrite, &exceptfds);
4087 select_timeout.tv_sec = 2; /* requires more time to realize it will not connect */
4088 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4089 ok(ret == 1, "expected 1, got %d\n", ret);
4090 len = sizeof(id);
4091 id = 0xdeadbeef;
4092 ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
4093 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError());
4094 ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id);
4095 ok(FD_ISSET(fdWrite, &exceptfds), "fdWrite socket is not in the set\n");
4096 ok(select_timeout.tv_usec == 250000, "select timeout should not have changed\n");
4097 closesocket(fdWrite);
4098
4099 /* Try select() on a closed socket after connection */
4100 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
4101 closesocket(fdRead);
4102 FD_ZERO_ALL();
4103 FD_SET_ALL(fdWrite);
4104 FD_SET_ALL(fdRead);
4105 SetLastError(0xdeadbeef);
4106 ret = select(0, &readfds, NULL, &exceptfds, &select_timeout);
4107 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
4109 ok(GetLastError() == WSAENOTSOCK, "expected 10038, got %d\n", GetLastError());
4110 /* descriptor sets are unchanged */
4111 ok(readfds.fd_count == 2, "expected 2, got %d\n", readfds.fd_count);
4112 ok(exceptfds.fd_count == 2, "expected 2, got %d\n", exceptfds.fd_count);
4113 closesocket(fdWrite);
4114
4115#if ROSTESTS_233_IS_FIXED
4116
4117 /* Close the socket currently being selected in a thread - bug 38399 */
4118 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
4119 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
4120 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
4121 FD_ZERO_ALL();
4122 FD_SET_ALL(fdWrite);
4123 ret = select(0, &readfds, NULL, &exceptfds, &select_timeout);
4124 ok(ret == 1, "expected 1, got %d\n", ret);
4125 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
4126 WaitForSingleObject (thread_handle, 1000);
4127 closesocket(fdRead);
4128 /* test again with only the except descriptor */
4129 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
4130 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
4131 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
4132 FD_ZERO_ALL();
4133 FD_SET(fdWrite, &exceptfds);
4134 SetLastError(0xdeadbeef);
4135 ret = select(0, NULL, NULL, &exceptfds, &select_timeout);
4137 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
4139 ok(GetLastError() == WSAENOTSOCK, "expected 10038, got %d\n", GetLastError());
4140 WaitForSingleObject (thread_handle, 1000);
4141 closesocket(fdRead);
4142
4143#endif /* ROSTESTS_233_IS_FIXED */
4144
4145 /* test UDP behavior of unbound sockets */
4146 select_timeout.tv_sec = 0;
4147 select_timeout.tv_usec = 250000;
4148 fdWrite = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
4149 ok(fdWrite != INVALID_SOCKET, "socket call failed\n");
4150 FD_ZERO_ALL();
4151 FD_SET_ALL(fdWrite);
4152 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4153 ok(ret == 1, "expected 1, got %d\n", ret);
4154 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n");
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
#define IPPROTO_UDP
Definition: ip.h:197
#define FD_SET_ALL(s)
Definition: sock.c:3779
static DWORD WINAPI SelectCloseThread(void *param)
Definition: sock.c:3648
#define FD_ZERO_ALL()
Definition: sock.c:3778
static DWORD WINAPI SelectReadThread(void *param)
Definition: sock.c:3621
#define SO_ERROR
Definition: winsock.h:194

◆ test_send()

static void test_send ( void  )
static

Definition at line 5354 of file sock.c.

5357{
5361 const int buflen = 1024*1024;
5362 char *buffer = NULL;
5363 int ret, i, zero = 0;
5364 WSABUF buf;
5365 OVERLAPPED ov;
5366 BOOL bret;
5367 DWORD id, bytes_sent, dwRet;
5368 DWORD expected_time, connect_time;
5369 socklen_t optlen;
5370
5371 memset(&ov, 0, sizeof(ov));
5372
5373 if (tcp_socketpair(&src, &dst) != 0)
5374 {
5375 ok(0, "creating socket pair failed, skipping test\n");
5376 return;
5377 }
5378 expected_time = GetTickCount();
5379
5381 /* force disable buffering so we can get a pending overlapped request */
5382 ret = setsockopt(dst, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof(zero));
5383 ok(!ret, "setsockopt SO_SNDBUF failed: %d - %d\n", ret, GetLastError());
5384
5386 if (hThread == NULL)
5387 {
5388 ok(0, "CreateThread failed, error %d\n", GetLastError());
5389 goto end;
5390 }
5391
5392 buffer = HeapAlloc(GetProcessHeap(), 0, buflen);
5393 if (buffer == NULL)
5394 {
5395 ok(0, "HeapAlloc failed, error %d\n", GetLastError());
5396 goto end;
5397 }
5398
5399 /* fill the buffer with some nonsense */
5400 for (i = 0; i < buflen; ++i)
5401 {
5402 buffer[i] = (char) i;
5403 }
5404
5405 ret = send(src, buffer, buflen, 0);
5406 if (ret >= 0)
5407 ok(ret == buflen, "send should have sent %d bytes, but it only sent %d\n", buflen, ret);
5408 else
5409 ok(0, "send failed, error %d\n", WSAGetLastError());
5410
5411 buf.buf = buffer;
5412 buf.len = buflen;
5413
5415 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError());
5416 if (!ov.hEvent)
5417 goto end;
5418
5419 bytes_sent = 0;
5420 WSASetLastError(12345);
5421 ret = WSASend(dst, &buf, 1, &bytes_sent, 0, &ov, NULL);
5422 ok((ret == SOCKET_ERROR && WSAGetLastError() == ERROR_IO_PENDING) || broken(bytes_sent == buflen),
5423 "Failed to start overlapped send %d - %d - %d/%d\n", ret, WSAGetLastError(), bytes_sent, buflen);
5424
5425 /* don't check for completion yet, we may need to drain the buffer while still sending */
5427 for (i = 0; i < buflen; ++i)
5428 {
5429 int j = 0;
5430
5431 ret = recv(src, buffer, 1, 0);
5432 while (ret == SOCKET_ERROR && GetLastError() == WSAEWOULDBLOCK && j < 100)
5433 {
5434 j++;
5435 Sleep(50);
5436 ret = recv(src, buffer, 1, 0);
5437 }
5438
5439 ok(ret == 1, "Failed to receive data %d - %d (got %d/%d)\n", ret, GetLastError(), i, buflen);
5440 if (ret != 1)
5441 break;
5442
5443 ok(buffer[0] == (char) i, "Received bad data at position %d\n", i);
5444 }
5445
5446 dwRet = WaitForSingleObject(ov.hEvent, 1000);
5447 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
5448 if (dwRet == WAIT_OBJECT_0)
5449 {
5450 bret = GetOverlappedResult((HANDLE)dst, &ov, &bytes_sent, FALSE);
5451 ok(bret && bytes_sent == buflen,
5452 "Got %d instead of %d (%d - %d)\n", bytes_sent, buflen, bret, GetLastError());
5453 }
5454
5455 WSASetLastError(12345);
5456 ret = WSASend(INVALID_SOCKET, &buf, 1, NULL, 0, &ov, NULL);
5458 "WSASend failed %d - %d\n", ret, WSAGetLastError());
5459
5460 WSASetLastError(12345);
5461 ret = WSASend(dst, &buf, 1, NULL, 0, &ov, NULL);
5463 "Failed to start overlapped send %d - %d\n", ret, WSAGetLastError());
5464
5465 expected_time = (GetTickCount() - expected_time) / 1000;
5466
5467 connect_time = 0xdeadbeef;
5468 optlen = sizeof(connect_time);
5469 ret = getsockopt(dst, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
5470 ok(!ret, "getsockopt failed %d\n", WSAGetLastError());
5471 ok(connect_time >= expected_time && connect_time <= expected_time + 1,
5472 "unexpected connect time %u, expected %u\n", connect_time, expected_time);
5473
5474 connect_time = 0xdeadbeef;
5475 optlen = sizeof(connect_time);
5476 ret = getsockopt(src, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
5477 ok(!ret, "getsockopt failed %d\n", WSAGetLastError());
5478 ok(connect_time >= expected_time && connect_time <= expected_time + 1,
5479 "unexpected connect time %u, expected %u\n", connect_time, expected_time);
5480
5481end:
5482 if (src != INVALID_SOCKET)
5484 if (dst != INVALID_SOCKET)
5486 if (hThread != NULL)
5487 {
5488 dwRet = WaitForSingleObject(hThread, 500);
5489 ok(dwRet == WAIT_OBJECT_0, "failed to wait for thread termination: %d\n", GetLastError());
5491 }
5492 if (ov.hEvent)
5493 CloseHandle(ov.hEvent);
#define SO_SNDBUF
Definition: winsock.h:188

◆ test_set_getsockopt()

static void test_set_getsockopt ( void  )
static

Definition at line 1408 of file sock.c.

1411{
1412 SOCKET s, s2;
1413 int i, err, lasterr;
1414 int timeout;
1415 LINGER lingval;
1416 int size;
1419 char providername[WSAPROTOCOL_LEN + 1];
1420 DWORD value;
1421 struct _prottest
1422 {
1423 int family, type, proto;
1424 } prottest[] = {
1429 };
1430 union _csspace
1431 {
1433 char space[128];
1434 } csinfoA, csinfoB;
1435
1436 s = socket(AF_INET, SOCK_STREAM, 0);
1437 ok(s!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1438 if( s == INVALID_SOCKET) return;
1439 /* SO_RCVTIMEO */
1441 size = sizeof(timeout);
1442 err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, size);
1443 if( !err)
1444 err = getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, &size);
1445 ok( !err, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1446 ok( timeout == SOCKTIMEOUT1, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout);
1447
1448 timeout = 0;
1449 size = sizeof(timeout);
1451 if( !err)
1452 err = getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, &size);
1453 ok( !err, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1454 ok( timeout == 0, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout);
1455
1456 /* SO_SNDTIMEO */
1457 timeout = SOCKTIMEOUT2; /* 997 seconds. See remark above */
1458 size = sizeof(timeout);
1459 err = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, size);
1460 if( !err)
1461 err = getsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, &size);
1462 ok( !err, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError());
1463 ok( timeout == SOCKTIMEOUT2, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout);
1464
1465 /* SO_SNDBUF */
1466 value = 4096;
1467 size = sizeof(value);
1468 err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&value, size);
1469 ok( !err, "setsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1470 value = 0xdeadbeef;
1471 err = getsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&value, &size);
1472 ok( !err, "getsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1473 ok( value == 4096, "expected 4096, got %u\n", value );
1474
1475 /* SO_RCVBUF */
1476 value = 4096;
1477 size = sizeof(value);
1478 err = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&value, size);
1479 ok( !err, "setsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1480 value = 0xdeadbeef;
1481 err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&value, &size);
1482 ok( !err, "getsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1483 ok( value == 4096, "expected 4096, got %u\n", value );
1484
1485 /* SO_LINGER */
1486 for( i = 0; i < sizeof(linger_testvals)/sizeof(LINGER);i++) {
1487 size = sizeof(lingval);
1488 lingval = linger_testvals[i];
1489 err = setsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, size);
1490 if( !err)
1491 err = getsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, &size);
1492 ok( !err, "get/setsockopt(SO_LINGER) failed error: %d\n", WSAGetLastError());
1493 ok( !lingval.l_onoff == !linger_testvals[i].l_onoff &&
1494 (lingval.l_linger == linger_testvals[i].l_linger ||
1495 (!lingval.l_linger && !linger_testvals[i].l_onoff))
1496 , "getsockopt(SO_LINGER #%d) returned wrong value %d,%d not %d,%d\n", i,
1497 lingval.l_onoff, lingval.l_linger,
1499 }
1500
1501 size = sizeof(lingval);
1504 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1507 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1508
1509 size = sizeof(BOOL);
1512 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1515 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1516
1517 /* Test for erroneously passing a value instead of a pointer as optval */
1518 size = sizeof(char);
1519 err = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)1, size);
1520 ok(err == SOCKET_ERROR, "setsockopt with optval being a value passed "
1521 "instead of failing.\n");
1522 lasterr = WSAGetLastError();
1523 ok(lasterr == WSAEFAULT, "setsockopt with optval being a value "
1524 "returned 0x%08x, not WSAEFAULT(0x%08x)\n",
1525 lasterr, WSAEFAULT);
1526
1527 /* SO_RCVTIMEO with invalid values for level */
1528 size = sizeof(timeout);
1530 SetLastError(0xdeadbeef);
1531 err = setsockopt(s, 0xffffffff, SO_RCVTIMEO, (char *) &timeout, size);
1533 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1534 err, WSAGetLastError());
1535
1537 SetLastError(0xdeadbeef);
1538 err = setsockopt(s, 0x00008000, SO_RCVTIMEO, (char *) &timeout, size);
1540 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1541 err, WSAGetLastError());
1542
1543 /* Test SO_ERROR set/get */
1544 SetLastError(0xdeadbeef);
1545 i = 1234;
1546 err = setsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, size);
1548 ok( !err && !WSAGetLastError(),
1549 "got %d with %d (expected 0 with 0)\n",
1550 err, WSAGetLastError());
1551
1552 SetLastError(0xdeadbeef);
1553 i = 4321;
1554 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size);
1556 ok( !err && !WSAGetLastError(),
1557 "got %d with %d (expected 0 with 0)\n",
1558 err, WSAGetLastError());
1560 ok (i == 1234, "got %d (expected 1234)\n", i);
1561
1562 /* Test invalid optlen */
1563 SetLastError(0xdeadbeef);
1564 size = 1;
1565 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size);
1568 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n",
1569 err, WSAGetLastError());
1570
1571 closesocket(s);
1572 /* Test with the closed socket */
1573 SetLastError(0xdeadbeef);
1574 size = sizeof(i);
1575 i = 1234;
1576 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size);
1579 "got %d with %d (expected SOCKET_ERROR with WSAENOTSOCK)\n",
1580 err, WSAGetLastError());
1581 ok (i == 1234, "expected 1234, got %d\n", i);
1582
1583 /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */
1584 s = socket(AF_INET, SOCK_DGRAM, 0);
1585 ok(s != INVALID_SOCKET, "Failed to create socket\n");
1586 size = sizeof(i);
1587 i = 0x0000000a;
1588 err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &i, size);
1589 if (!err)
1590 {
1591 for (i = 0; i < 4; i++)
1592 {
1593 int k, j;
1594 const int tests[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d};
1595 err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &tests[i], i + 1);
1596 ok(!err, "Test [%d] Expected 0, got %d\n", i, err);
1597 err = getsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &k, &size);
1598 ok(!err, "Test [%d] Expected 0, got %d\n", i, err);
1599 j = i != 3 ? tests[i] & ((1 << (i + 1) * 8) - 1) : tests[i];
1600 ok(k == j, "Test [%d] Expected 0x%x, got 0x%x\n", i, j, k);
1601 }
1602 }
1603 else
1604 win_skip("IP_MULTICAST_TTL is unsupported\n");
1605 closesocket(s);
1606
1607 /* test SO_PROTOCOL_INFOA invalid parameters */
1609 "getsockopt should have failed\n");
1610 err = WSAGetLastError();
1611 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err);
1612 size = sizeof(WSAPROTOCOL_INFOA);
1614 "getsockopt should have failed\n");
1615 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size);
1616 err = WSAGetLastError();
1617 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err);
1620 "getsockopt should have failed\n");
1621 err = WSAGetLastError();
1622 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1624 "getsockopt should have failed\n");
1625 err = WSAGetLastError();
1626 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1628 "getsockopt should have failed\n");
1629 err = WSAGetLastError();
1630 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1631 size = sizeof(WSAPROTOCOL_INFOA) / 2;
1633 "getsockopt should have failed\n");
1634 err = WSAGetLastError();
1635 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1636 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size);
1637 size = sizeof(WSAPROTOCOL_INFOA) * 2;
1639 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
1640 ok(size == sizeof(WSAPROTOCOL_INFOA) * 2, "got size %d\n", size);
1641
1642 closesocket(s);
1643
1644 /* test SO_PROTOCOL_INFO structure returned for different protocols */
1645 for (i = 0; i < sizeof(prottest) / sizeof(prottest[0]); i++)
1646 {
1647 int k;
1648
1649 s = socket(prottest[i].family, prottest[i].type, prottest[i].proto);
1650 if (s == INVALID_SOCKET && prottest[i].family == AF_INET6) continue;
1651
1652 ok(s != INVALID_SOCKET, "Failed to create socket: %d\n",
1653 WSAGetLastError());
1654
1655 /* compare both A and W version */
1656 infoA.szProtocol[0] = 0;
1657 size = sizeof(WSAPROTOCOL_INFOA);
1659 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
1660 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size);
1661
1662 infoW.szProtocol[0] = 0;
1663 size = sizeof(WSAPROTOCOL_INFOW);
1665 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
1666 ok(size == sizeof(WSAPROTOCOL_INFOW), "got size %d\n", size);
1667
1668 trace("provider name '%s', family %d, type %d, proto %d\n",
1669 infoA.szProtocol, prottest[i].family, prottest[i].type, prottest[i].proto);
1670
1671 ok(infoA.szProtocol[0], "WSAPROTOCOL_INFOA was not filled\n");
1672 ok(infoW.szProtocol[0], "WSAPROTOCOL_INFOW was not filled\n");
1673
1674 WideCharToMultiByte(CP_ACP, 0, infoW.szProtocol, -1,
1675 providername, sizeof(providername), NULL, NULL);
1676 ok(!strcmp(infoA.szProtocol,providername),
1677 "different provider names '%s' != '%s'\n", infoA.szProtocol, providername);
1678
1680 "SO_PROTOCOL_INFO[A/W] comparison failed\n");
1681
1682 /* Remove IF when WSAEnumProtocols support IPV6 data */
1683 todo_wine_if (prottest[i].family == AF_INET6)
1684 ok(infoA.iAddressFamily == prottest[i].family, "socket family invalid, expected %d received %d\n",
1685 prottest[i].family, infoA.iAddressFamily);
1686 ok(infoA.iSocketType == prottest[i].type, "socket type invalid, expected %d received %d\n",
1687 prottest[i].type, infoA.iSocketType);
1688 ok(infoA.iProtocol == prottest[i].proto, "socket protocol invalid, expected %d received %d\n",
1689 prottest[i].proto, infoA.iProtocol);
1690
1691 /* IP_HDRINCL is supported only on SOCK_RAW but passed to SOCK_DGRAM by Impossible Creatures */
1692 size = sizeof(i);
1693 k = 1;
1694 SetLastError(0xdeadbeef);
1695 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size);
1696 if (err == -1) /* >= Vista */
1697 {
1698 todo_wine {
1699 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1700 k = 99;
1701 SetLastError(0xdeadbeef);
1702 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1703 ok(err == -1, "Expected -1, got %d\n", err);
1704 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1705 ok(k == 99, "Expected 99, got %d\n", k);
1706
1707 size = sizeof(k);
1708 k = 0;
1709 SetLastError(0xdeadbeef);
1710 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size);
1711 }
1712 ok(err == -1, "Expected -1, got %d\n", err);
1713 todo_wine {
1714 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1715 k = 99;
1716 SetLastError(0xdeadbeef);
1717 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1718 ok(err == -1, "Expected -1, got %d\n", err);
1719 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1720 ok(k == 99, "Expected 99, got %d\n", k);
1721 }
1722 }
1723 else /* <= 2003 the tests differ between TCP and UDP, UDP silently accepts */
1724 {
1725 SetLastError(0xdeadbeef);
1726 k = 99;
1727 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1728 if (prottest[i].type == SOCK_DGRAM)
1729 {
1730 ok(err == 0, "Expected 0, got %d\n", err);
1731 ok(k == 1, "Expected 1, got %d\n", k);
1732 }
1733 else
1734 {
1735 /* contratry to what we could expect the function returns error but k is changed */
1736 ok(err == -1, "Expected -1, got %d\n", err);
1737 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError());
1738 ok(k == 0, "Expected 0, got %d\n", k);
1739 }
1740
1741 k = 0;
1742 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size);
1743 ok(err == 0, "Expected 0, got %d\n", err);
1744
1745 k = 99;
1746 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1747 if (prottest[i].type == SOCK_DGRAM)
1748 {
1749 ok(err == 0, "Expected 0, got %d\n", err);
1750 ok(k == 0, "Expected 0, got %d\n", k);
1751 }
1752 else
1753 {
1754 /* contratry to what we could expect the function returns error but k is changed */
1755 ok(err == -1, "Expected -1, got %d\n", err);
1756 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError());
1757 ok(k == 0, "Expected 0, got %d\n", k);
1758 }
1759 }
1760
1761 closesocket(s);
1762 }
1763
1764 /* Test SO_BSP_STATE - Present only in >= Win 2008 */
1766 ok(s != INVALID_SOCKET, "Failed to create socket\n");
1768 ok(s2 != INVALID_SOCKET, "Failed to create socket\n");
1769
1770 SetLastError(0xdeadbeef);
1771 size = sizeof(csinfoA);
1772 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1773 if (!err)
1774 {
1775 struct sockaddr_in saddr;
1776 memset(&saddr, 0, sizeof(saddr));
1777 saddr.sin_family = AF_INET;
1778 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
1779
1780 /* Socket is not bound, no information provided */
1781 ok(!csinfoA.cs.LocalAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength);
1782 ok(csinfoA.cs.LocalAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr);
1783 /* Socket is not connected, no information provided */
1784 ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.RemoteAddr.iSockaddrLength);
1785 ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.RemoteAddr.lpSockaddr);
1786
1787 err = bind(s, (struct sockaddr*)&saddr, sizeof(saddr));
1788 ok(!err, "Expected 0, got %d\n", err);
1789 size = sizeof(csinfoA);
1790 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1791 ok(!err, "Expected 0, got %d\n", err);
1792
1793 /* Socket is bound */
1794 ok(csinfoA.cs.LocalAddr.iSockaddrLength, "Expected non-zero\n");
1795 ok(csinfoA.cs.LocalAddr.lpSockaddr != NULL, "Expected non-null\n");
1796 /* Socket is not connected, no information provided */
1797 ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.RemoteAddr.iSockaddrLength);
1798 ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.RemoteAddr.lpSockaddr);
1799
1800 err = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1801 ok(!err, "Expected 0, got %d\n", err);
1802 err = getsockname(s2, (struct sockaddr *)&saddr, &size);
1803 ok(!err, "Expected 0, got %d\n", err);
1804 err = listen(s2, 1);
1805 ok(!err, "Expected 0, got %d\n", err);
1806 err = connect(s, (struct sockaddr*)&saddr, sizeof(saddr));
1807 ok(!err, "Expected 0, got %d\n", err);
1808 size = sizeof(saddr);
1809 err = accept(s2, (struct sockaddr*)&saddr, &size);
1810 ok(err != INVALID_SOCKET, "Failed to accept socket\n");
1811 closesocket(s2);
1812 s2 = err;
1813
1814 size = sizeof(csinfoA);
1815 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1816 ok(!err, "Expected 0, got %d\n", err);
1817 err = getsockopt(s2, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoB, &size);
1818 ok(!err, "Expected 0, got %d\n", err);
1819 ok(size == sizeof(csinfoA), "Got %d\n", size);
1820 size = sizeof(saddr);
1821 ok(size == csinfoA.cs.LocalAddr.iSockaddrLength, "Expected %d, got %d\n", size,
1822 csinfoA.cs.LocalAddr.iSockaddrLength);
1823 ok(size == csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected %d, got %d\n", size,
1824 csinfoA.cs.RemoteAddr.iSockaddrLength);
1825 ok(!memcmp(csinfoA.cs.LocalAddr.lpSockaddr, csinfoB.cs.RemoteAddr.lpSockaddr, size),
1826 "Expected matching addresses\n");
1827 ok(!memcmp(csinfoB.cs.LocalAddr.lpSockaddr, csinfoA.cs.RemoteAddr.lpSockaddr, size),
1828 "Expected matching addresses\n");
1829 ok(csinfoA.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n");
1830 ok(csinfoB.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n");
1831 ok(csinfoA.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n");
1832 ok(csinfoB.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n");
1833
1834 err = getpeername(s, (struct sockaddr *)&saddr, &size);
1835 ok(!err, "Expected 0, got %d\n", err);
1836 ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1837 ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1838 err = getpeername(s2, (struct sockaddr *)&saddr, &size);
1839 ok(!err, "Expected 0, got %d\n", err);
1840 ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1841 ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1842 err = getsockname(s, (struct sockaddr *)&saddr, &size);
1843 ok(!err, "Expected 0, got %d\n", err);
1844 ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1845 ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1846 err = getsockname(s2, (struct sockaddr *)&saddr, &size);
1847 ok(!err, "Expected 0, got %d\n", err);
1848 ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1849 ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1850
1851 SetLastError(0xdeadbeef);
1852 size = sizeof(CSADDR_INFO);
1853 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1854 ok(err, "Expected non-zero\n");
1855 ok(size == sizeof(CSADDR_INFO), "Got %d\n", size);
1856 ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError());
1857
1858 /* At least for IPv4 the size is exactly 56 bytes */
1859 size = sizeof(*csinfoA.cs.LocalAddr.lpSockaddr) * 2 + sizeof(csinfoA.cs);
1860 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1861 ok(!err, "Expected 0, got %d\n", err);
1862 size--;
1863 SetLastError(0xdeadbeef);
1864 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1865 ok(err, "Expected non-zero\n");
1866 ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError());
1867 }
1868 else
1869 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError());
1870
1871 closesocket(s);
1872 closesocket(s2);
1873
1874 for (i = 0; i < 2; i++)
1875 {
1876 int family, level;
1877
1878 if (i)
1879 {
1880 family = AF_INET6;
1881 level = IPPROTO_IPV6;
1882 }
1883 else
1884 {
1885 family = AF_INET;
1886 level = IPPROTO_IP;
1887 }
1888
1889 s = socket(family, SOCK_DGRAM, 0);
1890 if (s == INVALID_SOCKET && i)
1891 {
1892 skip("IPv6 is not supported\n");
1893 break;
1894 }
1895 ok(s != INVALID_SOCKET, "socket failed with error %d\n", GetLastError());
1896
1897 size = sizeof(value);
1898 value = 0xdead;
1899 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
1900 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1901 ok(value == 0, "Expected 0, got %d\n", value);
1902
1903 size = sizeof(value);
1904 value = 1;
1905 err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size);
1906 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1907
1908 value = 0xdead;
1909 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
1910 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1911 ok(value == 1, "Expected 1, got %d\n", value);
1912
1913 size = sizeof(value);
1914 value = 0xdead;
1915 err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size);
1916 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1917
1918 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
1919 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1920 ok(value == 1, "Expected 1, got %d\n", value);
1921
1922 closesocket(s);
#define WideCharToMultiByte
Definition: compat.h:111
#define IP_HDRINCL
Definition: ip.h:64
GLint level
Definition: gl.h:1546
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define cs
Definition: i386-dis.c:442
static const SecPkgInfoW infoW
Definition: kerberos.c:293
static const SecPkgInfoA infoA
Definition: kerberos.c:302
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval * timeout
Definition: sock.c:81
static const LINGER linger_testvals[]
Definition: sock.c:1397
#define SOCKTIMEOUT1
Definition: sock.c:1405
#define SOCKTIMEOUT2
Definition: sock.c:1406
u_short l_linger
Definition: winsock.h:143
Definition: pdh_main.c:94
#define WSAPROTOCOL_LEN
Definition: winsock2.h:428
struct _WSAPROTOCOL_INFOW WSAPROTOCOL_INFOW
struct _WSAPROTOCOL_INFOA WSAPROTOCOL_INFOA
#define SO_PROTOCOL_INFOW
Definition: winsock2.h:249
#define SO_PROTOCOL_INFOA
Definition: winsock2.h:248
#define SO_RCVBUF
Definition: winsock.h:189
#define IP_DONTFRAGMENT
Definition: winsock.h:326
#define SO_DONTROUTE
Definition: winsock.h:182
#define SO_SNDTIMEO
Definition: winsock.h:192
#define IP_MULTICAST_TTL
Definition: winsock.h:320
#define SO_RCVTIMEO
Definition: winsock.h:193
struct _CSADDR_INFO CSADDR_INFO
#define SO_BSP_STATE
Definition: ws2def.h:115

◆ test_sioAddressListChange()

static void test_sioAddressListChange ( void  )
static

Definition at line 9234 of file sock.c.

9237{
9238 struct sockaddr_in bindAddress;
9239 struct in_addr net_address;
9241 struct hostent *h;
9242 DWORD num_bytes, error, tick;
9243 SOCKET sock, sock2, sock3;
9244 WSAEVENT event2, event3;
9245 HANDLE io_port;
9246 ULONG_PTR key;
9247 int acount;
9248 BOOL bret;
9249 int ret;
9250
9251 /* Use gethostbyname to find the list of local network interfaces */
9252 h = gethostbyname("");
9253 if (!h)
9254 {
9255 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, gethostbyname failed with %u\n",
9256 WSAGetLastError());
9257 return;
9258 }
9259 for (acount = 0; h->h_addr_list[acount]; acount++);
9260 if (acount == 0)
9261 {
9262 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n");
9263 return;
9264 }
9265
9266 net_address.s_addr = *(ULONG *) h->h_addr_list[0];
9267
9269 ok(sock != INVALID_SOCKET, "socket() failed\n");
9270
9271 memset(&bindAddress, 0, sizeof(bindAddress));
9272 bindAddress.sin_family = AF_INET;
9273 bindAddress.sin_addr.s_addr = net_address.s_addr;
9274 SetLastError(0xdeadbeef);
9275 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9276 ok (!ret, "bind() failed with error %d\n", GetLastError());
9278
9279 memset(&overlapped, 0, sizeof(overlapped));
9281 SetLastError(0xdeadbeef);
9282 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9283 error = GetLastError();
9284 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9285 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9286
9287 CloseHandle(overlapped.hEvent);
9289
9291 ok(sock != INVALID_SOCKET, "socket() failed\n");
9292
9293 SetLastError(0xdeadbeef);
9294 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9295 ok (!ret, "bind() failed with error %d\n", GetLastError());
9297
9298 memset(&overlapped, 0, sizeof(overlapped));
9300 SetLastError(0xdeadbeef);
9301 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9302 error = GetLastError();
9303 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9304 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9305
9306 CloseHandle(overlapped.hEvent);
9308
9310 ok(sock != INVALID_SOCKET, "socket() failed\n");
9311
9312 SetLastError(0xdeadbeef);
9313 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9314 ok (!ret, "bind() failed with error %d\n", GetLastError());
9316
9317 memset(&overlapped, 0, sizeof(overlapped));
9319 SetLastError(0xdeadbeef);
9320 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9321 error = GetLastError();
9322 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9323 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9324
9325 CloseHandle(overlapped.hEvent);
9327
9329 ok(sock != INVALID_SOCKET, "socket() failed\n");
9330
9331 SetLastError(0xdeadbeef);
9332 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9333 ok (!ret, "bind() failed with error %d\n", GetLastError());
9335
9336 memset(&overlapped, 0, sizeof(overlapped));
9338 SetLastError(0xdeadbeef);
9339 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9340 error = GetLastError();
9341 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9342 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9343
9344 CloseHandle(overlapped.hEvent);
9346
9347 /* When the socket is overlapped non-blocking and the list change is requested without
9348 * an overlapped structure the error will be different. */
9350 ok(sock != INVALID_SOCKET, "socket() failed\n");
9351
9352 SetLastError(0xdeadbeef);
9353 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9354 ok (!ret, "bind() failed with error %d\n", GetLastError());
9356
9357 SetLastError(0xdeadbeef);
9358 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9359 error = GetLastError();
9360 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9361 ok (error == WSAEWOULDBLOCK, "expected 10035, got %d\n", error);
9362
9363 io_port = CreateIoCompletionPort( (HANDLE)sock, NULL, 0, 0 );
9364 ok (io_port != NULL, "failed to create completion port %u\n", GetLastError());
9365
9367 memset(&overlapped, 0, sizeof(overlapped));
9368 SetLastError(0xdeadbeef);
9369 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9370 error = GetLastError();
9371 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %u\n", error);
9372 ok (error == ERROR_IO_PENDING, "expected ERROR_IO_PENDING got %u\n", error);
9373
9374 olp = (WSAOVERLAPPED *)0xdeadbeef;
9375 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 );
9376 ok(!bret, "failed to get completion status %u\n", bret);
9377 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9378 ok(!olp, "Overlapped structure is at %p\n", olp);
9379
9381
9382 olp = (WSAOVERLAPPED *)0xdeadbeef;
9383 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 );
9384 ok(!bret, "failed to get completion status %u\n", bret);
9385 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %u\n", GetLastError());
9386 ok(olp == &overlapped, "Overlapped structure is at %p\n", olp);
9387
9388 CloseHandle(io_port);
9389
9390 /* Misuse of the API by using a blocking socket and not using an overlapped structure,
9391 * this leads to a hang forever. */
9392 if (0)
9393 {
9395
9396 SetLastError(0xdeadbeef);
9397 bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9398
9400 WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9401 /* hang */
9402
9404 }
9405
9407 {
9408 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n");
9409 return;
9410 }
9411
9412 /* Bind an overlapped socket to the first found network interface */
9414 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9416 ok(sock2 != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9418 ok(sock3 != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9419
9420 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9421 ok(!ret, "bind failed unexpectedly\n");
9422 ret = bind(sock2, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9423 ok(!ret, "bind failed unexpectedly\n");
9424 ret = bind(sock3, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9425 ok(!ret, "bind failed unexpectedly\n");
9426
9427 set_blocking(sock2, FALSE);
9428 set_blocking(sock3, FALSE);
9429
9430 /* Wait for address changes, request that the user connects/disconnects an interface */
9431 memset(&overlapped, 0, sizeof(overlapped));
9433 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9434 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
9435 ok(WSAGetLastError() == WSA_IO_PENDING, "Expected pending last error, got %d\n", WSAGetLastError());
9436
9437 ret = WSAIoctl(sock2, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9438 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
9439 ok(WSAGetLastError() == WSAEWOULDBLOCK, "Expected would block last error, got %d\n", WSAGetLastError());
9440
9441 event2 = WSACreateEvent();
9442 event3 = WSACreateEvent();
9443 ret = WSAEventSelect (sock2, event2, FD_ADDRESS_LIST_CHANGE);
9444 ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError());
9445 /* sock3 did not request SIO_ADDRESS_LIST_CHANGE but it is trying to wait anyway */
9446 ret = WSAEventSelect (sock3, event3, FD_ADDRESS_LIST_CHANGE);
9447 ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError());
9448
9449 trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or"
9450 " change the ipv4 address of any of the local network interfaces (15 second timeout).\n");
9451 tick = GetTickCount();
9452 ret = WaitForSingleObject(overlapped.hEvent, 15000);
9453 ok(ret == WAIT_OBJECT_0, "failed to get overlapped event %u\n", ret);
9454
9455 ret = WaitForSingleObject(event2, 500);
9457 ok(ret == WAIT_OBJECT_0, "failed to get change event %u\n", ret);
9458
9459 ret = WaitForSingleObject(event3, 500);
9460 ok(ret == WAIT_TIMEOUT, "unexpected change event\n");
9461
9462 trace("Spent %d ms waiting.\n", GetTickCount() - tick);
9463
9464 WSACloseEvent(event2);
9465 WSACloseEvent(event3);
9466
9468 closesocket(sock2);
#define FD_ADDRESS_LIST_CHANGE
Definition: winsock2.h:312
DWORD WSAEVENT
Definition: winsock2.h:606
#define SIO_ADDRESS_LIST_CHANGE
Definition: ws2def.h:178

◆ test_sioRoutingInterfaceQuery()

static void test_sioRoutingInterfaceQuery ( void  )
static

Definition at line 9186 of file sock.c.

9189{
9190 int ret;
9191 SOCKET sock;
9192 SOCKADDR_IN sin = { 0 }, sout = { 0 };
9193 DWORD bytesReturned;
9194
9196 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9197 if (sock == INVALID_SOCKET)
9198 {
9199 skip("Socket creation failed with %d\n", WSAGetLastError());
9200 return;
9201 }
9203 NULL, NULL);
9205 "expected WSAEFAULT, got %d\n", WSAGetLastError());
9207 NULL, 0, NULL, NULL, NULL);
9209 "expected WSAEFAULT, got %d\n", WSAGetLastError());
9211 NULL, 0, &bytesReturned, NULL, NULL);
9213 "expected WSAEAFNOSUPPORT, got %d\n", WSAGetLastError());
9214 sin.sin_family = AF_INET;
9216 NULL, 0, &bytesReturned, NULL, NULL);
9218 "expected WSAEINVAL, got %d\n", WSAGetLastError());
9219 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
9221 NULL, 0, &bytesReturned, NULL, NULL);
9223 "expected WSAEFAULT, got %d\n", WSAGetLastError());
9225 &sout, sizeof(sout), &bytesReturned, NULL, NULL);
9226 ok(!ret, "WSAIoctl failed: %d\n", WSAGetLastError());
9227 ok(sout.sin_family == AF_INET, "expected AF_INET, got %d\n", sout.sin_family);
9228 /* We expect the source address to be INADDR_LOOPBACK as well, but
9229 * there's no guarantee that a route to the loopback address exists,
9230 * so rather than introduce spurious test failures we do not test the
9231 * source address.
9232 */
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
#define INADDR_LOOPBACK
Definition: inet.h:51
#define SIO_ROUTING_INTERFACE_QUERY
Definition: ws2def.h:175

◆ test_so_reuseaddr()

static void test_so_reuseaddr ( void  )
static

Definition at line 1924 of file sock.c.

1927{
1928 struct sockaddr_in saddr;
1929 SOCKET s1,s2;
1930 unsigned int rc,reuse;
1931 int size;
1932 DWORD err;
1933
1934 saddr.sin_family = AF_INET;
1935 saddr.sin_port = htons(SERVERPORT+1);
1936 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
1937
1939 ok(s1!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1940 rc = bind(s1, (struct sockaddr*)&saddr, sizeof(saddr));
1941 ok(rc!=SOCKET_ERROR, "bind(s1) failed error: %d\n", WSAGetLastError());
1942
1944 ok(s2!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1945
1946 reuse=0x1234;
1947 size=sizeof(reuse);
1948 rc=getsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, &size );
1949 ok(rc==0 && reuse==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc,reuse);
1950
1951 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1952 ok(rc==SOCKET_ERROR, "bind() succeeded\n");
1953
1954 reuse = 1;
1955 rc = setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
1956 ok(rc==0, "setsockopt() failed error: %d\n", WSAGetLastError());
1957
1958 /* On Win2k3 and above, all SO_REUSEADDR seems to do is to allow binding to
1959 * a port immediately after closing another socket on that port, so
1960 * basically following the BSD socket semantics here. */
1961 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1962 if(rc==0)
1963 {
1964 int s3=socket(AF_INET, SOCK_STREAM, 0), s4;
1965 trace("<= Win XP behavior of SO_REUSEADDR\n");
1966
1967 /* If we could bind again in the same port this is Windows version <= XP.
1968 * Lets test if we can really connect to one of them. */
1971 rc = listen(s1, 1);
1972 ok(!rc, "listen() failed with error: %d\n", WSAGetLastError());
1973 rc = listen(s2, 1);
1974 ok(!rc, "listen() failed with error: %d\n", WSAGetLastError());
1975 rc = connect(s3, (struct sockaddr*)&saddr, sizeof(saddr));
1976 ok(!rc, "connecting to accepting socket failed %d\n", WSAGetLastError());
1977
1978 /* the delivery of the connection is random so we need to try on both sockets */
1979 size = sizeof(saddr);
1980 s4 = accept(s1, (struct sockaddr*)&saddr, &size);
1981 if(s4 == INVALID_SOCKET)
1982 s4 = accept(s2, (struct sockaddr*)&saddr, &size);
1983 ok(s4 != INVALID_SOCKET, "none of the listening sockets could get the connection\n");
1984
1985 closesocket(s1);
1986 closesocket(s3);
1987 closesocket(s4);
1988 }
1989 else
1990 {
1991 trace(">= Win 2003 behavior of SO_REUSEADDR\n");
1992 err = WSAGetLastError();
1993 ok(err==WSAEACCES, "expected 10013, got %d\n", err);
1994
1995 closesocket(s1);
1996 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1997 ok(rc==0, "bind() failed error: %d\n", WSAGetLastError());
1998 }
1999

◆ test_synchronous_WSAIoctl()

static void test_synchronous_WSAIoctl ( void  )
static

Definition at line 9470 of file sock.c.

9473{
9474 HANDLE previous_port, io_port;
9476 SOCKET socket;
9477 ULONG on;
9478 ULONG_PTR key;
9479 DWORD num_bytes;
9480 BOOL ret;
9481 int res;
9482
9483 previous_port = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 );
9484 ok( previous_port != NULL, "failed to create completion port %u\n", GetLastError() );
9485
9487 ok( socket != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError() );
9488
9489 io_port = CreateIoCompletionPort( (HANDLE)socket, previous_port, 0, 0 );
9490 ok( io_port != NULL, "failed to create completion port %u\n", GetLastError() );
9491
9492 on = 1;
9493 memset( &overlapped, 0, sizeof(overlapped) );
9494 res = WSAIoctl( socket, FIONBIO, &on, sizeof(on), NULL, 0, &num_bytes, &overlapped, NULL );
9495 ok( !res, "WSAIoctl failed %d\n", WSAGetLastError() );
9496
9497 ret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 10000 );
9498 ok( ret, "failed to get completion status %u\n", GetLastError() );
9499
9500 CloseHandle( io_port );
GLuint res
Definition: glext.h:9613

◆ test_TransmitFile()

static void test_TransmitFile ( void  )
static

Definition at line 8863 of file sock.c.

8866{
8867 DWORD num_bytes, err, file_size, total_sent;
8868 GUID transmitFileGuid = WSAID_TRANSMITFILE;
8869 LPFN_TRANSMITFILE pTransmitFile = NULL;
8871 char header_msg[] = "hello world";
8872 char footer_msg[] = "goodbye!!!";
8873 char system_ini_path[MAX_PATH];
8874 struct sockaddr_in bindAddress;
8877 WSAOVERLAPPED ov;
8878 char buf[256];
8879 int iret, len;
8880 BOOL bret;
8881
8882 memset( &ov, 0, sizeof(ov) );
8883
8884 /* Setup sockets for testing TransmitFile */
8888 {
8889 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8890 goto cleanup;
8891 }
8892 iret = WSAIoctl(client, SIO_GET_EXTENSION_FUNCTION_POINTER, &transmitFileGuid, sizeof(transmitFileGuid),
8893 &pTransmitFile, sizeof(pTransmitFile), &num_bytes, NULL, NULL);
8894 if (iret)
8895 {
8896 skip("WSAIoctl failed to get TransmitFile with ret %d + errno %d\n", iret, WSAGetLastError());
8897 goto cleanup;
8898 }
8899 GetSystemWindowsDirectoryA(system_ini_path, MAX_PATH );
8900 strcat(system_ini_path, "\\system.ini");
8901 file = CreateFileA(system_ini_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0x0, NULL);
8903 {
8904 skip("Unable to open a file to transmit.\n");
8905 goto cleanup;
8906 }
8908
8909 /* Test TransmitFile with an invalid socket */
8910 bret = pTransmitFile(INVALID_SOCKET, file, 0, 0, NULL, NULL, 0);
8911 err = WSAGetLastError();
8912 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8913 ok(err == WSAENOTSOCK, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTSOCK);
8914
8915 /* Test a bogus TransmitFile without a connected socket */
8916 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, TF_REUSE_SOCKET);
8917 err = WSAGetLastError();
8918 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8919 ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN);
8920
8921 /* Setup a properly connected socket for transfers */
8922 memset(&bindAddress, 0, sizeof(bindAddress));
8923 bindAddress.sin_family = AF_INET;
8924 bindAddress.sin_port = htons(SERVERPORT+1);
8925 bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8926 iret = bind(server, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8927 if (iret != 0)
8928 {
8929 skip("failed to bind(), error %d\n", WSAGetLastError());
8930 goto cleanup;
8931 }
8932 iret = listen(server, 1);
8933 if (iret != 0)
8934 {
8935 skip("failed to listen(), error %d\n", WSAGetLastError());
8936 goto cleanup;
8937 }
8938 iret = connect(client, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8939 if (iret != 0)
8940 {
8941 skip("failed to connect(), error %d\n", WSAGetLastError());
8942 goto cleanup;
8943 }
8944 len = sizeof(bindAddress);
8945 dest = accept(server, (struct sockaddr*)&bindAddress, &len);
8946 if (dest == INVALID_SOCKET)
8947 {
8948 skip("failed to accept(), error %d\n", WSAGetLastError());
8949 goto cleanup;
8950 }
8951 if (set_blocking(dest, FALSE))
8952 {
8953 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8954 goto cleanup;
8955 }
8956
8957 /* Test TransmitFile with no possible buffer */
8958 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0);
8959 ok(bret, "TransmitFile failed unexpectedly.\n");
8960 iret = recv(dest, buf, sizeof(buf), 0);
8961 ok(iret == -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret);
8962
8963 /* Test TransmitFile with only buffer data */
8964 buffers.Head = &header_msg[0];
8965 buffers.HeadLength = sizeof(header_msg);
8966 buffers.Tail = &footer_msg[0];
8967 buffers.TailLength = sizeof(footer_msg);
8968 bret = pTransmitFile(client, NULL, 0, 0, NULL, &buffers, 0);
8969 ok(bret, "TransmitFile failed unexpectedly.\n");
8970 iret = recv(dest, buf, sizeof(buf), 0);
8971 ok(iret == sizeof(header_msg)+sizeof(footer_msg),
8972 "Returned an unexpected buffer from TransmitFile: %d\n", iret );
8973 ok(memcmp(&buf[0], &header_msg[0], sizeof(header_msg)) == 0,
8974 "TransmitFile header buffer did not match!\n");
8975 ok(memcmp(&buf[sizeof(header_msg)], &footer_msg[0], sizeof(footer_msg)) == 0,
8976 "TransmitFile footer buffer did not match!\n");
8977
8978 /* Test TransmitFile with only file data */
8979 bret = pTransmitFile(client, file, 0, 0, NULL, NULL, 0);
8980 ok(bret, "TransmitFile failed unexpectedly.\n");
8981 compare_file(file, dest, 0);
8982
8983 /* Test TransmitFile with both file and buffer data */
8984 buffers.Head = &header_msg[0];
8985 buffers.HeadLength = sizeof(header_msg);
8986 buffers.Tail = &footer_msg[0];
8987 buffers.TailLength = sizeof(footer_msg);
8989 bret = pTransmitFile(client, file, 0, 0, NULL, &buffers, 0);
8990 ok(bret, "TransmitFile failed unexpectedly.\n");
8991 iret = recv(dest, buf, sizeof(header_msg), 0);
8992 ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0,
8993 "TransmitFile header buffer did not match!\n");
8994 compare_file(file, dest, 0);
8995 iret = recv(dest, buf, sizeof(footer_msg), 0);
8996 ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0,
8997 "TransmitFile footer buffer did not match!\n");
8998
8999 /* Test overlapped TransmitFile */
9001 if (ov.hEvent == INVALID_HANDLE_VALUE)
9002 {
9003 skip("Could not create event object, some tests will be skipped. errno = %d\n",
9004 GetLastError());
9005 goto cleanup;
9006 }
9008 bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
9009 err = WSAGetLastError();
9010 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9011 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n",
9013 iret = WaitForSingleObject(ov.hEvent, 2000);
9014 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
9015 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
9016 ok(total_sent == file_size,
9017 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
9018 total_sent, file_size);
9019 compare_file(file, dest, 0);
9020
9021 /* Test overlapped TransmitFile w/ start offset */
9023 if (ov.hEvent == INVALID_HANDLE_VALUE)
9024 {
9025 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
9026 goto cleanup;
9027 }
9029 ov.Offset = 10;
9030 bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
9031 err = WSAGetLastError();
9032 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9033 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
9034 iret = WaitForSingleObject(ov.hEvent, 2000);
9035 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
9036 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
9037 ok(total_sent == (file_size - ov.Offset),
9038 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
9039 total_sent, file_size - ov.Offset);
9041
9042 /* Test overlapped TransmitFile w/ file and buffer data */
9044 if (ov.hEvent == INVALID_HANDLE_VALUE)
9045 {
9046 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
9047 goto cleanup;
9048 }
9049 buffers.Head = &header_msg[0];
9050 buffers.HeadLength = sizeof(header_msg);
9051 buffers.Tail = &footer_msg[0];
9052 buffers.TailLength = sizeof(footer_msg);
9054 ov.Offset = 0;
9055 bret = pTransmitFile(client, file, 0, 0, &ov, &buffers, 0);
9056 err = WSAGetLastError();
9057 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9058 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
9059 iret = WaitForSingleObject(ov.hEvent, 2000);
9060 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
9061 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
9062 ok(total_sent == (file_size + buffers.HeadLength + buffers.TailLength),
9063 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
9064 total_sent, file_size + buffers.HeadLength + buffers.TailLength);
9065 iret = recv(dest, buf, sizeof(header_msg), 0);
9066 ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0,
9067 "TransmitFile header buffer did not match!\n");
9068 compare_file(file, dest, 0);
9069 iret = recv(dest, buf, sizeof(footer_msg), 0);
9070 ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0,
9071 "TransmitFile footer buffer did not match!\n");
9072
9073 /* Test TransmitFile w/ TF_DISCONNECT */
9075 bret = pTransmitFile(client, file, 0, 0, NULL, NULL, TF_DISCONNECT);
9076 ok(bret, "TransmitFile failed unexpectedly.\n");
9077 compare_file(file, dest, 0);
9079 ok(send(client, "test", 4, 0) == -1, "send() after TF_DISCONNECT succeeded unexpectedly.\n");
9080 err = WSAGetLastError();
9081 todo_wine ok(err == WSAENOTSOCK, "send() after TF_DISCONNECT triggered unexpected errno (%d != %d)\n",
9082 err, WSAENOTSOCK);
9083
9084 /* Test TransmitFile with a UDP datagram socket */
9086 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0);
9087 err = WSAGetLastError();
9088 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9089 ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN);
9090
9091cleanup:
9093 CloseHandle(ov.hEvent);
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define FILE_SHARE_READ
Definition: compat.h:136
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
UINT WINAPI GetSystemWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2367
const GLuint * buffers
Definition: glext.h:5916
#define OPEN_ALWAYS
Definition: disk.h:70
#define WSAID_TRANSMITFILE
Definition: mswsock.h:71
#define TF_REUSE_SOCKET
Definition: mswsock.h:52
#define TF_DISCONNECT
Definition: mswsock.h:51
static unsigned int file_size
Definition: regtests2xml.c:47
static FILE * client
Definition: client.c:41
#define compare_file(h, s, o)
Definition: sock.c:8837
DWORD Offset
Definition: winsock2.h:611

◆ test_UDP()

static void test_UDP ( void  )
static

Definition at line 2299 of file sock.c.

2302{
2303 /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is
2304 possible that this test fails due to dropped packets. */
2305
2306 /* peer 0 receives data from all other peers */
2308 char buf[16];
2309 int ss, i, n_recv, n_sent;
2310
2311 memset (buf,0,sizeof(buf));
2312 for ( i = NUM_UDP_PEERS - 1; i >= 0; i-- ) {
2313 ok ( ( peer[i].s = socket ( AF_INET, SOCK_DGRAM, 0 ) ) != INVALID_SOCKET, "UDP: socket failed\n" );
2314
2315 peer[i].addr.sin_family = AF_INET;
2316 peer[i].addr.sin_addr.s_addr = inet_addr ( SERVERIP );
2317
2318 if ( i == 0 ) {
2319 peer[i].addr.sin_port = htons ( SERVERPORT );
2320 } else {
2321 peer[i].addr.sin_port = htons ( 0 );
2322 }
2323
2324 do_bind ( peer[i].s, (struct sockaddr *) &peer[i].addr, sizeof( peer[i].addr ) );
2325
2326 /* test getsockname() to get peer's port */
2327 ss = sizeof ( peer[i].addr );
2328 ok ( getsockname ( peer[i].s, (struct sockaddr *) &peer[i].addr, &ss ) != SOCKET_ERROR, "UDP: could not getsockname()\n" );
2329 ok ( peer[i].addr.sin_port != htons ( 0 ), "UDP: bind() did not associate port\n" );
2330 }
2331
2332 /* test getsockname() */
2333 ok ( peer[0].addr.sin_port == htons ( SERVERPORT ), "UDP: getsockname returned incorrect peer port\n" );
2334
2335 for ( i = 1; i < NUM_UDP_PEERS; i++ ) {
2336 /* send client's ip */
2337 memcpy( buf, &peer[i].addr.sin_port, sizeof(peer[i].addr.sin_port) );
2338 n_sent = sendto ( peer[i].s, buf, sizeof(buf), 0, (struct sockaddr*) &peer[0].addr, sizeof(peer[0].addr) );
2339 ok ( n_sent == sizeof(buf), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent );
2340 }
2341
2342 for ( i = 1; i < NUM_UDP_PEERS; i++ ) {
2343 n_recv = recvfrom ( peer[0].s, buf, sizeof(buf), 0,(struct sockaddr *) &peer[0].peer, &ss );
2344 ok ( n_recv == sizeof(buf), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv );
2345 ok ( memcmp ( &peer[0].peer.sin_port, buf, sizeof(peer[0].addr.sin_port) ) == 0, "UDP: port numbers do not match\n" );
#define NUM_UDP_PEERS
Definition: sock.c:52
struct sockaddr_in peer
Definition: sock.c:119
int n_sent
Definition: sock.c:122

◆ test_WithoutWSAStartup()

static void test_WithoutWSAStartup ( void  )
static

Definition at line 1170 of file sock.c.

1172{
1173 DWORD err;
1174
1175 WSASetLastError(0xdeadbeef);
1176 ok(WSASocketA(0, 0, 0, NULL, 0, 0) == INVALID_SOCKET, "WSASocketA should have failed\n");
1177 err = WSAGetLastError();
1178 ok(err == WSANOTINITIALISED, "Expected 10093, received %d\n", err);
1179
1180 WSASetLastError(0xdeadbeef);
1181 ok(gethostbyname("localhost") == NULL, "gethostbyname() succeeded unexpectedly\n");
1182 err = WSAGetLastError();
1183 ok(err == WSANOTINITIALISED, "Expected 10093, received %d\n", err);
#define WSANOTINITIALISED
Definition: winerror.h:1987

◆ test_WithWSAStartup()

static void test_WithWSAStartup ( void  )
static

Definition at line 1185 of file sock.c.

1187{
1188 WSADATA data;
1189 WORD version = MAKEWORD( 2, 2 );
1190 INT res, socks, i, j;
1191 SOCKET sock;
1192 LPVOID ptr;
1193 struct
1194 {
1195 SOCKET src, dst, dup_src, dup_dst;
1196 } pairs[32];
1197 DWORD error;
1198
1199 res = WSAStartup( version, &data );
1200 ok(res == 0, "WSAStartup() failed unexpectedly: %d\n", res);
1201
1202 ptr = gethostbyname("localhost");
1203 ok(ptr != NULL, "gethostbyname() failed unexpectedly: %d\n", WSAGetLastError());
1204
1205 /* Alloc some sockets to check if they are destroyed on WSACleanup */
1206 for (socks = 0; socks < sizeof(pairs) / sizeof(pairs[0]); socks++)
1207 {
1209 if (tcp_socketpair(&pairs[socks].src, &pairs[socks].dst)) break;
1210
1211 memset(&info, 0, sizeof(info));
1213 "WSADuplicateSocketA should have worked\n");
1214 pairs[socks].dup_src = WSASocketA(0, 0, 0, &info, 0, 0);
1215 ok(pairs[socks].dup_src != SOCKET_ERROR, "expected != -1\n");
1216
1217 memset(&info, 0, sizeof(info));
1219 "WSADuplicateSocketA should have worked\n");
1220 pairs[socks].dup_dst = WSASocketA(0, 0, 0, &info, 0, 0);
1221 ok(pairs[socks].dup_dst != SOCKET_ERROR, "expected != -1\n");
1222 }
1223
1224 res = send(pairs[0].src, "TEST", 4, 0);
1225 ok(res == 4, "send failed with error %d\n", WSAGetLastError());
1226
1227 WSACleanup();
1228
1229 res = WSAStartup( version, &data );
1230 ok(res == 0, "WSAStartup() failed unexpectedly: %d\n", res);
1231
1232 /* show that sockets are destroyed automatically after WSACleanup */
1233 SetLastError(0xdeadbeef);
1234 res = send(pairs[0].src, "TEST", 4, 0);
1236 ok(res == SOCKET_ERROR, "send should have failed\n");
1237 todo_wine ok(error == WSAENOTSOCK, "expected 10038, got %d\n", error);
1238
1239 SetLastError(0xdeadbeef);
1240 res = send(pairs[0].dst, "TEST", 4, 0);
1242 ok(res == SOCKET_ERROR, "send should have failed\n");
1243 todo_wine ok(error == WSAENOTSOCK, "expected 10038, got %d\n", error);
1244
1245 /* Check that all sockets were destroyed */
1246 for (i = 0; i < socks; i++)
1247 {
1248 for (j = 0; j < 4; j++)
1249 {
1250 struct sockaddr_in saddr;
1251 int size = sizeof(saddr);
1252 switch(j)
1253 {
1254 case 0: sock = pairs[i].src; break;
1255 case 1: sock = pairs[i].dup_src; break;
1256 case 2: sock = pairs[i].dst; break;
1257 case 3: sock = pairs[i].dup_dst; break;
1258 }
1259
1260 SetLastError(0xdeadbeef);
1261 res = getsockname(sock, (struct sockaddr *)&saddr, &size);
1263 ok(res == SOCKET_ERROR, "Test[%d]: getsockname should have failed\n", i);
1264 todo_wine ok(error == WSAENOTSOCK, "Test[%d]: expected 10038, got %d\n", i, error);
1265 }
1266 }
1267
1268 /* While wine is not fixed, close all sockets manually */
1269 for (i = 0; i < socks; i++)
1270 {
1271 closesocket(pairs[i].src);
1272 closesocket(pairs[i].dst);
1273 closesocket(pairs[i].dup_src);
1274 closesocket(pairs[i].dup_dst);
1275 }
1276
1277 res = WSACleanup();
1278 ok(res == 0, "expected 0, got %d\n", res);
1279 WSASetLastError(0xdeadbeef);
1280 res = WSACleanup();
1283 "WSACleanup returned %d WSAGetLastError is %d\n", res, error);
static const WCHAR version[]
Definition: asmname.c:66

◆ test_write_watch()

static void test_write_watch ( void  )
static

Definition at line 6971 of file sock.c.

6974{
6975 SOCKET src, dest;
6976 WSABUF bufs[2];
6977 WSAOVERLAPPED ov;
6979 DWORD bytesReturned, flags, size;
6980 struct sockaddr addr;
6981 int addr_len, ret;
6983 char *base;
6984 void *results[64];
6986 ULONG pagesize;
6987 UINT (WINAPI *pGetWriteWatch)(DWORD,LPVOID,SIZE_T,LPVOID*,ULONG_PTR*,ULONG*);
6988
6989 pGetWriteWatch = (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetWriteWatch" );
6990 if (!pGetWriteWatch)
6991 {
6992 win_skip( "write watched not supported\n" );
6993 return;
6994 }
6995
6998 {
6999 skip("failed to create sockets\n");
7000 return;
7001 }
7002
7003 memset(&ov, 0, sizeof(ov));
7004 ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL);
7005 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError());
7006
7007 flags = 0;
7008
7009 size = 0x10000;
7011 ok( base != NULL, "VirtualAlloc failed %u\n", GetLastError() );
7012
7013#ifdef __REACTOS__
7014 if (!base)
7015 {
7016 skip("VirtualAlloc(MEM_WRITE_WATCH) is not supported yet on ReactOS\n");
7017 skip("Skipping tests due to hang. See ROSTESTS-385\n");
7018 return;
7019 }
7020#endif
7021
7022 memset( base, 0, size );
7023 count = 64;
7024 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7025 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7026 ok( count == 16, "wrong count %lu\n", count );
7027
7028 bufs[0].len = 5;
7029 bufs[0].buf = base;
7030 bufs[1].len = 0x8000;
7031 bufs[1].buf = base + 0x4000;
7032
7033 ret = WSARecv( dest, bufs, 2, NULL, &flags, &ov, NULL);
7035 "WSARecv failed - %d error %d\n", ret, GetLastError());
7036
7037 count = 64;
7038 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7039 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7040 ok( count == 9, "wrong count %lu\n", count );
7041 ok( !base[0], "data set\n" );
7042
7043 send(src, "test message", sizeof("test message"), 0);
7044
7045 ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
7046 ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
7047 ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
7048 ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
7049 ok( !memcmp( base + 0x4000, "message", 8 ), "wrong data %s\n", base + 0x4000 );
7050
7051 count = 64;
7052 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7053 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7054 ok( count == 0, "wrong count %lu\n", count );
7055
7056 memset( base, 0, size );
7057 count = 64;
7058 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7059 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7060 ok( count == 16, "wrong count %lu\n", count );
7061
7062 bufs[1].len = 0x4000;
7063 bufs[1].buf = base + 0x2000;
7064 ret = WSARecvFrom( dest, bufs, 2, NULL, &flags, &addr, &addr_len, &ov, NULL);
7066 "WSARecv failed - %d error %d\n", ret, GetLastError());
7067
7068 count = 64;
7069 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7070 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7071 ok( count == 5, "wrong count %lu\n", count );
7072 ok( !base[0], "data set\n" );
7073
7074 send(src, "test message", sizeof("test message"), 0);
7075
7076 ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
7077 ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
7078 ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
7079 ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
7080 ok( !memcmp( base + 0x2000, "message", 8 ), "wrong data %s\n", base + 0x2000 );
7081
7082 count = 64;
7083 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7084 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7085 ok( count == 0, "wrong count %lu\n", count );
7086
7087 memset( base, 0, size );
7088 count = 64;
7089 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7090 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7091 ok( count == 16, "wrong count %lu\n", count );
7092
7093 args.dest = dest;
7094 args.base = base;
7095 args.size = 0x7002;
7096 args.expect = "test message";
7097 for (args.func = 0; args.func < 4; args.func++)
7098 {
7100 Sleep( 200 );
7101
7102 count = 64;
7103 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7104 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7105 ok( count == 8, "wrong count %lu\n", count );
7106
7107 send(src, "test message", sizeof("test message"), 0);
7108 WaitForSingleObject( thread, 10000 );
7110
7111 count = 64;
7112 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7113 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7114 ok( count == 0, "wrong count %lu\n", count );
7115 }
7117 closesocket( dest );
7118 closesocket( src );
static struct _test_info results[8]
Definition: SetCursorPos.c:31
INT WSAAPI WSARecvFrom(IN SOCKET s, IN OUT LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesRecvd, IN OUT LPDWORD lpFlags, OUT LPSOCKADDR lpFrom, IN OUT LPINT lpFromlen, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
Definition: recv.c:254
#define MEM_WRITE_WATCH
Definition: mmtypes.h:86
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define MEM_RESERVE
Definition: nt_native.h:1314
#define MEM_COMMIT
Definition: nt_native.h:1313
static DWORD
Definition: sock.c:88
static LPVOID
Definition: sock.c:84
static DWORD CALLBACK write_watch_thread(void *arg)
Definition: sock.c:6931
Definition: match.c:390
ULONG_PTR SIZE_T
Definition: typedefs.h:80
LPVOID NTAPI VirtualAlloc(IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD flAllocationType, IN DWORD flProtect)
Definition: virtmem.c:65
#define WINAPI
Definition: msvc.h:6
#define WRITE_WATCH_FLAG_RESET
Definition: winnt_old.h:556

◆ test_WSAAddressToStringA()

static void test_WSAAddressToStringA ( void  )
static

Definition at line 3029 of file sock.c.

3032{
3034 INT ret;
3035 DWORD len;
3036 int GLE;
3038 CHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
3039
3040 CHAR expect1[] = "0.0.0.0";
3041 CHAR expect2[] = "255.255.255.255";
3042 CHAR expect3[] = "0.0.0.0:65535";
3043 CHAR expect4[] = "255.255.255.255:65535";
3044
3045 SOCKADDR_IN6 sockaddr6;
3046 CHAR address6[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3047
3048 CHAR addr6_1[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3049 CHAR addr6_2[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3050 CHAR addr6_3[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
3051
3052 CHAR expect6_1[] = "::1";
3053 CHAR expect6_2[] = "20ab::1";
3054 CHAR expect6_3[] = "[20ab::2001]:33274";
3055 CHAR expect6_3_2[] = "[20ab::2001%4660]:33274";
3056 CHAR expect6_3_3[] = "20ab::2001%4660";
3057
3058 len = 0;
3059
3060 sockaddr.sin_family = AF_INET;
3061 sockaddr.sin_port = 0;
3062 sockaddr.sin_addr.s_addr = 0;
3063
3065 GLE = WSAGetLastError();
3066 ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0),
3067 "WSAAddressToStringA() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
3068 GLE, ret );
3069
3070 len = sizeof(address);
3071
3072 sockaddr.sin_family = AF_INET;
3073 sockaddr.sin_port = 0;
3074 sockaddr.sin_addr.s_addr = 0;
3075
3077 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3078
3079 ok( !strcmp( address, expect1 ), "Expected: %s, got: %s\n", expect1, address );
3080 ok( len == sizeof( expect1 ), "Got size %d\n", len);
3081
3082 len = sizeof(address);
3083
3084 sockaddr.sin_family = AF_INET;
3085 sockaddr.sin_port = 0;
3086 sockaddr.sin_addr.s_addr = 0xffffffff;
3087
3089 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3090
3091 ok( !strcmp( address, expect2 ), "Expected: %s, got: %s\n", expect2, address );
3092
3093 len = sizeof(address);
3094
3095 sockaddr.sin_family = AF_INET;
3096 sockaddr.sin_port = 0xffff;
3097 sockaddr.sin_addr.s_addr = 0;
3098
3100 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3101
3102 ok( !strcmp( address, expect3 ), "Expected: %s, got: %s\n", expect3, address );
3103
3104 len = sizeof(address);
3105
3106 sockaddr.sin_family = AF_INET;
3107 sockaddr.sin_port = 0xffff;
3108 sockaddr.sin_addr.s_addr = 0xffffffff;
3109
3111 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3112
3113 ok( !strcmp( address, expect4 ), "Expected: %s, got: %s\n", expect4, address );
3114 ok( len == sizeof( expect4 ), "Got size %d\n", len);
3115
3116 /*check to see it IPv6 is available */
3118 if (v6 == INVALID_SOCKET) {
3119 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3121 goto end;
3122 }
3123 /* Test a short IPv6 address */
3124 len = sizeof(address6);
3125
3126 sockaddr6.sin6_family = AF_INET6;
3127 sockaddr6.sin6_port = 0x0000;
3128 sockaddr6.sin6_scope_id = 0;
3129 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1));
3130
3131 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3132 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3133 ok( !strcmp( address6, expect6_1 ), "Expected: %s, got: %s\n", expect6_1, address6 );
3134 ok( len == sizeof(expect6_1), "Got size %d\n", len);
3135
3136 /* Test a longer IPv6 address */
3137 len = sizeof(address6);
3138
3139 sockaddr6.sin6_family = AF_INET6;
3140 sockaddr6.sin6_port = 0x0000;
3141 sockaddr6.sin6_scope_id = 0;
3142 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2));
3143
3144 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3145 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3146 ok( !strcmp( address6, expect6_2 ), "Expected: %s, got: %s\n", expect6_2, address6 );
3147 ok( len == sizeof(expect6_2), "Got size %d\n", len);
3148
3149 /* Test IPv6 address and port number */
3150 len = sizeof(address6);
3151
3152 sockaddr6.sin6_family = AF_INET6;
3153 sockaddr6.sin6_port = 0xfa81;
3154 sockaddr6.sin6_scope_id = 0;
3155 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3156
3157 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3158 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3159 ok( !strcmp( address6, expect6_3 ), "Expected: %s, got: %s\n", expect6_3, address6 );
3160 ok( len == sizeof(expect6_3), "Got size %d\n", len );
3161
3162 /* Test IPv6 address, port number and scope_id */
3163 len = sizeof(address6);
3164
3165 sockaddr6.sin6_family = AF_INET6;
3166 sockaddr6.sin6_port = 0xfa81;
3167 sockaddr6.sin6_scope_id = 0x1234;
3168 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3169
3170 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3171 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3172 ok( !strcmp( address6, expect6_3_2 ), "Expected: %s, got: %s\n", expect6_3_2, address6 );
3173 ok( len == sizeof(expect6_3_2), "Got size %d\n", len );
3174
3175 /* Test IPv6 address and scope_id */
3176 len = sizeof(address6);
3177
3178 sockaddr6.sin6_family = AF_INET6;
3179 sockaddr6.sin6_port = 0x0000;
3180 sockaddr6.sin6_scope_id = 0x1234;
3181 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3182
3183 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3184 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3185 ok( !strcmp( address6, expect6_3_3 ), "Expected: %s, got: %s\n", expect6_3_3, address6 );
3186 ok( len == sizeof(expect6_3_3), "Got size %d\n", len );
3187
3188end:
3189 if (v6 != INVALID_SOCKET)
static DWORD GLE
Definition: registry.c:38
#define expect2(expected1, expected2, got1, got2)
Definition: listview.c:50
INT WSAAPI WSAAddressToStringA(IN LPSOCKADDR lpsaAddress, IN DWORD dwAddressLength, IN LPWSAPROTOCOL_INFOA lpProtocolInfo, OUT LPSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength)
Definition: rnr.c:23
ULONG sin6_scope_id
Definition: ws2ipdef.h:184
ADDRESS_FAMILY sin6_family
Definition: ws2ipdef.h:179
IN6_ADDR sin6_addr
Definition: ws2ipdef.h:182
USHORT sin6_port
Definition: ws2ipdef.h:180

◆ test_WSAAddressToStringW()

static void test_WSAAddressToStringW ( void  )
static

Definition at line 3191 of file sock.c.

3194{
3196 INT ret;
3197 DWORD len;
3198 int GLE;
3200 WCHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
3201
3202 WCHAR expect1[] = { '0','.','0','.','0','.','0', 0 };
3203 WCHAR expect2[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3204 WCHAR expect3[] = { '0','.','0','.','0','.','0', ':', '6', '5', '5', '3', '5', 0 };
3205 WCHAR expect4[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3206 '6', '5', '5', '3', '5', 0 };
3207
3208 SOCKADDR_IN6 sockaddr6;
3209 WCHAR address6[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3210
3211 CHAR addr6_1[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3212 CHAR addr6_2[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3213 CHAR addr6_3[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
3214
3215 WCHAR expect6_1[] = {':',':','1',0};
3216 WCHAR expect6_2[] = {'2','0','a','b',':',':','1',0};
3217 WCHAR expect6_3[] = {'[','2','0','a','b',':',':','2','0','0','1',']',':','3','3','2','7','4',0};
3218 WCHAR expect6_3_2[] = {'[','2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',']',':','3','3','2','7','4',0};
3219 WCHAR expect6_3_3[] = {'2','0','a','b',':',':','2','0','0','1','%','6','5','5','3','4',0};
3220
3221 len = 0;
3222
3223 sockaddr.sin_family = AF_INET;
3224 sockaddr.sin_port = 0;
3225 sockaddr.sin_addr.s_addr = 0;
3226
3228 GLE = WSAGetLastError();
3229 ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0),
3230 "WSAAddressToStringW() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
3231 GLE, ret );
3232
3233 len = sizeof(address);
3234
3235 sockaddr.sin_family = AF_INET;
3236 sockaddr.sin_port = 0;
3237 sockaddr.sin_addr.s_addr = 0;
3238
3240 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3241
3242 ok( !lstrcmpW( address, expect1 ), "Expected different address string\n" );
3243 ok( len == sizeof( expect1 )/sizeof( WCHAR ), "Got size %d\n", len);
3244
3245 len = sizeof(address);
3246
3247 sockaddr.sin_family = AF_INET;
3248 sockaddr.sin_port = 0;
3249 sockaddr.sin_addr.s_addr = 0xffffffff;
3250
3252 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3253
3254 ok( !lstrcmpW( address, expect2 ), "Expected different address string\n" );
3255
3256 len = sizeof(address);
3257
3258 sockaddr.sin_family = AF_INET;
3259 sockaddr.sin_port = 0xffff;
3260 sockaddr.sin_addr.s_addr = 0;
3261
3263 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3264
3265 ok( !lstrcmpW( address, expect3 ), "Expected different address string\n" );
3266
3267 len = sizeof(address);
3268
3269 sockaddr.sin_family = AF_INET;
3270 sockaddr.sin_port = 0xffff;
3271 sockaddr.sin_addr.s_addr = 0xffffffff;
3272
3274 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3275
3276 ok( !lstrcmpW( address, expect4 ), "Expected different address string\n" );
3277 ok( len == sizeof( expect4 )/sizeof( WCHAR ), "Got %d\n", len);
3278
3279 /*check to see it IPv6 is available */
3281 if (v6 == INVALID_SOCKET) {
3282 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3284 goto end;
3285 }
3286
3287 /* Test a short IPv6 address */
3288 len = sizeof(address6)/sizeof(WCHAR);
3289
3290 sockaddr6.sin6_family = AF_INET6;
3291 sockaddr6.sin6_port = 0x0000;
3292 sockaddr6.sin6_scope_id = 0;
3293 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1));
3294
3295 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3296 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3297 ok( !lstrcmpW( address6, expect6_1 ), "Wrong string returned\n" );
3298 ok( len == sizeof(expect6_1)/sizeof(WCHAR), "Got %d\n", len);
3299
3300 /* Test a longer IPv6 address */
3301 len = sizeof(address6)/sizeof(WCHAR);
3302
3303 sockaddr6.sin6_family = AF_INET6;
3304 sockaddr6.sin6_port = 0x0000;
3305 sockaddr6.sin6_scope_id = 0;
3306 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2));
3307
3308 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3309 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3310
3311 ok( !lstrcmpW( address6, expect6_2 ), "Wrong string returned\n" );
3312 ok( len == sizeof(expect6_2)/sizeof(WCHAR), "Got %d\n", len);
3313
3314 /* Test IPv6 address and port number */
3315 len = sizeof(address6)/sizeof(WCHAR);
3316
3317 sockaddr6.sin6_family = AF_INET6;
3318 sockaddr6.sin6_port = 0xfa81;
3319 sockaddr6.sin6_scope_id = 0;
3320 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3321
3322 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3323 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3324 ok( !lstrcmpW( address6, expect6_3 ),
3325 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3), wine_dbgstr_w(address6) );
3326 ok( len == sizeof(expect6_3)/sizeof(WCHAR), "Got %d\n", len );
3327
3328 /* Test IPv6 address, port number and scope_id */
3329 len = sizeof(address6)/sizeof(WCHAR);
3330
3331 sockaddr6.sin6_family = AF_INET6;
3332 sockaddr6.sin6_port = 0xfa81;
3333 sockaddr6.sin6_scope_id = 0x1234;
3334 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3335
3336 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3337 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3338 ok( !lstrcmpW( address6, expect6_3_2 ),
3339 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_2), wine_dbgstr_w(address6) );
3340 ok( len == sizeof(expect6_3_2)/sizeof(WCHAR), "Got %d\n", len );
3341
3342 /* Test IPv6 address and scope_id */
3343 len = sizeof(address6)/sizeof(WCHAR);
3344
3345 sockaddr6.sin6_family = AF_INET6;
3346 sockaddr6.sin6_port = 0x0000;
3347 sockaddr6.sin6_scope_id = 0xfffe;
3348 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3349
3350 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3351 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3352 ok( !lstrcmpW( address6, expect6_3_3 ),
3353 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_3), wine_dbgstr_w(address6) );
3354 ok( len == sizeof(expect6_3_3)/sizeof(WCHAR), "Got %d\n", len );
3355
3356end:
3357 if (v6 != INVALID_SOCKET)
INT WSAAPI WSAAddressToStringW(IN LPSOCKADDR lpsaAddress, IN DWORD dwAddressLength, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPWSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength)
Definition: rnr.c:128

◆ test_WSAAsyncGetServByName()

static void test_WSAAsyncGetServByName ( void  )
static

Definition at line 9583 of file sock.c.

9586{
9588 HANDLE ret;
9590
9591 if (!hwnd)
9592 return;
9593
9594 /* FIXME: The asynchronous window messages should be tested. */
9595
9596 /* Parameters are not checked when initiating the asynchronous operation. */
9598 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9600
9602 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9604
9606 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9608
9610 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9612
HANDLE WSAAPI WSAAsyncGetServByName(IN HWND hWnd, IN UINT wMsg, IN CONST CHAR FAR *Name, IN CONST CHAR FAR *Protocol, OUT CHAR FAR *Buffer, IN INT BufferLength)
Definition: getxbyxx.c:820
static void wait_for_async_message(HWND hwnd, HANDLE handle)
Definition: sock.c:9537
static HWND create_async_message_window(void)
Definition: sock.c:9504
#define WM_ASYNCCOMPLETE
Definition: sock.c:9503
#define MAXGETHOSTSTRUCT
Definition: winsock.h:403

◆ test_WSAAsyncGetServByPort()

static void test_WSAAsyncGetServByPort ( void  )
static

Definition at line 9553 of file sock.c.

9556{
9558 HANDLE ret;
9560
9561 if (!hwnd)
9562 return;
9563
9564 /* FIXME: The asynchronous window messages should be tested. */
9565
9566 /* Parameters are not checked when initiating the asynchronous operation. */
9567 ret = WSAAsyncGetServByPort(NULL, 0, 0, NULL, NULL, 0);
9568 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9569
9571 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9573
9575 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9577
9579 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9581
HANDLE WSAAPI WSAAsyncGetServByPort(IN HWND hWnd, IN UINT wMsg, IN INT Port, IN CONST CHAR FAR *Protocol, OUT CHAR FAR *Buffer, IN INT BufferLength)
Definition: getxbyxx.c:885

◆ test_WSADuplicateSocket()

static void test_WSADuplicateSocket ( void  )
static

Definition at line 2795 of file sock.c.

2798{
2799 SOCKET source, dupsock;
2801 DWORD err;
2802 struct sockaddr_in addr;
2803 int socktype, size, addrsize, ret;
2804 char teststr[] = "TEST", buffer[16];
2805
2807 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2808
2809 /* test invalid parameters */
2810 SetLastError(0xdeadbeef);
2811 ok(WSADuplicateSocketA(0, 0, NULL), "WSADuplicateSocketA should have failed\n");
2812 err = WSAGetLastError();
2813 ok(err == WSAENOTSOCK, "expected 10038, received %d\n", err);
2814
2815 SetLastError(0xdeadbeef);
2817 "WSADuplicateSocketA should have failed\n");
2818 err = WSAGetLastError();
2819 ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2820
2821 SetLastError(0xdeadbeef);
2823 "WSADuplicateSocketA should have failed\n");
2824 err = WSAGetLastError();
2825 ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2826
2827 SetLastError(0xdeadbeef);
2829 "WSADuplicateSocketA should have failed\n");
2830 err = WSAGetLastError();
2831 ok(err == WSAENOTSOCK, "expected 10038, received %d\n", err);
2832
2833 SetLastError(0xdeadbeef);
2835 "WSADuplicateSocketA should have failed\n");
2836 err = WSAGetLastError();
2837 ok(err == WSAEFAULT, "expected 10014, received %d\n", err);
2838
2839 /* test returned structure */
2840 memset(&info, 0, sizeof(info));
2842 "WSADuplicateSocketA should have worked\n");
2843
2844 ok(info.iProtocol == IPPROTO_TCP, "expected protocol %d, received %d\n",
2845 IPPROTO_TCP, info.iProtocol);
2846 ok(info.iAddressFamily == AF_INET, "expected family %d, received %d\n",
2847 AF_INET, info.iProtocol);
2848 ok(info.iSocketType == SOCK_STREAM, "expected type %d, received %d\n",
2849 SOCK_STREAM, info.iSocketType);
2850
2851 dupsock = WSASocketA(0, 0, 0, &info, 0, 0);
2852 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2853
2854 closesocket(dupsock);
2856
2857 /* create a socket, bind it, duplicate it then send data on source and
2858 * receive in the duplicated socket */
2860 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2861
2862 memset(&info, 0, sizeof(info));
2864 "WSADuplicateSocketA should have worked\n");
2865
2866 ok(info.iProtocol == IPPROTO_UDP, "expected protocol %d, received %d\n",
2867 IPPROTO_UDP, info.iProtocol);
2868 ok(info.iAddressFamily == AF_INET, "expected family %d, received %d\n",
2869 AF_INET, info.iProtocol);
2870 ok(info.iSocketType == SOCK_DGRAM, "expected type %d, received %d\n",
2871 SOCK_DGRAM, info.iSocketType);
2872
2873 memset(&addr, 0, sizeof(addr));
2874 addr.sin_family = AF_INET;
2875 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2876 ok(!bind(source, (struct sockaddr*)&addr, sizeof(addr)),
2877 "bind should have worked\n");
2878
2879 /* read address to find out the port number to be used in sendto */
2880 memset(&addr, 0, sizeof(addr));
2881 addrsize = sizeof(addr);
2882 ok(!getsockname(source, (struct sockaddr *) &addr, &addrsize),
2883 "getsockname should have worked\n");
2884 ok(addr.sin_port, "socket port should be != 0\n");
2885
2886 dupsock = WSASocketA(0, 0, 0, &info, 0, 0);
2887 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2888
2889 size = sizeof(int);
2890 ret = getsockopt(dupsock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2891 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError());
2892 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n",
2893 SOCK_DGRAM, socktype);
2894
2896
2897 /* send data on source socket */
2898 addrsize = sizeof(addr);
2899 size = sendto(source, teststr, sizeof(teststr), 0, (struct sockaddr *) &addr, addrsize);
2900 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError());
2901
2902 /* receive on duplicated socket */
2903 addrsize = sizeof(addr);
2904 memset(buffer, 0, sizeof(buffer));
2905 size = recvfrom(dupsock, buffer, sizeof(teststr), 0, (struct sockaddr *) &addr, &addrsize);
2906 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError());
2907 buffer[sizeof(teststr) - 1] = 0;
2908 ok(!strcmp(buffer, teststr), "expected '%s', received '%s'\n", teststr, buffer);
2909
2910 closesocket(dupsock);
2912
2913 /* show that the source socket need to be bound before the duplicated
2914 * socket is created */
2916 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2917
2918 memset(&info, 0, sizeof(info));
2920 "WSADuplicateSocketA should have worked\n");
2921
2922 dupsock = WSASocketA(0, 0, 0, &info, 0, 0);
2923 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2924
2925 memset(&addr, 0, sizeof(addr));
2926 addr.sin_family = AF_INET;
2927 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2928 ok(!bind(source, (struct sockaddr*)&addr, sizeof(addr)),
2929 "bind should have worked\n");
2930
2931 /* read address to find out the port number to be used in sendto */
2932 memset(&addr, 0, sizeof(addr));
2933 addrsize = sizeof(addr);
2934 ok(!getsockname(source, (struct sockaddr *) &addr, &addrsize),
2935 "getsockname should have worked\n");
2936 ok(addr.sin_port, "socket port should be != 0\n");
2937
2939
2940 addrsize = sizeof(addr);
2941 size = sendto(source, teststr, sizeof(teststr), 0, (struct sockaddr *) &addr, addrsize);
2942 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError());
2943
2944 SetLastError(0xdeadbeef);
2945 addrsize = sizeof(addr);
2946 memset(buffer, 0, sizeof(buffer));
2947 todo_wine {
2948 ok(recvfrom(dupsock, buffer, sizeof(teststr), 0, (struct sockaddr *) &addr, &addrsize) == -1,
2949 "recvfrom should have failed\n");
2950 err = WSAGetLastError();
2951 ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2952 }
2953
2954 closesocket(dupsock);
#define SO_TYPE
Definition: winsock.h:195

◆ test_WSAEnumNameSpaceProvidersA()

static void test_WSAEnumNameSpaceProvidersA ( void  )
static

Definition at line 10756 of file sock.c.

10759{
10761 DWORD ret, error, blen = 0, i;
10762 if (!pWSAEnumNameSpaceProvidersA)
10763 {
10764 win_skip("WSAEnumNameSpaceProvidersA not found\n");
10765 return;
10766 }
10767
10768 SetLastError(0xdeadbeef);
10769 ret = pWSAEnumNameSpaceProvidersA(&blen, name);
10772 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10774 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10775
10776 /* Invalid parameter tests */
10777 SetLastError(0xdeadbeef);
10778 ret = pWSAEnumNameSpaceProvidersA(NULL, name);
10781 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10783 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10784
10785 SetLastError(0xdeadbeef);
10786 ret = pWSAEnumNameSpaceProvidersA(NULL, NULL);
10789 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10791 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10792
10793 SetLastError(0xdeadbeef);
10794 ret = pWSAEnumNameSpaceProvidersA(&blen, NULL);
10797 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10799 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10800
10801#ifdef __REACTOS__ /* ROSTESTS-233 */
10802 if (!blen)
10803 {
10804 skip("Failed to get length needed for name space providers.\n");
10805 return;
10806 }
10807#endif
10808
10809 name = HeapAlloc(GetProcessHeap(), 0, blen);
10810 if (!name)
10811 {
10812 skip("Failed to alloc memory\n");
10813 return;
10814 }
10815
10816 ret = pWSAEnumNameSpaceProvidersA(&blen, name);
10818 ok(ret > 0, "Expected more than zero name space providers\n");
10819
10820 for (i = 0;i < ret; i++)
10821 {
10822 trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier,
10823 name[i].lpszIdentifier);
10824 switch (name[i].dwNameSpace)
10825 {
10826 case NS_DNS:
10827 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace);
10828 break;
10829 case NS_NLA:
10830 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace);
10831 break;
10832 default:
10833 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace);
10834 break;
10835 }
10836 trace("\tActive: %d\n", name[i].fActive);
10837 trace("\tVersion: %d\n", name[i].dwVersion);
10838 }
10839

◆ test_WSAEnumNameSpaceProvidersW()

static void test_WSAEnumNameSpaceProvidersW ( void  )
static

Definition at line 10841 of file sock.c.

10844{
10846 DWORD ret, error, blen = 0, i;
10847 if (!pWSAEnumNameSpaceProvidersW)
10848 {
10849 win_skip("WSAEnumNameSpaceProvidersW not found\n");
10850 return;
10851 }
10852
10853 SetLastError(0xdeadbeef);
10854 ret = pWSAEnumNameSpaceProvidersW(&blen, name);
10857 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10859 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10860
10861 /* Invalid parameter tests */
10862 SetLastError(0xdeadbeef);
10863 ret = pWSAEnumNameSpaceProvidersW(NULL, name);
10866 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10868 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10869
10870 SetLastError(0xdeadbeef);
10871 ret = pWSAEnumNameSpaceProvidersW(NULL, NULL);
10874 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10876 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10877
10878 SetLastError(0xdeadbeef);
10879 ret = pWSAEnumNameSpaceProvidersW(&blen, NULL);
10882 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10884 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10885
10886#ifdef __REACTOS__ /* ROSTESTS-233 */
10887 if (!blen)
10888 {
10889 skip("Failed to get length needed for name space providers.\n");
10890 return;
10891 }
10892#endif
10893
10894 name = HeapAlloc(GetProcessHeap(), 0, blen);
10895 if (!name)
10896 {
10897 skip("Failed to alloc memory\n");
10898 return;
10899 }
10900
10901 ret = pWSAEnumNameSpaceProvidersW(&blen, name);
10903 ok(ret > 0, "Expected more than zero name space providers\n");
10904
10905 for (i = 0;i < ret; i++)
10906 {
10907 trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier,
10908 wine_dbgstr_w(name[i].lpszIdentifier));
10909 switch (name[i].dwNameSpace)
10910 {
10911 case NS_DNS:
10912 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace);
10913 break;
10914 case NS_NLA:
10915 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace);
10916 break;
10917 default:
10918 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace);
10919 break;
10920 }
10921 trace("\tActive: %d\n", name[i].fActive);
10922 trace("\tVersion: %d\n", name[i].dwVersion);
10923 }
10924

◆ test_WSAEnumNetworkEvents()

static void test_WSAEnumNetworkEvents ( void  )
static

Definition at line 2956 of file sock.c.

2959{
2960 SOCKET s, s2;
2961 int sock_type[] = {SOCK_STREAM, SOCK_DGRAM, SOCK_STREAM}, i, j, k, l;
2962 struct sockaddr_in address;
2963 HANDLE event;
2964 WSANETWORKEVENTS net_events;
2965
2966 memset(&address, 0, sizeof(address));
2967 address.sin_addr.s_addr = htonl(INADDR_ANY);
2968 address.sin_family = AF_INET;
2969
2970 /* This test follows the steps from bugs 10204 and 24946 */
2971 for (l = 0; l < 2; l++)
2972 {
2973 for (i = 0; i < sizeof(sock_type) / sizeof(sock_type[0]); i++)
2974 {
2975 if (i == 2)
2976 ok(!tcp_socketpair(&s, &s2), "Test[%d]: creating socket pair failed\n", i);
2977 else
2978 {
2979 s = socket(AF_INET, sock_type[i], 0);
2980 ok (s != SOCKET_ERROR, "Test[%d]: failed to create socket\n", i);
2981 ok (!bind(s, (struct sockaddr*) &address, sizeof(address)), "Test[%d]: bind failed\n", i);
2982 }
2983 event = WSACreateEvent();
2984 ok (event != NULL, "Test[%d]: failed to create event\n", i);
2985 for (j = 0; j < 5; j++) /* Repeat sometimes and the result must be the same */
2986 {
2987 /* When the TCP socket is not connected NO events will be returned.
2988 * When connected and no data pending it will get the write event.
2989 * UDP sockets don't have connections so as soon as they are bound
2990 * they can read/write data. Since nobody is sendind us data only
2991 * the write event will be returned and ONLY once.
2992 */
2993 ok (!WSAEventSelect(s, event, FD_READ | FD_WRITE), "Test[%d]: WSAEventSelect failed\n", i);
2994 memset(&net_events, 0xAB, sizeof(net_events));
2995 ok (!WSAEnumNetworkEvents(s, l == 0 ? event : NULL, &net_events),
2996 "Test[%d]: WSAEnumNetworkEvents failed\n", i);
2997 if (i >= 1 && j == 0) /* FD_WRITE is SET on first try for UDP and connected TCP */
2998 {
2999 todo_wine_if (i == 0 || net_events.lNetworkEvents == 0)
3000 ok (net_events.lNetworkEvents == FD_WRITE, "Test[%d]: expected 2, got %d\n",
3001 i, net_events.lNetworkEvents);
3002 }
3003 else
3004 {
3005 todo_wine_if (i != 0 && net_events.lNetworkEvents != 0)
3006 ok (net_events.lNetworkEvents == 0, "Test[%d]: expected 0, got %d\n",
3007 i, net_events.lNetworkEvents);
3008 }
3009 for (k = 0; k < FD_MAX_EVENTS; k++)
3010 {
3011 if (net_events.lNetworkEvents & (1 << k))
3012 {
3013 ok (net_events.iErrorCode[k] == 0x0, "Test[%d][%d]: expected 0x0, got 0x%x\n",
3014 i, k, net_events.iErrorCode[k]);
3015 }
3016 else
3017 {
3018 /* Bits that are not set in lNetworkEvents MUST not be changed */
3019 ok (net_events.iErrorCode[k] == 0xABABABAB, "Test[%d][%d]: expected 0xABABABAB, got 0x%x\n",
3020 i, k, net_events.iErrorCode[k]);
3021 }
3022 }
3023 }
3024 closesocket(s);
3026 if (i == 2) closesocket(s2);
3027 }
r l[0]
Definition: byte_order.h:168
#define d
Definition: ke_i.h:81
#define for
Definition: utility.h:88
BOOL expected
Definition: store.c:2063
else
Definition: tritemp.h:161

◆ test_WSALookupService()

static void test_WSALookupService ( void  )
static

Definition at line 10595 of file sock.c.

10598{
10599 char buffer[4096], strbuff[128];
10600 WSAQUERYSETW *qs = NULL;
10601 HANDLE hnd;
10602 PNLA_BLOB netdata;
10603 int ret;
10604 DWORD error, offset, bsize;
10605
10606 if (!pWSALookupServiceBeginW || !pWSALookupServiceEnd || !pWSALookupServiceNextW)
10607 {
10608 win_skip("WSALookupServiceBeginW or WSALookupServiceEnd or WSALookupServiceNextW not found\n");
10609 return;
10610 }
10611
10612 qs = (WSAQUERYSETW *)buffer;
10613 memset(qs, 0, sizeof(*qs));
10614
10615 /* invalid parameter tests */
10616 ret = pWSALookupServiceBeginW(NULL, 0, &hnd);
10618 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10620 ok(error == WSAEFAULT, "expected 10014, got %d\n", error);
10621
10622 ret = pWSALookupServiceBeginW(qs, 0, NULL);
10624 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10626 ok(error == WSAEFAULT, "expected 10014, got %d\n", error);
10627
10628 ret = pWSALookupServiceBeginW(qs, 0, &hnd);
10630 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10632 ok(error == WSAEINVAL
10633 || broken(error == ERROR_INVALID_PARAMETER) /* == XP */
10634 || broken(error == WSAEFAULT) /* == NT */
10635 || broken(error == WSASERVICE_NOT_FOUND) /* == 2000 */,
10636 "expected 10022, got %d\n", error);
10637
10638 ret = pWSALookupServiceEnd(NULL);
10641 ok(ret == SOCKET_ERROR, "WSALookupServiceEnd should have failed\n");
10643 ok(error == ERROR_INVALID_HANDLE, "expected 6, got %d\n", error);
10644
10645 /* standard network list query */
10646 qs->dwSize = sizeof(*qs);
10647 hnd = (HANDLE)0xdeadbeef;
10648 ret = pWSALookupServiceBeginW(qs, LUP_RETURN_ALL | LUP_DEEP, &hnd);
10651 {
10652 win_skip("the current WSALookupServiceBeginW test is not supported in win <= 2000\n");
10653 return;
10654 }
10655
10657 ok(!ret, "WSALookupServiceBeginW failed unexpectedly with error %d\n", error);
10659 ok(hnd != (HANDLE)0xdeadbeef, "Handle was not filled\n");
10660
10661 offset = 0;
10662 do
10663 {
10664 memset(qs, 0, sizeof(*qs));
10665 bsize = sizeof(buffer);
10666
10667 if (pWSALookupServiceNextW(hnd, 0, &bsize, qs) == SOCKET_ERROR)
10668 {
10670 if (error == WSA_E_NO_MORE) break;
10671 ok(0, "Error %d happened while listing services\n", error);
10672 break;
10673 }
10674
10675 WideCharToMultiByte(CP_ACP, 0, qs->lpszServiceInstanceName, -1,
10676 strbuff, sizeof(strbuff), NULL, NULL);
10677 trace("Network Name: %s\n", strbuff);
10678
10679 /* network data is written in the blob field */
10680 if (qs->lpBlob)
10681 {
10682 /* each network may have multiple NLA_BLOB information structures */
10683 do
10684 {
10685 netdata = (PNLA_BLOB) &qs->lpBlob->pBlobData[offset];
10686 switch (netdata->header.type)
10687 {
10688 case NLA_RAW_DATA:
10689 trace("\tNLA Data Type: NLA_RAW_DATA\n");
10690 break;
10691 case NLA_INTERFACE:
10692 trace("\tNLA Data Type: NLA_INTERFACE\n");
10693 trace("\t\tType: %d\n", netdata->data.interfaceData.dwType);
10694 trace("\t\tSpeed: %d\n", netdata->data.interfaceData.dwSpeed);
10695 trace("\t\tAdapter Name: %s\n", netdata->data.interfaceData.adapterName);
10696 break;
10697 case NLA_802_1X_LOCATION:
10698 trace("\tNLA Data Type: NLA_802_1X_LOCATION\n");
10699 trace("\t\tInformation: %s\n", netdata->data.locationData.information);
10700 break;
10701 case NLA_CONNECTIVITY:
10702 switch (netdata->data.connectivity.type)
10703 {
10704 case NLA_NETWORK_AD_HOC:
10705 trace("\t\tNetwork Type: AD HOC\n");
10706 break;
10707 case NLA_NETWORK_MANAGED:
10708 trace("\t\tNetwork Type: Managed\n");
10709 break;
10710 case NLA_NETWORK_UNMANAGED:
10711 trace("\t\tNetwork Type: Unmanaged\n");
10712 break;
10713 case NLA_NETWORK_UNKNOWN:
10714 trace("\t\tNetwork Type: Unknown\n");
10715 }
10716 switch (netdata->data.connectivity.internet)
10717 {
10718 case NLA_INTERNET_NO:
10719 trace("\t\tInternet connectivity: No\n");
10720 break;
10721 case NLA_INTERNET_YES:
10722 trace("\t\tInternet connectivity: Yes\n");
10723 break;
10724 case NLA_INTERNET_UNKNOWN:
10725 trace("\t\tInternet connectivity: Unknown\n");
10726 break;
10727 }
10728 break;
10729 case NLA_ICS:
10730 trace("\tNLA Data Type: NLA_ICS\n");
10731 trace("\t\tSpeed: %d\n",
10732 netdata->data.ICS.remote.speed);
10733 trace("\t\tType: %d\n",
10734 netdata->data.ICS.remote.type);
10735 trace("\t\tState: %d\n",
10736 netdata->data.ICS.remote.state);
10737 WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.machineName, -1,
10738 strbuff, sizeof(strbuff), NULL, NULL);
10739 trace("\t\tMachine Name: %s\n", strbuff);
10740 WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.sharedAdapterName, -1,
10741 strbuff, sizeof(strbuff), NULL, NULL);
10742 trace("\t\tShared Adapter Name: %s\n", strbuff);
10743 break;
10744 default:
10745 trace("\tNLA Data Type: Unknown\n");
10746 break;
10747 }
10748 }
10749 while (offset);
10750 }
10751 }
10752 while (1);
10753
10754 ret = pWSALookupServiceEnd(hnd);
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
switch(r->id)
Definition: btrfs.c:3046
PVOID HANDLE
Definition: typedefs.h:73
#define WSASERVICE_NOT_FOUND
Definition: winerror.h:1995
#define WSA_E_NO_MORE
Definition: winerror.h:1997
#define LUP_DEEP
Definition: winsock2.h:510
WSAQUERYSETW
Definition: winsock2.h:836
#define LUP_RETURN_ALL
Definition: winsock2.h:522

◆ test_WSAPoll()

static void test_WSAPoll ( void  )
static

Definition at line 7131 of file sock.c.

7134{
7135 int ix, ret, err, poll_timeout;
7136 SOCKET fdListen, fdRead, fdWrite;
7137 struct sockaddr_in address;
7138 socklen_t len;
7139 static char tmp_buf[1024];
7140 WSAPOLLFD fds[16];
7141 HANDLE thread_handle;
7142 DWORD id;
7143
7144 if (!pWSAPoll) /* >= Vista */
7145 {
7146 skip("WSAPoll is unsupported, some tests will be skipped.\n");
7147 return;
7148 }
7149
7150 /* Invalid parameters test */
7151 SetLastError(0xdeadbeef);
7152 ret = pWSAPoll(NULL, 0, 0);
7153 err = GetLastError();
7154 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7155 ok(err == WSAEINVAL, "expected 10022, got %d\n", err);
7156 SetLastError(0xdeadbeef);
7157 ret = pWSAPoll(NULL, 1, 0);
7158 err = GetLastError();
7159 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7160 ok(err == WSAEFAULT, "expected 10014, got %d\n", err);
7161 SetLastError(0xdeadbeef);
7162 ret = pWSAPoll(NULL, 0, 1);
7163 err = GetLastError();
7164 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7165 ok(err == WSAEINVAL, "expected 10022, got %d\n", err);
7166 SetLastError(0xdeadbeef);
7167 ret = pWSAPoll(NULL, 1, 1);
7168 err = GetLastError();
7169 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7170 ok(err == WSAEFAULT, "expected 10014, got %d\n", err);
7171
7172 /* WSAPoll() tries to mime the unix poll() call. The following tests do:
7173 * - check if a connection attempt ended with success or error;
7174 * - check if a pending connection is waiting for acceptance;
7175 * - check for data to read, availability for write and OOB data
7176 */
7177 memset(&address, 0, sizeof(address));
7178 address.sin_addr.s_addr = inet_addr("127.0.0.1");
7179 address.sin_family = AF_INET;
7180 len = sizeof(address);
7181 fdListen = setup_server_socket(&address, &len);
7182 poll_timeout = 100;
7183
7184 /* When no events are pending poll returns 0 with no error */
7185 POLL_CLEAR();
7186 POLL_SET(fdListen, POLLIN);
7187 ret = pWSAPoll(fds, ix, poll_timeout);
7188 ok(ret == 0, "expected 0, got %d\n", ret);
7189
7190 /* Test listening socket connection attempt notifications */
7191 fdWrite = setup_connector_socket(&address, len, TRUE);
7192 POLL_CLEAR();
7193 POLL_SET(fdListen, POLLIN | POLLOUT);
7194 ret = pWSAPoll(fds, ix, poll_timeout);
7195 ok(ret == 1, "expected 1, got %d\n", ret);
7196 ok(POLL_ISSET(fdListen, POLLRDNORM), "fdListen socket events incorrect\n");
7197 len = sizeof(address);
7198 fdRead = accept(fdListen, (struct sockaddr*) &address, &len);
7199 ok(fdRead != INVALID_SOCKET, "expected a valid socket\n");
7200
7201 /* Test client side connection attempt notifications */
7202 POLL_CLEAR();
7203 POLL_SET(fdListen, POLLIN | POLLOUT);
7204 POLL_SET(fdRead, POLLIN | POLLOUT);
7205 POLL_SET(fdWrite, POLLIN | POLLOUT);
7206 ret = pWSAPoll(fds, ix, poll_timeout);
7207 ok(ret == 2, "expected 2, got %d\n", ret);
7208 ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n");
7209 ok(POLL_ISSET(fdRead, POLLWRNORM), "fdRead socket events incorrect\n");
7210 len = sizeof(id);
7211 id = 0xdeadbeef;
7212 err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
7213 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
7214 ok(id == 0, "expected 0, got %d\n", id);
7215
7216 /* Test data receiving notifications */
7217 ret = send(fdWrite, "1234", 4, 0);
7218 ok(ret == 4, "expected 4, got %d\n", ret);
7219 POLL_CLEAR();
7220 POLL_SET(fdListen, POLLIN | POLLOUT);
7221 POLL_SET(fdRead, POLLIN);
7222 ret = pWSAPoll(fds, ix, poll_timeout);
7223 ok(ret == 1, "expected 1, got %d\n", ret);
7224 ok(POLL_ISSET(fdRead, POLLRDNORM), "fdRead socket events incorrect\n");
7225 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
7226 ok(ret == 4, "expected 4, got %d\n", ret);
7227 ok(!strcmp(tmp_buf, "1234"), "data received differs from sent\n");
7228
7229 /* Test OOB data notifications */
7230 ret = send(fdWrite, "A", 1, MSG_OOB);
7231 ok(ret == 1, "expected 1, got %d\n", ret);
7232 POLL_CLEAR();
7233 POLL_SET(fdListen, POLLIN | POLLOUT);
7234 POLL_SET(fdRead, POLLIN);
7235 ret = pWSAPoll(fds, ix, poll_timeout);
7236 ok(ret == 1, "expected 1, got %d\n", ret);
7237 ok(POLL_ISSET(fdRead, POLLRDBAND), "fdRead socket events incorrect\n");
7238 tmp_buf[0] = 0xAF;
7239 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
7240 ok(ret == 1, "expected 1, got %d\n", ret);
7241 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
7242
7243 /* If the socket is OOBINLINED the notification is like normal data */
7244 ret = 1;
7245 ret = setsockopt(fdRead, SOL_SOCKET, SO_OOBINLINE, (char*) &ret, sizeof(ret));
7246 ok(ret == 0, "expected 0, got %d\n", ret);
7247 ret = send(fdWrite, "A", 1, MSG_OOB);
7248 ok(ret == 1, "expected 1, got %d\n", ret);
7249 POLL_CLEAR();
7250 POLL_SET(fdListen, POLLIN | POLLOUT);
7251 POLL_SET(fdRead, POLLIN | POLLOUT);
7252 ret = pWSAPoll(fds, ix, poll_timeout);
7253 ok(ret == 1, "expected 1, got %d\n", ret);
7254 tmp_buf[0] = 0xAF;
7255 SetLastError(0xdeadbeef);
7256 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
7257 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7258 ok(GetLastError() == WSAEINVAL, "expected 10022, got %d\n", GetLastError());
7259 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
7260 ok(ret == 1, "expected 1, got %d\n", ret);
7261 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
7262
7263 /* Test connection closed notifications */
7264 ret = closesocket(fdRead);
7265 ok(ret == 0, "expected 0, got %d\n", ret);
7266 POLL_CLEAR();
7267 POLL_SET(fdListen, POLLIN | POLLOUT);
7268 POLL_SET(fdWrite, POLLIN);
7269 ret = pWSAPoll(fds, ix, poll_timeout);
7270 ok(ret == 1, "expected 1, got %d\n", ret);
7271 ok(POLL_ISSET(fdWrite, POLLHUP), "fdWrite socket events incorrect\n");
7272 ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0);
7273 ok(ret == 0, "expected 0, got %d\n", ret);
7274
7275 /* When a connection is attempted to a non-listening socket due to a bug
7276 * in the MS code it will never be notified. This is a long standing issue
7277 * that will never be fixed for compatibility reasons so we have to deal
7278 * with it manually. */
7279 ret = closesocket(fdWrite);
7280 ok(ret == 0, "expected 0, got %d\n", ret);
7281 ret = closesocket(fdListen);
7282 ok(ret == 0, "expected 0, got %d\n", ret);
7283 len = sizeof(address);
7284 fdWrite = setup_connector_socket(&address, len, TRUE);
7285 POLL_CLEAR();
7286 POLL_SET(fdWrite, POLLIN | POLLOUT);
7287 poll_timeout = 2000;
7288 ret = pWSAPoll(fds, ix, poll_timeout);
7290 ok(ret == 0, "expected 0, got %d\n", ret);
7291 len = sizeof(id);
7292 id = 0xdeadbeef;
7293 err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
7294 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
7295 ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id);
7296 closesocket(fdWrite);
7297
7298 /* Try poll() on a closed socket after connection */
7299 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7300 closesocket(fdRead);
7301 POLL_CLEAR();
7302 POLL_SET(fdWrite, POLLIN | POLLOUT);
7303 POLL_SET(fdRead, POLLIN | POLLOUT);
7304 ret = pWSAPoll(fds, ix, poll_timeout);
7305 ok(ret == 1, "expected 1, got %d\n", ret);
7306 ok(POLL_ISSET(fdRead, POLLNVAL), "fdRead socket events incorrect\n");
7307 POLL_CLEAR();
7308 POLL_SET(fdWrite, POLLIN | POLLOUT);
7309 ret = pWSAPoll(fds, ix, poll_timeout);
7310 ok(ret == 1, "expected 1, got %d\n", ret);
7312 ok(POLL_ISSET(fdWrite, POLLWRNORM | POLLHUP) || broken(POLL_ISSET(fdWrite, POLLWRNORM)) /* <= 2008 */,
7313 "fdWrite socket events incorrect\n");
7314 closesocket(fdWrite);
7315
7316 /* Close the socket currently being polled in a thread */
7317 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7318 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
7319 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
7320 POLL_CLEAR();
7321 POLL_SET(fdWrite, POLLIN | POLLOUT);
7322 ret = pWSAPoll(fds, ix, poll_timeout);
7323 ok(ret == 1, "expected 1, got %d\n", ret);
7324 ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n");
7325 WaitForSingleObject (thread_handle, 1000);
7326 closesocket(fdRead);
7327 /* test again with less flags - behavior changes */
7328 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7329 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
7330 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
7331 POLL_CLEAR();
7332 POLL_SET(fdWrite, POLLIN);
7333 ret = pWSAPoll(fds, ix, poll_timeout);
7334 ok(ret == 1, "expected 1, got %d\n", ret);
7335 ok(POLL_ISSET(fdWrite, POLLNVAL), "fdWrite socket events incorrect\n");
7336 WaitForSingleObject (thread_handle, 1000);
#define POLLRDBAND
Definition: clnt_bcast.c:83
#define POLLRDNORM
Definition: clnt_bcast.c:80
#define POLLHUP
Definition: linux.h:1857
#define POLLIN
Definition: linux.h:1853
#define POLLOUT
Definition: linux.h:1855
#define POLLWRNORM
Definition: linux.h:1863
#define POLLNVAL
Definition: linux.h:1858
#define POLL_CLEAR()
Definition: sock.c:7120
#define POLL_SET(s, ev)
Definition: sock.c:7121
#define POLL_ISSET(s, rev)
Definition: sock.c:7122

◆ test_WSARecv()

static void test_WSARecv ( void  )
static

Definition at line 6745 of file sock.c.

6748{
6750 char buf[20];
6751 WSABUF bufs[2];
6752 WSAOVERLAPPED ov;
6753 DWORD bytesReturned, flags, id;
6754 struct linger ling;
6755 struct sockaddr_in addr;
6756 int iret, len;
6757 DWORD dwret;
6758 BOOL bret;
6759 HANDLE thread, event = NULL, io_port;
6760
6763 {
6764 skip("failed to create sockets\n");
6765 goto end;
6766 }
6767
6768 memset(&ov, 0, sizeof(ov));
6769 flags = 0;
6770 bufs[0].len = 2;
6771 bufs[0].buf = buf;
6772
6773 /* Send 4 bytes and receive in two calls of 2 */
6774 SetLastError(0xdeadbeef);
6775 iret = send(src, "test", 4, 0);
6776 ok(iret == 4, "Expected 4, got %d\n", iret);
6777 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6778 SetLastError(0xdeadbeef);
6779 bytesReturned = 0xdeadbeef;
6780 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL);
6781 ok(!iret, "Expected 0, got %d\n", iret);
6782 ok(bytesReturned == 2, "Expected 2, got %d\n", bytesReturned);
6783 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6784 SetLastError(0xdeadbeef);
6785 bytesReturned = 0xdeadbeef;
6786 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL);
6787 ok(!iret, "Expected 0, got %d\n", iret);
6788 ok(bytesReturned == 2, "Expected 2, got %d\n", bytesReturned);
6789 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6790
6791 bufs[0].len = 4;
6792 SetLastError(0xdeadbeef);
6793 iret = send(src, "test", 4, 0);
6794 ok(iret == 4, "Expected 4, got %d\n", iret);
6795 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6796 SetLastError(0xdeadbeef);
6797 bytesReturned = 0xdeadbeef;
6798 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL);
6799 ok(!iret, "Expected 0, got %d\n", iret);
6800 ok(bytesReturned == 4, "Expected 4, got %d\n", bytesReturned);
6801 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6802
6803 /* Test 2 buffers */
6804 bufs[0].len = 4;
6805 bufs[1].len = 5;
6806 bufs[1].buf = buf + 10;
6807 SetLastError(0xdeadbeef);
6808 iret = send(src, "deadbeefs", 9, 0);
6809 ok(iret == 9, "Expected 9, got %d\n", iret);
6810 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6811 SetLastError(0xdeadbeef);
6812 bytesReturned = 0xdeadbeef;
6813 iret = WSARecv(dest, bufs, 2, &bytesReturned, &flags, NULL, NULL);
6814 ok(!iret, "Expected 0, got %d\n", iret);
6815 ok(bytesReturned == 9, "Expected 9, got %d\n", bytesReturned);
6816 bufs[0].buf[4] = '\0';
6817 bufs[1].buf[5] = '\0';
6818 ok(!strcmp(bufs[0].buf, "dead"), "buf[0] doesn't match: %s != dead\n", bufs[0].buf);
6819 ok(!strcmp(bufs[1].buf, "beefs"), "buf[1] doesn't match: %s != beefs\n", bufs[1].buf);
6820 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6821
6822 bufs[0].len = sizeof(buf);
6823 ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL);
6824 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError());
6825 if (!event)
6826 goto end;
6827
6828 ling.l_onoff = 1;
6829 ling.l_linger = 0;
6830 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
6831 ok(!iret, "Failed to set linger %d\n", GetLastError());
6832
6833 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, NULL);
6834 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError());
6835
6836 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, &ov, NULL);
6837 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError());
6838
6841
6842 dwret = WaitForSingleObject(ov.hEvent, 1000);
6843 ok(dwret == WAIT_OBJECT_0, "Waiting for disconnect event failed with %d + errno %d\n", dwret, GetLastError());
6844
6845 bret = GetOverlappedResult((HANDLE)dest, &ov, &bytesReturned, FALSE);
6847 "Did not get disconnect event: %d, error %d\n", bret, GetLastError());
6848 ok(bytesReturned == 0, "Bytes received is %d\n", bytesReturned);
6851
6853 ok(src != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError());
6854 if (src == INVALID_SOCKET) goto end;
6855
6857 ok(server != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError());
6858 if (server == INVALID_SOCKET) goto end;
6859
6860 memset(&addr, 0, sizeof(addr));
6861 addr.sin_family = AF_INET;
6862 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
6863 iret = bind(server, (struct sockaddr *)&addr, sizeof(addr));
6864 if (iret) goto end;
6865
6866 len = sizeof(addr);
6867 iret = getsockname(server, (struct sockaddr *)&addr, &len);
6868 if (iret) goto end;
6869
6870 iret = listen(server, 1);
6871 if (iret) goto end;
6872
6873 iret = connect(src, (struct sockaddr *)&addr, sizeof(addr));
6874 if (iret) goto end;
6875
6876 len = sizeof(addr);
6877 dest = accept(server, (struct sockaddr *)&addr, &len);
6878 ok(dest != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError());
6879 if (dest == INVALID_SOCKET) goto end;
6880
6881 send(src, "test message", sizeof("test message"), 0);
6882 thread = CreateThread(NULL, 0, recv_thread, &dest, 0, &id);
6885
6886 memset(&ov, 0, sizeof(ov));
6887 ov.hEvent = event;
6889 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion);
6890 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError());
6891 send(src, "test message", sizeof("test message"), 0);
6892
6894 dwret = SleepEx(1000, TRUE);
6895 ok(dwret == WAIT_IO_COMPLETION, "got %u\n", dwret);
6896 ok(completion_called == 1, "completion not called\n");
6897
6898 dwret = WaitForSingleObject(event, 1);
6899 ok(dwret == WAIT_TIMEOUT, "got %u\n", dwret);
6900
6901 io_port = CreateIoCompletionPort( (HANDLE)dest, NULL, 0, 0 );
6902 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
6903
6904 /* Using completion function on socket associated with completion port is not allowed. */
6905 memset(&ov, 0, sizeof(ov));
6907 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion);
6908 ok(iret == SOCKET_ERROR && GetLastError() == WSAEINVAL, "WSARecv failed - %d error %d\n", iret, GetLastError());
6909 ok(!completion_called, "completion called\n");
6910
6911 CloseHandle(io_port);
6912
6913end:
6914 if (server != INVALID_SOCKET)
6916 if (dest != INVALID_SOCKET)
6918 if (src != INVALID_SOCKET)
6920 if (event)
static DWORD WINAPI recv_thread(LPVOID arg)
Definition: sock.c:6720
static int completion_called
Definition: sock.c:6738
static void WINAPI io_completion(DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags)
Definition: sock.c:6740
DWORD WINAPI SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:802
#define WAIT_IO_COMPLETION
Definition: winbase.h:411

◆ test_WSASendMsg()

static void test_WSASendMsg ( void  )
static

Definition at line 6496 of file sock.c.

6499{
6500 SOCKET sock, dst;
6501 struct sockaddr_in sendaddr, sockaddr;
6502 GUID WSASendMsg_GUID = WSAID_WSASENDMSG;
6503 LPFN_WSASENDMSG pWSASendMsg = NULL;
6504 char teststr[12] = "hello world", buffer[32];
6505 WSABUF iovec[2];
6506 WSAMSG msg;
6507 DWORD bytesSent, err;
6508 int ret, addrlen;
6509
6510 /* FIXME: Missing OVERLAPPED and OVERLAPPED COMPLETION ROUTINE tests */
6511
6513 ok(sock != INVALID_SOCKET, "socket() failed\n");
6514
6515 /* Obtain the WSASendMsg function */
6516 WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &WSASendMsg_GUID, sizeof(WSASendMsg_GUID),
6517 &pWSASendMsg, sizeof(pWSASendMsg), &err, NULL, NULL);
6518 if (!pWSASendMsg)
6519 {
6521 win_skip("WSASendMsg is unsupported, some tests will be skipped.\n");
6522 return;
6523 }
6524
6525 /* fake address for now */
6526 sendaddr.sin_family = AF_INET;
6527 sendaddr.sin_port = htons(139);
6528 sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6529
6530 memset(&msg, 0, sizeof(msg));
6531 iovec[0].buf = teststr;
6532 iovec[0].len = sizeof(teststr);
6533 iovec[1].buf = teststr;
6534 iovec[1].len = sizeof(teststr) / 2;
6535 msg.name = (struct sockaddr *) &sendaddr;
6536 msg.namelen = sizeof(sendaddr);
6537 msg.lpBuffers = iovec;
6538 msg.dwBufferCount = 1; /* send only one buffer for now */
6539
6540 WSASetLastError(0xdeadbeef);
6541 ret = pWSASendMsg(INVALID_SOCKET, &msg, 0, NULL, NULL, NULL);
6542 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6543 err = WSAGetLastError();
6544 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err);
6545
6546 WSASetLastError(0xdeadbeef);
6547 ret = pWSASendMsg(sock, NULL, 0, NULL, NULL, NULL);
6548 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6549 err = WSAGetLastError();
6550 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
6551
6552 WSASetLastError(0xdeadbeef);
6553 ret = pWSASendMsg(sock, NULL, 0, &bytesSent, NULL, NULL);
6554 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6555 err = WSAGetLastError();
6556 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
6557
6558 WSASetLastError(0xdeadbeef);
6559 ret = pWSASendMsg(sock, &msg, 0, NULL, NULL, NULL);
6560 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6561 err = WSAGetLastError();
6562 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
6563
6565
6567 ok(sock != INVALID_SOCKET, "socket() failed\n");
6568
6570 ok(dst != INVALID_SOCKET, "socket() failed\n");
6571
6572 memset(&sockaddr, 0, sizeof(sockaddr));
6573 sockaddr.sin_family = AF_INET;
6574 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6575 ok(!bind(dst, (struct sockaddr*)&sockaddr, sizeof(sockaddr)),
6576 "bind should have worked\n");
6577
6578 /* read address to find out the port number to be used in send */
6579 memset(&sendaddr, 0, sizeof(sendaddr));
6580 addrlen = sizeof(sendaddr);
6581 ok(!getsockname(dst, (struct sockaddr *) &sendaddr, &addrlen),
6582 "getsockname should have worked\n");
6583 ok(sendaddr.sin_port, "socket port should be != 0\n");
6584
6585 /* ensure the sending socket is not bound */
6586 WSASetLastError(0xdeadbeef);
6587 addrlen = sizeof(sockaddr);
6588 ret = getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen);
6589 ok(ret == SOCKET_ERROR, "getsockname should have failed\n");
6590 err = WSAGetLastError();
6591 ok(err == WSAEINVAL, "expected 10022, got %d instead\n", err);
6592
6594
6595 bytesSent = 0;
6596 SetLastError(0xdeadbeef);
6597 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL);
6598 ok(!ret, "WSASendMsg should have worked\n");
6599 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6600 "Expected 0, got %d\n", GetLastError());
6601 ok(bytesSent == iovec[0].len, "incorret bytes sent, expected %d, sent %d\n",
6602 iovec[0].len, bytesSent);
6603
6604 /* receive data */
6605 addrlen = sizeof(sockaddr);
6606 memset(buffer, 0, sizeof(buffer));
6607 SetLastError(0xdeadbeef);
6608 ret = recvfrom(dst, buffer, sizeof(buffer), 0, (struct sockaddr *) &sockaddr, &addrlen);
6609 ok(ret == bytesSent, "got %d, expected %d\n",
6610 ret, bytesSent);
6611 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6612
6613 /* A successful call to WSASendMsg must have bound the socket */
6614 addrlen = sizeof(sockaddr);
6615 sockaddr.sin_port = 0;
6616 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6617 ret = getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen);
6618 ok(!ret, "getsockname should have worked\n");
6619 ok(sockaddr.sin_addr.s_addr == htonl(INADDR_ANY), "expected 0.0.0.0, got %s\n",
6620 inet_ntoa(sockaddr.sin_addr));
6621 ok(sockaddr.sin_port, "sin_port should be != 0\n");
6622
6623 msg.dwBufferCount = 2; /* send both buffers */
6624
6625 bytesSent = 0;
6626 SetLastError(0xdeadbeef);
6627 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL);
6628 ok(!ret, "WSASendMsg should have worked\n");
6629 ok(bytesSent == iovec[0].len + iovec[1].len, "incorret bytes sent, expected %d, sent %d\n",
6630 iovec[0].len + iovec[1].len, bytesSent);
6631 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6632 "Expected 0, got %d\n", GetLastError());
6633
6634 /* receive data */
6635 addrlen = sizeof(sockaddr);
6636 memset(buffer, 0, sizeof(buffer));
6637 SetLastError(0xdeadbeef);
6638 ret = recvfrom(dst, buffer, sizeof(buffer), 0, (struct sockaddr *) &sockaddr, &addrlen);
6639 ok(ret == bytesSent, "got %d, expected %d\n",
6640 ret, bytesSent);
6641 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6642
6645
6646 /* a bad call to WSASendMsg will also bind the socket */
6647 addrlen = sizeof(sockaddr);
6648 sockaddr.sin_port = 0;
6649 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6651 ok(sock != INVALID_SOCKET, "socket() failed\n");
6652 ok(pWSASendMsg(sock, &msg, 0, NULL, NULL, NULL) == SOCKET_ERROR, "WSASendMsg should have failed\n");
6653todo_wine {
6654 ok(!getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen), "getsockname should have worked\n");
6655 ok(sockaddr.sin_addr.s_addr == htonl(INADDR_ANY), "expected 0.0.0.0, got %s\n",
6656 inet_ntoa(sockaddr.sin_addr));
6657 ok(sockaddr.sin_port, "sin_port should be > 0\n");
6658}
6660
6661 /* a bad call without msg parameter will not trigger the auto-bind */
6663 ok(sock != INVALID_SOCKET, "socket() failed\n");
6664 ok(pWSASendMsg(sock, NULL, 0, NULL, NULL, NULL) == SOCKET_ERROR, "WSASendMsg should have failed\n");
6665 ok(getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen), "getsockname should have failed\n");
6666 err = WSAGetLastError();
6667 ok(err == WSAEINVAL, "expected 10022, got %d instead\n", err);
6669
6670 /* SOCK_STREAM sockets are not supported */
6671 bytesSent = 0;
6673 ok(sock != INVALID_SOCKET, "socket() failed\n");
6674 SetLastError(0xdeadbeef);
6675 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL);
6676 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6677 err = WSAGetLastError();
6679 ok(err == WSAEINVAL, "expected 10014, got %d instead\n", err);
char * name
Definition: compiler.c:66

◆ test_WSASendTo()

static void test_WSASendTo ( void  )
static

Definition at line 6681 of file sock.c.

6684{
6685 SOCKET s;
6686 struct sockaddr_in addr;
6687 char buf[12] = "hello world";
6688 WSABUF data_buf;
6689 DWORD bytesSent;
6690 int ret;
6691
6692 addr.sin_family = AF_INET;
6693 addr.sin_port = htons(139);
6694 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
6695 data_buf.len = sizeof(buf);
6696 data_buf.buf = buf;
6697
6698 if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) {
6699 ok(0, "socket() failed error: %d\n", WSAGetLastError());
6700 return;
6701 }
6702
6703 WSASetLastError(12345);
6704 ret = WSASendTo(INVALID_SOCKET, &data_buf, 1, NULL, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL);
6706 "WSASendTo() failed: %d/%d\n", ret, WSAGetLastError());
6707
6708 WSASetLastError(12345);
6709 ret = WSASendTo(s, &data_buf, 1, NULL, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL);
6711 "WSASendTo() failed: %d/%d\n", ret, WSAGetLastError());
6712
6713 WSASetLastError(12345);
6714 if(WSASendTo(s, &data_buf, 1, &bytesSent, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL)) {
6715 ok(0, "WSASendTo() failed error: %d\n", WSAGetLastError());
6716 return;
6717 }
6718 ok(!WSAGetLastError(), "WSAGetLastError() should return zero after "
INT WSAAPI WSASendTo(IN SOCKET s, IN LPWSABUF lpBuffers, IN DWORD dwBufferCount, OUT LPDWORD lpNumberOfBytesSent, IN DWORD dwFlags, IN CONST struct sockaddr *lpTo, IN INT iToLen, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
Definition: send.c:247

◆ test_WSASocket()

static void test_WSASocket ( void  )
static

Definition at line 2409 of file sock.c.

2412{
2415 int wsaproviders[] = {IPPROTO_TCP, IPPROTO_IP};
2416 int autoprotocols[] = {IPPROTO_TCP, IPPROTO_UDP};
2417 int items, err, size, socktype, i, j;
2418 UINT pi_size;
2419
2420 SetLastError(0xdeadbeef);
2421 ok(WSASocketA(0, 0, 0, NULL, 0, 0) == INVALID_SOCKET,
2422 "WSASocketA should have failed\n");
2423 err = WSAGetLastError();
2424 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2425
2426 sock = WSASocketA(AF_INET, 0, 0, NULL, 0, 0);
2427 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2429
2430 sock = WSASocketA(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);
2431 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2433
2434 SetLastError(0xdeadbeef);
2435 ok(WSASocketA(0, SOCK_STREAM, -1, NULL, 0, 0) == INVALID_SOCKET,
2436 "WSASocketA should have failed\n");
2437 err = WSAGetLastError();
2438 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2439
2440 SetLastError(0xdeadbeef);
2441 ok(WSASocketA(0, -1, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET,
2442 "WSASocketA should have failed\n");
2443 err = WSAGetLastError();
2444 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2445
2446 SetLastError(0xdeadbeef);
2447 ok(WSASocketA(0, -1, 0, NULL, 0, 0) == INVALID_SOCKET,
2448 "WSASocketA should have failed\n");
2449 err = WSAGetLastError();
2450 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2451
2452 SetLastError(0xdeadbeef);
2453 ok(WSASocketA(AF_INET, -1, 0, NULL, 0, 0) == INVALID_SOCKET,
2454 "WSASocketA should have failed\n");
2455 err = WSAGetLastError();
2456 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2457
2458 SetLastError(0xdeadbeef);
2459 ok(WSASocketA(AF_INET, 0, -1, NULL, 0, 0) == INVALID_SOCKET,
2460 "WSASocketA should have failed\n");
2461 err = WSAGetLastError();
2462 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2463
2464 SetLastError(0xdeadbeef);
2465 ok(WSASocketA(0, -1, -1, NULL, 0, 0) == INVALID_SOCKET,
2466 "WSASocketA should have failed\n");
2467 err = WSAGetLastError();
2468 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2469
2470 SetLastError(0xdeadbeef);
2472 "WSASocketA should have failed\n");
2473 err = WSAGetLastError();
2474 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err);
2475
2476 sock = WSASocketA(AF_INET, 0, IPPROTO_TCP, NULL, 0, 0);
2477 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2479
2480 SetLastError(0xdeadbeef);
2481 ok(WSASocketA(0, SOCK_STREAM, 0, NULL, 0, 0) == INVALID_SOCKET,
2482 "WSASocketA should have failed\n");
2483 err = WSAGetLastError();
2484 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2485
2486 SetLastError(0xdeadbeef);
2487 ok(WSASocketA(0, 0, 0xdead, NULL, 0, 0) == INVALID_SOCKET,
2488 "WSASocketA should have failed\n");
2489 err = WSAGetLastError();
2490 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2491
2492 SetLastError(0xdeadbeef);
2493 ok(WSASocketA(AF_INET, 0xdead, 0, NULL, 0, 0) == INVALID_SOCKET,
2494 "WSASocketA should have failed\n");
2495 err = WSAGetLastError();
2496 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2497
2498 SetLastError(0xdeadbeef);
2499 ok(WSASocketA(0, 0xdead, 0, NULL, 0, 0) == INVALID_SOCKET,
2500 "WSASocketA should have failed\n");
2501 err = WSAGetLastError();
2502 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2503
2504 sock = WSASocketA(0, 0, IPPROTO_TCP, NULL, 0, 0);
2505 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2507
2508 /* SOCK_STREAM does not support IPPROTO_UDP */
2509 SetLastError(0xdeadbeef);
2511 "WSASocketA should have failed\n");
2512 err = WSAGetLastError();
2513 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2514
2515 /* SOCK_DGRAM does not support IPPROTO_TCP */
2516 SetLastError(0xdeadbeef);
2518 "WSASocketA should have failed\n");
2519 err = WSAGetLastError();
2520 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2521
2522 /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
2523 * to avoid a crash on win98.
2524 */
2525 pi_size = 0;
2526 items = WSAEnumProtocolsA(wsaproviders, NULL, &pi_size);
2527 ok(items == SOCKET_ERROR, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
2528 items);
2529 err = WSAGetLastError();
2530 ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2531 err, WSAENOBUFS);
2532
2533 pi = HeapAlloc(GetProcessHeap(), 0, pi_size);
2534 ok(pi != NULL, "Failed to allocate memory\n");
2535 if (pi == NULL) {
2536 skip("Can't continue without memory.\n");
2537 return;
2538 }
2539
2540 items = WSAEnumProtocolsA(wsaproviders, pi, &pi_size);
2541 ok(items != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n",
2542 WSAGetLastError());
2543
2544 if (items == 0) {
2545 skip("No protocols enumerated.\n");
2546 HeapFree(GetProcessHeap(), 0, pi);
2547 return;
2548 }
2549
2551 FROM_PROTOCOL_INFO, &pi[0], 0, 0);
2552 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2553 WSAGetLastError());
2555
2556 /* find what parameters are used first: plain parameters or protocol info struct */
2557 pi[0].iProtocol = -1;
2558 pi[0].iSocketType = -1;
2559 pi[0].iAddressFamily = -1;
2560 ok(WSASocketA(0, 0, IPPROTO_UDP, &pi[0], 0, 0) == INVALID_SOCKET,
2561 "WSASocketA should have failed\n");
2562 err = WSAGetLastError();
2563 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err);
2564
2565 pi[0].iProtocol = 0;
2566 pi[0].iSocketType = 0;
2567 pi[0].iAddressFamily = 0;
2568 sock = WSASocketA(0, 0, IPPROTO_UDP, &pi[0], 0, 0);
2569 if(sock != INVALID_SOCKET)
2570 {
2571 win_skip("must work only in OS <= 2003\n");
2573 }
2574 else
2575 {
2576 err = WSAGetLastError();
2577 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err);
2578 }
2579
2580 pi[0].iProtocol = IPPROTO_UDP;
2581 pi[0].iSocketType = SOCK_DGRAM;
2582 pi[0].iAddressFamily = AF_INET;
2583 sock = WSASocketA(0, 0, 0, &pi[0], 0, 0);
2584 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2585 WSAGetLastError());
2586 size = sizeof(socktype);
2587 socktype = 0xdead;
2588 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2589 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2590 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n",
2591 SOCK_DGRAM, socktype);
2593
2595 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2596 WSAGetLastError());
2597 size = sizeof(socktype);
2598 socktype = 0xdead;
2599 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2600 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2601 ok(socktype == SOCK_STREAM, "Wrong socket type, expected %d received %d\n",
2602 SOCK_STREAM, socktype);
2604
2605 HeapFree(GetProcessHeap(), 0, pi);
2606
2607 pi_size = 0;
2608 items = WSAEnumProtocolsA(NULL, NULL, &pi_size);
2609 ok(items == SOCKET_ERROR, "WSAEnumProtocolsA(NULL, NULL, 0) returned %d\n",
2610 items);
2611 err = WSAGetLastError();
2612 ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2613 err, WSAENOBUFS);
2614
2615 pi = HeapAlloc(GetProcessHeap(), 0, pi_size);
2616 ok(pi != NULL, "Failed to allocate memory\n");
2617 if (pi == NULL) {
2618 skip("Can't continue without memory.\n");
2619 return;
2620 }
2621
2622 items = WSAEnumProtocolsA(NULL, pi, &pi_size);
2623 ok(items != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n",
2624 WSAGetLastError());
2625
2626 /* when no protocol and socket type are specified the first entry
2627 * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO
2628 * is returned */
2629 sock = WSASocketA(AF_INET, 0, 0, NULL, 0, 0);
2630 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2631 WSAGetLastError());
2632
2633 size = sizeof(socktype);
2634 socktype = 0xdead;
2635 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2636 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2637 for(i = 0; i < items; i++)
2638 {
2639 if(pi[i].dwProviderFlags & PFL_MATCHES_PROTOCOL_ZERO)
2640 {
2641 ok(socktype == pi[i].iSocketType, "Wrong socket type, expected %d received %d\n",
2642 pi[i].iSocketType, socktype);
2643 break;
2644 }
2645 }
2646 ok(i != items, "Creating a socket without protocol and socket type didn't work\n");
2648
2649 /* when no socket type is specified the first entry from WSAEnumProtocols
2650 * that matches the protocol is returned */
2651 for (i = 0; i < sizeof(autoprotocols) / sizeof(autoprotocols[0]); i++)
2652 {
2653 sock = WSASocketA(0, 0, autoprotocols[i], NULL, 0, 0);
2654 ok(sock != INVALID_SOCKET, "Failed to create socket for protocol %d, received %d\n",
2655 autoprotocols[i], WSAGetLastError());
2656
2657 size = sizeof(socktype);
2658 socktype = 0xdead;
2659 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2660 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2661
2662 for (err = 1, j = 0; j < items; j++)
2663 {
2664 if (pi[j].iProtocol == autoprotocols[i])
2665 {
2666 if (socktype == pi[j].iSocketType)
2667 err = 0;
2668 else
2669 ok(0, "Wrong socket type, expected %d received %d\n",
2670 pi[j].iSocketType, socktype);
2671 break;
2672 }
2673 }
2674 ok(!err, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols[i]);
2675
2677 }
2678
2679 HeapFree(GetProcessHeap(), 0, pi);
2680
2681 SetLastError(0xdeadbeef);
2682 /* starting on vista the socket function returns error during the socket
2683 creation and no longer in the socket operations (sendto, readfrom) */
2685 if (sock == INVALID_SOCKET)
2686 {
2687 err = WSAGetLastError();
2688 ok(err == WSAEACCES, "Expected 10013, received %d\n", err);
2689 skip("SOCK_RAW is not supported\n");
2690 }
2691 else
2692 {
2693 trace("SOCK_RAW is supported\n");
2694
2695 size = sizeof(socktype);
2696 socktype = 0xdead;
2697 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2698 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2699 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n",
2700 SOCK_RAW, socktype);
2702
2703 todo_wine {
2704 sock = WSASocketA(0, 0, IPPROTO_RAW, NULL, 0, 0);
2705 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2706 WSAGetLastError());
2707 size = sizeof(socktype);
2708 socktype = 0xdead;
2709 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2710 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2711 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n",
2712 SOCK_RAW, socktype);
2714 }
2715
2717 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2718 WSAGetLastError());
2719 size = sizeof(socktype);
2720 socktype = 0xdead;
2721 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2722 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2723 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n",
2724 SOCK_RAW, socktype);
2726 }
2727
2728 /* IPX socket tests */
2729
2730 SetLastError(0xdeadbeef);
2732 if (sock == INVALID_SOCKET)
2733 {
2734 err = WSAGetLastError();
2736 ok(err == WSAEAFNOSUPPORT || broken(err == WSAEPROTONOSUPPORT), "Expected 10047, received %d\n", err);
2737 skip("IPX is not supported\n");
2738 }
2739 else
2740 {
2743
2744 trace("IPX is supported\n");
2745
2746 sock = WSASocketA(0, 0, NSPROTO_IPX, NULL, 0, 0);
2747 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2748 WSAGetLastError());
2749
2750 size = sizeof(socktype);
2751 socktype = 0xdead;
2752 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2753 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2754 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n",
2755 SOCK_DGRAM, socktype);
2756
2757 /* check socket family, type and protocol */
2758 size = sizeof(WSAPROTOCOL_INFOA);
2760 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2761 ok(info.iProtocol == NSPROTO_IPX, "expected protocol %d, received %d\n",
2762 NSPROTO_IPX, info.iProtocol);
2763 ok(info.iAddressFamily == AF_IPX, "expected family %d, received %d\n",
2764 AF_IPX, info.iProtocol);
2765 ok(info.iSocketType == SOCK_DGRAM, "expected type %d, received %d\n",
2766 SOCK_DGRAM, info.iSocketType);
2768
2769 /* SOCK_STREAM does not support NSPROTO_IPX */
2770 SetLastError(0xdeadbeef);
2772 "WSASocketA should have failed\n");
2773 err = WSAGetLastError();
2774 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2775
2776 /* test extended IPX support - that is adding any number between 0 and 255
2777 * to the IPX protocol value will make it be used as IPX packet type */
2778 for(i = 0;i <= 255;i += 17)
2779 {
2780 SetLastError(0xdeadbeef);
2781 sock = WSASocketA(0, 0, NSPROTO_IPX + i, NULL, 0, 0);
2782 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2783 WSAGetLastError());
2784
2785 size = sizeof(int);
2786 socktype = -1;
2787 err = getsockopt(sock, NSPROTO_IPX, IPX_PTYPE, (char *) &socktype, &size);
2788 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2789 ok(socktype == i, "Wrong IPX packet type, expected %d received %d\n",
2790 i, socktype);
2791
2793 }
#define IPPROTO_RAW
Definition: ip.h:192
#define IPPROTO_ICMP
Definition: ip.h:194
INT WSAAPI WSAEnumProtocolsA(IN LPINT lpiProtocols, OUT LPWSAPROTOCOL_INFOA lpProtocolBuffer, IN OUT LPDWORD lpdwBufferLength)
Definition: enumprot.c:229
static TCHAR * items[]
Definition: page1.c:45
#define WSAEPROTONOSUPPORT
Definition: winerror.h:1956
#define WSAESOCKTNOSUPPORT
Definition: winerror.h:1957
#define FROM_PROTOCOL_INFO
Definition: winsock2.h:246
#define PFL_MATCHES_PROTOCOL_ZERO
Definition: winsock2.h:433
#define SOCK_RAW
Definition: winsock.h:337
#define AF_IPX
Definition: winsock.h:350
#define NSPROTO_IPX
Definition: wsipx.h:11

◆ test_WSAStringToAddressA()

static void test_WSAStringToAddressA ( void  )
static

Definition at line 3359 of file sock.c.

3362{
3363 INT ret, len;
3365 SOCKADDR_IN6 sockaddr6;
3366 int GLE;
3367
3368 CHAR address1[] = "0.0.0.0";
3369 CHAR address2[] = "127.127.127.127";
3370 CHAR address3[] = "255.255.255.255";
3371 CHAR address4[] = "127.127.127.127:65535";
3372 CHAR address5[] = "255.255.255.255:65535";
3373 CHAR address6[] = "::1";
3374 CHAR address7[] = "[::1]";
3375 CHAR address8[] = "[::1]:65535";
3376 CHAR address9[] = "2001::1";
3377
3378 len = 0;
3379 sockaddr.sin_family = AF_INET;
3380
3381 ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3382 ok( ret == SOCKET_ERROR, "WSAStringToAddressA() succeeded unexpectedly: %d\n",
3383 WSAGetLastError() );
3384
3385 len = sizeof(sockaddr);
3386 sockaddr.sin_port = 0;
3387 sockaddr.sin_addr.s_addr = 0;
3388
3389 ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3390 ok( !ret && sockaddr.sin_addr.s_addr == 0,
3391 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3392
3393 len = sizeof(sockaddr);
3394 sockaddr.sin_port = 0;
3395 sockaddr.sin_addr.s_addr = 0;
3396
3397 ret = WSAStringToAddressA( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3398 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
3399 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3400
3401 len = sizeof(sockaddr);
3402 sockaddr.sin_port = 0;
3403 sockaddr.sin_addr.s_addr = 0;
3404
3405 ret = WSAStringToAddressA( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3406 GLE = WSAGetLastError();
3407 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) ||
3409 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
3410
3411 len = sizeof(sockaddr);
3412 sockaddr.sin_port = 0;
3413 sockaddr.sin_addr.s_addr = 0;
3414
3415 ret = WSAStringToAddressA( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3416 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
3417 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3418
3419 len = sizeof(sockaddr);
3420 sockaddr.sin_port = 0;
3421 sockaddr.sin_addr.s_addr = 0;
3422
3423 ret = WSAStringToAddressA( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3424 GLE = WSAGetLastError();
3425 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) ||
3427 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
3428
3429 len = sizeof(sockaddr);
3430
3431 ret = WSAStringToAddressA( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3432 GLE = WSAGetLastError();
3433 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3434 "WSAStringToAddressA() should have failed with %d\n", GLE );
3435
3436 len = sizeof(sockaddr6);
3437 memset(&sockaddr6, 0, len);
3438 sockaddr6.sin6_family = AF_INET6;
3439
3440 ret = WSAStringToAddressA( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3441 &len );
3442 if (ret == SOCKET_ERROR)
3443 {
3444 win_skip("IPv6 not supported\n");
3445 return;
3446 }
3447
3448 GLE = WSAGetLastError();
3449 ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
3450
3451 len = sizeof(sockaddr6);
3452 memset(&sockaddr6, 0, len);
3453 sockaddr6.sin6_family = AF_INET6;
3454
3455 ret = WSAStringToAddressA( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3456 &len );
3457 GLE = WSAGetLastError();
3458 ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
3459
3460 len = sizeof(sockaddr6);
3461 memset(&sockaddr6, 0, len);
3462 sockaddr6.sin6_family = AF_INET6;
3463
3464 ret = WSAStringToAddressA( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3465 &len );
3466 GLE = WSAGetLastError();
3467 ok( ret == 0 && sockaddr6.sin6_port == 0xffff,
3468 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
3469
3470 len = sizeof(sockaddr6);
3471
3472 ret = WSAStringToAddressA( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3473 GLE = WSAGetLastError();
3474 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3475 "WSAStringToAddressW() should have failed with %d\n", GLE );
3476
3477 len = sizeof(sockaddr6);
3478
3479 ret = WSAStringToAddressA( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3480 GLE = WSAGetLastError();
3481 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
INT WSAAPI WSAStringToAddressA(IN LPSTR AddressString, IN INT AddressFamily, IN LPWSAPROTOCOL_INFOA lpProtocolInfo, OUT LPSOCKADDR lpAddress, IN OUT LPINT lpAddressLength)
Definition: rnr.c:883

◆ test_WSAStringToAddressW()

static void test_WSAStringToAddressW ( void  )
static

Definition at line 3483 of file sock.c.

3486{
3487 INT ret, len;
3489 SOCKADDR_IN6 sockaddr6;
3490 SOCKADDR_STORAGE sockaddr_storage;
3491 int GLE;
3492
3493 WCHAR address1[] = { '0','.','0','.','0','.','0', 0 };
3494 WCHAR address2[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 };
3495 WCHAR address3[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3496 WCHAR address4[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7',
3497 ':', '6', '5', '5', '3', '5', 0 };
3498 WCHAR address5[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3499 '6', '5', '5', '3', '5', 0 };
3500 WCHAR address6[] = {':',':','1','\0'};
3501 WCHAR address7[] = {'[',':',':','1',']','\0'};
3502 WCHAR address8[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'};
3503 WCHAR address9[] = {'2','0','0','1',':',':','1','\0'};
3504
3505 len = 0;
3506 sockaddr.sin_family = AF_INET;
3507
3508 ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3509 ok( ret == SOCKET_ERROR, "WSAStringToAddressW() failed unexpectedly: %d\n",
3510 WSAGetLastError() );
3511
3512 len = sizeof(sockaddr);
3513 sockaddr.sin_port = 0;
3514 sockaddr.sin_addr.s_addr = 0;
3515
3516 ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3517 ok( !ret && sockaddr.sin_addr.s_addr == 0,
3518 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3519
3520 len = sizeof(sockaddr);
3521 sockaddr.sin_port = 0;
3522 sockaddr.sin_addr.s_addr = 0;
3523
3524 ret = WSAStringToAddressW( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3525 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
3526 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3527
3528 len = sizeof(sockaddr);
3529 sockaddr.sin_port = 0;
3530 sockaddr.sin_addr.s_addr = 0;
3531
3532 ret = WSAStringToAddressW( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3533 GLE = WSAGetLastError();
3534 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) ||
3536 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
3537
3538 len = sizeof(sockaddr);
3539 sockaddr.sin_port = 0;
3540 sockaddr.sin_addr.s_addr = 0;
3541
3542 ret = WSAStringToAddressW( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3543 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
3544 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3545
3546 len = sizeof(sockaddr);
3547 sockaddr.sin_port = 0;
3548 sockaddr.sin_addr.s_addr = 0;
3549
3550 ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3551 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) ||
3553 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
3554
3555 /* Test with a larger buffer than necessary */
3556 len = sizeof(sockaddr_storage);
3558 sin->sin_port = 0;
3559 sin->sin_addr.s_addr = 0;
3560
3561 ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)sin, &len );
3562 ok( (ret == 0 && sin->sin_addr.s_addr == 0xffffffff && sin->sin_port == 0xffff) ||
3564 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
3565 ok( len == sizeof(SOCKADDR_IN), "unexpected length %d\n", len );
3566
3567 len = sizeof(sockaddr);
3568
3569 ret = WSAStringToAddressW( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3570 GLE = WSAGetLastError();
3571 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3572 "WSAStringToAddressW() should have failed with %d\n", GLE );
3573
3574 len = sizeof(sockaddr6);
3575 memset(&sockaddr6, 0, len);
3576 sockaddr6.sin6_family = AF_INET6;
3577
3578 ret = WSAStringToAddressW( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3579 &len );
3580 if (ret == SOCKET_ERROR)
3581 {
3582 win_skip("IPv6 not supported\n");
3583 return;
3584 }
3585
3586 GLE = WSAGetLastError();
3587 ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
3588
3589 len = sizeof(sockaddr6);
3590 memset(&sockaddr6, 0, len);
3591 sockaddr6.sin6_family = AF_INET6;
3592
3593 ret = WSAStringToAddressW( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3594 &len );
3595 GLE = WSAGetLastError();
3596 ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
3597
3598 len = sizeof(sockaddr6);
3599 memset(&sockaddr6, 0, len);
3600 sockaddr6.sin6_family = AF_INET6;
3601
3602 ret = WSAStringToAddressW( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3603 &len );
3604 GLE = WSAGetLastError();
3605 ok( ret == 0 && sockaddr6.sin6_port == 0xffff,
3606 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
3607
3608 len = sizeof(sockaddr6);
3609
3610 ret = WSAStringToAddressW( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3611 GLE = WSAGetLastError();
3612 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3613 "WSAStringToAddressW() should have failed with %d\n", GLE );
3614
3615 len = sizeof(sockaddr6);
3616
3617 ret = WSAStringToAddressW( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3618 GLE = WSAGetLastError();
3619 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
INT WSAAPI WSAStringToAddressW(IN LPWSTR AddressString, IN INT AddressFamily, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPSOCKADDR lpAddress, IN OUT LPINT lpAddressLength)
Definition: rnr.c:977

◆ verify_ipv6_addrinfo()

static void verify_ipv6_addrinfo ( ADDRINFOA result,
const char expectedIp 
)
static

Definition at line 7714 of file sock.c.

7717{
7718 SOCKADDR_IN6 *sockaddr6;
7719 char ipBuffer[256];
7720 const char *ret;
7721
7722 ok(result->ai_family == AF_INET6, "ai_family == %d\n", result->ai_family);
7723 ok(result->ai_addrlen >= sizeof(struct sockaddr_in6), "ai_addrlen == %d\n", (int)result->ai_addrlen);
7724 ok(result->ai_addr != NULL, "ai_addr == NULL\n");
7725
7726 if (result->ai_addr != NULL)
7727 {
7728 sockaddr6 = (SOCKADDR_IN6 *)result->ai_addr;
7729 ok(sockaddr6->sin6_family == AF_INET6, "ai_addr->sin6_family == %d\n", sockaddr6->sin6_family);
7730 ok(sockaddr6->sin6_port == 0, "ai_addr->sin6_port == %d\n", sockaddr6->sin6_port);
7731
7732 ZeroMemory(ipBuffer, sizeof(ipBuffer));
7733 ret = pInetNtop(AF_INET6, &sockaddr6->sin6_addr, ipBuffer, sizeof(ipBuffer));
7734 ok(ret != NULL, "inet_ntop failed (%d)\n", WSAGetLastError());
7735 ok(strcmp(ipBuffer, expectedIp) == 0, "ai_addr->sin6_addr == '%s' (expected '%s')\n", ipBuffer, expectedIp);
#define ZeroMemory
Definition: winbase.h:1712

◆ void()

static void ( WINAPI pfreeaddrinfo)
static

◆ wait_for_async_message()

static void wait_for_async_message ( HWND  hwnd,
HANDLE  handle 
)
static

Definition at line 9537 of file sock.c.

9540{
9541 BOOL ret;
9542 MSG msg;
9543
9544 while ((ret = GetMessageA(&msg, 0, 0, 0)) &&
9545 !(msg.hwnd == hwnd && msg.message == WM_ASYNCCOMPLETE))
9546 {
9549 }
9550
9551 ok(ret, "did not expect WM_QUIT message\n");
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)

◆ write_watch_thread()

static DWORD CALLBACK write_watch_thread ( void arg)
static

Definition at line 6931 of file sock.c.

6934{
6936 struct sockaddr addr;
6937 int addr_len = sizeof(addr), ret;
6938 DWORD bytes, flags = 0;
6939 WSABUF buf[1];
6940
6941 switch (args->func)
6942 {
6943 case 0:
6944 ret = recv( args->dest, args->base, args->size, 0 );
6945 ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret );
6946 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6947 break;
6948 case 1:
6949 ret = recvfrom( args->dest, args->base, args->size, 0, &addr, &addr_len );
6950 ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret );
6951 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6952 break;
6953 case 2:
6954 buf[0].len = args->size;
6955 buf[0].buf = args->base;
6956 ret = WSARecv( args->dest, buf, 1, &bytes, &flags, NULL, NULL );
6957 ok( !ret, "WSARecv failed %u\n", GetLastError() );
6958 ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes );
6959 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6960 break;
6961 case 3:
6962 buf[0].len = args->size;
6963 buf[0].buf = args->base;
6964 ret = WSARecvFrom( args->dest, buf, 1, &bytes, &flags, &addr, &addr_len, NULL, NULL );
6965 ok( !ret, "WSARecvFrom failed %u\n", GetLastError() );
6966 ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes );
6967 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6968 break;
6969 }
void * arg
Definition: msvc.h:10

◆ ws2_test_WndProc()

static LRESULT CALLBACK ws2_test_WndProc ( HWND  hwnd,
UINT  msg,
WPARAM  wparam,
LPARAM  lparam 
)
static

Definition at line 5505 of file sock.c.

5508{
5509 struct async_message *message;
5510
5511 switch (msg)
5512 {
5513 case WM_SOCKET:
5514 message = HeapAlloc(GetProcessHeap(), 0, sizeof(*message));
5515 message->socket = (SOCKET) wparam;
5516 message->lparam = lparam;
5517 message->next = NULL;
5518
5520 {
5522 while (last->next) last = last->next;
5523 last->next = message;
5524 }
5525 else
5527 return 0;
5528 }
5529
@ lparam
Definition: SystemMenu.c:31
@ wparam
Definition: SystemMenu.c:30

Referenced by test_events().

◆ wsa_async_select_thread()

static DWORD WINAPI wsa_async_select_thread ( void param)
static

Definition at line 11228 of file sock.c.

11231{
11233 int ret;
11234
11236 ok(!ret, "got %d\n", ret);
11237

◆ wsa_recv_thread()

static DWORD WINAPI wsa_recv_thread ( void param)
static

Definition at line 11246 of file sock.c.

11249{
11250 struct wsa_recv_info *info = param;
11251 int ret;
11252 DWORD flags, bytes;
11253
11254 bytes = 0xdeadbeef;
11255 flags = 0;
11256 SetLastError(0xdeadbeef);
11257 ret = WSARecv(info->sock, &info->wsa_buf, 1, &bytes, &flags, &info->ovl, NULL);
11258 ok(ret == SOCKET_ERROR, "got %d\n", ret);
11259 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
11260 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11261

Variable Documentation

◆ BOOL

Definition at line 101 of file sock.c.

Referenced by test_events(), and test_set_getsockopt().

◆ client_id

int client_id
static

Definition at line 234 of file sock.c.

Referenced by client_start(), and StartClients().

◆ client_ready

HANDLE client_ready[MAX_CLIENTS]
static

Definition at line 233 of file sock.c.

Referenced by client_start(), do_test(), and StartClients().

◆ completion_called

int completion_called
static

Definition at line 6738 of file sock.c.

Referenced by io_completion().

◆ completion_routine

namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine

Definition at line 82 of file sock.c.

Referenced by serverThreadMain5(), and test_readfileex_pending().

◆ drain_pause

BOOL drain_pause = FALSE
static

Definition at line 5327 of file sock.c.

Referenced by drain_socket_thread(), and test_events().

◆ DWORD

Definition at line 88 of file sock.c.

◆ FILE_INFORMATION_CLASS

Definition at line 96 of file sock.c.

◆ handle

Definition at line 82 of file sock.c.

◆ hints

◆ hinttests

const struct addr_hint_tests hinttests[]
static

Referenced by test_GetAddrInfoW().

◆ INT

INT

Definition at line 93 of file sock.c.

◆ linger_testvals

const LINGER linger_testvals[]
static
Initial value:
= {
{0,0},
{0,73},
{1,0},
{5,189}
}

Definition at line 1397 of file sock.c.

Referenced by test_set_getsockopt().

◆ LPCSTR

Definition at line 75 of file sock.c.

◆ LPCWSTR

Definition at line 78 of file sock.c.

◆ LPDWORD

Definition at line 90 of file sock.c.

◆ LPHANDLE

Definition at line 88 of file sock.c.

◆ LPSTR

Definition at line 84 of file sock.c.

◆ LPVOID

Definition at line 84 of file sock.c.

◆ LPWSANAMESPACE_INFOA

Definition at line 91 of file sock.c.

◆ LPWSANAMESPACE_INFOW

Definition at line 92 of file sock.c.

◆ LPWSAQUERYSETW

◆ LPWSTR

Definition at line 85 of file sock.c.

◆ messages_received

struct async_message* messages_received
static

Definition at line 5502 of file sock.c.

Referenced by ws2_test_WndProc().

◆ namespace_id

namespace GUID* namespace_id

Definition at line 80 of file sock.c.

◆ overlapped

◆ PIO_STATUS_BLOCK

Definition at line 96 of file sock.c.

◆ PULONG

Definition at line 100 of file sock.c.

◆ PVOID

Definition at line 96 of file sock.c.

◆ result

namespace GUID const ADDRINFOEXW ADDRINFOEXW** result

Definition at line 80 of file sock.c.

Referenced by test_GetAddrInfoW().

◆ server_ready

◆ servname

const ADDRINFOW PADDRINFOW *static const WCHAR* servname

Definition at line 79 of file sock.c.

Referenced by getaddrinfo(), and WspiapiGetAddrInfo().

◆ tests

test_setup tests[]
static

Definition at line 2190 of file sock.c.

Referenced by test_set_getsockopt().

◆ thread

HANDLE thread[1+MAX_CLIENTS]
static

Definition at line 230 of file sock.c.

Referenced by do_test(), StartClients(), and StartServer().

◆ thread_id

DWORD thread_id[1+MAX_CLIENTS]
static

Definition at line 231 of file sock.c.

Referenced by do_test(), StartClients(), and StartServer().

◆ timeout

namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval* timeout

Definition at line 81 of file sock.c.

Referenced by test_set_getsockopt().

◆ tls

◆ ULONG

Definition at line 84 of file sock.c.