1 /*
2  * Unit test suite for winsock functions
3  *
4  * Copyright 2002 Martin Wilck
5  * Copyright 2005 Thomas Kho
6  * Copyright 2008 Jeff Zaroyko
7  * Copyright 2017 Dmitry Timoshkov
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #ifdef __REACTOS__
25 #undef _WIN32_WINNT
26 #define _WIN32_WINNT 0x0600
27 #endif
28 
29 #include <ntstatus.h>
30 #define WIN32_NO_STATUS
31 #include <winsock2.h>
32 #include <windows.h>
33 #include <winternl.h>
34 #include <ws2tcpip.h>
35 #include <wsipx.h>
36 #include <wsnwlink.h>
37 #include <mswsock.h>
38 #include <mstcpip.h>
39 #include <iphlpapi.h>
40 #include <stdio.h>
41 #include "wine/test.h"
42 
43 // ReactOS: Wine has this in mstcpip.h, but it doesn't belong there
44 #define WSA_CMSG_ALIGN(len)     (((len) + sizeof(SIZE_T) - 1) & ~(sizeof(SIZE_T) - 1))
45 
46 #define MAX_CLIENTS 4      /* Max number of clients */
47 #define FIRST_CHAR 'A'     /* First character in transferred pattern */
48 #define BIND_SLEEP 10      /* seconds to wait between attempts to bind() */
49 #define BIND_TRIES 6       /* Number of bind() attempts */
50 #define TEST_TIMEOUT 30    /* seconds to wait before killing child threads
51                               after server initialization, if something hangs */
52 
53 #define NUM_UDP_PEERS 3    /* Number of UDP sockets to create and test > 1 */
54 
55 #define NUM_THREADS 3      /* Number of threads to run getservbyname */
56 #define NUM_QUERIES 250    /* Number of getservbyname queries per thread */
57 
58 #define SERVERIP "127.0.0.1"   /* IP to bind to */
59 #define SERVERPORT 9374        /* Port number to bind to */
60 
61 #define wsa_ok(op, cond, msg) \
62    do { \
63         int tmp, err = 0; \
64         tmp = op; \
65         if ( !(cond tmp) ) err = WSAGetLastError(); \
66         ok ( cond tmp, msg, GetCurrentThreadId(), err); \
67    } while (0);
68 
69 #define make_keepalive(k, enable, time, interval) \
70    k.onoff = enable; \
71    k.keepalivetime = time; \
72    k.keepaliveinterval = interval;
73 
74 /* Function pointers */
75 static void  (WINAPI *pfreeaddrinfo)(struct addrinfo *);
76 static int   (WINAPI *pgetaddrinfo)(LPCSTR,LPCSTR,const struct addrinfo *,struct addrinfo **);
77 static void  (WINAPI *pFreeAddrInfoW)(PADDRINFOW);
78 static void  (WINAPI *pFreeAddrInfoExW)(ADDRINFOEXW *ai);
79 static int   (WINAPI *pGetAddrInfoW)(LPCWSTR,LPCWSTR,const ADDRINFOW *,PADDRINFOW *);
80 static int   (WINAPI *pGetAddrInfoExW)(const WCHAR *name, const WCHAR *servname, DWORD namespace,
81         GUID *namespace_id, const ADDRINFOEXW *hints, ADDRINFOEXW **result,
82         struct timeval *timeout, OVERLAPPED *overlapped,
83         LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine, HANDLE *handle);
84 static int   (WINAPI *pGetAddrInfoExOverlappedResult)(OVERLAPPED *overlapped);
85 static PCSTR (WINAPI *pInetNtop)(INT,LPVOID,LPSTR,ULONG);
86 static PCWSTR(WINAPI *pInetNtopW)(INT,LPVOID,LPWSTR,ULONG);
87 static int   (WINAPI *pInetPtonA)(INT,LPCSTR,LPVOID);
88 static int   (WINAPI *pInetPtonW)(INT,LPWSTR,LPVOID);
89 static int   (WINAPI *pWSALookupServiceBeginW)(LPWSAQUERYSETW,DWORD,LPHANDLE);
90 static int   (WINAPI *pWSALookupServiceEnd)(HANDLE);
91 static int   (WINAPI *pWSALookupServiceNextW)(HANDLE,DWORD,LPDWORD,LPWSAQUERYSETW);
92 static int   (WINAPI *pWSAEnumNameSpaceProvidersA)(LPDWORD,LPWSANAMESPACE_INFOA);
93 static int   (WINAPI *pWSAEnumNameSpaceProvidersW)(LPDWORD,LPWSANAMESPACE_INFOW);
94 static int   (WINAPI *pWSAPoll)(WSAPOLLFD *,ULONG,INT);
95 
96 /* Function pointers from ntdll */
97 static NTSTATUS (WINAPI *pNtSetInformationFile)(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS);
98 static NTSTATUS (WINAPI *pNtQueryInformationFile)(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS);
99 
100 /* Function pointers from iphlpapi */
101 static DWORD (WINAPI *pGetAdaptersInfo)(PIP_ADAPTER_INFO,PULONG);
102 static DWORD (WINAPI *pGetIpForwardTable)(PMIB_IPFORWARDTABLE,PULONG,BOOL);
103 
104 /* Function pointers from ntdll */
105 static DWORD (WINAPI *pNtClose)(HANDLE);
106 
107 /**************** Structs and typedefs ***************/
108 
109 typedef struct thread_info
110 {
111     HANDLE thread;
112     DWORD id;
113 } thread_info;
114 
115 /* Information in the server about open client connections */
116 typedef struct sock_info
117 {
118     SOCKET                 s;
119     struct sockaddr_in     addr;
120     struct sockaddr_in     peer;
121     char                  *buf;
122     int                    n_recvd;
123     int                    n_sent;
124 } sock_info;
125 
126 /* Test parameters for both server & client */
127 typedef struct test_params
128 {
129     int          sock_type;
130     int          sock_prot;
131     const char  *inet_addr;
132     short        inet_port;
133     int          chunk_size;
134     int          n_chunks;
135     int          n_clients;
136 } test_params;
137 
138 /* server-specific test parameters */
139 typedef struct server_params
140 {
141     test_params   *general;
142     DWORD          sock_flags;
143     int            buflen;
144 } server_params;
145 
146 /* client-specific test parameters */
147 typedef struct client_params
148 {
149     test_params   *general;
150     DWORD          sock_flags;
151     int            buflen;
152 } client_params;
153 
154 /* This type combines all information for setting up a test scenario */
155 typedef struct test_setup
156 {
157     test_params              general;
158     LPVOID                   srv;
159     server_params            srv_params;
160     LPVOID                   clt;
161     client_params            clt_params;
162 } test_setup;
163 
164 /* Thread local storage for server */
165 typedef struct server_memory
166 {
167     SOCKET                  s;
168     struct sockaddr_in      addr;
169     sock_info               sock[MAX_CLIENTS];
170 } server_memory;
171 
172 /* Thread local storage for client */
173 typedef struct client_memory
174 {
175     SOCKET s;
176     struct sockaddr_in      addr;
177     char                   *send_buf;
178     char                   *recv_buf;
179 } client_memory;
180 
181 /* SelectReadThread thread parameters */
182 typedef struct select_thread_params
183 {
184     SOCKET s;
185     BOOL ReadKilled;
186 } select_thread_params;
187 
188 /* Tests used in both getaddrinfo and GetAddrInfoW */
189 static const struct addr_hint_tests
190 {
191     int family, socktype, protocol;
192     DWORD error;
193 } hinttests[] = {
194     {AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0 },
195     {AF_UNSPEC, SOCK_STREAM, IPPROTO_UDP, 0 },
196     {AF_UNSPEC, SOCK_STREAM, IPPROTO_IPV6,0 },
197     {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_TCP, 0 },
198     {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_UDP, 0 },
199     {AF_UNSPEC, SOCK_DGRAM,  IPPROTO_IPV6,0 },
200     {AF_INET,   SOCK_STREAM, IPPROTO_TCP, 0 },
201     {AF_INET,   SOCK_STREAM, IPPROTO_UDP, 0 },
202     {AF_INET,   SOCK_STREAM, IPPROTO_IPV6,0 },
203     {AF_INET,   SOCK_DGRAM,  IPPROTO_TCP, 0 },
204     {AF_INET,   SOCK_DGRAM,  IPPROTO_UDP, 0 },
205     {AF_INET,   SOCK_DGRAM,  IPPROTO_IPV6,0 },
206     {AF_UNSPEC, 0,           IPPROTO_TCP, 0 },
207     {AF_UNSPEC, 0,           IPPROTO_UDP, 0 },
208     {AF_UNSPEC, 0,           IPPROTO_IPV6,0 },
209     {AF_UNSPEC, SOCK_STREAM, 0,           0 },
210     {AF_UNSPEC, SOCK_DGRAM,  0,           0 },
211     {AF_INET,   0,           IPPROTO_TCP, 0 },
212     {AF_INET,   0,           IPPROTO_UDP, 0 },
213     {AF_INET,   0,           IPPROTO_IPV6,0 },
214     {AF_INET,   SOCK_STREAM, 0,           0 },
215     {AF_INET,   SOCK_DGRAM,  0,           0 },
216     {AF_UNSPEC, 999,         IPPROTO_TCP, WSAESOCKTNOSUPPORT },
217     {AF_UNSPEC, 999,         IPPROTO_UDP, WSAESOCKTNOSUPPORT },
218     {AF_UNSPEC, 999,         IPPROTO_IPV6,WSAESOCKTNOSUPPORT },
219     {AF_INET,   999,         IPPROTO_TCP, WSAESOCKTNOSUPPORT },
220     {AF_INET,   999,         IPPROTO_UDP, WSAESOCKTNOSUPPORT },
221     {AF_INET,   999,         IPPROTO_IPV6,WSAESOCKTNOSUPPORT },
222     {AF_UNSPEC, SOCK_STREAM, 999,         0 },
223     {AF_UNSPEC, SOCK_STREAM, 999,         0 },
224     {AF_INET,   SOCK_DGRAM,  999,         0 },
225     {AF_INET,   SOCK_DGRAM,  999,         0 },
226 };
227 
228 /**************** Static variables ***************/
229 
230 static DWORD      tls;              /* Thread local storage index */
231 static HANDLE     thread[1+MAX_CLIENTS];
232 static DWORD      thread_id[1+MAX_CLIENTS];
233 static HANDLE     server_ready;
234 static HANDLE     client_ready[MAX_CLIENTS];
235 static int        client_id;
236 
237 /**************** General utility functions ***************/
238 
239 static SOCKET setup_server_socket(struct sockaddr_in *addr, int *len);
240 static SOCKET setup_connector_socket(struct sockaddr_in *addr, int len, BOOL nonblock);
241 
242 static int tcp_socketpair(SOCKET *src, SOCKET *dst)
243 {
244     SOCKET server = INVALID_SOCKET;
245     struct sockaddr_in addr;
246     int len;
247     int ret;
248 
249     *src = INVALID_SOCKET;
250     *dst = INVALID_SOCKET;
251 
252     *src = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
253     if (*src == INVALID_SOCKET)
254         goto end;
255 
256     server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
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 
283 end:
284     if (server != INVALID_SOCKET)
285         closesocket(server);
286     if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET)
287         return 0;
288     closesocket(*src);
289     closesocket(*dst);
290     return -1;
291 }
292 
293 static int tcp_socketpair_ovl(SOCKET *src, SOCKET *dst)
294 {
295     SOCKET server = INVALID_SOCKET;
296     struct sockaddr_in addr;
297     int len, ret;
298 
299     *src = INVALID_SOCKET;
300     *dst = INVALID_SOCKET;
301 
302     *src = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
303     if (*src == INVALID_SOCKET)
304         goto end;
305 
306     server = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
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 
333 end:
334     if (server != INVALID_SOCKET)
335         closesocket(server);
336     if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET)
337         return 0;
338     closesocket(*src);
339     closesocket(*dst);
340     return -1;
341 }
342 
343 static void set_so_opentype ( BOOL overlapped )
344 {
345     int optval = !overlapped, newval, len = sizeof (int);
346 
347     ok ( setsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
348                       (LPVOID) &optval, sizeof (optval) ) == 0,
349          "setting SO_OPENTYPE failed\n" );
350     ok ( getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
351                       (LPVOID) &newval, &len ) == 0,
352          "getting SO_OPENTYPE failed\n" );
353     ok ( optval == newval, "failed to set SO_OPENTYPE\n" );
354 }
355 
356 static int set_blocking ( SOCKET s, BOOL blocking )
357 {
358     u_long val = !blocking;
359     return ioctlsocket ( s, FIONBIO, &val );
360 }
361 
362 static void fill_buffer ( char *buf, int chunk_size, int n_chunks )
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 );
367 }
368 
369 static int test_buffer ( char *buf, int chunk_size, int n_chunks )
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;
379 }
380 
381 /*
382  * This routine is called when a client / server does not expect any more data,
383  * but needs to acknowledge the closing of the connection (by reading 0 bytes).
384  */
385 static void read_zero_bytes ( SOCKET s )
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 );
392 }
393 
394 static int do_synchronous_send ( SOCKET s, char *buf, int buflen, int flags, int sendlen )
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;
405 }
406 
407 static int do_synchronous_recv ( SOCKET s, char *buf, int buflen, int flags, int recvlen )
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;
418 }
419 
420 static int do_synchronous_recvfrom ( SOCKET s, char *buf, int buflen, int flags, struct sockaddr *from, int *fromlen, int recvlen )
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;
431 }
432 
433 /*
434  *  Call this routine right after thread startup.
435  *  SO_OPENTYPE must by 0, regardless what the server did.
436  */
437 static void check_so_opentype (void)
438 {
439     int tmp = 1, len;
440     len = sizeof (tmp);
441     getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (LPVOID) &tmp, &len );
442     ok ( tmp == 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp );
443 }
444 
445 static void compare_addrinfo (ADDRINFO *a, ADDRINFO *b)
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);
471 }
472 
473 static void compare_addrinfow (ADDRINFOW *a, ADDRINFOW *b)
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);
499 }
500 
501 /**************** Server utility functions ***************/
502 
503 /*
504  *  Even if we have closed our server socket cleanly,
505  *  the OS may mark the address "in use" for some time -
506  *  this happens with native Linux apps, too.
507  */
508 static void do_bind ( SOCKET s, struct sockaddr* addr, int addrlen )
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 );
520 }
521 
522 static void server_start ( server_params *par )
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) );
547 }
548 
549 static void server_stop (void)
550 {
551     int i;
552     server_memory *mem = TlsGetValue ( tls );
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 );
562     ExitThread ( GetCurrentThreadId () );
563 }
564 
565 /**************** Client utilitiy functions ***************/
566 
567 static void client_start ( client_params *par )
568 {
569     test_params *gen = par->general;
570     client_memory *mem = LocalAlloc (LPTR, sizeof (client_memory));
571 
572     TlsSetValue ( tls, mem );
573 
574     WaitForSingleObject ( server_ready, INFINITE );
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 
589     SetEvent ( client_ready[client_id] );
590     /* Wait for the other clients to come up */
591     WaitForMultipleObjects ( min ( gen->n_clients, MAX_CLIENTS ), client_ready, TRUE, INFINITE );
592 }
593 
594 static void client_stop (void)
595 {
596     client_memory *mem = TlsGetValue ( tls );
597     wsa_ok ( closesocket ( mem->s ), 0 ==, "closesocket error (%x): %d\n" );
598     LocalFree ( mem->send_buf );
599     LocalFree ( mem );
600     ExitThread(0);
601 }
602 
603 /**************** Servers ***************/
604 
605 /*
606  * simple_server: A very basic server doing synchronous IO.
607  */
608 static VOID WINAPI simple_server ( server_params *par )
609 {
610     test_params *gen = par->general;
611     server_memory *mem;
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 ();
659 }
660 
661 /*
662  * oob_server: A very basic server receiving out-of-band data.
663  */
664 static VOID WINAPI oob_server ( server_params *par )
665 {
666     test_params *gen = par->general;
667     server_memory *mem;
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 ();
735 }
736 
737 /*
738  * select_server: A non-blocking server.
739  */
740 static VOID WINAPI select_server ( server_params *par )
741 {
742     test_params *gen = par->general;
743     server_memory *mem;
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 ();
865 }
866 
867 /**************** Clients ***************/
868 
869 /*
870  * simple_client: A very basic client doing synchronous IO.
871  */
872 static VOID WINAPI simple_client ( client_params *par )
873 {
874     test_params *gen = par->general;
875     client_memory *mem;
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 */
881     WaitForSingleObject ( server_ready, INFINITE );
882     trace ( "simple_client (%x): server ready\n", id );
883 
884     check_so_opentype ();
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 ();
917 }
918 
919 /*
920  * oob_client: A very basic client sending out-of-band data.
921  */
922 static VOID WINAPI oob_client ( client_params *par )
923 {
924     test_params *gen = par->general;
925     client_memory *mem;
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 */
931     WaitForSingleObject ( server_ready, INFINITE );
932     trace ( "oob_client (%x): server ready\n", id );
933 
934     check_so_opentype ();
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 ();
970 }
971 
972 /*
973  * simple_mixed_client: mixing send and recvfrom
974  */
975 static VOID WINAPI simple_mixed_client ( client_params *par )
976 {
977     test_params *gen = par->general;
978     client_memory *mem;
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 */
986     WaitForSingleObject ( server_ready, INFINITE );
987     trace ( "simple_client (%x): server ready\n", id );
988 
989     check_so_opentype ();
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 ();
1039 }
1040 
1041 /*
1042  * event_client: An event-driven client
1043  */
1044 static void WINAPI event_client ( client_params *par )
1045 {
1046     test_params *gen = par->general;
1047     client_memory *mem;
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;
1053     LONG mask = FD_READ | FD_WRITE | FD_CLOSE;
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 ();
1063     WSAEventSelect ( mem->s, event, FD_CONNECT );
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 );
1068         tmp = WaitForSingleObject ( event, INFINITE );
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     {
1088         err = WaitForSingleObject ( event, INFINITE );
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 
1164 out:
1165     WSACloseEvent ( event );
1166     trace ( "event_client (%x) exiting\n", id );
1167     client_stop ();
1168 }
1169 
1170 /* Tests for WSAStartup */
1171 static void test_WithoutWSAStartup(void)
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);
1184 }
1185 
1186 static void test_WithWSAStartup(void)
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     {
1208         WSAPROTOCOL_INFOA info;
1209         if (tcp_socketpair(&pairs[socks].src, &pairs[socks].dst)) break;
1210 
1211         memset(&info, 0, sizeof(info));
1212         ok(!WSADuplicateSocketA(pairs[socks].src, GetCurrentProcessId(), &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));
1218         ok(!WSADuplicateSocketA(pairs[socks].dst, GetCurrentProcessId(), &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);
1235     error = WSAGetLastError();
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);
1241     error = WSAGetLastError();
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);
1262             error = WSAGetLastError();
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();
1281     error = WSAGetLastError();
1282     ok ( res == SOCKET_ERROR && error ==  WSANOTINITIALISED,
1283             "WSACleanup returned %d WSAGetLastError is %d\n", res, error);
1284 }
1285 
1286 /**************** Main program utility functions ***************/
1287 
1288 static void Init (void)
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();
1329 }
1330 
1331 static void Exit (void)
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);
1338 }
1339 
1340 static void StartServer (LPTHREAD_START_ROUTINE routine,
1341                          test_params *general, server_params *par)
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" );
1346 }
1347 
1348 static void StartClients (LPTHREAD_START_ROUTINE routine,
1349                           test_params *general, client_params *par)
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 */
1359         WaitForSingleObject ( client_ready[client_id], INFINITE );
1360     };
1361 }
1362 
1363 static void do_test( test_setup *test )
1364 {
1365     DWORD i, n = min (test->general.n_clients, MAX_CLIENTS);
1366     DWORD wait;
1367 
1368     server_ready = CreateEventA ( NULL, TRUE, FALSE, NULL );
1369     for (i = 0; i <= n; i++)
1370         client_ready[i] = CreateEventA ( NULL, TRUE, FALSE, NULL );
1371 
1372     StartServer ( test->srv, &test->general, &test->srv_params );
1373     StartClients ( test->clt, &test->general, &test->clt_params );
1374     WaitForSingleObject ( server_ready, INFINITE );
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     }
1391     CloseHandle ( server_ready );
1392     for (i = 0; i <= n; i++)
1393         CloseHandle ( client_ready[i] );
1394 }
1395 
1396 /********* some tests for getsockopt(setsockopt(X)) == X ***********/
1397 /* optname = SO_LINGER */
1398 static const LINGER linger_testvals[] = {
1399     {0,0},
1400     {0,73},
1401     {1,0},
1402     {5,189}
1403 };
1404 
1405 /* optname = SO_RCVTIMEO, SOSNDTIMEO */
1406 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a
1407                         bug in the linux kernel (fixed in 2.6.8) */
1408 #define SOCKTIMEOUT2 997000 /* 997 seconds */
1409 
1410 static void test_set_getsockopt(void)
1411 {
1412     SOCKET s, s2;
1413     int i, err, lasterr;
1414     int timeout;
1415     LINGER lingval;
1416     int size;
1417     WSAPROTOCOL_INFOA infoA;
1418     WSAPROTOCOL_INFOW infoW;
1419     char providername[WSAPROTOCOL_LEN + 1];
1420     DWORD value;
1421     struct _prottest
1422     {
1423         int family, type, proto;
1424     } prottest[] = {
1425         {AF_INET, SOCK_STREAM, IPPROTO_TCP},
1426         {AF_INET, SOCK_DGRAM, IPPROTO_UDP},
1427         {AF_INET6, SOCK_STREAM, IPPROTO_TCP},
1428         {AF_INET6, SOCK_DGRAM, IPPROTO_UDP}
1429     };
1430     union _csspace
1431     {
1432         CSADDR_INFO cs;
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 */
1440     timeout = SOCKTIMEOUT1;
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);
1450     err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, size);
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,
1498                  linger_testvals[i].l_onoff, linger_testvals[i].l_linger);
1499     }
1500 
1501     size =  sizeof(lingval);
1502     err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, size);
1503     ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
1504        "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1505     err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, 0);
1506     ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
1507        "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1508 
1509     size =  sizeof(BOOL);
1510     err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, size);
1511     ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
1512        "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1513     err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, 0);
1514     ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
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);
1529     timeout = SOCKTIMEOUT1;
1530     SetLastError(0xdeadbeef);
1531     err = setsockopt(s, 0xffffffff, SO_RCVTIMEO, (char *) &timeout, size);
1532     ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
1533         "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1534         err, WSAGetLastError());
1535 
1536     timeout = SOCKTIMEOUT1;
1537     SetLastError(0xdeadbeef);
1538     err = setsockopt(s, 0x00008000, SO_RCVTIMEO, (char *) &timeout, size);
1539     ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
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);
1547 todo_wine
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);
1555 todo_wine
1556     ok( !err && !WSAGetLastError(),
1557         "got %d with %d (expected 0 with 0)\n",
1558         err, WSAGetLastError());
1559 todo_wine
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);
1566 todo_wine
1567     ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEFAULT),
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);
1577 todo_wine
1578     ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAENOTSOCK),
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 */
1608     ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL),
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);
1613     ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size),
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);
1618     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1619     ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL),
1620        "getsockopt should have failed\n");
1621     err = WSAGetLastError();
1622     ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1623     ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, NULL),
1624        "getsockopt should have failed\n");
1625     err = WSAGetLastError();
1626     ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1627     ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, &size),
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;
1632     ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size),
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;
1638     err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size);
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);
1658         err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size);
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);
1664         err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOW, (char *) &infoW, &size);
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 
1679         ok(!memcmp(&infoA, &infoW, FIELD_OFFSET(WSAPROTOCOL_INFOA, szProtocol)),
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 */
1765     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1766     ok(s != INVALID_SOCKET, "Failed to create socket\n");
1767     s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
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);
1923     }
1924 }
1925 
1926 static void test_so_reuseaddr(void)
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 
1938     s1=socket(AF_INET, SOCK_STREAM, 0);
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 
1943     s2=socket(AF_INET, SOCK_STREAM, 0);
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. */
1969         set_blocking(s1, FALSE);
1970         set_blocking(s2, FALSE);
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 
2000     closesocket(s2);
2001 }
2002 
2003 #define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo)))
2004 
2005 static void test_ip_pktinfo(void)
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));
2024     ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
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 */
2050         s1=socket(AF_INET, SOCK_DGRAM, 0);
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 */
2082         s2=socket(AF_INET, SOCK_DGRAM, 0);
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);
2092         err=WSAGetLastError();
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);
2105         err=WSAGetLastError();
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);
2113         err=WSAGetLastError();
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());
2119         if (WaitForSingleObject(ov.hEvent, 100) != WAIT_OBJECT_0)
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;
2127         WSAGetOverlappedResult(s1, &ov, NULL, FALSE, &dwFlags);
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);
2140         err=WSAGetLastError();
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());
2146         if (WaitForSingleObject(ov.hEvent, 100) != WAIT_OBJECT_0)
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;
2154         WSAGetOverlappedResult(s1, &ov, &dwSize, FALSE, NULL);
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 
2180 cleanup:
2181     CloseHandle(ov.hEvent);
2182 }
2183 
2184 /************* Array containing the tests to run **********/
2185 
2186 #define STD_STREAM_SOCKET \
2187             SOCK_STREAM, \
2188             0, \
2189             SERVERIP, \
2190             SERVERPORT
2191 
2192 static test_setup tests [] =
2193 {
2194     /* Test 0: synchronous client and server */
2195     {
2196         {
2197             STD_STREAM_SOCKET,
2198             2048,
2199             16,
2200             2
2201         },
2202         simple_server,
2203         {
2204             NULL,
2205             0,
2206             64
2207         },
2208         simple_client,
2209         {
2210             NULL,
2211             0,
2212             128
2213         }
2214     },
2215     /* Test 1: event-driven client, synchronous server */
2216     {
2217         {
2218             STD_STREAM_SOCKET,
2219             2048,
2220             16,
2221             2
2222         },
2223         simple_server,
2224         {
2225             NULL,
2226             0,
2227             64
2228         },
2229         event_client,
2230         {
2231             NULL,
2232             WSA_FLAG_OVERLAPPED,
2233             128
2234         }
2235     },
2236     /* Test 2: synchronous client, non-blocking server via select() */
2237     {
2238         {
2239             STD_STREAM_SOCKET,
2240             2048,
2241             16,
2242             2
2243         },
2244         select_server,
2245         {
2246             NULL,
2247             0,
2248             64
2249         },
2250         simple_client,
2251         {
2252             NULL,
2253             0,
2254             128
2255         }
2256     },
2257     /* Test 3: OOB client, OOB server */
2258     {
2259         {
2260             STD_STREAM_SOCKET,
2261             128,
2262             16,
2263             1
2264         },
2265         oob_server,
2266         {
2267             NULL,
2268             0,
2269             128
2270         },
2271         oob_client,
2272         {
2273             NULL,
2274             0,
2275             128
2276         }
2277     },
2278     /* Test 4: synchronous mixed client and server */
2279     {
2280         {
2281             STD_STREAM_SOCKET,
2282             2048,
2283             16,
2284             2
2285         },
2286         simple_server,
2287         {
2288             NULL,
2289             0,
2290             64
2291         },
2292         simple_mixed_client,
2293         {
2294             NULL,
2295             0,
2296             128
2297         }
2298     }
2299 };
2300 
2301 static void test_UDP(void)
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 */
2307     struct sock_info peer[NUM_UDP_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" );
2346     }
2347 }
2348 
2349 static DWORD WINAPI do_getservbyname( void *param )
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 
2387     return 0;
2388 }
2389 
2390 static void test_getservbyname(void)
2391 {
2392     int i;
2393     HANDLE starttest, thread[NUM_THREADS];
2394     DWORD thread_id[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++) {
2407         WaitForSingleObject ( thread[i], TEST_TIMEOUT * 1000 );
2408     }
2409 }
2410 
2411 static void test_WSASocket(void)
2412 {
2413     SOCKET sock = INVALID_SOCKET;
2414     WSAPROTOCOL_INFOA *pi;
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");
2428     closesocket(sock);
2429 
2430     sock = WSASocketA(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);
2431     ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2432     closesocket(sock);
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);
2471     ok(WSASocketA(-1, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET,
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");
2478     closesocket(sock);
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");
2506     closesocket(sock);
2507 
2508     /* SOCK_STREAM does not support IPPROTO_UDP */
2509     SetLastError(0xdeadbeef);
2510     ok(WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET,
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);
2517     ok(WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_TCP, NULL, 0, 0) == INVALID_SOCKET,
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 
2550     sock = WSASocketA(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
2551                       FROM_PROTOCOL_INFO, &pi[0], 0, 0);
2552     ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2553             WSAGetLastError());
2554     closesocket(sock);
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");
2572       closesocket(sock);
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);
2592     closesocket(sock);
2593 
2594     sock = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, &pi[0], 0, 0);
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);
2603     closesocket(sock);
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");
2647     closesocket(sock);
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 
2676         closesocket(sock);
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) */
2684     sock = WSASocketA(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0);
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);
2701         closesocket(sock);
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);
2713         closesocket(sock);
2714         }
2715 
2716         sock = WSASocketA(AF_INET, SOCK_RAW, IPPROTO_TCP, NULL, 0, 0);
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);
2725         closesocket(sock);
2726     }
2727 
2728     /* IPX socket tests */
2729 
2730     SetLastError(0xdeadbeef);
2731     sock = WSASocketA(AF_IPX, SOCK_DGRAM, NSPROTO_IPX, NULL, 0, 0);
2732     if (sock == INVALID_SOCKET)
2733     {
2734         err = WSAGetLastError();
2735         todo_wine_if (err == WSAEPROTONOSUPPORT)
2736         ok(err == WSAEAFNOSUPPORT || broken(err == WSAEPROTONOSUPPORT), "Expected 10047, received %d\n", err);
2737         skip("IPX is not supported\n");
2738     }
2739     else
2740     {
2741         WSAPROTOCOL_INFOA info;
2742         closesocket(sock);
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);
2759         err = getsockopt(sock, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &info, &size);
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);
2767         closesocket(sock);
2768 
2769         /* SOCK_STREAM does not support NSPROTO_IPX */
2770         SetLastError(0xdeadbeef);
2771         ok(WSASocketA(AF_IPX, SOCK_STREAM, NSPROTO_IPX, NULL, 0, 0) == INVALID_SOCKET,
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 
2792           closesocket(sock);
2793         }
2794     }
2795 }
2796 
2797 static void test_WSADuplicateSocket(void)
2798 {
2799     SOCKET source, dupsock;
2800     WSAPROTOCOL_INFOA info;
2801     DWORD err;
2802     struct sockaddr_in addr;
2803     int socktype, size, addrsize, ret;
2804     char teststr[] = "TEST", buffer[16];
2805 
2806     source = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
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);
2816     ok(WSADuplicateSocketA(source, 0, NULL),
2817        "WSADuplicateSocketA should have failed\n");
2818     err = WSAGetLastError();
2819     ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2820 
2821     SetLastError(0xdeadbeef);
2822     ok(WSADuplicateSocketA(source, ~0, &info),
2823        "WSADuplicateSocketA should have failed\n");
2824     err = WSAGetLastError();
2825     ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2826 
2827     SetLastError(0xdeadbeef);
2828     ok(WSADuplicateSocketA(0, GetCurrentProcessId(), &info),
2829        "WSADuplicateSocketA should have failed\n");
2830     err = WSAGetLastError();
2831     ok(err == WSAENOTSOCK, "expected 10038, received %d\n", err);
2832 
2833     SetLastError(0xdeadbeef);
2834     ok(WSADuplicateSocketA(source, GetCurrentProcessId(), NULL),
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));
2841     ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &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);
2855     closesocket(source);
2856 
2857     /* create a socket, bind it, duplicate it then send data on source and
2858      * receive in the duplicated socket */
2859     source = WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
2860     ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2861 
2862     memset(&info, 0, sizeof(info));
2863     ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &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 
2895     set_blocking(source, TRUE);
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);
2911     closesocket(source);
2912 
2913     /* show that the source socket need to be bound before the duplicated
2914      * socket is created */
2915     source = WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
2916     ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2917 
2918     memset(&info, 0, sizeof(info));
2919     ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &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 
2938     set_blocking(source, TRUE);
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);
2955     closesocket(source);
2956 }
2957 
2958 static void test_WSAEnumNetworkEvents(void)
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);
3025             WSACloseEvent(event);
3026             if (i == 2) closesocket(s2);
3027         }
3028     }
3029 }
3030 
3031 static void test_WSAAddressToStringA(void)
3032 {
3033     SOCKET v6 = INVALID_SOCKET;
3034     INT ret;
3035     DWORD len;
3036     int GLE;
3037     SOCKADDR_IN sockaddr;
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 
3064     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3076     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3088     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3099     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3110     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 */
3117     v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
3118     if (v6 == INVALID_SOCKET) {
3119         skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3120             WSAGetLastError(), WSAEAFNOSUPPORT);
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 
3188 end:
3189     if (v6 != INVALID_SOCKET)
3190         closesocket(v6);
3191 }
3192 
3193 static void test_WSAAddressToStringW(void)
3194 {
3195     SOCKET v6 = INVALID_SOCKET;
3196     INT ret;
3197     DWORD len;
3198     int GLE;
3199     SOCKADDR_IN sockaddr;
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 
3227     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3239     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3251     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3262     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 
3273     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
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 */
3280     v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
3281     if (v6 == INVALID_SOCKET) {
3282         skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3283             WSAGetLastError(), WSAEAFNOSUPPORT);
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 
3356 end:
3357     if (v6 != INVALID_SOCKET)
3358         closesocket(v6);
3359 }
3360 
3361 static void test_WSAStringToAddressA(void)
3362 {
3363     INT ret, len;
3364     SOCKADDR_IN sockaddr;
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) ||
3408         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
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) ||
3426         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
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),
3482         "WSAStringToAddressW() should have failed with %d\n", GLE );
3483 }
3484 
3485 static void test_WSAStringToAddressW(void)
3486 {
3487     INT ret, len;
3488     SOCKADDR_IN sockaddr, *sin;
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) ||
3535         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
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) ||
3552         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
3553         "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
3554 
3555     /* Test with a larger buffer than necessary */
3556     len = sizeof(sockaddr_storage);
3557     sin = (SOCKADDR_IN *)&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) ||
3563         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
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),
3620         "WSAStringToAddressW() should have failed with %d\n", GLE );
3621 }
3622 
3623 static DWORD WINAPI SelectReadThread(void *param)
3624 {
3625     select_thread_params *par = param;
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 
3643     SetEvent(server_ready);
3644     ret = select(par->s+1, &readfds, NULL, NULL, &select_timeout);
3645     par->ReadKilled = (ret == 1);
3646 
3647     return 0;
3648 }
3649 
3650 static DWORD WINAPI SelectCloseThread(void *param)
3651 {
3652     SOCKET s = *(SOCKET*)param;
3653     Sleep(500);
3654     closesocket(s);
3655     return 0;
3656 }
3657 
3658 static void test_errors(void)
3659 {
3660     SOCKET sock;
3661     SOCKADDR_IN  SockAddr;
3662     int ret, err;
3663 
3664     WSASetLastError(NO_ERROR);
3665     sock = socket(PF_INET, SOCK_STREAM, 0);
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     {
3681         TIMEVAL timeval;
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);
3692     ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", WSAGetLastError());
3693 }
3694 
3695 static void test_listen(void)
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);
3777     ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret);
3778 }
3779 
3780 #define FD_ZERO_ALL() { 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); }
3782 static 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;
3841     server_ready = CreateEventA(NULL, TRUE, FALSE, NULL);
3842     thread_handle = CreateThread (NULL, 0, SelectReadThread, &thread_params, 0, &id );
3843     ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError());
3844 
3845     WaitForSingleObject (server_ready, INFINITE);
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);
4108 todo_wine
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);
4136 todo_wine
4137     ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
4138 todo_wine
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");
4155     closesocket(fdWrite);
4156 }
4157 #undef FD_SET_ALL
4158 #undef FD_ZERO_ALL
4159 
4160 static DWORD WINAPI AcceptKillThread(void *param)
4161 {
4162     select_thread_params *par = param;
4163     struct sockaddr_in address;
4164     int len = sizeof(address);
4165     SOCKET client_socket;
4166 
4167     SetEvent(server_ready);
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);
4172     return 0;
4173 }
4174 
4175 
4176 static int CALLBACK AlwaysDeferConditionFunc(LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos,
4177                                              LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData,
4178                                              GROUP *g, DWORD_PTR dwCallbackData)
4179 {
4180     return CF_DEFER;
4181 }
4182 
4183 static SOCKET setup_server_socket(struct sockaddr_in *addr, int *len)
4184 {
4185     int ret, val;
4186     SOCKET server_socket;
4187 
4188     server_socket = socket(AF_INET, SOCK_STREAM, 0);
4189     if (server_socket == INVALID_SOCKET)
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());
4200         closesocket(server_socket);
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 
4210     ret = getsockname(server_socket, (struct sockaddr *)addr, len);
4211     if (ret)
4212     {
4213         skip("failed to lookup bind address: %d\n", WSAGetLastError());
4214         closesocket(server_socket);
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());
4222         closesocket(server_socket);
4223         return INVALID_SOCKET;
4224     }
4225 
4226     return server_socket;
4227 }
4228 
4229 static SOCKET setup_connector_socket(struct sockaddr_in *addr, int len, BOOL nonblock)
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     {
4245         DWORD error = WSAGetLastError();
4246         ok(error == WSAEWOULDBLOCK || error == WSAEINPROGRESS,
4247            "expected 10035 or 10036, got %d\n", error);
4248     }
4249 
4250     return connector;
4251 }
4252 
4253 static void test_accept(void)
4254 {
4255     int ret;
4256     SOCKET server_socket, accepted = INVALID_SOCKET, connector;
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);
4269     server_socket = setup_server_socket(&address, &socklen);
4270     if (server_socket == INVALID_SOCKET)
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 
4281     accepted = WSAAccept(server_socket, NULL, NULL, AlwaysDeferConditionFunc, 0);
4282     ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError());
4283 
4284     accepted = accept(server_socket, NULL, 0);
4285     ok(accepted != INVALID_SOCKET, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
4286 
4287     server_ready = CreateEventA(NULL, TRUE, FALSE, NULL);
4288     if (server_ready == INVALID_HANDLE_VALUE)
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 
4303     WaitForSingleObject(server_ready, INFINITE);
4304     Sleep(200);
4305     ret = closesocket(server_socket);
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 
4315     closesocket(accepted);
4316     closesocket(connector);
4317     accepted = connector = INVALID_SOCKET;
4318 
4319     socklen = sizeof(address);
4320     server_socket = setup_server_socket(&address, &socklen);
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);
4328     ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError());
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 
4337     accepted = WSAAccept(server_socket, NULL, NULL, NULL, 0);
4338     ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4339     closesocket(accepted);
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");
4353     closesocket(accepted);
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);
4363     ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError());
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 
4372     accepted = accept(server_socket, NULL, NULL);
4373     ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4374     closesocket(accepted);
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");
4388     closesocket(accepted);
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 
4402 done:
4403     if (accepted != INVALID_SOCKET)
4404         closesocket(accepted);
4405     if (connector != INVALID_SOCKET)
4406         closesocket(connector);
4407     if (thread_handle != NULL)
4408         CloseHandle(thread_handle);
4409     if (server_ready != INVALID_HANDLE_VALUE)
4410         CloseHandle(server_ready);
4411     if (server_socket != INVALID_SOCKET)
4412         closesocket(server_socket);
4413 }
4414 
4415 static void test_extendedSocketOptions(void)
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 
4436     if((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == INVALID_SOCKET) {
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());
4444         closesocket(sock);
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);
4460     ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
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);
4469     ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
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);
4477     ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
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);
4485     ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
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);
4493     ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
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);
4500     ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAENOPROTOOPT),
4501         "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n",
4502         ret, WSAGetLastError());
4503     closesocket(sock);
4504 
4505     if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
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());
4513         closesocket(sock);
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 
4528     closesocket(sock);
4529     WSACleanup();
4530 }
4531 
4532 static void test_getsockname(void)
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 
4554     if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
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());
4572         closesocket(sock);
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());
4579         closesocket(sock);
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 
4587     closesocket(sock);
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 
4599             sock = socket(AF_INET, SOCK_DGRAM, 0);
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 
4616             closesocket(sock);
4617         }
4618     }
4619 
4620     WSACleanup();
4621 }
4622 
4623 static void test_dns(void)
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,
4669        "hostent->h_addr_list[0] should be in %p, it is in %p\n", addr.mem, h->h_addr_list[0]);
4670 }
4671 
4672 #ifndef __REACTOS__
4673 /* Our winsock headers don't define gethostname because it conflicts with the
4674  * definition in unistd.h. Define it here to get rid of the warning. */
4675 
4676 int WINAPI gethostname(char *name, int namelen);
4677 #endif
4678 
4679 static void test_gethostbyname(void)
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 
4771 cleanup:
4772     HeapFree(GetProcessHeap(), 0, adapters);
4773     HeapFree(GetProcessHeap(), 0, routes);
4774 }
4775 
4776 static void test_gethostbyname_hack(void)
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
4830      * resolve nonexistent host names to addresses of the ISP's spam pages. */
4831 }
4832 
4833 static void test_gethostname(void)
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);
4863     ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
4864 }
4865 
4866 static void test_inet_addr(void)
4867 {
4868     u_long addr;
4869 
4870     addr = inet_addr(NULL);
4871     ok(addr == INADDR_NONE, "inet_addr succeeded unexpectedly\n");
4872 }
4873 
4874 static void test_addr_to_print(void)
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);
4927     ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
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);
4935     ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
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);
4943     ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
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);
4980     ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
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);
4988     ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
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);
4996     ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
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);
5003     ok(pdst != NULL, "The pointer should be returned (%p)\n", pdst);
5004 }
5005 static void test_inet_pton(void)
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},
5019         {AF_UNSPEC, -1, WSAEAFNOSUPPORT,
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},
5030         {AF_UNSPEC, -1, WSAEAFNOSUPPORT,
5031         "broken", NULL, NULL},
5032         {AF_INET, 0, 0,
5033         "broken", NULL, NULL},
5034         {AF_INET6, 0, 0,              /* Test 10 */
5035         "broken", NULL, NULL},
5036         {AF_UNSPEC, -1, WSAEAFNOSUPPORT,
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));
5147     }
5148 }
5149 
5150 static void test_ioctlsocket(void)
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 
5162     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
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 
5182     ret = ioctlsocket(sock, SIOCATMARK, &arg);
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;
5191     ret = ioctlsocket(sock, SIOCATMARK, &arg);
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;
5200     ret = ioctlsocket(sock, SIOCATMARK, &arg);
5201     ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n");
5202     ok(arg, "SIOCATMARK expected a non-zero value\n");
5203 
5204     ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &arg, 0, NULL, 0, &arg, NULL, NULL);
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 
5238     closesocket(sock);
5239 
5240     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
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;
5250     ret = ioctlsocket(sock, FIONREAD, &arg);
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 
5261     ret = listen(sock, SOMAXCONN);
5262     ok(ret == 0, "listen failed unexpectedly with error %d\n", WSAGetLastError());
5263 
5264     /* test FIONREAD with listening socket */
5265     arg = 0xdeadbeef;
5266     ret = ioctlsocket(sock, FIONREAD, &arg);
5267     ok(ret == 0, "ioctlsocket failed unexpectedly with error %d\n", WSAGetLastError());
5268     ok(arg == 0, "expected 0, got %u\n", arg);
5269 
5270     closesocket(sock);
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 */
5292     set_blocking(dst, FALSE);
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 
5321     closesocket(dst);
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);
5326     closesocket(src);
5327 }
5328 
5329 static BOOL drain_pause = FALSE;
5330 static DWORD WINAPI drain_socket_thread(LPVOID arg)
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         {
5340             if (WSAGetLastError() == WSAEWOULDBLOCK)
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     }
5353     return 0;
5354 }
5355 
5356 static void test_send(void)
5357 {
5358     SOCKET src = INVALID_SOCKET;
5359     SOCKET dst = INVALID_SOCKET;
5360     HANDLE hThread = NULL;
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 
5380     set_blocking(dst, FALSE);
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 
5385     hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
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 
5414     ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
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 */
5426     set_blocking(src, FALSE);
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);
5457     ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAENOTSOCK,
5458        "WSASend failed %d - %d\n", ret, WSAGetLastError());
5459 
5460     WSASetLastError(12345);
5461     ret = WSASend(dst, &buf, 1, NULL, 0, &ov, NULL);
5462     ok(ret == SOCKET_ERROR && WSAGetLastError() == ERROR_IO_PENDING,
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 
5481 end:
5482     if (src != INVALID_SOCKET)
5483         closesocket(src);
5484     if (dst != INVALID_SOCKET)
5485         closesocket(dst);
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());
5490         CloseHandle(hThread);
5491     }
5492     if (ov.hEvent)
5493         CloseHandle(ov.hEvent);
5494     HeapFree(GetProcessHeap(), 0, buffer);
5495 }
5496 
5497 typedef struct async_message
5498 {
5499     SOCKET socket;
5500     LPARAM lparam;
5501     struct async_message *next;
5502 } async_message;
5503 
5504 static struct async_message *messages_received;
5505 
5506 #define WM_SOCKET (WM_USER+100)
5507 static LRESULT CALLBACK ws2_test_WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
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 
5519         if (messages_received)
5520         {
5521             struct async_message *last = messages_received;
5522             while (last->next) last = last->next;
5523             last->next = message;
5524         }
5525         else
5526             messages_received = message;
5527         return 0;
5528     }
5529 
5530     return DefWindowProcA(hwnd, msg, wparam, lparam);
5531 }
5532 
5533 static void get_event_details(int event, int *bit, char *name)
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);
5564     }
5565 }
5566 
5567 static const char *dbgstr_event_seq(const LPARAM *seq)
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     {
5577         get_event_details(WSAGETSELECTEVENT(*seq), NULL, name);
5578         len += sprintf(message + len, "%s(%d) ", name, WSAGETSELECTERROR(*seq));
5579         seq++;
5580     }
5581     if (len > 1) len--;
5582     strcpy( message + len, "]" );
5583     return message;
5584 }
5585 
5586 static char *dbgstr_event_seq_result(SOCKET s, WSANETWORKEVENTS *netEvents)
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             }
5618             get_event_details(WSAGETSELECTEVENT(curr->lparam), NULL, name);
5619             error = WSAGETSELECTERROR(curr->lparam);
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, "]" );
5627     return message;
5628 }
5629 
5630 static void flush_events(SOCKET s, HANDLE hEvent)
5631 {
5632     WSANETWORKEVENTS netEvents;
5633     struct async_message *prev = NULL, *curr = messages_received;
5634     int ret;
5635     DWORD dwRet;
5636 
5637     if (hEvent != INVALID_HANDLE_VALUE)
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         }
5667     }
5668 }
5669 
5670 static int match_event_sequence(SOCKET s, WSANETWORKEVENTS *netEvents, const LPARAM *seq)
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);
5682             get_event_details(event, &index, NULL);
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     }
5713     return 1;
5714 }
5715 
5716 /* checks for a sequence of events, (order only checked if window is used) */
5717 static void ok_event_sequence(SOCKET s, HANDLE hEvent, const LPARAM *seq, const LPARAM **broken_seqs, int completelyBroken)
5718 {
5719     MSG msg;
5720     WSANETWORKEVENTS events, *netEvents = NULL;
5721     int ret;
5722     DWORD dwRet;
5723 
5724     if (hEvent != INVALID_HANDLE_VALUE)
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         {
5747             DispatchMessageA(&msg);
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));
5754         flush_events(s, hEvent);
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));
5765                 flush_events(s, hEvent);
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));
5773     flush_events(s, hEvent);
5774 }
5775 
5776 #define ok_event_seq (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : ok_event_sequence
5777 
5778 static void test_events(int useMessages)
5779 {
5780     SOCKET server = INVALID_SOCKET;
5781     SOCKET src = INVALID_SOCKET, src2 = INVALID_SOCKET;
5782     SOCKET dst = INVALID_SOCKET, dst2 = INVALID_SOCKET;
5783     struct sockaddr_in addr;
5784     HANDLE hThread = NULL;
5785     HANDLE hEvent = INVALID_HANDLE_VALUE, hEvent2 = INVALID_HANDLE_VALUE;
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),
5807                                           WSAMAKESELECTREPLY(FD_WRITE, 0), 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),
5811                                              WSAMAKESELECTREPLY(FD_WRITE, 0), 0 };
5812     static const LPARAM read_close_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0),
5813                                              WSAMAKESELECTREPLY(FD_CLOSE, 0), 0 };
5814 
5815     memset(&ov, 0, sizeof(ov));
5816     memset(&ov2, 0, sizeof(ov2));
5817 
5818     /* don't use socketpair, we want connection event */
5819     src = socket(AF_INET, SOCK_STREAM, 0);
5820     if (src == INVALID_SOCKET)
5821     {
5822         ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5823         goto end;
5824     }
5825 
5826     ret = set_blocking(src, TRUE);
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);
5857         wndclass.hIcon          = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
5858         wndclass.hIconSm        = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
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 
5865         hWnd = CreateWindowA(szClassName, "WS2Test", WS_OVERLAPPEDWINDOW,
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 
5873         ret = WSAAsyncSelect(src, hWnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
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 
5883         ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
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 
5897         hEvent = WSACreateEvent();
5898         if (hEvent == INVALID_HANDLE_VALUE)
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 
5911         ret = WSAEventSelect(src, hEvent, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
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 
5932     server = socket(AF_INET, SOCK_STREAM, 0);
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));
5970     if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
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));
5977     if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
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 
5999     closesocket(server);
6000     server = INVALID_SOCKET;
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 
6013     buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufferSize);
6014     if (buffer == NULL)
6015     {
6016         ok(0, "could not allocate memory for test\n");
6017         goto end;
6018     }
6019 
6020     ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
6021     if (ov.hEvent == NULL)
6022     {
6023         ok(0, "could not create event object, errno = %d\n", GetLastError());
6024         goto end;
6025     }
6026 
6027     ov2.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
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());
6060     ok_event_seq(src, hEvent, empty_seq, NULL, 0);
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);
6068     ok(ret == SOCKET_ERROR && (GetLastError() == WSAEFAULT || GetLastError() == WSAENOBUFS),
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
6077         ok_event_seq(src, hEvent, empty_seq, NULL, 0);
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());
6083     ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6084 
6085     /* Interaction with overlapped */
6086     bufs.len = sizeof(char);
6087     bufs.buf = buffer;
6088     ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov, NULL);
6089     ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
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);
6095     ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
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());
6132     ok_event_seq(src, hEvent, empty_seq, NULL, 0);
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);
6139     ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
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 */
6172     ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6173     }
6174 
6175     /* Flood the send queue */
6176     hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
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 */
6184     ok_event_seq(src, hEvent, empty_seq, NULL, 0);
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);
6196     drain_pause = FALSE;
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);
6215     closesocket(dst);
6216     dst = INVALID_SOCKET;
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     {
6274         ret = WSAAsyncSelect(src, hWnd, WM_SOCKET, 0);
6275         if (ret)
6276         {
6277             ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6278             goto end;
6279         }
6280 
6281         ret = set_blocking(src, TRUE);
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 
6303         ret = set_blocking(src, TRUE);
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 
6317 end:
6318     if (src != INVALID_SOCKET)
6319     {
6320         flush_events(src, hEvent);
6321         closesocket(src);
6322     }
6323     if (src2 != INVALID_SOCKET)
6324     {
6325         flush_events(src2, hEvent2);
6326         closesocket(src2);
6327     }
6328     HeapFree(GetProcessHeap(), 0, buffer);
6329     if (server != INVALID_SOCKET)
6330         closesocket(server);
6331     if (dst != INVALID_SOCKET)
6332         closesocket(dst);
6333     if (dst2 != INVALID_SOCKET)
6334         closesocket(dst2);
6335     if (hThread != NULL)
6336         CloseHandle(hThread);
6337     if (hWnd != NULL)
6338         DestroyWindow(hWnd);
6339     if (hEvent != NULL)
6340         CloseHandle(hEvent);
6341     if (hEvent2 != NULL)
6342         CloseHandle(hEvent2);
6343     if (ov.hEvent != NULL)
6344         CloseHandle(ov.hEvent);
6345     if (ov2.hEvent != NULL)
6346         CloseHandle(ov2.hEvent);
6347 }
6348 
6349 static void test_ipv6only(void)
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 
6364     v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
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 
6383     v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
6384     ok(v4 != INVALID_SOCKET, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
6385 
6386 todo_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 
6398 todo_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 
6414 todo_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 
6426 todo_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 
6445     v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
6446     ok(v6 != INVALID_SOCKET, "Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
6447         WSAGetLastError(), WSAEAFNOSUPPORT);
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;
6467     ret = setsockopt(v6, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&enabled, len);
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 
6479     v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
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 
6491 end:
6492     if (v4 != INVALID_SOCKET)
6493         closesocket(v4);
6494     if (v6 != INVALID_SOCKET)
6495         closesocket(v6);
6496 }
6497 
6498 static void test_WSASendMsg(void)
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 
6512     sock = socket(AF_INET, SOCK_DGRAM, 0);
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     {
6520         closesocket(sock);
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 
6564     closesocket(sock);
6565 
6566     sock = socket(AF_INET, SOCK_DGRAM, 0);
6567     ok(sock != INVALID_SOCKET, "socket() failed\n");
6568 
6569     dst = socket(AF_INET, SOCK_DGRAM, 0);
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 
6593     set_blocking(sock, TRUE);
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 
6643     closesocket(sock);
6644     closesocket(dst);
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");
6650     sock = socket(AF_INET, SOCK_DGRAM, 0);
6651     ok(sock != INVALID_SOCKET, "socket() failed\n");
6652     ok(pWSASendMsg(sock, &msg, 0, NULL, NULL, NULL) == SOCKET_ERROR, "WSASendMsg should have failed\n");
6653 todo_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 }
6659     closesocket(sock);
6660 
6661     /* a bad call without msg parameter will not trigger the auto-bind */
6662     sock = socket(AF_INET, SOCK_DGRAM, 0);
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);
6668     closesocket(sock);
6669 
6670     /* SOCK_STREAM sockets are not supported */
6671     bytesSent = 0;
6672     sock = socket(AF_INET, SOCK_STREAM, 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();
6678 todo_wine
6679     ok(err == WSAEINVAL, "expected 10014, got %d instead\n", err);
6680     closesocket(sock);
6681 }
6682 
6683 static void test_WSASendTo(void)
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);
6705     ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAENOTSOCK,
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);
6710     ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
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 "
6719             "a successful call to WSASendTo()\n");
6720 }
6721 
6722 static DWORD WINAPI recv_thread(LPVOID arg)
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);
6736     WSACloseEvent(ov.hEvent);
6737     return 0;
6738 }
6739 
6740 static int completion_called;
6741 
6742 static void WINAPI io_completion(DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags)
6743 {
6744     completion_called++;
6745 }
6746 
6747 static void test_WSARecv(void)
6748 {
6749     SOCKET src, dest, server = INVALID_SOCKET;
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 
6761     tcp_socketpair(&src, &dest);
6762     if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
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 
6839     closesocket(src);
6840     src = INVALID_SOCKET;
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);
6846     todo_wine ok(!bret && (GetLastError() == ERROR_NETNAME_DELETED || broken(GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */),
6847         "Did not get disconnect event: %d, error %d\n", bret, GetLastError());
6848     ok(bytesReturned == 0, "Bytes received is %d\n", bytesReturned);
6849     closesocket(dest);
6850     dest = INVALID_SOCKET;
6851 
6852     src = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
6853     ok(src != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError());
6854     if (src == INVALID_SOCKET) goto end;
6855 
6856     server = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
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);
6883     WaitForSingleObject(thread, 3000);
6884     CloseHandle(thread);
6885 
6886     memset(&ov, 0, sizeof(ov));
6887     ov.hEvent = event;
6888     ResetEvent(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 
6893     completion_called = 0;
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));
6906     completion_called = 0;
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 
6913 end:
6914     if (server != INVALID_SOCKET)
6915         closesocket(server);
6916     if (dest != INVALID_SOCKET)
6917         closesocket(dest);
6918     if (src != INVALID_SOCKET)
6919         closesocket(src);
6920     if (event)
6921         WSACloseEvent(event);
6922 }
6923 
6924 struct write_watch_thread_args
6925 {
6926     int func;
6927     SOCKET dest;
6928     void *base;
6929     DWORD size;
6930     const char *expect;
6931 };
6932 
6933 static DWORD CALLBACK write_watch_thread( void *arg )
6934 {
6935     struct write_watch_thread_args *args = arg;
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     }
6970     return 0;
6971 }
6972 
6973 static void test_write_watch(void)
6974 {
6975     SOCKET src, dest;
6976     WSABUF bufs[2];
6977     WSAOVERLAPPED ov;
6978     struct write_watch_thread_args args;
6979     DWORD bytesReturned, flags, size;
6980     struct sockaddr addr;
6981     int addr_len, ret;
6982     HANDLE thread, event;
6983     char *base;
6984     void *results[64];
6985     ULONG_PTR count;
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 
6996     tcp_socketpair(&src, &dest);
6997     if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
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;
7010     base = VirtualAlloc( 0, size, MEM_RESERVE | MEM_COMMIT | MEM_WRITE_WATCH, PAGE_READWRITE );
7011     ok( base != NULL, "VirtualAlloc failed %u\n", GetLastError() );
7012 
7013     memset( base, 0, size );
7014     count = 64;
7015     ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7016     ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7017     ok( count == 16, "wrong count %lu\n", count );
7018 
7019     bufs[0].len = 5;
7020     bufs[0].buf = base;
7021     bufs[1].len = 0x8000;
7022     bufs[1].buf = base + 0x4000;
7023 
7024     ret = WSARecv( dest, bufs, 2, NULL, &flags, &ov, NULL);
7025     ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
7026        "WSARecv failed - %d error %d\n", ret, GetLastError());
7027 
7028     count = 64;
7029     ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7030     ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7031     ok( count == 9, "wrong count %lu\n", count );
7032     ok( !base[0], "data set\n" );
7033 
7034     send(src, "test message", sizeof("test message"), 0);
7035 
7036     ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
7037     ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
7038     ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
7039     ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
7040     ok( !memcmp( base + 0x4000, "message", 8 ), "wrong data %s\n", base + 0x4000 );
7041 
7042     count = 64;
7043     ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7044     ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7045     ok( count == 0, "wrong count %lu\n", count );
7046 
7047     memset( base, 0, size );
7048     count = 64;
7049     ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7050     ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7051     ok( count == 16, "wrong count %lu\n", count );
7052 
7053     bufs[1].len = 0x4000;
7054     bufs[1].buf = base + 0x2000;
7055     ret = WSARecvFrom( dest, bufs, 2, NULL, &flags, &addr, &addr_len, &ov, NULL);
7056     ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
7057        "WSARecv failed - %d error %d\n", ret, GetLastError());
7058 
7059     count = 64;
7060     ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7061     ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7062     ok( count == 5, "wrong count %lu\n", count );
7063     ok( !base[0], "data set\n" );
7064 
7065     send(src, "test message", sizeof("test message"), 0);
7066 
7067     ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
7068     ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
7069     ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
7070     ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
7071     ok( !memcmp( base + 0x2000, "message", 8 ), "wrong data %s\n", base + 0x2000 );
7072 
7073     count = 64;
7074     ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7075     ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7076     ok( count == 0, "wrong count %lu\n", count );
7077 
7078     memset( base, 0, size );
7079     count = 64;
7080     ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7081     ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7082     ok( count == 16, "wrong count %lu\n", count );
7083 
7084     args.dest = dest;
7085     args.base = base;
7086     args.size = 0x7002;
7087     args.expect = "test message";
7088     for (args.func = 0; args.func < 4; args.func++)
7089     {
7090         thread = CreateThread( NULL, 0, write_watch_thread, &args, 0, NULL );
7091         Sleep( 200 );
7092 
7093         count = 64;
7094         ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7095         ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7096         ok( count == 8, "wrong count %lu\n", count );
7097 
7098         send(src, "test message", sizeof("test message"), 0);
7099         WaitForSingleObject( thread, 10000 );
7100         CloseHandle( thread );
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 == 0, "wrong count %lu\n", count );
7106     }
7107     WSACloseEvent( event );
7108     closesocket( dest );
7109     closesocket( src );
7110     VirtualFree( base, 0, MEM_FREE );
7111 }
7112 
7113 #define POLL_CLEAR() ix = 0
7114 #define POLL_SET(s, ev) {fds[ix].fd = s; fds[ix++].events = ev;}
7115 #define POLL_ISSET(s, rev) poll_isset(fds, ix, s, rev)
7116 static BOOL poll_isset(WSAPOLLFD *fds, int max, SOCKET s, int rev)
7117 {
7118     int k;
7119     for (k = 0; k < max; k++)
7120         if (fds[k].fd == s && (fds[k].revents == rev)) return TRUE;
7121     return FALSE;
7122 }
7123 
7124 static void test_WSAPoll(void)
7125 {
7126     int ix, ret, err, poll_timeout;
7127     SOCKET fdListen, fdRead, fdWrite;
7128     struct sockaddr_in address;
7129     socklen_t len;
7130     static char tmp_buf[1024];
7131     WSAPOLLFD fds[16];
7132     HANDLE thread_handle;
7133     DWORD id;
7134 
7135     if (!pWSAPoll) /* >= Vista */
7136     {
7137         skip("WSAPoll is unsupported, some tests will be skipped.\n");
7138         return;
7139     }
7140 
7141     /* Invalid parameters test */
7142     SetLastError(0xdeadbeef);
7143     ret = pWSAPoll(NULL, 0, 0);
7144     err = GetLastError();
7145     ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7146     ok(err == WSAEINVAL, "expected 10022, got %d\n", err);
7147     SetLastError(0xdeadbeef);
7148     ret = pWSAPoll(NULL, 1, 0);
7149     err = GetLastError();
7150     ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7151     ok(err == WSAEFAULT, "expected 10014, got %d\n", err);
7152     SetLastError(0xdeadbeef);
7153     ret = pWSAPoll(NULL, 0, 1);
7154     err = GetLastError();
7155     ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7156     ok(err == WSAEINVAL, "expected 10022, got %d\n", err);
7157     SetLastError(0xdeadbeef);
7158     ret = pWSAPoll(NULL, 1, 1);
7159     err = GetLastError();
7160     ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7161     ok(err == WSAEFAULT, "expected 10014, got %d\n", err);
7162 
7163     /* WSAPoll() tries to mime the unix poll() call. The following tests do:
7164      * - check if a connection attempt ended with success or error;
7165      * - check if a pending connection is waiting for acceptance;
7166      * - check for data to read, availability for write and OOB data
7167      */
7168     memset(&address, 0, sizeof(address));
7169     address.sin_addr.s_addr = inet_addr("127.0.0.1");
7170     address.sin_family = AF_INET;
7171     len = sizeof(address);
7172     fdListen = setup_server_socket(&address, &len);
7173     poll_timeout = 100;
7174 
7175     /* When no events are pending poll returns 0 with no error */
7176     POLL_CLEAR();
7177     POLL_SET(fdListen, POLLIN);
7178     ret = pWSAPoll(fds, ix, poll_timeout);
7179     ok(ret == 0, "expected 0, got %d\n", ret);
7180 
7181     /* Test listening socket connection attempt notifications */
7182     fdWrite = setup_connector_socket(&address, len, TRUE);
7183     POLL_CLEAR();
7184     POLL_SET(fdListen, POLLIN | POLLOUT);
7185     ret = pWSAPoll(fds, ix, poll_timeout);
7186     ok(ret == 1, "expected 1, got %d\n", ret);
7187     ok(POLL_ISSET(fdListen, POLLRDNORM), "fdListen socket events incorrect\n");
7188     len = sizeof(address);
7189     fdRead = accept(fdListen, (struct sockaddr*) &address, &len);
7190     ok(fdRead != INVALID_SOCKET, "expected a valid socket\n");
7191 
7192     /* Test client side connection attempt notifications */
7193     POLL_CLEAR();
7194     POLL_SET(fdListen, POLLIN | POLLOUT);
7195     POLL_SET(fdRead, POLLIN | POLLOUT);
7196     POLL_SET(fdWrite, POLLIN | POLLOUT);
7197     ret = pWSAPoll(fds, ix, poll_timeout);
7198     ok(ret == 2, "expected 2, got %d\n", ret);
7199     ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n");
7200     ok(POLL_ISSET(fdRead, POLLWRNORM), "fdRead socket events incorrect\n");
7201     len = sizeof(id);
7202     id = 0xdeadbeef;
7203     err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
7204     ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
7205     ok(id == 0, "expected 0, got %d\n", id);
7206 
7207     /* Test data receiving notifications */
7208     ret = send(fdWrite, "1234", 4, 0);
7209     ok(ret == 4, "expected 4, got %d\n", ret);
7210     POLL_CLEAR();
7211     POLL_SET(fdListen, POLLIN | POLLOUT);
7212     POLL_SET(fdRead, POLLIN);
7213     ret = pWSAPoll(fds, ix, poll_timeout);
7214     ok(ret == 1, "expected 1, got %d\n", ret);
7215     ok(POLL_ISSET(fdRead, POLLRDNORM), "fdRead socket events incorrect\n");
7216     ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
7217     ok(ret == 4, "expected 4, got %d\n", ret);
7218     ok(!strcmp(tmp_buf, "1234"), "data received differs from sent\n");
7219 
7220     /* Test OOB data notifications */
7221     ret = send(fdWrite, "A", 1, MSG_OOB);
7222     ok(ret == 1, "expected 1, got %d\n", ret);
7223     POLL_CLEAR();
7224     POLL_SET(fdListen, POLLIN | POLLOUT);
7225     POLL_SET(fdRead, POLLIN);
7226     ret = pWSAPoll(fds, ix, poll_timeout);
7227     ok(ret == 1, "expected 1, got %d\n", ret);
7228     ok(POLL_ISSET(fdRead, POLLRDBAND), "fdRead socket events incorrect\n");
7229     tmp_buf[0] = 0xAF;
7230     ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
7231     ok(ret == 1, "expected 1, got %d\n", ret);
7232     ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
7233 
7234     /* If the socket is OOBINLINED the notification is like normal data */
7235     ret = 1;
7236     ret = setsockopt(fdRead, SOL_SOCKET, SO_OOBINLINE, (char*) &ret, sizeof(ret));
7237     ok(ret == 0, "expected 0, got %d\n", ret);
7238     ret = send(fdWrite, "A", 1, MSG_OOB);
7239     ok(ret == 1, "expected 1, got %d\n", ret);
7240     POLL_CLEAR();
7241     POLL_SET(fdListen, POLLIN | POLLOUT);
7242     POLL_SET(fdRead, POLLIN | POLLOUT);
7243     ret = pWSAPoll(fds, ix, poll_timeout);
7244     ok(ret == 1, "expected 1, got %d\n", ret);
7245     tmp_buf[0] = 0xAF;
7246     SetLastError(0xdeadbeef);
7247     ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
7248     ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7249     ok(GetLastError() == WSAEINVAL, "expected 10022, got %d\n", GetLastError());
7250     ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
7251     ok(ret == 1, "expected 1, got %d\n", ret);
7252     ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
7253 
7254     /* Test connection closed notifications */
7255     ret = closesocket(fdRead);
7256     ok(ret == 0, "expected 0, got %d\n", ret);
7257     POLL_CLEAR();
7258     POLL_SET(fdListen, POLLIN | POLLOUT);
7259     POLL_SET(fdWrite, POLLIN);
7260     ret = pWSAPoll(fds, ix, poll_timeout);
7261     ok(ret == 1, "expected 1, got %d\n", ret);
7262     ok(POLL_ISSET(fdWrite, POLLHUP), "fdWrite socket events incorrect\n");
7263     ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0);
7264     ok(ret == 0, "expected 0, got %d\n", ret);
7265 
7266     /* When a connection is attempted to a non-listening socket due to a bug
7267      * in the MS code it will never be notified. This is a long standing issue
7268      * that will never be fixed for compatibility reasons so we have to deal
7269      * with it manually. */
7270     ret = closesocket(fdWrite);
7271     ok(ret == 0, "expected 0, got %d\n", ret);
7272     ret = closesocket(fdListen);
7273     ok(ret == 0, "expected 0, got %d\n", ret);
7274     len = sizeof(address);
7275     fdWrite = setup_connector_socket(&address, len, TRUE);
7276     POLL_CLEAR();
7277     POLL_SET(fdWrite, POLLIN | POLLOUT);
7278     poll_timeout = 2000;
7279     ret = pWSAPoll(fds, ix, poll_timeout);
7280 todo_wine
7281     ok(ret == 0, "expected 0, got %d\n", ret);
7282     len = sizeof(id);
7283     id = 0xdeadbeef;
7284     err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
7285     ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
7286     ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id);
7287     closesocket(fdWrite);
7288 
7289     /* Try poll() on a closed socket after connection */
7290     ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7291     closesocket(fdRead);
7292     POLL_CLEAR();
7293     POLL_SET(fdWrite, POLLIN | POLLOUT);
7294     POLL_SET(fdRead, POLLIN | POLLOUT);
7295     ret = pWSAPoll(fds, ix, poll_timeout);
7296     ok(ret == 1, "expected 1, got %d\n", ret);
7297     ok(POLL_ISSET(fdRead, POLLNVAL), "fdRead socket events incorrect\n");
7298     POLL_CLEAR();
7299     POLL_SET(fdWrite, POLLIN | POLLOUT);
7300     ret = pWSAPoll(fds, ix, poll_timeout);
7301     ok(ret == 1, "expected 1, got %d\n", ret);
7302 todo_wine
7303     ok(POLL_ISSET(fdWrite, POLLWRNORM | POLLHUP) || broken(POLL_ISSET(fdWrite, POLLWRNORM)) /* <= 2008 */,
7304        "fdWrite socket events incorrect\n");
7305     closesocket(fdWrite);
7306 
7307     /* Close the socket currently being polled in a thread */
7308     ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7309     thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
7310     ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
7311     POLL_CLEAR();
7312     POLL_SET(fdWrite, POLLIN | POLLOUT);
7313     ret = pWSAPoll(fds, ix, poll_timeout);
7314     ok(ret == 1, "expected 1, got %d\n", ret);
7315     ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n");
7316     WaitForSingleObject (thread_handle, 1000);
7317     closesocket(fdRead);
7318     /* test again with less flags - behavior changes */
7319     ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7320     thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
7321     ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
7322     POLL_CLEAR();
7323     POLL_SET(fdWrite, POLLIN);
7324     ret = pWSAPoll(fds, ix, poll_timeout);
7325     ok(ret == 1, "expected 1, got %d\n", ret);
7326     ok(POLL_ISSET(fdWrite, POLLNVAL), "fdWrite socket events incorrect\n");
7327     WaitForSingleObject (thread_handle, 1000);
7328     closesocket(fdRead);
7329 }
7330 #undef POLL_SET
7331 #undef POLL_ISSET
7332 #undef POLL_CLEAR
7333 
7334 static void test_GetAddrInfoW(void)
7335 {
7336     static const WCHAR port[] = {'8','0',0};
7337     static const WCHAR empty[] = {0};
7338     static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
7339     static const WCHAR nxdomain[] =
7340         {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
7341     static const WCHAR zero[] = {'0',0};
7342     int i, ret;
7343     ADDRINFOW *result, *result2, *p, hint;
7344     WCHAR name[256];
7345     DWORD size = sizeof(name)/sizeof(WCHAR);
7346     /* te su to.winehq.org written in katakana */
7347     static const WCHAR idn_domain[] =
7348         {0x30C6,0x30B9,0x30C8,'.','w','i','n','e','h','q','.','o','r','g',0};
7349     static const WCHAR idn_punycode[] =
7350         {'x','n','-','-','z','c','k','z','a','h','.','w','i','n','e','h','q','.','o','r','g',0};
7351 
7352     if (!pGetAddrInfoW || !pFreeAddrInfoW)
7353     {
7354         win_skip("GetAddrInfoW and/or FreeAddrInfoW not present\n");
7355         return;
7356     }
7357     memset(&hint, 0, sizeof(ADDRINFOW));
7358     name[0] = 0;
7359     GetComputerNameExW( ComputerNamePhysicalDnsHostname, name, &size );
7360 
7361     result = (ADDRINFOW *)0xdeadbeef;
7362     WSASetLastError(0xdeadbeef);
7363     ret = pGetAddrInfoW(NULL, NULL, NULL, &result);
7364     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7365     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7366     ok(result == NULL, "got %p\n", result);
7367 
7368     result = NULL;
7369     WSASetLastError(0xdeadbeef);
7370     ret = pGetAddrInfoW(empty, NULL, NULL, &result);
7371     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7372     ok(result != NULL, "GetAddrInfoW failed\n");
7373     ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7374     pFreeAddrInfoW(result);
7375 
7376     result = NULL;
7377     ret = pGetAddrInfoW(NULL, zero, NULL, &result);
7378     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7379     ok(result != NULL, "GetAddrInfoW failed\n");
7380 
7381     result2 = NULL;
7382     ret = pGetAddrInfoW(NULL, empty, NULL, &result2);
7383     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7384     ok(result2 != NULL, "GetAddrInfoW failed\n");
7385     compare_addrinfow(result, result2);
7386     pFreeAddrInfoW(result);
7387     pFreeAddrInfoW(result2);
7388 
7389     result = NULL;
7390     ret = pGetAddrInfoW(empty, zero, NULL, &result);
7391     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7392     ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7393     ok(result != NULL, "GetAddrInfoW failed\n");
7394 
7395     result2 = NULL;
7396     ret = pGetAddrInfoW(empty, empty, NULL, &result2);
7397     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7398     ok(result2 != NULL, "GetAddrInfoW failed\n");
7399     compare_addrinfow(result, result2);
7400     pFreeAddrInfoW(result);
7401     pFreeAddrInfoW(result2);
7402 
7403     result = NULL;
7404     ret = pGetAddrInfoW(localhost, NULL, NULL, &result);
7405     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7406     pFreeAddrInfoW(result);
7407 
7408     result = NULL;
7409     ret = pGetAddrInfoW(localhost, empty, NULL, &result);
7410     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7411     pFreeAddrInfoW(result);
7412 
7413     result = NULL;
7414     ret = pGetAddrInfoW(localhost, zero, NULL, &result);
7415     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7416     pFreeAddrInfoW(result);
7417 
7418     result = NULL;
7419     ret = pGetAddrInfoW(localhost, port, NULL, &result);
7420     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7421     pFreeAddrInfoW(result);
7422 
7423     result = NULL;
7424     ret = pGetAddrInfoW(localhost, NULL, &hint, &result);
7425     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7426     pFreeAddrInfoW(result);
7427 
7428     result = NULL;
7429     SetLastError(0xdeadbeef);
7430     ret = pGetAddrInfoW(localhost, port, &hint, &result);
7431     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7432     ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7433     pFreeAddrInfoW(result);
7434 
7435     /* try to get information from the computer name, result is the same
7436      * as if requesting with an empty host name. */
7437     ret = pGetAddrInfoW(name, NULL, NULL, &result);
7438     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7439     ok(result != NULL, "GetAddrInfoW failed\n");
7440 
7441     ret = pGetAddrInfoW(empty, NULL, NULL, &result2);
7442     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7443 #ifdef __REACTOS__
7444     ok(result2 != NULL, "GetAddrInfoW failed\n");
7445 #else
7446     ok(result != NULL, "GetAddrInfoW failed\n");
7447 #endif
7448     compare_addrinfow(result, result2);
7449     pFreeAddrInfoW(result);
7450     pFreeAddrInfoW(result2);
7451 
7452     ret = pGetAddrInfoW(name, empty, NULL, &result);
7453     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7454     ok(result != NULL, "GetAddrInfoW failed\n");
7455 
7456     ret = pGetAddrInfoW(empty, empty, NULL, &result2);
7457     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7458 #ifdef __REACTOS__
7459     ok(result2 != NULL, "GetAddrInfoW failed\n");
7460 #else
7461     ok(result != NULL, "GetAddrInfoW failed\n");
7462 #endif
7463     compare_addrinfow(result, result2);
7464     pFreeAddrInfoW(result);
7465     pFreeAddrInfoW(result2);
7466 
7467     result = (ADDRINFOW *)0xdeadbeef;
7468     WSASetLastError(0xdeadbeef);
7469     ret = pGetAddrInfoW(NULL, NULL, NULL, &result);
7470     if(ret == 0)
7471     {
7472         skip("nxdomain returned success. Broken ISP redirects?\n");
7473         return;
7474     }
7475     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7476     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7477     ok(result == NULL, "got %p\n", result);
7478 
7479     result = (ADDRINFOW *)0xdeadbeef;
7480     WSASetLastError(0xdeadbeef);
7481     ret = pGetAddrInfoW(nxdomain, NULL, NULL, &result);
7482     if(ret == 0)
7483     {
7484         skip("nxdomain returned success. Broken ISP redirects?\n");
7485         return;
7486     }
7487     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7488     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7489     ok(result == NULL, "got %p\n", result);
7490 
7491     for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
7492     {
7493         hint.ai_family = hinttests[i].family;
7494         hint.ai_socktype = hinttests[i].socktype;
7495         hint.ai_protocol = hinttests[i].protocol;
7496 
7497         result = NULL;
7498         SetLastError(0xdeadbeef);
7499         ret = pGetAddrInfoW(localhost, NULL, &hint, &result);
7500         if (!ret)
7501         {
7502             if (hinttests[i].error)
7503                 ok(0, "test %d: GetAddrInfoW succeeded unexpectedly\n", i);
7504             else
7505             {
7506                 p = result;
7507                 do
7508                 {
7509                     /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7510                     if (hinttests[i].family == AF_UNSPEC)
7511                         ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
7512                            "test %d: expected AF_INET or AF_INET6, got %d\n",
7513                            i, p->ai_family);
7514                     else
7515                         ok(p->ai_family == hinttests[i].family,
7516                            "test %d: expected family %d, got %d\n",
7517                            i, hinttests[i].family, p->ai_family);
7518 
7519                     ok(p->ai_socktype == hinttests[i].socktype,
7520                        "test %d: expected type %d, got %d\n",
7521                        i, hinttests[i].socktype, p->ai_socktype);
7522                     ok(p->ai_protocol == hinttests[i].protocol,
7523                        "test %d: expected protocol %d, got %d\n",
7524                        i, hinttests[i].protocol, p->ai_protocol);
7525                     p = p->ai_next;
7526                 }
7527                 while (p);
7528             }
7529             pFreeAddrInfoW(result);
7530         }
7531         else
7532         {
7533             DWORD err = WSAGetLastError();
7534             if (hinttests[i].error)
7535                 ok(hinttests[i].error == err, "test %d: GetAddrInfoW failed with error %d, expected %d\n",
7536                    i, err, hinttests[i].error);
7537             else
7538                 ok(0, "test %d: GetAddrInfoW failed with %d (err %d)\n", i, ret, err);
7539         }
7540     }
7541 
7542     /* Test IDN resolution (Internationalized Domain Names) present since Windows 8 */
7543     trace("Testing punycode IDN %s\n", wine_dbgstr_w(idn_punycode));
7544     result = NULL;
7545     ret = pGetAddrInfoW(idn_punycode, NULL, NULL, &result);
7546     ok(!ret, "got %d expected success\n", ret);
7547     ok(result != NULL, "got %p\n", result);
7548     pFreeAddrInfoW(result);
7549 
7550     hint.ai_family = AF_INET;
7551     hint.ai_socktype = 0;
7552     hint.ai_protocol = 0;
7553     hint.ai_flags = 0;
7554 
7555     result = NULL;
7556     ret = pGetAddrInfoW(idn_punycode, NULL, &hint, &result);
7557     ok(!ret, "got %d expected success\n", ret);
7558     ok(result != NULL, "got %p\n", result);
7559 
7560     trace("Testing unicode IDN %s\n", wine_dbgstr_w(idn_domain));
7561     result2 = NULL;
7562     ret = pGetAddrInfoW(idn_domain, NULL, NULL, &result2);
7563     if (ret == WSAHOST_NOT_FOUND && broken(1))
7564     {
7565         pFreeAddrInfoW(result);
7566         win_skip("IDN resolution not supported in Win <= 7\n");
7567         return;
7568     }
7569 
7570     ok(!ret, "got %d expected success\n", ret);
7571     ok(result2 != NULL, "got %p\n", result2);
7572     pFreeAddrInfoW(result2);
7573 
7574     hint.ai_family = AF_INET;
7575     hint.ai_socktype = 0;
7576     hint.ai_protocol = 0;
7577     hint.ai_flags = 0;
7578 
7579     result2 = NULL;
7580     ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7581     ok(!ret, "got %d expected success\n", ret);
7582     ok(result2 != NULL, "got %p\n", result2);
7583 
7584     /* ensure manually resolved punycode and unicode hosts result in same data */
7585     compare_addrinfow(result, result2);
7586 
7587     pFreeAddrInfoW(result);
7588     pFreeAddrInfoW(result2);
7589 
7590     hint.ai_family = AF_INET;
7591     hint.ai_socktype = 0;
7592     hint.ai_protocol = 0;
7593     hint.ai_flags = 0;
7594 
7595     result2 = NULL;
7596     ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7597     ok(!ret, "got %d expected success\n", ret);
7598     ok(result2 != NULL, "got %p\n", result2);
7599     pFreeAddrInfoW(result2);
7600 
7601     /* Disable IDN resolution and test again*/
7602     hint.ai_family = AF_INET;
7603     hint.ai_socktype = 0;
7604     hint.ai_protocol = 0;
7605     hint.ai_flags = AI_DISABLE_IDN_ENCODING;
7606 
7607     SetLastError(0xdeadbeef);
7608     result2 = NULL;
7609     ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7610     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7611     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7612     ok(result2 == NULL, "got %p\n", result2);
7613 }
7614 
7615 static void test_GetAddrInfoExW(void)
7616 {
7617     static const WCHAR empty[] = {0};
7618     static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
7619     static const WCHAR winehq[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
7620     ADDRINFOEXW *result;
7621     OVERLAPPED overlapped;
7622     HANDLE event;
7623     int ret;
7624 
7625     if (!pGetAddrInfoExW || !pGetAddrInfoExOverlappedResult)
7626     {
7627         win_skip("GetAddrInfoExW and/or GetAddrInfoExOverlappedResult not present\n");
7628         return;
7629     }
7630 
7631     event = WSACreateEvent();
7632 
7633     result = (ADDRINFOEXW *)0xdeadbeef;
7634     WSASetLastError(0xdeadbeef);
7635     ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7636     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7637     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7638     ok(result == NULL, "got %p\n", result);
7639 
7640     result = NULL;
7641     WSASetLastError(0xdeadbeef);
7642     ret = pGetAddrInfoExW(empty, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7643     ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7644     ok(result != NULL, "GetAddrInfoW failed\n");
7645     ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7646     pFreeAddrInfoExW(result);
7647 
7648     result = NULL;
7649     ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7650     ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7651     pFreeAddrInfoExW(result);
7652 
7653     result = (void*)0xdeadbeef;
7654     memset(&overlapped, 0xcc, sizeof(overlapped));
7655     overlapped.hEvent = event;
7656     ResetEvent(event);
7657     ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7658     ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7659     ok(!result, "result != NULL\n");
7660     ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
7661     ret = pGetAddrInfoExOverlappedResult(&overlapped);
7662     ok(!ret, "overlapped result is %d\n", ret);
7663     pFreeAddrInfoExW(result);
7664 
7665     result = (void*)0xdeadbeef;
7666     memset(&overlapped, 0xcc, sizeof(overlapped));
7667     ResetEvent(event);
7668     overlapped.hEvent = event;
7669     WSASetLastError(0xdeadbeef);
7670     ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7671     ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7672     ok(WSAGetLastError() == ERROR_IO_PENDING, "expected 11001, got %d\n", WSAGetLastError());
7673     ret = overlapped.Internal;
7674     ok(ret == WSAEINPROGRESS || ret == ERROR_SUCCESS, "overlapped.Internal = %u\n", ret);
7675     ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
7676     ret = pGetAddrInfoExOverlappedResult(&overlapped);
7677     ok(!ret, "overlapped result is %d\n", ret);
7678     ok(overlapped.hEvent == event, "hEvent changed %p\n", overlapped.hEvent);
7679     ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal);
7680     ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
7681     ok(result != NULL, "result == NULL\n");
7682     if (result != NULL)
7683     {
7684         ok(!result->ai_blob, "ai_blob != NULL\n");
7685         ok(!result->ai_bloblen, "ai_bloblen != 0\n");
7686         ok(!result->ai_provider, "ai_provider = %s\n", wine_dbgstr_guid(result->ai_provider));
7687         pFreeAddrInfoExW(result);
7688     }
7689 
7690     result = (void*)0xdeadbeef;
7691     memset(&overlapped, 0xcc, sizeof(overlapped));
7692     ResetEvent(event);
7693     overlapped.hEvent = event;
7694     ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7695     todo_wine
7696     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7697     todo_wine
7698     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7699     ok(result == NULL, "got %p\n", result);
7700     ret = WaitForSingleObject(event, 0);
7701     todo_wine_if(ret != WAIT_TIMEOUT) /* Remove when abowe todo_wines are fixed */
7702     ok(ret == WAIT_TIMEOUT, "wait failed\n");
7703 
7704     WSACloseEvent(event);
7705 }
7706 
7707 static void verify_ipv6_addrinfo(ADDRINFOA *result, const char *expectedIp)
7708 {
7709     SOCKADDR_IN6 *sockaddr6;
7710     char ipBuffer[256];
7711     const char *ret;
7712 
7713     ok(result->ai_family == AF_INET6, "ai_family == %d\n", result->ai_family);
7714     ok(result->ai_addrlen >= sizeof(struct sockaddr_in6), "ai_addrlen == %d\n", (int)result->ai_addrlen);
7715     ok(result->ai_addr != NULL, "ai_addr == NULL\n");
7716 
7717     if (result->ai_addr != NULL)
7718     {
7719         sockaddr6 = (SOCKADDR_IN6 *)result->ai_addr;
7720         ok(sockaddr6->sin6_family == AF_INET6, "ai_addr->sin6_family == %d\n", sockaddr6->sin6_family);
7721         ok(sockaddr6->sin6_port == 0, "ai_addr->sin6_port == %d\n", sockaddr6->sin6_port);
7722 
7723         ZeroMemory(ipBuffer, sizeof(ipBuffer));
7724         ret = pInetNtop(AF_INET6, &sockaddr6->sin6_addr, ipBuffer, sizeof(ipBuffer));
7725         ok(ret != NULL, "inet_ntop failed (%d)\n", WSAGetLastError());
7726         ok(strcmp(ipBuffer, expectedIp) == 0, "ai_addr->sin6_addr == '%s' (expected '%s')\n", ipBuffer, expectedIp);
7727     }
7728 }
7729 
7730 static void test_getaddrinfo(void)
7731 {
7732     int i, ret;
7733     ADDRINFOA *result, *result2, *p, hint;
7734     SOCKADDR_IN *sockaddr;
7735     CHAR name[256], *ip;
7736     DWORD size = sizeof(name);
7737 
7738     if (!pgetaddrinfo || !pfreeaddrinfo)
7739     {
7740         win_skip("getaddrinfo and/or freeaddrinfo not present\n");
7741         return;
7742     }
7743     memset(&hint, 0, sizeof(ADDRINFOA));
7744     GetComputerNameExA( ComputerNamePhysicalDnsHostname, name, &size );
7745 
7746     result = (ADDRINFOA *)0xdeadbeef;
7747     WSASetLastError(0xdeadbeef);
7748     ret = pgetaddrinfo(NULL, NULL, NULL, &result);
7749     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7750     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7751     ok(result == NULL, "got %p\n", result);
7752 
7753     result = NULL;
7754     WSASetLastError(0xdeadbeef);
7755     ret = pgetaddrinfo("", NULL, NULL, &result);
7756     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7757     ok(result != NULL, "getaddrinfo failed\n");
7758     ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7759     pfreeaddrinfo(result);
7760 
7761     result = NULL;
7762     ret = pgetaddrinfo(NULL, "0", NULL, &result);
7763     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7764     ok(result != NULL, "getaddrinfo failed\n");
7765 
7766     result2 = NULL;
7767     ret = pgetaddrinfo(NULL, "", NULL, &result2);
7768     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7769     ok(result2 != NULL, "getaddrinfo failed\n");
7770     compare_addrinfo(result, result2);
7771     pfreeaddrinfo(result);
7772     pfreeaddrinfo(result2);
7773 
7774     result = NULL;
7775     WSASetLastError(0xdeadbeef);
7776     ret = pgetaddrinfo("", "0", NULL, &result);
7777     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7778     ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7779     ok(result != NULL, "getaddrinfo failed\n");
7780 
7781     result2 = NULL;
7782     ret = pgetaddrinfo("", "", NULL, &result2);
7783     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7784     ok(result2 != NULL, "getaddrinfo failed\n");
7785     compare_addrinfo(result, result2);
7786     pfreeaddrinfo(result);
7787     pfreeaddrinfo(result2);
7788 
7789     result = NULL;
7790     ret = pgetaddrinfo("localhost", NULL, NULL, &result);
7791     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7792     pfreeaddrinfo(result);
7793 
7794     result = NULL;
7795     ret = pgetaddrinfo("localhost", "", NULL, &result);
7796     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7797     pfreeaddrinfo(result);
7798 
7799     result = NULL;
7800     ret = pgetaddrinfo("localhost", "0", NULL, &result);
7801     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7802     pfreeaddrinfo(result);
7803 
7804     result = NULL;
7805     ret = pgetaddrinfo("localhost", "80", NULL, &result);
7806     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7807     pfreeaddrinfo(result);
7808 
7809     result = NULL;
7810     ret = pgetaddrinfo("localhost", NULL, &hint, &result);
7811     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7812     pfreeaddrinfo(result);
7813 
7814     result = NULL;
7815     WSASetLastError(0xdeadbeef);
7816     ret = pgetaddrinfo("localhost", "80", &hint, &result);
7817     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7818     ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7819     pfreeaddrinfo(result);
7820 
7821     hint.ai_flags = AI_NUMERICHOST;
7822     result = (void*)0xdeadbeef;
7823     ret = pgetaddrinfo("localhost", "80", &hint, &result);
7824     ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", WSAGetLastError());
7825     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected WSAHOST_NOT_FOUND, got %d\n", WSAGetLastError());
7826     ok(!result, "result = %p\n", result);
7827     hint.ai_flags = 0;
7828 
7829     /* try to get information from the computer name, result is the same
7830      * as if requesting with an empty host name. */
7831     ret = pgetaddrinfo(name, NULL, NULL, &result);
7832     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7833 #ifdef __REACTOS__
7834     ok(result != NULL, "getaddrinfo failed\n");
7835 #else
7836     ok(result != NULL, "GetAddrInfoW failed\n");
7837 #endif
7838 
7839     ret = pgetaddrinfo("", NULL, NULL, &result2);
7840     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7841 #ifdef __REACTOS__
7842     ok(result2 != NULL, "getaddrinfo failed\n");
7843 #else
7844     ok(result != NULL, "GetAddrInfoW failed\n");
7845 #endif
7846     compare_addrinfo(result, result2);
7847     pfreeaddrinfo(result);
7848     pfreeaddrinfo(result2);
7849 
7850     ret = pgetaddrinfo(name, "", NULL, &result);
7851     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7852 #ifdef __REACTOS__
7853     ok(result != NULL, "getaddrinfo failed\n");
7854 #else
7855     ok(result != NULL, "GetAddrInfoW failed\n");
7856 #endif
7857 
7858     ret = pgetaddrinfo("", "", NULL, &result2);
7859     ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7860 #ifdef __REACTOS__
7861     ok(result2 != NULL, "getaddrinfo failed\n");
7862 #else
7863     ok(result != NULL, "GetAddrInfoW failed\n");
7864 #endif
7865     compare_addrinfo(result, result2);
7866     pfreeaddrinfo(result);
7867     pfreeaddrinfo(result2);
7868 
7869     result = (ADDRINFOA *)0xdeadbeef;
7870     WSASetLastError(0xdeadbeef);
7871     ret = pgetaddrinfo("nxdomain.codeweavers.com", NULL, NULL, &result);
7872     if(ret == 0)
7873     {
7874         skip("nxdomain returned success. Broken ISP redirects?\n");
7875         return;
7876     }
7877     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7878     ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7879     ok(result == NULL, "got %p\n", result);
7880 
7881     /* Test IPv4 address conversion */
7882     result = NULL;
7883     ret = pgetaddrinfo("192.168.1.253", NULL, NULL, &result);
7884     ok(!ret, "getaddrinfo failed with %d\n", ret);
7885     ok(result->ai_family == AF_INET, "ai_family == %d\n", result->ai_family);
7886     ok(result->ai_addrlen >= sizeof(struct sockaddr_in), "ai_addrlen == %d\n", (int)result->ai_addrlen);
7887     ok(result->ai_addr != NULL, "ai_addr == NULL\n");
7888     sockaddr = (SOCKADDR_IN *)result->ai_addr;
7889     ok(sockaddr->sin_family == AF_INET, "ai_addr->sin_family == %d\n", sockaddr->sin_family);
7890     ok(sockaddr->sin_port == 0, "ai_addr->sin_port == %d\n", sockaddr->sin_port);
7891 
7892     ip = inet_ntoa(sockaddr->sin_addr);
7893     ok(strcmp(ip, "192.168.1.253") == 0, "sockaddr->ai_addr == '%s'\n", ip);
7894     pfreeaddrinfo(result);
7895 
7896     /* Test IPv4 address conversion with port */
7897     result = NULL;
7898     hint.ai_flags = AI_NUMERICHOST;
7899     ret = pgetaddrinfo("192.168.1.253:1024", NULL, &hint, &result);
7900     hint.ai_flags = 0;
7901     ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo returned unexpected result: %d\n", ret);
7902     ok(result == NULL, "expected NULL, got %p\n", result);
7903 
7904     /* Test IPv6 address conversion */
7905     result = NULL;
7906     SetLastError(0xdeadbeef);
7907     ret = pgetaddrinfo("2a00:2039:dead:beef:cafe::6666", NULL, NULL, &result);
7908 
7909     if (result != NULL)
7910     {
7911         ok(!ret, "getaddrinfo failed with %d\n", ret);
7912         verify_ipv6_addrinfo(result, "2a00:2039:dead:beef:cafe::6666");
7913         pfreeaddrinfo(result);
7914 
7915         /* Test IPv6 address conversion with brackets */
7916         result = NULL;
7917         ret = pgetaddrinfo("[beef::cafe]", NULL, NULL, &result);
7918         ok(!ret, "getaddrinfo failed with %d\n", ret);
7919         verify_ipv6_addrinfo(result, "beef::cafe");
7920         pfreeaddrinfo(result);
7921 
7922         /* Test IPv6 address conversion with brackets and hints */
7923         memset(&hint, 0, sizeof(ADDRINFOA));
7924         hint.ai_flags = AI_NUMERICHOST;
7925         hint.ai_family = AF_INET6;
7926         result = NULL;
7927         ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
7928         ok(!ret, "getaddrinfo failed with %d\n", ret);
7929         verify_ipv6_addrinfo(result, "beef::cafe");
7930         pfreeaddrinfo(result);
7931 
7932         memset(&hint, 0, sizeof(ADDRINFOA));
7933         hint.ai_flags = AI_NUMERICHOST;
7934         hint.ai_family = AF_INET;
7935         result = NULL;
7936         ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
7937         ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7938 
7939         /* Test IPv6 address conversion with brackets and port */
7940         result = NULL;
7941         ret = pgetaddrinfo("[beef::cafe]:10239", NULL, NULL, &result);
7942         ok(!ret, "getaddrinfo failed with %d\n", ret);
7943         verify_ipv6_addrinfo(result, "beef::cafe");
7944         pfreeaddrinfo(result);
7945 
7946         /* Test IPv6 address conversion with unmatched brackets */
7947         result = NULL;
7948         hint.ai_flags = AI_NUMERICHOST;
7949         ret = pgetaddrinfo("[beef::cafe", NULL, &hint, &result);
7950         ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7951 
7952         ret = pgetaddrinfo("beef::cafe]", NULL, &hint, &result);
7953         ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7954     }
7955     else
7956     {
7957         ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7958         win_skip("getaddrinfo does not support IPV6\n");
7959     }
7960 
7961     hint.ai_flags = 0;
7962 
7963     for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
7964     {
7965         hint.ai_family = hinttests[i].family;
7966         hint.ai_socktype = hinttests[i].socktype;
7967         hint.ai_protocol = hinttests[i].protocol;
7968 
7969         result = NULL;
7970         SetLastError(0xdeadbeef);
7971         ret = pgetaddrinfo("localhost", NULL, &hint, &result);
7972         if(!ret)
7973         {
7974             if (hinttests[i].error)
7975                 ok(0, "test %d: getaddrinfo succeeded unexpectedly\n", i);
7976             else
7977             {
7978                 p = result;
7979                 do
7980                 {
7981                     /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7982                     if (hinttests[i].family == AF_UNSPEC)
7983                         ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
7984                            "test %d: expected AF_INET or AF_INET6, got %d\n",
7985                            i, p->ai_family);
7986                     else
7987                         ok(p->ai_family == hinttests[i].family,
7988                            "test %d: expected family %d, got %d\n",
7989                            i, hinttests[i].family, p->ai_family);
7990 
7991                     ok(p->ai_socktype == hinttests[i].socktype,
7992                        "test %d: expected type %d, got %d\n",
7993                        i, hinttests[i].socktype, p->ai_socktype);
7994                     ok(p->ai_protocol == hinttests[i].protocol,
7995                        "test %d: expected protocol %d, got %d\n",
7996                        i, hinttests[i].protocol, p->ai_protocol);
7997                     p = p->ai_next;
7998                 }
7999                 while (p);
8000             }
8001             pfreeaddrinfo(result);
8002         }
8003         else
8004         {
8005             DWORD err = WSAGetLastError();
8006             if (hinttests[i].error)
8007                 ok(hinttests[i].error == err, "test %d: getaddrinfo failed with error %d, expected %d\n",
8008                    i, err, hinttests[i].error);
8009             else
8010                 ok(0, "test %d: getaddrinfo failed with %d (err %d)\n", i, ret, err);
8011         }
8012     }
8013 }
8014 
8015 static void test_ConnectEx(void)
8016 {
8017     SOCKET listener = INVALID_SOCKET;
8018     SOCKET acceptor = INVALID_SOCKET;
8019     SOCKET connector = INVALID_SOCKET;
8020     struct sockaddr_in address, conaddress;
8021     int addrlen;
8022     OVERLAPPED overlapped;
8023     LPFN_CONNECTEX pConnectEx;
8024     GUID connectExGuid = WSAID_CONNECTEX;
8025     DWORD bytesReturned;
8026     char buffer[1024];
8027     BOOL bret;
8028     DWORD dwret;
8029     int iret;
8030 
8031     memset(&overlapped, 0, sizeof(overlapped));
8032 
8033     listener = socket(AF_INET, SOCK_STREAM, 0);
8034     if (listener == INVALID_SOCKET) {
8035         skip("could not create listener socket, error %d\n", WSAGetLastError());
8036         goto end;
8037     }
8038 
8039     connector = socket(AF_INET, SOCK_STREAM, 0);
8040     if (connector == INVALID_SOCKET) {
8041         skip("could not create connector socket, error %d\n", WSAGetLastError());
8042         goto end;
8043     }
8044 
8045     memset(&address, 0, sizeof(address));
8046     address.sin_family = AF_INET;
8047     address.sin_addr.s_addr = inet_addr("127.0.0.1");
8048     iret = bind(listener, (struct sockaddr*)&address, sizeof(address));
8049     if (iret != 0) {
8050         skip("failed to bind, error %d\n", WSAGetLastError());
8051         goto end;
8052     }
8053 
8054     addrlen = sizeof(address);
8055     iret = getsockname(listener, (struct sockaddr*)&address, &addrlen);
8056     if (iret != 0) {
8057         skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8058         goto end;
8059     }
8060 
8061     if (set_blocking(listener, TRUE)) {
8062         skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8063         goto end;
8064     }
8065 
8066     bytesReturned = 0xdeadbeef;
8067     iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectExGuid, sizeof(connectExGuid),
8068         &pConnectEx, sizeof(pConnectEx), &bytesReturned, NULL, NULL);
8069     if (iret) {
8070         win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", iret, WSAGetLastError());
8071         goto end;
8072     }
8073 
8074     ok(bytesReturned == sizeof(pConnectEx), "expected sizeof(pConnectEx), got %u\n", bytesReturned);
8075 
8076     bret = pConnectEx(INVALID_SOCKET, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8077     ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "ConnectEx on invalid socket "
8078         "returned %d + errno %d\n", bret, WSAGetLastError());
8079 
8080     bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8081     ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "ConnectEx on a unbound socket "
8082         "returned %d + errno %d\n", bret, WSAGetLastError());
8083     if (bret == TRUE || WSAGetLastError() != WSAEINVAL)
8084     {
8085         acceptor = accept(listener, NULL, NULL);
8086         if (acceptor != INVALID_SOCKET) {
8087             closesocket(acceptor);
8088             acceptor = INVALID_SOCKET;
8089         }
8090 
8091         closesocket(connector);
8092         connector = socket(AF_INET, SOCK_STREAM, 0);
8093         if (connector == INVALID_SOCKET) {
8094             skip("could not create connector socket, error %d\n", WSAGetLastError());
8095             goto end;
8096         }
8097     }
8098 
8099     /* ConnectEx needs a bound socket */
8100     memset(&conaddress, 0, sizeof(conaddress));
8101     conaddress.sin_family = AF_INET;
8102     conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8103     iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8104     if (iret != 0) {
8105         skip("failed to bind, error %d\n", WSAGetLastError());
8106         goto end;
8107     }
8108 
8109     bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, NULL);
8110     ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "ConnectEx on a NULL overlapped "
8111         "returned %d + errno %d\n", bret, WSAGetLastError());
8112 
8113     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
8114     if (overlapped.hEvent == NULL) {
8115         skip("could not create event object, errno = %d\n", GetLastError());
8116         goto end;
8117     }
8118 
8119     iret = listen(listener, 1);
8120     if (iret != 0) {
8121         skip("listening failed, errno = %d\n", WSAGetLastError());
8122         goto end;
8123     }
8124 
8125     bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8126     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: "
8127         "returned %d + errno %d\n", bret, WSAGetLastError());
8128     dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8129     ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8130 
8131     bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8132     ok(bret, "Connecting failed, error %d\n", GetLastError());
8133     ok(bytesReturned == 0, "Bytes sent is %d\n", bytesReturned);
8134 
8135     closesocket(connector);
8136     connector = socket(AF_INET, SOCK_STREAM, 0);
8137     if (connector == INVALID_SOCKET) {
8138         skip("could not create connector socket, error %d\n", WSAGetLastError());
8139         goto end;
8140     }
8141     /* ConnectEx needs a bound socket */
8142     memset(&conaddress, 0, sizeof(conaddress));
8143     conaddress.sin_family = AF_INET;
8144     conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8145     iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8146     if (iret != 0) {
8147         skip("failed to bind, error %d\n", WSAGetLastError());
8148         goto end;
8149     }
8150 
8151     acceptor = accept(listener, NULL, NULL);
8152     if (acceptor != INVALID_SOCKET) {
8153         closesocket(acceptor);
8154     }
8155 
8156     buffer[0] = '1';
8157     buffer[1] = '2';
8158     buffer[2] = '3';
8159     bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, buffer, 3, &bytesReturned, &overlapped);
8160     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: "
8161         "returned %d + errno %d\n", bret, WSAGetLastError());
8162     dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8163     ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8164 
8165     bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8166     ok(bret, "Connecting failed, error %d\n", GetLastError());
8167     ok(bytesReturned == 3, "Bytes sent is %d\n", bytesReturned);
8168 
8169     acceptor = accept(listener, NULL, NULL);
8170     ok(acceptor != INVALID_SOCKET, "could not accept socket error %d\n", WSAGetLastError());
8171 
8172     bytesReturned = recv(acceptor, buffer, 3, 0);
8173     buffer[4] = 0;
8174     ok(bytesReturned == 3, "Didn't get all sent data, got only %d\n", bytesReturned);
8175     ok(buffer[0] == '1' && buffer[1] == '2' && buffer[2] == '3',
8176        "Failed to get the right data, expected '123', got '%s'\n", buffer);
8177 
8178     closesocket(connector);
8179     connector = socket(AF_INET, SOCK_STREAM, 0);
8180     if (connector == INVALID_SOCKET) {
8181         skip("could not create connector socket, error %d\n", WSAGetLastError());
8182         goto end;
8183     }
8184     /* ConnectEx needs a bound socket */
8185     memset(&conaddress, 0, sizeof(conaddress));
8186     conaddress.sin_family = AF_INET;
8187     conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8188     iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8189     if (iret != 0) {
8190         skip("failed to bind, error %d\n", WSAGetLastError());
8191         goto end;
8192     }
8193 
8194     if (acceptor != INVALID_SOCKET) {
8195         closesocket(acceptor);
8196         acceptor = INVALID_SOCKET;
8197     }
8198 
8199     /* Connect with error */
8200     closesocket(listener);
8201     listener = INVALID_SOCKET;
8202 
8203     address.sin_port = htons(1);
8204 
8205     bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8206     ok(bret == FALSE && GetLastError() == ERROR_IO_PENDING, "ConnectEx to bad destination failed: "
8207         "returned %d + errno %d\n", bret, GetLastError());
8208     dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8209     ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8210 
8211     bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8212     ok(bret == FALSE && GetLastError() == ERROR_CONNECTION_REFUSED,
8213        "Connecting to a disconnected host returned error %d - %d\n", bret, WSAGetLastError());
8214 
8215 end:
8216     if (overlapped.hEvent)
8217         WSACloseEvent(overlapped.hEvent);
8218     if (listener != INVALID_SOCKET)
8219         closesocket(listener);
8220     if (acceptor != INVALID_SOCKET)
8221         closesocket(acceptor);
8222     if (connector != INVALID_SOCKET)
8223         closesocket(connector);
8224 }
8225 
8226 static void test_AcceptEx(void)
8227 {
8228     SOCKET listener = INVALID_SOCKET;
8229     SOCKET acceptor = INVALID_SOCKET;
8230     SOCKET connector = INVALID_SOCKET;
8231     SOCKET connector2 = INVALID_SOCKET;
8232     struct sockaddr_in bindAddress, peerAddress, *readBindAddress, *readRemoteAddress;
8233     int socklen, optlen;
8234     GUID acceptExGuid = WSAID_ACCEPTEX, getAcceptExGuid = WSAID_GETACCEPTEXSOCKADDRS;
8235     LPFN_ACCEPTEX pAcceptEx = NULL;
8236     LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs = NULL;
8237     fd_set fds_accept, fds_send;
8238     struct timeval timeout = {0,10}; /* wait for 10 milliseconds */
8239     int got, conn1, i;
8240     DWORD bytesReturned, connect_time;
8241     char buffer[1024], ipbuffer[32];
8242     OVERLAPPED overlapped;
8243     int iret, localSize = sizeof(struct sockaddr_in), remoteSize = localSize;
8244     BOOL bret;
8245     DWORD dwret;
8246 
8247     memset(&overlapped, 0, sizeof(overlapped));
8248 
8249     listener = socket(AF_INET, SOCK_STREAM, 0);
8250     if (listener == INVALID_SOCKET) {
8251         skip("could not create listener socket, error %d\n", WSAGetLastError());
8252         goto end;
8253     }
8254 
8255     acceptor = socket(AF_INET, SOCK_STREAM, 0);
8256     if (acceptor == INVALID_SOCKET) {
8257         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8258         goto end;
8259     }
8260 
8261     connector = socket(AF_INET, SOCK_STREAM, 0);
8262     if (connector == INVALID_SOCKET) {
8263         skip("could not create connector socket, error %d\n", WSAGetLastError());
8264         goto end;
8265     }
8266 
8267     memset(&bindAddress, 0, sizeof(bindAddress));
8268     bindAddress.sin_family = AF_INET;
8269     bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8270     iret = bind(listener, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8271     if (iret != 0) {
8272         skip("failed to bind, error %d\n", WSAGetLastError());
8273         goto end;
8274     }
8275 
8276     socklen = sizeof(bindAddress);
8277     iret = getsockname(listener, (struct sockaddr*)&bindAddress, &socklen);
8278     if (iret != 0) {
8279         skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8280         goto end;
8281     }
8282 
8283     if (set_blocking(listener, FALSE)) {
8284         skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8285         goto end;
8286     }
8287 
8288     iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid),
8289         &pAcceptEx, sizeof(pAcceptEx), &bytesReturned, NULL, NULL);
8290     if (iret) {
8291         skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError());
8292         goto end;
8293     }
8294 
8295     iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &getAcceptExGuid, sizeof(getAcceptExGuid),
8296         &pGetAcceptExSockaddrs, sizeof(pGetAcceptExSockaddrs), &bytesReturned, NULL, NULL);
8297     if (iret) {
8298         skip("WSAIoctl failed to get GetAcceptExSockaddrs with ret %d + errno %d\n", iret, WSAGetLastError());
8299         goto end;
8300     }
8301 
8302     bret = pAcceptEx(INVALID_SOCKET, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8303         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8304         &bytesReturned, &overlapped);
8305     ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid listening socket "
8306         "returned %d + errno %d\n", bret, WSAGetLastError());
8307 
8308     bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8309         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8310         &bytesReturned, &overlapped);
8311 todo_wine
8312     ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "AcceptEx on a non-listening socket "
8313         "returned %d + errno %d\n", bret, WSAGetLastError());
8314 
8315     iret = listen(listener, 5);
8316     if (iret != 0) {
8317         skip("listening failed, errno = %d\n", WSAGetLastError());
8318         goto end;
8319     }
8320 
8321     bret = pAcceptEx(listener, INVALID_SOCKET, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8322         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8323         &bytesReturned, &overlapped);
8324     ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid accepting socket "
8325         "returned %d + errno %d\n", bret, WSAGetLastError());
8326 
8327     bret = pAcceptEx(listener, acceptor, NULL, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8328         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8329         &bytesReturned, &overlapped);
8330     todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEFAULT,
8331         "AcceptEx on NULL buffer returned %d + errno %d\n", bret, WSAGetLastError());
8332 
8333     bret = pAcceptEx(listener, acceptor, buffer, 0, 0, sizeof(struct sockaddr_in) + 16,
8334         &bytesReturned, &overlapped);
8335     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING,
8336         "AcceptEx on too small local address size returned %d + errno %d\n",
8337         bret, WSAGetLastError());
8338     bret = CancelIo((HANDLE) listener);
8339     ok(bret, "Failed to cancel pending accept socket\n");
8340 
8341     bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 15,
8342         sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped);
8343     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx on too small local address "
8344         "size returned %d + errno %d\n",
8345         bret, WSAGetLastError());
8346     bret = CancelIo((HANDLE) listener);
8347     ok(bret, "Failed to cancel pending accept socket\n");
8348 
8349     bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, 0,
8350         &bytesReturned, &overlapped);
8351     ok(bret == FALSE && WSAGetLastError() == WSAEFAULT,
8352         "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError());
8353 
8354     bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16,
8355         sizeof(struct sockaddr_in) + 15, &bytesReturned, &overlapped);
8356     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING,
8357         "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError());
8358     bret = CancelIo((HANDLE) listener);
8359     ok(bret, "Failed to cancel pending accept socket\n");
8360 
8361     bret = pAcceptEx(listener, acceptor, buffer, 0,
8362         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8363         &bytesReturned, NULL);
8364     ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped "
8365         "returned %d + errno %d\n", bret, WSAGetLastError());
8366 
8367     bret = pAcceptEx(listener, acceptor, buffer, 0, 0, 0, &bytesReturned, NULL);
8368     ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped "
8369         "returned %d + errno %d\n", bret, WSAGetLastError());
8370 
8371     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
8372     if (overlapped.hEvent == NULL) {
8373         skip("could not create event object, errno = %d\n", GetLastError());
8374         goto end;
8375     }
8376 
8377     bret = pAcceptEx(listener, acceptor, buffer, 0,
8378         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8379         &bytesReturned, &overlapped);
8380     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8381 
8382     bret = pAcceptEx(listener, acceptor, buffer, 0,
8383         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8384         &bytesReturned, &overlapped);
8385     todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEINVAL,
8386        "AcceptEx on already pending socket returned %d + errno %d\n", bret, WSAGetLastError());
8387     if (bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING) {
8388         /* We need to cancel this call, otherwise things fail */
8389         bret = CancelIo((HANDLE) listener);
8390         ok(bret, "Failed to cancel failed test. Bailing...\n");
8391         if (!bret) return;
8392         WaitForSingleObject(overlapped.hEvent, 0);
8393 
8394         bret = pAcceptEx(listener, acceptor, buffer, 0,
8395             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8396             &bytesReturned, &overlapped);
8397         ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8398     }
8399 
8400     iret = connect(acceptor,  (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8401     todo_wine ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL,
8402        "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret, WSAGetLastError());
8403     if (!iret || (iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)) {
8404         /* We need to cancel this call, otherwise things fail */
8405         closesocket(acceptor);
8406         acceptor = socket(AF_INET, SOCK_STREAM, 0);
8407         if (acceptor == INVALID_SOCKET) {
8408             skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8409             goto end;
8410         }
8411 
8412         bret = CancelIo((HANDLE) listener);
8413         ok(bret, "Failed to cancel failed test. Bailing...\n");
8414         if (!bret) return;
8415 
8416         bret = pAcceptEx(listener, acceptor, buffer, 0,
8417             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8418             &bytesReturned, &overlapped);
8419         ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8420     }
8421 
8422     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8423     ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8424 
8425     dwret = WaitForSingleObject(overlapped.hEvent, INFINITE);
8426     ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8427 
8428     bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8429     ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8430     ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8431 
8432     closesocket(connector);
8433     connector = INVALID_SOCKET;
8434     closesocket(acceptor);
8435 
8436     /* Test short reads */
8437 
8438     acceptor = socket(AF_INET, SOCK_STREAM, 0);
8439     if (acceptor == INVALID_SOCKET) {
8440         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8441         goto end;
8442     }
8443     connector = socket(AF_INET, SOCK_STREAM, 0);
8444     if (connector == INVALID_SOCKET) {
8445         skip("could not create connector socket, error %d\n", WSAGetLastError());
8446         goto end;
8447     }
8448     bret = pAcceptEx(listener, acceptor, buffer, 2,
8449         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8450         &bytesReturned, &overlapped);
8451     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8452 
8453     connect_time = 0xdeadbeef;
8454     optlen = sizeof(connect_time);
8455     iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
8456     ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
8457     ok(connect_time == ~0u, "unexpected connect time %u\n", connect_time);
8458 
8459     /* AcceptEx() still won't complete until we send data */
8460     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8461     ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8462 
8463     connect_time = 0xdeadbeef;
8464     optlen = sizeof(connect_time);
8465     iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
8466     ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
8467     ok(connect_time < 0xdeadbeef, "unexpected connect time %u\n", connect_time);
8468 
8469     dwret = WaitForSingleObject(overlapped.hEvent, 0);
8470     ok(dwret == WAIT_TIMEOUT, "Waiting for accept event timeout failed with %d + errno %d\n", dwret, GetLastError());
8471 
8472     iret = getsockname( connector, (struct sockaddr *)&peerAddress, &remoteSize);
8473     ok( !iret, "getsockname failed.\n");
8474 
8475     /* AcceptEx() could complete any time now */
8476     iret = send(connector, buffer, 1, 0);
8477     ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError());
8478 
8479     dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8480     ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8481 
8482     /* Check if the buffer from AcceptEx is decoded correctly */
8483     pGetAcceptExSockaddrs(buffer, 2, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8484                           (struct sockaddr **)&readBindAddress, &localSize,
8485                           (struct sockaddr **)&readRemoteAddress, &remoteSize);
8486     strcpy( ipbuffer, inet_ntoa(readBindAddress->sin_addr));
8487     ok( readBindAddress->sin_addr.s_addr == bindAddress.sin_addr.s_addr,
8488             "Local socket address is different %s != %s\n",
8489             ipbuffer, inet_ntoa(bindAddress.sin_addr));
8490     ok( readBindAddress->sin_port == bindAddress.sin_port,
8491             "Local socket port is different: %d != %d\n",
8492             readBindAddress->sin_port, bindAddress.sin_port);
8493     strcpy( ipbuffer, inet_ntoa(readRemoteAddress->sin_addr));
8494     ok( readRemoteAddress->sin_addr.s_addr == peerAddress.sin_addr.s_addr,
8495             "Remote socket address is different %s != %s\n",
8496             ipbuffer, inet_ntoa(peerAddress.sin_addr));
8497     ok( readRemoteAddress->sin_port == peerAddress.sin_port,
8498             "Remote socket port is different: %d != %d\n",
8499             readRemoteAddress->sin_port, peerAddress.sin_port);
8500 
8501     bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8502     ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8503     ok(bytesReturned == 1, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8504 
8505     closesocket(connector);
8506     connector = INVALID_SOCKET;
8507     closesocket(acceptor);
8508 
8509     /* Test CF_DEFER & AcceptEx interaction */
8510 
8511     acceptor = socket(AF_INET, SOCK_STREAM, 0);
8512     if (acceptor == INVALID_SOCKET) {
8513         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8514         goto end;
8515     }
8516     connector = socket(AF_INET, SOCK_STREAM, 0);
8517     if (connector == INVALID_SOCKET) {
8518         skip("could not create connector socket, error %d\n", WSAGetLastError());
8519         goto end;
8520     }
8521     connector2 = socket(AF_INET, SOCK_STREAM, 0);
8522     if (connector == INVALID_SOCKET) {
8523         skip("could not create connector socket, error %d\n", WSAGetLastError());
8524         goto end;
8525     }
8526 
8527     if (set_blocking(connector, FALSE)) {
8528         skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8529         goto end;
8530     }
8531 
8532     if (set_blocking(connector2, FALSE)) {
8533         skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8534         goto end;
8535     }
8536 
8537     /* Connect socket #1 */
8538     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8539     ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8540 
8541     FD_ZERO ( &fds_accept );
8542     FD_ZERO ( &fds_send );
8543 
8544     FD_SET ( listener, &fds_accept );
8545     FD_SET ( connector, &fds_send );
8546 
8547     buffer[0] = '0';
8548     got = 0;
8549     conn1 = 0;
8550 
8551     for (i = 0; i < 4000; ++i)
8552     {
8553         fd_set fds_openaccept = fds_accept, fds_opensend = fds_send;
8554 
8555         wsa_ok ( ( select ( 0, &fds_openaccept, &fds_opensend, NULL, &timeout ) ), SOCKET_ERROR !=,
8556             "acceptex test(%d): could not select on socket, errno %d\n" );
8557 
8558         /* check for incoming requests */
8559         if ( FD_ISSET ( listener, &fds_openaccept ) ) {
8560             got++;
8561             if (got == 1) {
8562                 SOCKET tmp = WSAAccept(listener, NULL, NULL, (LPCONDITIONPROC) AlwaysDeferConditionFunc, 0);
8563                 ok(tmp == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError());
8564                 bret = pAcceptEx(listener, acceptor, buffer, 0,
8565                                     sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8566                                     &bytesReturned, &overlapped);
8567                 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8568             }
8569             else if (got == 2) {
8570                 /* this should be socket #2 */
8571                 SOCKET tmp = accept(listener, NULL, NULL);
8572                 ok(tmp != INVALID_SOCKET, "accept failed %d\n", WSAGetLastError());
8573                 closesocket(tmp);
8574             }
8575             else {
8576                 ok(FALSE, "Got more than 2 connections?\n");
8577             }
8578         }
8579         if ( conn1 && FD_ISSET ( connector2, &fds_opensend ) ) {
8580             /* Send data on second socket, and stop */
8581             send(connector2, "2", 1, 0);
8582             FD_CLR ( connector2, &fds_send );
8583 
8584             break;
8585         }
8586         if ( FD_ISSET ( connector, &fds_opensend ) ) {
8587             /* Once #1 is connected, allow #2 to connect */
8588             conn1 = 1;
8589 
8590             send(connector, "1", 1, 0);
8591             FD_CLR ( connector, &fds_send );
8592 
8593             iret = connect(connector2, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8594             ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8595             FD_SET ( connector2, &fds_send );
8596         }
8597     }
8598 
8599     ok (got == 2 || broken(got == 1) /* NT4 */,
8600             "Did not get both connections, got %d\n", got);
8601 
8602     dwret = WaitForSingleObject(overlapped.hEvent, 0);
8603     ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8604 
8605     bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8606     ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8607     ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8608 
8609     set_blocking(acceptor, TRUE);
8610     iret = recv( acceptor, buffer, 2, 0);
8611     ok(iret == 1, "Failed to get data, %d, errno: %d\n", iret, WSAGetLastError());
8612 
8613     ok(buffer[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer[0]);
8614 
8615     closesocket(connector);
8616     connector = INVALID_SOCKET;
8617     closesocket(acceptor);
8618 
8619     /* clean up in case of failures */
8620     while ((acceptor = accept(listener, NULL, NULL)) != INVALID_SOCKET)
8621         closesocket(acceptor);
8622 
8623     /* Disconnect during receive? */
8624 
8625     acceptor = socket(AF_INET, SOCK_STREAM, 0);
8626     if (acceptor == INVALID_SOCKET) {
8627         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8628         goto end;
8629     }
8630     connector = socket(AF_INET, SOCK_STREAM, 0);
8631     if (connector == INVALID_SOCKET) {
8632         skip("could not create connector socket, error %d\n", WSAGetLastError());
8633         goto end;
8634     }
8635     bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8636         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8637         &bytesReturned, &overlapped);
8638     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8639 
8640     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8641     ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8642 
8643     closesocket(connector);
8644     connector = INVALID_SOCKET;
8645 
8646     dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8647     ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8648 
8649     bytesReturned = 123456;
8650     bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8651     ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8652     ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8653 
8654     closesocket(acceptor);
8655 
8656     /* Test closing with pending requests */
8657 
8658     acceptor = socket(AF_INET, SOCK_STREAM, 0);
8659     if (acceptor == INVALID_SOCKET) {
8660         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8661         goto end;
8662     }
8663     bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8664         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8665         &bytesReturned, &overlapped);
8666     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8667 
8668     closesocket(acceptor);
8669 
8670     dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8671     todo_wine ok(dwret == WAIT_OBJECT_0,
8672        "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8673 
8674     if (dwret != WAIT_TIMEOUT) {
8675         bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8676         ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError());
8677     }
8678     else {
8679         bret = CancelIo((HANDLE) listener);
8680         ok(bret, "Failed to cancel failed test. Bailing...\n");
8681         if (!bret) return;
8682         WaitForSingleObject(overlapped.hEvent, 0);
8683     }
8684 
8685     acceptor = socket(AF_INET, SOCK_STREAM, 0);
8686     if (acceptor == INVALID_SOCKET) {
8687         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8688         goto end;
8689     }
8690     bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8691         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8692         &bytesReturned, &overlapped);
8693     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8694 
8695     CancelIo((HANDLE) acceptor);
8696 
8697     dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8698     ok(dwret == WAIT_TIMEOUT, "Waiting for timeout failed with %d + errno %d\n", dwret, GetLastError());
8699 
8700     closesocket(acceptor);
8701 
8702     acceptor = socket(AF_INET, SOCK_STREAM, 0);
8703     if (acceptor == INVALID_SOCKET) {
8704         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8705         goto end;
8706     }
8707     bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8708         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8709         &bytesReturned, &overlapped);
8710     ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8711 
8712     closesocket(listener);
8713     listener = INVALID_SOCKET;
8714 
8715     dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8716     ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8717 
8718     bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8719     ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError());
8720 
8721 end:
8722     if (overlapped.hEvent)
8723         WSACloseEvent(overlapped.hEvent);
8724     if (listener != INVALID_SOCKET)
8725         closesocket(listener);
8726     if (acceptor != INVALID_SOCKET)
8727         closesocket(acceptor);
8728     if (connector != INVALID_SOCKET)
8729         closesocket(connector);
8730     if (connector2 != INVALID_SOCKET)
8731         closesocket(connector2);
8732 }
8733 
8734 static void test_DisconnectEx(void)
8735 {
8736     SOCKET listener, acceptor, connector;
8737     LPFN_DISCONNECTEX pDisconnectEx;
8738     GUID disconnectExGuid = WSAID_DISCONNECTEX;
8739     struct sockaddr_in address;
8740     DWORD num_bytes, flags;
8741     OVERLAPPED overlapped;
8742     int addrlen, iret;
8743     BOOL bret;
8744 
8745     connector = socket(AF_INET, SOCK_STREAM, 0);
8746     ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError());
8747 
8748     iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &disconnectExGuid, sizeof(disconnectExGuid),
8749                     &pDisconnectEx, sizeof(pDisconnectEx), &num_bytes, NULL, NULL);
8750     if (iret)
8751     {
8752         win_skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError());
8753         closesocket(connector);
8754         return;
8755     }
8756 
8757     listener = socket(AF_INET, SOCK_STREAM, 0);
8758     ok(listener != INVALID_SOCKET, "failed to create listener socket, error %d\n", WSAGetLastError());
8759 
8760     memset(&address, 0, sizeof(address));
8761     address.sin_family = AF_INET;
8762     address.sin_addr.s_addr = inet_addr("127.0.0.1");
8763     iret = bind(listener, (struct sockaddr *)&address, sizeof(address));
8764     ok(iret == 0, "failed to bind, error %d\n", WSAGetLastError());
8765 
8766     addrlen = sizeof(address);
8767     iret = getsockname(listener, (struct sockaddr *)&address, &addrlen);
8768     ok(iret == 0, "failed to lookup bind address, error %d\n", WSAGetLastError());
8769 
8770     iret = listen(listener, 1);
8771     ok(iret == 0, "failed to listen, error %d\n", WSAGetLastError());
8772 
8773     set_blocking(listener, TRUE);
8774 
8775     memset(&overlapped, 0, sizeof(overlapped));
8776     bret = pDisconnectEx(INVALID_SOCKET, &overlapped, 0, 0);
8777     ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n");
8778     ok(WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %d\n", WSAGetLastError());
8779 
8780     memset(&overlapped, 0, sizeof(overlapped));
8781     bret = pDisconnectEx(connector, &overlapped, 0, 0);
8782     ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n");
8783     todo_wine ok(WSAGetLastError() == WSAENOTCONN, "expected WSAENOTCONN, got %d\n", WSAGetLastError());
8784 
8785     iret = connect(connector, (struct sockaddr *)&address, addrlen);
8786     ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError());
8787 
8788     acceptor = accept(listener, NULL, NULL);
8789     ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError());
8790 
8791     memset(&overlapped, 0, sizeof(overlapped));
8792     overlapped.hEvent = WSACreateEvent();
8793     ok(overlapped.hEvent != WSA_INVALID_EVENT, "WSACreateEvent failed, error %d\n", WSAGetLastError());
8794     bret = pDisconnectEx(connector, &overlapped, 0, 0);
8795     if (bret)
8796         ok(overlapped.Internal == STATUS_PENDING, "expected STATUS_PENDING, got %08lx\n", overlapped.Internal);
8797     else if (WSAGetLastError() == ERROR_IO_PENDING)
8798         bret = WSAGetOverlappedResult(connector, &overlapped, &num_bytes, TRUE, &flags);
8799     ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError());
8800     WSACloseEvent(overlapped.hEvent);
8801 
8802     iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
8803     ok(iret != 0, "connect unexpectedly succeeded\n");
8804     ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError());
8805 
8806     closesocket(acceptor);
8807     closesocket(connector);
8808 
8809     connector = socket(AF_INET, SOCK_STREAM, 0);
8810     ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError());
8811 
8812     iret = connect(connector, (struct sockaddr *)&address, addrlen);
8813     ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError());
8814 
8815     acceptor = accept(listener, NULL, NULL);
8816     ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError());
8817 
8818     bret = pDisconnectEx(connector, NULL, 0, 0);
8819     ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError());
8820 
8821     iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
8822     ok(iret != 0, "connect unexpectedly succeeded\n");
8823     ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError());
8824 
8825     closesocket(acceptor);
8826     closesocket(connector);
8827     closesocket(listener);
8828 }
8829 
8830 #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__)
8831 
8832 static void compare_file2(HANDLE handle, SOCKET sock, int offset, const char *file, int line)
8833 {
8834     char buf1[256], buf2[256];
8835     BOOL success;
8836     int i = 0;
8837 
8838     SetFilePointer(handle, offset, NULL, FILE_BEGIN);
8839     while (1)
8840     {
8841         DWORD n1 = 0, n2 = 0;
8842 
8843         success = ReadFile(handle, buf1, sizeof(buf1), &n1, NULL);
8844         ok_(file,line)(success, "Failed to read from file.\n");
8845         if (success && n1 == 0)
8846             break;
8847         else if(!success)
8848             return;
8849         n2 = recv(sock, buf2, n1, 0);
8850         ok_(file,line)(n1 == n2, "Block %d size mismatch (%d != %d)\n", i, n1, n2);
8851         ok_(file,line)(memcmp(buf1, buf2, n2) == 0, "Block %d failed\n", i);
8852         i++;
8853     }
8854 }
8855 
8856 static void test_TransmitFile(void)
8857 {
8858     DWORD num_bytes, err, file_size, total_sent;
8859     GUID transmitFileGuid = WSAID_TRANSMITFILE;
8860     LPFN_TRANSMITFILE pTransmitFile = NULL;
8861     HANDLE file = INVALID_HANDLE_VALUE;
8862     char header_msg[] = "hello world";
8863     char footer_msg[] = "goodbye!!!";
8864     char system_ini_path[MAX_PATH];
8865     struct sockaddr_in bindAddress;
8866     TRANSMIT_FILE_BUFFERS buffers;
8867     SOCKET client, server, dest;
8868     WSAOVERLAPPED ov;
8869     char buf[256];
8870     int iret, len;
8871     BOOL bret;
8872 
8873     memset( &ov, 0, sizeof(ov) );
8874 
8875     /* Setup sockets for testing TransmitFile */
8876     client = socket(AF_INET, SOCK_STREAM, 0);
8877     server = socket(AF_INET, SOCK_STREAM, 0);
8878     if (client == INVALID_SOCKET || server == INVALID_SOCKET)
8879     {
8880         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8881         goto cleanup;
8882     }
8883     iret = WSAIoctl(client, SIO_GET_EXTENSION_FUNCTION_POINTER, &transmitFileGuid, sizeof(transmitFileGuid),
8884                     &pTransmitFile, sizeof(pTransmitFile), &num_bytes, NULL, NULL);
8885     if (iret)
8886     {
8887         skip("WSAIoctl failed to get TransmitFile with ret %d + errno %d\n", iret, WSAGetLastError());
8888         goto cleanup;
8889     }
8890     GetSystemWindowsDirectoryA(system_ini_path, MAX_PATH );
8891     strcat(system_ini_path, "\\system.ini");
8892     file = CreateFileA(system_ini_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0x0, NULL);
8893     if (file == INVALID_HANDLE_VALUE)
8894     {
8895         skip("Unable to open a file to transmit.\n");
8896         goto cleanup;
8897     }
8898     file_size = GetFileSize(file, NULL);
8899 
8900     /* Test TransmitFile with an invalid socket */
8901     bret = pTransmitFile(INVALID_SOCKET, file, 0, 0, NULL, NULL, 0);
8902     err = WSAGetLastError();
8903     ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8904     ok(err == WSAENOTSOCK, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTSOCK);
8905 
8906     /* Test a bogus TransmitFile without a connected socket */
8907     bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, TF_REUSE_SOCKET);
8908     err = WSAGetLastError();
8909     ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8910     ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN);
8911 
8912     /* Setup a properly connected socket for transfers */
8913     memset(&bindAddress, 0, sizeof(bindAddress));
8914     bindAddress.sin_family = AF_INET;
8915     bindAddress.sin_port = htons(SERVERPORT+1);
8916     bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8917     iret = bind(server, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8918     if (iret != 0)
8919     {
8920         skip("failed to bind(), error %d\n", WSAGetLastError());
8921         goto cleanup;
8922     }
8923     iret = listen(server, 1);
8924     if (iret != 0)
8925     {
8926         skip("failed to listen(), error %d\n", WSAGetLastError());
8927         goto cleanup;
8928     }
8929     iret = connect(client, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8930     if (iret != 0)
8931     {
8932         skip("failed to connect(), error %d\n", WSAGetLastError());
8933         goto cleanup;
8934     }
8935     len = sizeof(bindAddress);
8936     dest = accept(server, (struct sockaddr*)&bindAddress, &len);
8937     if (dest == INVALID_SOCKET)
8938     {
8939         skip("failed to accept(), error %d\n", WSAGetLastError());
8940         goto cleanup;
8941     }
8942     if (set_blocking(dest, FALSE))
8943     {
8944         skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8945         goto cleanup;
8946     }
8947 
8948     /* Test TransmitFile with no possible buffer */
8949     bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0);
8950     ok(bret, "TransmitFile failed unexpectedly.\n");
8951     iret = recv(dest, buf, sizeof(buf), 0);
8952     ok(iret == -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret);
8953 
8954     /* Test TransmitFile with only buffer data */
8955     buffers.Head = &header_msg[0];
8956     buffers.HeadLength = sizeof(header_msg);
8957     buffers.Tail = &footer_msg[0];
8958     buffers.TailLength = sizeof(footer_msg);
8959     bret = pTransmitFile(client, NULL, 0, 0, NULL, &buffers, 0);
8960     ok(bret, "TransmitFile failed unexpectedly.\n");
8961     iret = recv(dest, buf, sizeof(buf), 0);
8962     ok(iret == sizeof(header_msg)+sizeof(footer_msg),
8963        "Returned an unexpected buffer from TransmitFile: %d\n", iret );
8964     ok(memcmp(&buf[0], &header_msg[0], sizeof(header_msg)) == 0,
8965        "TransmitFile header buffer did not match!\n");
8966     ok(memcmp(&buf[sizeof(header_msg)], &footer_msg[0], sizeof(footer_msg)) == 0,
8967        "TransmitFile footer buffer did not match!\n");
8968 
8969     /* Test TransmitFile with only file data */
8970     bret = pTransmitFile(client, file, 0, 0, NULL, NULL, 0);
8971     ok(bret, "TransmitFile failed unexpectedly.\n");
8972     compare_file(file, dest, 0);
8973 
8974     /* Test TransmitFile with both file and buffer data */
8975     buffers.Head = &header_msg[0];
8976     buffers.HeadLength = sizeof(header_msg);
8977     buffers.Tail = &footer_msg[0];
8978     buffers.TailLength = sizeof(footer_msg);
8979     SetFilePointer(file, 0, NULL, FILE_BEGIN);
8980     bret = pTransmitFile(client, file, 0, 0, NULL, &buffers, 0);
8981     ok(bret, "TransmitFile failed unexpectedly.\n");
8982     iret = recv(dest, buf, sizeof(header_msg), 0);
8983     ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0,
8984        "TransmitFile header buffer did not match!\n");
8985     compare_file(file, dest, 0);
8986     iret = recv(dest, buf, sizeof(footer_msg), 0);
8987     ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0,
8988        "TransmitFile footer buffer did not match!\n");
8989 
8990     /* Test overlapped TransmitFile */
8991     ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
8992     if (ov.hEvent == INVALID_HANDLE_VALUE)
8993     {
8994         skip("Could not create event object, some tests will be skipped. errno = %d\n",
8995              GetLastError());
8996         goto cleanup;
8997     }
8998     SetFilePointer(file, 0, NULL, FILE_BEGIN);
8999     bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
9000     err = WSAGetLastError();
9001     ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9002     ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n",
9003        err, ERROR_IO_PENDING);
9004     iret = WaitForSingleObject(ov.hEvent, 2000);
9005     ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
9006     WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
9007     ok(total_sent == file_size,
9008        "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
9009        total_sent, file_size);
9010     compare_file(file, dest, 0);
9011 
9012     /* Test overlapped TransmitFile w/ start offset */
9013     ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
9014     if (ov.hEvent == INVALID_HANDLE_VALUE)
9015     {
9016         skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
9017         goto cleanup;
9018     }
9019     SetFilePointer(file, 0, NULL, FILE_BEGIN);
9020     ov.Offset = 10;
9021     bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
9022     err = WSAGetLastError();
9023     ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9024     ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
9025     iret = WaitForSingleObject(ov.hEvent, 2000);
9026     ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
9027     WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
9028     ok(total_sent == (file_size - ov.Offset),
9029        "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
9030        total_sent, file_size - ov.Offset);
9031     compare_file(file, dest, ov.Offset);
9032 
9033     /* Test overlapped TransmitFile w/ file and buffer data */
9034     ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
9035     if (ov.hEvent == INVALID_HANDLE_VALUE)
9036     {
9037         skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
9038         goto cleanup;
9039     }
9040     buffers.Head = &header_msg[0];
9041     buffers.HeadLength = sizeof(header_msg);
9042     buffers.Tail = &footer_msg[0];
9043     buffers.TailLength = sizeof(footer_msg);
9044     SetFilePointer(file, 0, NULL, FILE_BEGIN);
9045     ov.Offset = 0;
9046     bret = pTransmitFile(client, file, 0, 0, &ov, &buffers, 0);
9047     err = WSAGetLastError();
9048     ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9049     ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
9050     iret = WaitForSingleObject(ov.hEvent, 2000);
9051     ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
9052     WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
9053     ok(total_sent == (file_size + buffers.HeadLength + buffers.TailLength),
9054        "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
9055        total_sent, file_size  + buffers.HeadLength + buffers.TailLength);
9056     iret = recv(dest, buf, sizeof(header_msg), 0);
9057     ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0,
9058        "TransmitFile header buffer did not match!\n");
9059     compare_file(file, dest, 0);
9060     iret = recv(dest, buf, sizeof(footer_msg), 0);
9061     ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0,
9062        "TransmitFile footer buffer did not match!\n");
9063 
9064     /* Test TransmitFile w/ TF_DISCONNECT */
9065     SetFilePointer(file, 0, NULL, FILE_BEGIN);
9066     bret = pTransmitFile(client, file, 0, 0, NULL, NULL, TF_DISCONNECT);
9067     ok(bret, "TransmitFile failed unexpectedly.\n");
9068     compare_file(file, dest, 0);
9069     closesocket(client);
9070     ok(send(client, "test", 4, 0) == -1, "send() after TF_DISCONNECT succeeded unexpectedly.\n");
9071     err = WSAGetLastError();
9072     todo_wine ok(err == WSAENOTSOCK, "send() after TF_DISCONNECT triggered unexpected errno (%d != %d)\n",
9073                  err, WSAENOTSOCK);
9074 
9075     /* Test TransmitFile with a UDP datagram socket */
9076     client = socket(AF_INET, SOCK_DGRAM, 0);
9077     bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0);
9078     err = WSAGetLastError();
9079     ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9080     ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN);
9081 
9082 cleanup:
9083     CloseHandle(file);
9084     CloseHandle(ov.hEvent);
9085     closesocket(client);
9086     closesocket(server);
9087 }
9088 
9089 static void test_getpeername(void)
9090 {
9091     SOCKET sock;
9092     struct sockaddr_in sa, sa_out;
9093     SOCKADDR_STORAGE ss;
9094     int sa_len;
9095     const char buf[] = "hello world";
9096     int ret;
9097 
9098     /* Test the parameter validation order. */
9099     ret = getpeername(INVALID_SOCKET, NULL, NULL);
9100     ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9101     ok(WSAGetLastError() == WSAENOTSOCK,
9102        "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError());
9103 
9104     sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
9105     ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9106     if (sock == INVALID_SOCKET)
9107     {
9108         skip("Socket creation failed with %d\n", WSAGetLastError());
9109         return;
9110     }
9111 
9112     ret = getpeername(sock, NULL, NULL);
9113     ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9114     ok(WSAGetLastError() == WSAENOTCONN,
9115        "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9116 
9117     memset(&sa, 0, sizeof(sa));
9118     sa.sin_family = AF_INET;
9119     sa.sin_port = htons(139);
9120     sa.sin_addr.s_addr = inet_addr("127.0.0.1");
9121 
9122     /* sendto does not change a socket's connection state. */
9123     ret = sendto(sock, buf, sizeof(buf), 0, (struct sockaddr*)&sa, sizeof(sa));
9124     ok(ret != SOCKET_ERROR,
9125        "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9126 
9127     ret = getpeername(sock, NULL, NULL);
9128     ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9129     ok(WSAGetLastError() == WSAENOTCONN,
9130        "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9131 
9132     ret = connect(sock, (struct sockaddr*)&sa, sizeof(sa));
9133     ok(ret == 0,
9134        "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9135 
9136     ret = getpeername(sock, NULL, NULL);
9137     ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9138     ok(WSAGetLastError() == WSAEFAULT,
9139        "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9140 
9141     /* Test crashes on Wine. */
9142     if (0)
9143     {
9144         ret = getpeername(sock, (void*)0xdeadbeef, (void*)0xcafebabe);
9145         ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9146         ok(WSAGetLastError() == WSAEFAULT,
9147            "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9148     }
9149 
9150     ret = getpeername(sock, (struct sockaddr*)&sa_out, NULL);
9151     ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9152     ok(WSAGetLastError() == WSAEFAULT,
9153        "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9154 
9155     sa_len = 0;
9156     ret = getpeername(sock, NULL, &sa_len);
9157     ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9158     ok(WSAGetLastError() == WSAEFAULT,
9159        "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9160     ok(!sa_len, "got %d\n", sa_len);
9161 
9162     sa_len = 0;
9163     ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len);
9164     ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9165     ok(WSAGetLastError() == WSAEFAULT,
9166        "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9167     ok(!sa_len, "got %d\n", sa_len);
9168 
9169     sa_len = sizeof(ss);
9170     ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len);
9171     ok(ret == 0, "Expected getpeername to return 0, got %d\n", ret);
9172     ok(!memcmp(&sa, &ss, sizeof(sa)),
9173        "Expected the returned structure to be identical to the connect structure\n");
9174     ok(sa_len == sizeof(sa), "got %d\n", sa_len);
9175 
9176     closesocket(sock);
9177 }
9178 
9179 static void test_sioRoutingInterfaceQuery(void)
9180 {
9181     int ret;
9182     SOCKET sock;
9183     SOCKADDR_IN sin = { 0 }, sout = { 0 };
9184     DWORD bytesReturned;
9185 
9186     sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
9187     ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9188     if (sock == INVALID_SOCKET)
9189     {
9190         skip("Socket creation failed with %d\n", WSAGetLastError());
9191         return;
9192     }
9193     ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, NULL, 0, NULL, 0, NULL,
9194                    NULL, NULL);
9195     ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
9196        "expected WSAEFAULT, got %d\n", WSAGetLastError());
9197     ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9198                    NULL, 0, NULL, NULL, NULL);
9199     ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
9200        "expected WSAEFAULT, got %d\n", WSAGetLastError());
9201     ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9202                    NULL, 0, &bytesReturned, NULL, NULL);
9203     todo_wine ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEAFNOSUPPORT,
9204        "expected WSAEAFNOSUPPORT, got %d\n", WSAGetLastError());
9205     sin.sin_family = AF_INET;
9206     ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9207                    NULL, 0, &bytesReturned, NULL, NULL);
9208     todo_wine ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL,
9209        "expected WSAEINVAL, got %d\n", WSAGetLastError());
9210     sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
9211     ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9212                    NULL, 0, &bytesReturned, NULL, NULL);
9213     ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
9214        "expected WSAEFAULT, got %d\n", WSAGetLastError());
9215     ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9216                    &sout, sizeof(sout), &bytesReturned, NULL, NULL);
9217     ok(!ret, "WSAIoctl failed: %d\n", WSAGetLastError());
9218     ok(sout.sin_family == AF_INET, "expected AF_INET, got %d\n", sout.sin_family);
9219     /* We expect the source address to be INADDR_LOOPBACK as well, but
9220      * there's no guarantee that a route to the loopback address exists,
9221      * so rather than introduce spurious test failures we do not test the
9222      * source address.
9223      */
9224     closesocket(sock);
9225 }
9226 
9227 static void test_sioAddressListChange(void)
9228 {
9229     struct sockaddr_in bindAddress;
9230     struct in_addr net_address;
9231     WSAOVERLAPPED overlapped, *olp;
9232     struct hostent *h;
9233     DWORD num_bytes, error, tick;
9234     SOCKET sock, sock2, sock3;
9235     WSAEVENT event2, event3;
9236     HANDLE io_port;
9237     ULONG_PTR key;
9238     int acount;
9239     BOOL bret;
9240     int ret;
9241 
9242     /* Use gethostbyname to find the list of local network interfaces */
9243     h = gethostbyname("");
9244     if (!h)
9245     {
9246         skip("Cannot test SIO_ADDRESS_LIST_CHANGE, gethostbyname failed with %u\n",
9247              WSAGetLastError());
9248         return;
9249     }
9250     for (acount = 0; h->h_addr_list[acount]; acount++);
9251     if (acount == 0)
9252     {
9253         skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n");
9254         return;
9255     }
9256 
9257     net_address.s_addr = *(ULONG *) h->h_addr_list[0];
9258 
9259     sock = socket(AF_INET, 0, IPPROTO_TCP);
9260     ok(sock != INVALID_SOCKET, "socket() failed\n");
9261 
9262     memset(&bindAddress, 0, sizeof(bindAddress));
9263     bindAddress.sin_family = AF_INET;
9264     bindAddress.sin_addr.s_addr = net_address.s_addr;
9265     SetLastError(0xdeadbeef);
9266     ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9267     ok (!ret, "bind() failed with error %d\n", GetLastError());
9268     set_blocking(sock, FALSE);
9269 
9270     memset(&overlapped, 0, sizeof(overlapped));
9271     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9272     SetLastError(0xdeadbeef);
9273     ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9274     error = GetLastError();
9275     ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9276     ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9277 
9278     CloseHandle(overlapped.hEvent);
9279     closesocket(sock);
9280 
9281     sock = socket(AF_INET, 0, IPPROTO_TCP);
9282     ok(sock != INVALID_SOCKET, "socket() failed\n");
9283 
9284     SetLastError(0xdeadbeef);
9285     ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9286     ok (!ret, "bind() failed with error %d\n", GetLastError());
9287     set_blocking(sock, TRUE);
9288 
9289     memset(&overlapped, 0, sizeof(overlapped));
9290     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9291     SetLastError(0xdeadbeef);
9292     ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9293     error = GetLastError();
9294     ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9295     ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9296 
9297     CloseHandle(overlapped.hEvent);
9298     closesocket(sock);
9299 
9300     sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9301     ok(sock != INVALID_SOCKET, "socket() failed\n");
9302 
9303     SetLastError(0xdeadbeef);
9304     ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9305     ok (!ret, "bind() failed with error %d\n", GetLastError());
9306     set_blocking(sock, FALSE);
9307 
9308     memset(&overlapped, 0, sizeof(overlapped));
9309     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9310     SetLastError(0xdeadbeef);
9311     ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9312     error = GetLastError();
9313     ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9314     ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9315 
9316     CloseHandle(overlapped.hEvent);
9317     closesocket(sock);
9318 
9319     sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9320     ok(sock != INVALID_SOCKET, "socket() failed\n");
9321 
9322     SetLastError(0xdeadbeef);
9323     ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9324     ok (!ret, "bind() failed with error %d\n", GetLastError());
9325     set_blocking(sock, TRUE);
9326 
9327     memset(&overlapped, 0, sizeof(overlapped));
9328     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9329     SetLastError(0xdeadbeef);
9330     ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9331     error = GetLastError();
9332     ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9333     ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9334 
9335     CloseHandle(overlapped.hEvent);
9336     closesocket(sock);
9337 
9338     /* When the socket is overlapped non-blocking and the list change is requested without
9339      * an overlapped structure the error will be different. */
9340     sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9341     ok(sock != INVALID_SOCKET, "socket() failed\n");
9342 
9343     SetLastError(0xdeadbeef);
9344     ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9345     ok (!ret, "bind() failed with error %d\n", GetLastError());
9346     set_blocking(sock, FALSE);
9347 
9348     SetLastError(0xdeadbeef);
9349     ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9350     error = GetLastError();
9351     ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9352     ok (error == WSAEWOULDBLOCK, "expected 10035, got %d\n", error);
9353 
9354     io_port = CreateIoCompletionPort( (HANDLE)sock, NULL, 0, 0 );
9355     ok (io_port != NULL, "failed to create completion port %u\n", GetLastError());
9356 
9357     set_blocking(sock, FALSE);
9358     memset(&overlapped, 0, sizeof(overlapped));
9359     SetLastError(0xdeadbeef);
9360     ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9361     error = GetLastError();
9362     ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %u\n", error);
9363     ok (error == ERROR_IO_PENDING, "expected ERROR_IO_PENDING got %u\n", error);
9364 
9365     olp = (WSAOVERLAPPED *)0xdeadbeef;
9366     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 );
9367     ok(!bret, "failed to get completion status %u\n", bret);
9368     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9369     ok(!olp, "Overlapped structure is at %p\n", olp);
9370 
9371     closesocket(sock);
9372 
9373     olp = (WSAOVERLAPPED *)0xdeadbeef;
9374     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 );
9375     ok(!bret, "failed to get completion status %u\n", bret);
9376     ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %u\n", GetLastError());
9377     ok(olp == &overlapped, "Overlapped structure is at %p\n", olp);
9378 
9379     CloseHandle(io_port);
9380 
9381     /* Misuse of the API by using a blocking socket and not using an overlapped structure,
9382      * this leads to a hang forever. */
9383     if (0)
9384     {
9385         sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9386 
9387         SetLastError(0xdeadbeef);
9388         bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9389 
9390         set_blocking(sock, TRUE);
9391         WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9392         /* hang */
9393 
9394         closesocket(sock);
9395     }
9396 
9397     if (!winetest_interactive)
9398     {
9399         skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n");
9400         return;
9401     }
9402 
9403     /* Bind an overlapped socket to the first found network interface */
9404     sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9405     ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9406     sock2 = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9407     ok(sock2 != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9408     sock3 = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9409     ok(sock3 != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9410 
9411     ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9412     ok(!ret, "bind failed unexpectedly\n");
9413     ret = bind(sock2, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9414     ok(!ret, "bind failed unexpectedly\n");
9415     ret = bind(sock3, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9416     ok(!ret, "bind failed unexpectedly\n");
9417 
9418     set_blocking(sock2, FALSE);
9419     set_blocking(sock3, FALSE);
9420 
9421     /* Wait for address changes, request that the user connects/disconnects an interface */
9422     memset(&overlapped, 0, sizeof(overlapped));
9423     overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9424     ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9425     ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
9426     ok(WSAGetLastError() == WSA_IO_PENDING, "Expected pending last error, got %d\n", WSAGetLastError());
9427 
9428     ret = WSAIoctl(sock2, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9429     ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
9430     ok(WSAGetLastError() == WSAEWOULDBLOCK, "Expected would block last error, got %d\n", WSAGetLastError());
9431 
9432     event2 = WSACreateEvent();
9433     event3 = WSACreateEvent();
9434     ret = WSAEventSelect (sock2, event2, FD_ADDRESS_LIST_CHANGE);
9435     ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError());
9436     /* sock3 did not request SIO_ADDRESS_LIST_CHANGE but it is trying to wait anyway */
9437     ret = WSAEventSelect (sock3, event3, FD_ADDRESS_LIST_CHANGE);
9438     ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError());
9439 
9440     trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or"
9441           " change the ipv4 address of any of the local network interfaces (15 second timeout).\n");
9442     tick = GetTickCount();
9443     ret = WaitForSingleObject(overlapped.hEvent, 15000);
9444     ok(ret == WAIT_OBJECT_0, "failed to get overlapped event %u\n", ret);
9445 
9446     ret = WaitForSingleObject(event2, 500);
9447 todo_wine
9448     ok(ret == WAIT_OBJECT_0, "failed to get change event %u\n", ret);
9449 
9450     ret = WaitForSingleObject(event3, 500);
9451     ok(ret == WAIT_TIMEOUT, "unexpected change event\n");
9452 
9453     trace("Spent %d ms waiting.\n", GetTickCount() - tick);
9454 
9455     WSACloseEvent(event2);
9456     WSACloseEvent(event3);
9457 
9458     closesocket(sock);
9459     closesocket(sock2);
9460     closesocket(sock3);
9461 }
9462 
9463 static void test_synchronous_WSAIoctl(void)
9464 {
9465     HANDLE previous_port, io_port;
9466     WSAOVERLAPPED overlapped, *olp;
9467     SOCKET socket;
9468     ULONG on;
9469     ULONG_PTR key;
9470     DWORD num_bytes;
9471     BOOL ret;
9472     int res;
9473 
9474     previous_port = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 );
9475     ok( previous_port != NULL, "failed to create completion port %u\n", GetLastError() );
9476 
9477     socket = WSASocketW( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED );
9478     ok( socket != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError() );
9479 
9480     io_port = CreateIoCompletionPort( (HANDLE)socket, previous_port, 0, 0 );
9481     ok( io_port != NULL, "failed to create completion port %u\n", GetLastError() );
9482 
9483     on = 1;
9484     memset( &overlapped, 0, sizeof(overlapped) );
9485     res = WSAIoctl( socket, FIONBIO, &on, sizeof(on), NULL, 0, &num_bytes, &overlapped, NULL );
9486     ok( !res, "WSAIoctl failed %d\n", WSAGetLastError() );
9487 
9488     ret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 10000 );
9489     ok( ret, "failed to get completion status %u\n", GetLastError() );
9490 
9491     CloseHandle( io_port );
9492     closesocket( socket );
9493     CloseHandle( previous_port );
9494 }
9495 
9496 #define WM_ASYNCCOMPLETE (WM_USER + 100)
9497 static HWND create_async_message_window(void)
9498 {
9499     static const char class_name[] = "ws2_32 async message window class";
9500 
9501     WNDCLASSEXA wndclass;
9502     HWND hWnd;
9503 
9504     wndclass.cbSize         = sizeof(wndclass);
9505     wndclass.style          = CS_HREDRAW | CS_VREDRAW;
9506     wndclass.lpfnWndProc    = DefWindowProcA;
9507     wndclass.cbClsExtra     = 0;
9508     wndclass.cbWndExtra     = 0;
9509     wndclass.hInstance      = GetModuleHandleA(NULL);
9510     wndclass.hIcon          = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
9511     wndclass.hIconSm        = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
9512     wndclass.hCursor        = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
9513     wndclass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
9514     wndclass.lpszClassName  = class_name;
9515     wndclass.lpszMenuName   = NULL;
9516 
9517     RegisterClassExA(&wndclass);
9518 
9519     hWnd = CreateWindowA(class_name, "ws2_32 async message window", WS_OVERLAPPEDWINDOW,
9520                         0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL);
9521     if (!hWnd)
9522     {
9523         ok(0, "failed to create window: %u\n", GetLastError());
9524         return NULL;
9525     }
9526 
9527     return hWnd;
9528 }
9529 
9530 static void wait_for_async_message(HWND hwnd, HANDLE handle)
9531 {
9532     BOOL ret;
9533     MSG msg;
9534 
9535     while ((ret = GetMessageA(&msg, 0, 0, 0)) &&
9536            !(msg.hwnd == hwnd && msg.message == WM_ASYNCCOMPLETE))
9537     {
9538         TranslateMessage(&msg);
9539         DispatchMessageA(&msg);
9540     }
9541 
9542     ok(ret, "did not expect WM_QUIT message\n");
9543     ok(msg.wParam == (WPARAM)handle, "expected wParam = %p, got %lx\n", handle, msg.wParam);
9544 }
9545 
9546 static void test_WSAAsyncGetServByPort(void)
9547 {
9548     HWND hwnd = create_async_message_window();
9549     HANDLE ret;
9550     char buffer[MAXGETHOSTSTRUCT];
9551 
9552     if (!hwnd)
9553         return;
9554 
9555     /* FIXME: The asynchronous window messages should be tested. */
9556 
9557     /* Parameters are not checked when initiating the asynchronous operation.  */
9558     ret = WSAAsyncGetServByPort(NULL, 0, 0, NULL, NULL, 0);
9559     ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9560 
9561     ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, 0, NULL, NULL, 0);
9562     ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9563     wait_for_async_message(hwnd, ret);
9564 
9565     ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, NULL, 0);
9566     ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9567     wait_for_async_message(hwnd, ret);
9568 
9569     ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, buffer, MAXGETHOSTSTRUCT);
9570     ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9571     wait_for_async_message(hwnd, ret);
9572 
9573     DestroyWindow(hwnd);
9574 }
9575 
9576 static void test_WSAAsyncGetServByName(void)
9577 {
9578     HWND hwnd = create_async_message_window();
9579     HANDLE ret;
9580     char buffer[MAXGETHOSTSTRUCT];
9581 
9582     if (!hwnd)
9583         return;
9584 
9585     /* FIXME: The asynchronous window messages should be tested. */
9586 
9587     /* Parameters are not checked when initiating the asynchronous operation.  */
9588     ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", NULL, NULL, 0);
9589     ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9590     wait_for_async_message(hwnd, ret);
9591 
9592     ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", "", buffer, MAXGETHOSTSTRUCT);
9593     ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9594     wait_for_async_message(hwnd, ret);
9595 
9596     ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", NULL, NULL, 0);
9597     ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9598     wait_for_async_message(hwnd, ret);
9599 
9600     ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", "tcp", buffer, MAXGETHOSTSTRUCT);
9601     ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9602     wait_for_async_message(hwnd, ret);
9603 
9604     DestroyWindow(hwnd);
9605 }
9606 
9607 /*
9608  * Provide consistent initialization for the AcceptEx IOCP tests.
9609  */
9610 static SOCKET setup_iocp_src(struct sockaddr_in *bindAddress)
9611 {
9612     SOCKET src, ret = INVALID_SOCKET;
9613     int iret, socklen;
9614 
9615     src = socket(AF_INET, SOCK_STREAM, 0);
9616     if (src == INVALID_SOCKET)
9617     {
9618         skip("could not create listener socket, error %d\n", WSAGetLastError());
9619         goto end;
9620     }
9621 
9622     memset(bindAddress, 0, sizeof(*bindAddress));
9623     bindAddress->sin_family = AF_INET;
9624     bindAddress->sin_addr.s_addr = inet_addr("127.0.0.1");
9625     iret = bind(src, (struct sockaddr*)bindAddress, sizeof(*bindAddress));
9626     if (iret != 0)
9627     {
9628         skip("failed to bind, error %d\n", WSAGetLastError());
9629         goto end;
9630     }
9631 
9632     socklen = sizeof(*bindAddress);
9633     iret = getsockname(src, (struct sockaddr*)bindAddress, &socklen);
9634     if (iret != 0) {
9635         skip("failed to lookup bind address, error %d\n", WSAGetLastError());
9636         goto end;
9637     }
9638 
9639     if (set_blocking(src, FALSE))
9640     {
9641         skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
9642         goto end;
9643     }
9644 
9645     iret = listen(src, 5);
9646     if (iret != 0)
9647     {
9648         skip("listening failed, errno = %d\n", WSAGetLastError());
9649         goto end;
9650     }
9651 
9652     ret = src;
9653 end:
9654     if (src != ret && ret == INVALID_SOCKET)
9655         closesocket(src);
9656     return ret;
9657 }
9658 
9659 static void test_completion_port(void)
9660 {
9661     FILE_IO_COMPLETION_NOTIFICATION_INFORMATION io_info;
9662     HANDLE previous_port, io_port;
9663     WSAOVERLAPPED ov, *olp;
9664     SOCKET src, dest, dup, connector = INVALID_SOCKET;
9665     WSAPROTOCOL_INFOA info;
9666     IO_STATUS_BLOCK io;
9667     NTSTATUS status;
9668     char buf[1024];
9669     WSABUF bufs;
9670     DWORD num_bytes, flags;
9671     struct linger ling;
9672     int iret;
9673     BOOL bret;
9674     ULONG_PTR key;
9675     struct sockaddr_in bindAddress;
9676     GUID acceptExGuid = WSAID_ACCEPTEX;
9677     LPFN_ACCEPTEX pAcceptEx = NULL;
9678     fd_set fds_recv;
9679 
9680     memset(buf, 0, sizeof(buf));
9681     previous_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
9682     ok( previous_port != NULL, "Failed to create completion port %u\n", GetLastError());
9683 
9684     memset(&ov, 0, sizeof(ov));
9685 
9686     tcp_socketpair(&src, &dest);
9687     if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9688     {
9689         skip("failed to create sockets\n");
9690         goto end;
9691     }
9692 
9693     bufs.len = sizeof(buf);
9694     bufs.buf = buf;
9695     flags = 0;
9696 
9697     ling.l_onoff = 1;
9698     ling.l_linger = 0;
9699     iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9700     ok(!iret, "Failed to set linger %d\n", GetLastError());
9701 
9702     io_port = CreateIoCompletionPort( (HANDLE)dest, previous_port, 125, 0 );
9703     ok(io_port != NULL, "Failed to create completion port %u\n", GetLastError());
9704 
9705     SetLastError(0xdeadbeef);
9706 
9707     iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9708     ok(iret == SOCKET_ERROR, "WSARecv returned %d\n", iret);
9709     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
9710 
9711     Sleep(100);
9712 
9713     closesocket(src);
9714     src = INVALID_SOCKET;
9715 
9716     SetLastError(0xdeadbeef);
9717     key = 0xdeadbeef;
9718     num_bytes = 0xdeadbeef;
9719     olp = (WSAOVERLAPPED *)0xdeadbeef;
9720 
9721     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9722     todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret);
9723     todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "Last error was %d\n", GetLastError());
9724     ok(key == 125, "Key is %lu\n", key);
9725     ok(num_bytes == 0, "Number of bytes received is %u\n", num_bytes);
9726     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9727 
9728     SetLastError(0xdeadbeef);
9729     key = 0xdeadbeef;
9730     num_bytes = 0xdeadbeef;
9731     olp = (WSAOVERLAPPED *)0xdeadbeef;
9732 
9733     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9734     ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret );
9735     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9736     ok(key == 0xdeadbeef, "Key is %lu\n", key);
9737     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9738     ok(!olp, "Overlapped structure is at %p\n", olp);
9739 
9740     if (dest != INVALID_SOCKET)
9741         closesocket(dest);
9742 
9743     memset(&ov, 0, sizeof(ov));
9744 
9745     tcp_socketpair(&src, &dest);
9746     if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9747     {
9748         skip("failed to create sockets\n");
9749         goto end;
9750     }
9751 
9752     bufs.len = sizeof(buf);
9753     bufs.buf = buf;
9754     flags = 0;
9755 
9756     ling.l_onoff = 1;
9757     ling.l_linger = 0;
9758     iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9759     ok(!iret, "Failed to set linger %d\n", GetLastError());
9760 
9761     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9762     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9763 
9764     set_blocking(dest, FALSE);
9765 
9766     closesocket(src);
9767     src = INVALID_SOCKET;
9768 
9769     Sleep(100);
9770 
9771     num_bytes = 0xdeadbeef;
9772     SetLastError(0xdeadbeef);
9773 
9774     iret = WSASend(dest, &bufs, 1, &num_bytes, 0, &ov, NULL);
9775     ok(iret == SOCKET_ERROR, "WSASend failed - %d\n", iret);
9776     ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError());
9777     ok(num_bytes == 0xdeadbeef, "Managed to send %d\n", num_bytes);
9778 
9779     SetLastError(0xdeadbeef);
9780     key = 0xdeadbeef;
9781     num_bytes = 0xdeadbeef;
9782     olp = (WSAOVERLAPPED *)0xdeadbeef;
9783 
9784     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9785     ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9786     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9787     ok(key == 0xdeadbeef, "Key is %lu\n", key);
9788     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9789     ok(!olp, "Overlapped structure is at %p\n", olp);
9790 
9791     if (dest != INVALID_SOCKET)
9792         closesocket(dest);
9793 
9794     /* Test IOCP response on successful immediate read. */
9795     tcp_socketpair(&src, &dest);
9796     if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9797     {
9798         skip("failed to create sockets\n");
9799         goto end;
9800     }
9801 
9802     bufs.len = sizeof(buf);
9803     bufs.buf = buf;
9804     flags = 0;
9805     SetLastError(0xdeadbeef);
9806 
9807     iret = WSASend(src, &bufs, 1, &num_bytes, 0, &ov, NULL);
9808     ok(!iret, "WSASend failed - %d, last error %u\n", iret, GetLastError());
9809     ok(num_bytes == sizeof(buf), "Managed to send %d\n", num_bytes);
9810 
9811     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9812     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9813     set_blocking(dest, FALSE);
9814 
9815     FD_ZERO(&fds_recv);
9816     FD_SET(dest, &fds_recv);
9817     select(dest + 1, &fds_recv, NULL, NULL, NULL);
9818 
9819     num_bytes = 0xdeadbeef;
9820     flags = 0;
9821 
9822     iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9823     ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError());
9824     ok(num_bytes == sizeof(buf), "Managed to read %d\n", num_bytes);
9825 
9826     SetLastError(0xdeadbeef);
9827     key = 0xdeadbeef;
9828     num_bytes = 0xdeadbeef;
9829     olp = (WSAOVERLAPPED *)0xdeadbeef;
9830 
9831     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9832     ok(bret == TRUE, "failed to get completion status %u\n", bret);
9833     ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9834     ok(key == 125, "Key is %lu\n", key);
9835     ok(num_bytes == sizeof(buf), "Number of bytes transferred is %u\n", num_bytes);
9836     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9837 
9838     /* Test IOCP response on graceful shutdown. */
9839     closesocket(src);
9840 
9841     FD_ZERO(&fds_recv);
9842     FD_SET(dest, &fds_recv);
9843     select(dest + 1, &fds_recv, NULL, NULL, NULL);
9844 
9845     num_bytes = 0xdeadbeef;
9846     flags = 0;
9847     memset(&ov, 0, sizeof(ov));
9848 
9849     iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9850     ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError());
9851     ok(!num_bytes, "Managed to read %d\n", num_bytes);
9852 
9853     SetLastError(0xdeadbeef);
9854     key = 0xdeadbeef;
9855     num_bytes = 0xdeadbeef;
9856     olp = (WSAOVERLAPPED *)0xdeadbeef;
9857 
9858     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9859     ok(bret == TRUE, "failed to get completion status %u\n", bret);
9860     ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9861     ok(key == 125, "Key is %lu\n", key);
9862     ok(!num_bytes, "Number of bytes transferred is %u\n", num_bytes);
9863     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9864 
9865     closesocket(src);
9866     src = INVALID_SOCKET;
9867     closesocket(dest);
9868     dest = INVALID_SOCKET;
9869 
9870     /* Test IOCP response on hard shutdown. This was the condition that triggered
9871      * a crash in an actual app (bug 38980). */
9872     tcp_socketpair(&src, &dest);
9873     if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9874     {
9875         skip("failed to create sockets\n");
9876         goto end;
9877     }
9878 
9879     bufs.len = sizeof(buf);
9880     bufs.buf = buf;
9881     flags = 0;
9882     memset(&ov, 0, sizeof(ov));
9883 
9884     ling.l_onoff = 1;
9885     ling.l_linger = 0;
9886     iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9887     ok(!iret, "Failed to set linger %d\n", GetLastError());
9888 
9889     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9890     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9891     set_blocking(dest, FALSE);
9892 
9893     closesocket(src);
9894     src = INVALID_SOCKET;
9895 
9896     FD_ZERO(&fds_recv);
9897     FD_SET(dest, &fds_recv);
9898     select(dest + 1, &fds_recv, NULL, NULL, NULL);
9899 
9900     num_bytes = 0xdeadbeef;
9901     SetLastError(0xdeadbeef);
9902 
9903     /* Somehow a hard shutdown doesn't work on my Linux box. It seems SO_LINGER is ignored. */
9904     iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9905     todo_wine ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret);
9906     todo_wine ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError());
9907     todo_wine ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes);
9908 
9909     SetLastError(0xdeadbeef);
9910     key = 0xdeadbeef;
9911     num_bytes = 0xdeadbeef;
9912     olp = (WSAOVERLAPPED *)0xdeadbeef;
9913 
9914     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9915     todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9916     todo_wine ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9917     todo_wine ok(key == 0xdeadbeef, "Key is %lu\n", key);
9918     todo_wine ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9919     todo_wine ok(!olp, "Overlapped structure is at %p\n", olp);
9920 
9921     closesocket(dest);
9922 
9923     /* Test reading from a non-connected socket, mostly because the above test is marked todo. */
9924     dest = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
9925     ok(dest != INVALID_SOCKET, "socket() failed\n");
9926 
9927     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9928     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9929     set_blocking(dest, FALSE);
9930 
9931     num_bytes = 0xdeadbeef;
9932     SetLastError(0xdeadbeef);
9933     memset(&ov, 0, sizeof(ov));
9934 
9935     iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9936     ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret);
9937     ok(GetLastError() == WSAENOTCONN, "Last error was %d\n", GetLastError());
9938     ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes);
9939 
9940     SetLastError(0xdeadbeef);
9941     key = 0xdeadbeef;
9942     num_bytes = 0xdeadbeef;
9943     olp = (WSAOVERLAPPED *)0xdeadbeef;
9944 
9945     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9946     ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9947     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9948     ok(key == 0xdeadbeef, "Key is %lu\n", key);
9949     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9950     ok(!olp, "Overlapped structure is at %p\n", olp);
9951 
9952     num_bytes = 0xdeadbeef;
9953     closesocket(dest);
9954 
9955     dest = socket(AF_INET, SOCK_STREAM, 0);
9956     if (dest == INVALID_SOCKET)
9957     {
9958         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
9959         goto end;
9960     }
9961 
9962     iret = WSAIoctl(dest, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid),
9963             &pAcceptEx, sizeof(pAcceptEx), &num_bytes, NULL, NULL);
9964     if (iret)
9965     {
9966         skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError());
9967         goto end;
9968     }
9969 
9970     /* Test IOCP response on socket close (IOCP created after AcceptEx) */
9971 
9972     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
9973         goto end;
9974 
9975     SetLastError(0xdeadbeef);
9976 
9977     bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
9978             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
9979             &num_bytes, &ov);
9980     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
9981     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
9982 
9983     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
9984     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9985 
9986     closesocket(src);
9987     src = INVALID_SOCKET;
9988 
9989     SetLastError(0xdeadbeef);
9990     key = 0xdeadbeef;
9991     num_bytes = 0xdeadbeef;
9992     olp = (WSAOVERLAPPED *)0xdeadbeef;
9993 
9994     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9995     ok(bret == FALSE, "failed to get completion status %u\n", bret);
9996     ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
9997     ok(key == 125, "Key is %lu\n", key);
9998     ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
9999     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10000     ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10001 
10002     SetLastError(0xdeadbeef);
10003     key = 0xdeadbeef;
10004     num_bytes = 0xdeadbeef;
10005     olp = (WSAOVERLAPPED *)0xdeadbeef;
10006     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10007     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10008     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10009     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10010     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10011     ok(!olp, "Overlapped structure is at %p\n", olp);
10012 
10013     /* Test IOCP response on socket close (IOCP created before AcceptEx) */
10014 
10015     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10016         goto end;
10017 
10018     SetLastError(0xdeadbeef);
10019 
10020     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10021     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10022 
10023     bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10024             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10025             &num_bytes, &ov);
10026     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10027     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10028 
10029     closesocket(src);
10030     src = INVALID_SOCKET;
10031 
10032     SetLastError(0xdeadbeef);
10033     key = 0xdeadbeef;
10034     num_bytes = 0xdeadbeef;
10035     olp = (WSAOVERLAPPED *)0xdeadbeef;
10036 
10037     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10038     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10039     ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10040     ok(key == 125, "Key is %lu\n", key);
10041     ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10042     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10043     ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10044 
10045     SetLastError(0xdeadbeef);
10046     key = 0xdeadbeef;
10047     num_bytes = 0xdeadbeef;
10048     olp = (WSAOVERLAPPED *)0xdeadbeef;
10049     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10050     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10051     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10052     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10053     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10054     ok(!olp, "Overlapped structure is at %p\n", olp);
10055 
10056     /* Test IOCP with duplicated handle */
10057 
10058     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10059         goto end;
10060 
10061     SetLastError(0xdeadbeef);
10062 
10063     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10064     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10065 
10066     WSADuplicateSocketA( src, GetCurrentProcessId(), &info );
10067     dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED);
10068     ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10069 
10070     bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10071             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10072             &num_bytes, &ov);
10073     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10074     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10075 
10076     SetLastError(0xdeadbeef);
10077     key = 0xdeadbeef;
10078     num_bytes = 0xdeadbeef;
10079     olp = (WSAOVERLAPPED *)0xdeadbeef;
10080     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10081     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10082     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10083     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10084     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10085     ok(!olp, "Overlapped structure is at %p\n", olp);
10086 
10087     closesocket(src);
10088     src = INVALID_SOCKET;
10089     closesocket(dup);
10090     dup = INVALID_SOCKET;
10091 
10092     SetLastError(0xdeadbeef);
10093     key = 0xdeadbeef;
10094     num_bytes = 0xdeadbeef;
10095     olp = (WSAOVERLAPPED *)0xdeadbeef;
10096     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10097     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10098     ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10099     ok(key == 125, "Key is %lu\n", key);
10100     ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10101     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10102     ok(olp && olp->Internal == (ULONG)STATUS_CANCELLED, "Internal status is %lx\n", olp ? olp->Internal : 0);
10103 
10104     SetLastError(0xdeadbeef);
10105     key = 0xdeadbeef;
10106     num_bytes = 0xdeadbeef;
10107     olp = (WSAOVERLAPPED *)0xdeadbeef;
10108     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10109     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10110     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10111     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10112     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10113     ok(!olp, "Overlapped structure is at %p\n", olp);
10114 
10115     /* Test IOCP with duplicated handle (closing duplicated handle) */
10116 
10117     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10118         goto end;
10119 
10120     SetLastError(0xdeadbeef);
10121 
10122     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10123     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10124 
10125     WSADuplicateSocketA( src, GetCurrentProcessId(), &info );
10126     dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED);
10127     ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10128 
10129     bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10130             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10131             &num_bytes, &ov);
10132     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10133     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10134 
10135     closesocket(dup);
10136     dup = INVALID_SOCKET;
10137 
10138     SetLastError(0xdeadbeef);
10139     key = 0xdeadbeef;
10140     num_bytes = 0xdeadbeef;
10141     olp = (WSAOVERLAPPED *)0xdeadbeef;
10142     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10143     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10144     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10145     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10146     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10147     ok(!olp, "Overlapped structure is at %p\n", olp);
10148 
10149     SetLastError(0xdeadbeef);
10150     key = 0xdeadbeef;
10151     num_bytes = 0xdeadbeef;
10152     olp = (WSAOVERLAPPED *)0xdeadbeef;
10153     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10154     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10155     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10156     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10157     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10158     ok(!olp, "Overlapped structure is at %p\n", olp);
10159 
10160     closesocket(src);
10161     src = INVALID_SOCKET;
10162 
10163     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10164     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10165     ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10166     ok(key == 125, "Key is %lu\n", key);
10167     ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10168     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10169     ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10170 
10171     SetLastError(0xdeadbeef);
10172     key = 0xdeadbeef;
10173     num_bytes = 0xdeadbeef;
10174     olp = (WSAOVERLAPPED *)0xdeadbeef;
10175     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10176     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10177     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10178     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10179     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10180     ok(!olp, "Overlapped structure is at %p\n", olp);
10181 
10182     /* Test IOCP with duplicated handle (closing original handle) */
10183 
10184     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10185         goto end;
10186 
10187     SetLastError(0xdeadbeef);
10188 
10189     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10190     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10191 
10192     WSADuplicateSocketA( src, GetCurrentProcessId(), &info );
10193     dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED);
10194     ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10195 
10196     bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10197             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10198             &num_bytes, &ov);
10199     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10200     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10201 
10202     closesocket(src);
10203     src = INVALID_SOCKET;
10204 
10205     SetLastError(0xdeadbeef);
10206     key = 0xdeadbeef;
10207     num_bytes = 0xdeadbeef;
10208     olp = (WSAOVERLAPPED *)0xdeadbeef;
10209     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10210     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10211     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10212     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10213     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10214     ok(!olp, "Overlapped structure is at %p\n", olp);
10215 
10216     closesocket(dup);
10217     dup = INVALID_SOCKET;
10218 
10219     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10220     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10221     ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10222     ok(key == 125, "Key is %lu\n", key);
10223     ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10224     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10225     ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10226 
10227     SetLastError(0xdeadbeef);
10228     key = 0xdeadbeef;
10229     num_bytes = 0xdeadbeef;
10230     olp = (WSAOVERLAPPED *)0xdeadbeef;
10231     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10232     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10233     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10234     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10235     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10236     ok(!olp, "Overlapped structure is at %p\n", olp);
10237 
10238     /* Test IOCP without AcceptEx */
10239 
10240     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10241         goto end;
10242 
10243     SetLastError(0xdeadbeef);
10244 
10245     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10246     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10247 
10248     closesocket(src);
10249     src = INVALID_SOCKET;
10250 
10251     SetLastError(0xdeadbeef);
10252     key = 0xdeadbeef;
10253     num_bytes = 0xdeadbeef;
10254     olp = (WSAOVERLAPPED *)0xdeadbeef;
10255     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10256     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10257     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10258     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10259     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10260     ok(!olp, "Overlapped structure is at %p\n", olp);
10261 
10262     /* */
10263 
10264     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10265         goto end;
10266 
10267     connector = socket(AF_INET, SOCK_STREAM, 0);
10268     if (connector == INVALID_SOCKET) {
10269         skip("could not create connector socket, error %d\n", WSAGetLastError());
10270         goto end;
10271     }
10272 
10273     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10274     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10275 
10276     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10277     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10278 
10279     bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10280             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10281             &num_bytes, &ov);
10282     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10283     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10284 
10285     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10286     ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10287 
10288     closesocket(connector);
10289     connector = INVALID_SOCKET;
10290 
10291     SetLastError(0xdeadbeef);
10292     key = 0xdeadbeef;
10293     num_bytes = 0xdeadbeef;
10294     olp = (WSAOVERLAPPED *)0xdeadbeef;
10295 
10296     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10297     ok(bret == TRUE, "failed to get completion status %u\n", bret);
10298     ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
10299     ok(key == 125, "Key is %lu\n", key);
10300     ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10301     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10302     ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0);
10303 
10304     SetLastError(0xdeadbeef);
10305     key = 0xdeadbeef;
10306     num_bytes = 0xdeadbeef;
10307     olp = (WSAOVERLAPPED *)0xdeadbeef;
10308     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10309     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10310     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10311     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10312     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10313     ok(!olp, "Overlapped structure is at %p\n", olp);
10314 
10315     if (dest != INVALID_SOCKET)
10316         closesocket(dest);
10317     if (src != INVALID_SOCKET)
10318         closesocket(dest);
10319 
10320     /* */
10321 
10322     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10323         goto end;
10324 
10325     dest = socket(AF_INET, SOCK_STREAM, 0);
10326     if (dest == INVALID_SOCKET)
10327     {
10328         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
10329         goto end;
10330     }
10331 
10332     connector = socket(AF_INET, SOCK_STREAM, 0);
10333     if (connector == INVALID_SOCKET) {
10334         skip("could not create connector socket, error %d\n", WSAGetLastError());
10335         goto end;
10336     }
10337 
10338     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10339     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10340 
10341     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10342     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10343 
10344     io_info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS;
10345     status = pNtSetInformationFile((HANDLE)src, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation);
10346     ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) /* XP */,
10347        "expected STATUS_SUCCESS, got %08x\n", status);
10348 
10349     io_info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS;
10350     status = pNtSetInformationFile((HANDLE)dest, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation);
10351     ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) /* XP */,
10352        "expected STATUS_SUCCESS, got %08x\n", status);
10353 
10354     bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10355             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10356             &num_bytes, &ov);
10357     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10358     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10359 
10360     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10361     ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10362 
10363     iret = send(connector, buf, 1, 0);
10364     ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError());
10365 
10366     Sleep(100);
10367 
10368     closesocket(dest);
10369     dest = INVALID_SOCKET;
10370 
10371     SetLastError(0xdeadbeef);
10372     key = 0xdeadbeef;
10373     num_bytes = 0xdeadbeef;
10374     olp = (WSAOVERLAPPED *)0xdeadbeef;
10375 
10376     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10377     ok(bret == TRUE, "failed to get completion status %u\n", bret);
10378     ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
10379     ok(key == 125, "Key is %lu\n", key);
10380     ok(num_bytes == 1, "Number of bytes transferred is %u\n", num_bytes);
10381     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10382     ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0);
10383 
10384     io_info.Flags = 0;
10385     status = pNtQueryInformationFile((HANDLE)dest, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation);
10386     ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) /* XP */,
10387        "expected STATUS_SUCCESS, got %08x\n", status);
10388     if (status == STATUS_SUCCESS)
10389         ok((io_info.Flags & FILE_SKIP_COMPLETION_PORT_ON_SUCCESS) != 0, "got %08x\n", io_info.Flags);
10390 
10391     SetLastError(0xdeadbeef);
10392     key = 0xdeadbeef;
10393     num_bytes = 0xdeadbeef;
10394     olp = (WSAOVERLAPPED *)0xdeadbeef;
10395     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10396     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10397     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10398     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10399     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10400     ok(!olp, "Overlapped structure is at %p\n", olp);
10401 
10402     if (src != INVALID_SOCKET)
10403         closesocket(src);
10404     if (connector != INVALID_SOCKET)
10405         closesocket(connector);
10406 
10407     /* */
10408 
10409     if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10410         goto end;
10411 
10412     dest = socket(AF_INET, SOCK_STREAM, 0);
10413     if (dest == INVALID_SOCKET)
10414     {
10415         skip("could not create acceptor socket, error %d\n", WSAGetLastError());
10416         goto end;
10417     }
10418 
10419     connector = socket(AF_INET, SOCK_STREAM, 0);
10420     if (connector == INVALID_SOCKET) {
10421         skip("could not create connector socket, error %d\n", WSAGetLastError());
10422         goto end;
10423     }
10424 
10425     io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10426     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10427 
10428     io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10429     ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10430 
10431     bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10432             sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10433             &num_bytes, &ov);
10434     ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10435     ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10436 
10437     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10438     ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10439 
10440     closesocket(dest);
10441     dest = INVALID_SOCKET;
10442 
10443     SetLastError(0xdeadbeef);
10444     key = 0xdeadbeef;
10445     num_bytes = 0xdeadbeef;
10446     olp = (WSAOVERLAPPED *)0xdeadbeef;
10447 
10448     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10449     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10450     todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED ||
10451                  GetLastError() == ERROR_OPERATION_ABORTED ||
10452                  GetLastError() == ERROR_CONNECTION_ABORTED ||
10453                  GetLastError() == ERROR_PIPE_NOT_CONNECTED /* win 2000 */,
10454                  "Last error was %d\n", GetLastError());
10455     ok(key == 125, "Key is %lu\n", key);
10456     ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10457     ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10458     todo_wine ok(olp && (olp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT ||
10459                          olp->Internal == (ULONG)STATUS_CANCELLED ||
10460                          olp->Internal == (ULONG)STATUS_CONNECTION_ABORTED ||
10461                          olp->Internal == (ULONG)STATUS_PIPE_DISCONNECTED /* win 2000 */),
10462                          "Internal status is %lx\n", olp ? olp->Internal : 0);
10463 
10464     SetLastError(0xdeadbeef);
10465     key = 0xdeadbeef;
10466     num_bytes = 0xdeadbeef;
10467     olp = (WSAOVERLAPPED *)0xdeadbeef;
10468     bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10469     ok(bret == FALSE, "failed to get completion status %u\n", bret);
10470     ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10471     ok(key == 0xdeadbeef, "Key is %lu\n", key);
10472     ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10473     ok(!olp, "Overlapped structure is at %p\n", olp);
10474 
10475 
10476     end:
10477     if (dest != INVALID_SOCKET)
10478         closesocket(dest);
10479     if (src != INVALID_SOCKET)
10480         closesocket(src);
10481     if (connector != INVALID_SOCKET)
10482         closesocket(connector);
10483     CloseHandle(previous_port);
10484 }
10485 
10486 static void test_address_list_query(void)
10487 {
10488     SOCKET_ADDRESS_LIST *address_list;
10489     DWORD bytes_returned, size;
10490     unsigned int i;
10491     SOCKET s;
10492     int ret;
10493 
10494     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
10495     ok(s != INVALID_SOCKET, "Failed to create socket, error %d.\n", WSAGetLastError());
10496 
10497     bytes_returned = 0;
10498     ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, 0, &bytes_returned, NULL, NULL);
10499     ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10500     ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10501     ok(bytes_returned >= FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]),
10502             "Got unexpected bytes_returned %u.\n", bytes_returned);
10503 
10504     size = bytes_returned;
10505     bytes_returned = 0;
10506     address_list = HeapAlloc(GetProcessHeap(), 0, size * 2);
10507     ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size * 2, &bytes_returned, NULL, NULL);
10508     ok(!ret, "Got unexpected ret %d, error %d.\n", ret, WSAGetLastError());
10509     ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10510 
10511     bytes_returned = FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[address_list->iAddressCount]);
10512     for (i = 0; i < address_list->iAddressCount; ++i)
10513     {
10514         bytes_returned += address_list->Address[i].iSockaddrLength;
10515     }
10516     ok(size == bytes_returned, "Got unexpected size %u, expected %u.\n", size, bytes_returned);
10517 
10518     ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size, NULL, NULL, NULL);
10519     ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10520     ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10521 
10522     bytes_returned = 0xdeadbeef;
10523     ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, size, &bytes_returned, NULL, NULL);
10524     ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10525     ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10526     ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10527 
10528     ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, 1, &bytes_returned, NULL, NULL);
10529     ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10530     ok(WSAGetLastError() == WSAEINVAL, "Got unexpected error %d.\n", WSAGetLastError());
10531     ok(bytes_returned == 0, "Got unexpected bytes_returned %u.\n", bytes_returned);
10532 
10533     ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list,
10534             FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]), &bytes_returned, NULL, NULL);
10535     ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10536     ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10537     ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10538 
10539     HeapFree(GetProcessHeap(), 0, address_list);
10540     closesocket(s);
10541 }
10542 
10543 static DWORD WINAPI inet_ntoa_thread_proc(void *param)
10544 {
10545     ULONG addr;
10546     const char *str;
10547     HANDLE *event = param;
10548 
10549     addr = inet_addr("4.3.2.1");
10550     ok(addr == htonl(0x04030201), "expected 0x04030201, got %08x\n", addr);
10551     str = inet_ntoa(*(struct in_addr *)&addr);
10552     ok(!strcmp(str, "4.3.2.1"), "expected 4.3.2.1, got %s\n", str);
10553 
10554     SetEvent(event[0]);
10555     WaitForSingleObject(event[1], 3000);
10556 
10557     return 0;
10558 }
10559 
10560 static void test_inet_ntoa(void)
10561 {
10562     ULONG addr;
10563     const char *str;
10564     HANDLE thread, event[2];
10565     DWORD tid;
10566 
10567     addr = inet_addr("1.2.3.4");
10568     ok(addr == htonl(0x01020304), "expected 0x01020304, got %08x\n", addr);
10569     str = inet_ntoa(*(struct in_addr *)&addr);
10570     ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str);
10571 
10572     event[0] = CreateEventW(NULL, TRUE, FALSE, NULL);
10573     event[1] = CreateEventW(NULL, TRUE, FALSE, NULL);
10574 
10575     thread = CreateThread(NULL, 0, inet_ntoa_thread_proc, event, 0, &tid);
10576     WaitForSingleObject(event[0], 3000);
10577 
10578     ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str);
10579 
10580     SetEvent(event[1]);
10581     WaitForSingleObject(thread, 3000);
10582 
10583     CloseHandle(event[0]);
10584     CloseHandle(event[1]);
10585     CloseHandle(thread);
10586 }
10587 
10588 static void test_WSALookupService(void)
10589 {
10590     char buffer[4096], strbuff[128];
10591     WSAQUERYSETW *qs = NULL;
10592     HANDLE hnd;
10593     PNLA_BLOB netdata;
10594     int ret;
10595     DWORD error, offset, bsize;
10596 
10597     if (!pWSALookupServiceBeginW || !pWSALookupServiceEnd || !pWSALookupServiceNextW)
10598     {
10599         win_skip("WSALookupServiceBeginW or WSALookupServiceEnd or WSALookupServiceNextW not found\n");
10600         return;
10601     }
10602 
10603     qs = (WSAQUERYSETW *)buffer;
10604     memset(qs, 0, sizeof(*qs));
10605 
10606     /* invalid parameter tests */
10607     ret = pWSALookupServiceBeginW(NULL, 0, &hnd);
10608     error = WSAGetLastError();
10609     ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10610 todo_wine
10611     ok(error == WSAEFAULT, "expected 10014, got %d\n", error);
10612 
10613     ret = pWSALookupServiceBeginW(qs, 0, NULL);
10614     error = WSAGetLastError();
10615     ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10616 todo_wine
10617     ok(error == WSAEFAULT, "expected 10014, got %d\n", error);
10618 
10619     ret = pWSALookupServiceBeginW(qs, 0, &hnd);
10620     error = WSAGetLastError();
10621     ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10622 todo_wine
10623     ok(error == WSAEINVAL
10624        || broken(error == ERROR_INVALID_PARAMETER) /* == XP */
10625        || broken(error == WSAEFAULT) /* == NT */
10626        || broken(error == WSASERVICE_NOT_FOUND) /* == 2000 */,
10627        "expected 10022, got %d\n", error);
10628 
10629     ret = pWSALookupServiceEnd(NULL);
10630     error = WSAGetLastError();
10631 todo_wine
10632     ok(ret == SOCKET_ERROR, "WSALookupServiceEnd should have failed\n");
10633 todo_wine
10634     ok(error == ERROR_INVALID_HANDLE, "expected 6, got %d\n", error);
10635 
10636     /* standard network list query */
10637     qs->dwSize = sizeof(*qs);
10638     hnd = (HANDLE)0xdeadbeef;
10639     ret = pWSALookupServiceBeginW(qs, LUP_RETURN_ALL | LUP_DEEP, &hnd);
10640     error = WSAGetLastError();
10641     if(ret && error == ERROR_INVALID_PARAMETER)
10642     {
10643         win_skip("the current WSALookupServiceBeginW test is not supported in win <= 2000\n");
10644         return;
10645     }
10646 
10647 todo_wine
10648     ok(!ret, "WSALookupServiceBeginW failed unexpectedly with error %d\n", error);
10649 todo_wine
10650     ok(hnd != (HANDLE)0xdeadbeef, "Handle was not filled\n");
10651 
10652     offset = 0;
10653     do
10654     {
10655         memset(qs, 0, sizeof(*qs));
10656         bsize = sizeof(buffer);
10657 
10658         if (pWSALookupServiceNextW(hnd, 0, &bsize, qs) == SOCKET_ERROR)
10659         {
10660             error = WSAGetLastError();
10661             if (error == WSA_E_NO_MORE) break;
10662             ok(0, "Error %d happened while listing services\n", error);
10663             break;
10664         }
10665 
10666         WideCharToMultiByte(CP_ACP, 0, qs->lpszServiceInstanceName, -1,
10667                             strbuff, sizeof(strbuff), NULL, NULL);
10668         trace("Network Name: %s\n", strbuff);
10669 
10670         /* network data is written in the blob field */
10671         if (qs->lpBlob)
10672         {
10673             /* each network may have multiple NLA_BLOB information structures */
10674             do
10675             {
10676                 netdata = (PNLA_BLOB) &qs->lpBlob->pBlobData[offset];
10677                 switch (netdata->header.type)
10678                 {
10679                     case NLA_RAW_DATA:
10680                         trace("\tNLA Data Type: NLA_RAW_DATA\n");
10681                         break;
10682                     case NLA_INTERFACE:
10683                         trace("\tNLA Data Type: NLA_INTERFACE\n");
10684                         trace("\t\tType: %d\n", netdata->data.interfaceData.dwType);
10685                         trace("\t\tSpeed: %d\n", netdata->data.interfaceData.dwSpeed);
10686                         trace("\t\tAdapter Name: %s\n", netdata->data.interfaceData.adapterName);
10687                         break;
10688                     case NLA_802_1X_LOCATION:
10689                         trace("\tNLA Data Type: NLA_802_1X_LOCATION\n");
10690                         trace("\t\tInformation: %s\n", netdata->data.locationData.information);
10691                         break;
10692                     case NLA_CONNECTIVITY:
10693                         switch (netdata->data.connectivity.type)
10694                         {
10695                             case NLA_NETWORK_AD_HOC:
10696                                 trace("\t\tNetwork Type: AD HOC\n");
10697                                 break;
10698                             case NLA_NETWORK_MANAGED:
10699                                 trace("\t\tNetwork Type: Managed\n");
10700                                 break;
10701                             case NLA_NETWORK_UNMANAGED:
10702                                 trace("\t\tNetwork Type: Unmanaged\n");
10703                                 break;
10704                             case NLA_NETWORK_UNKNOWN:
10705                                 trace("\t\tNetwork Type: Unknown\n");
10706                         }
10707                         switch (netdata->data.connectivity.internet)
10708                         {
10709                             case NLA_INTERNET_NO:
10710                                 trace("\t\tInternet connectivity: No\n");
10711                                 break;
10712                             case NLA_INTERNET_YES:
10713                                 trace("\t\tInternet connectivity: Yes\n");
10714                                 break;
10715                             case NLA_INTERNET_UNKNOWN:
10716                                 trace("\t\tInternet connectivity: Unknown\n");
10717                                 break;
10718                         }
10719                         break;
10720                     case NLA_ICS:
10721                         trace("\tNLA Data Type: NLA_ICS\n");
10722                         trace("\t\tSpeed: %d\n",
10723                                netdata->data.ICS.remote.speed);
10724                         trace("\t\tType: %d\n",
10725                                netdata->data.ICS.remote.type);
10726                         trace("\t\tState: %d\n",
10727                                netdata->data.ICS.remote.state);
10728                         WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.machineName, -1,
10729                             strbuff, sizeof(strbuff), NULL, NULL);
10730                         trace("\t\tMachine Name: %s\n", strbuff);
10731                         WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.sharedAdapterName, -1,
10732                             strbuff, sizeof(strbuff), NULL, NULL);
10733                         trace("\t\tShared Adapter Name: %s\n", strbuff);
10734                         break;
10735                     default:
10736                         trace("\tNLA Data Type: Unknown\n");
10737                         break;
10738                 }
10739             }
10740             while (offset);
10741         }
10742     }
10743     while (1);
10744 
10745     ret = pWSALookupServiceEnd(hnd);
10746     ok(!ret, "WSALookupServiceEnd failed unexpectedly\n");
10747 }
10748 
10749 static void test_WSAEnumNameSpaceProvidersA(void)
10750 {
10751     LPWSANAMESPACE_INFOA name = NULL;
10752     DWORD ret, error, blen = 0, i;
10753     if (!pWSAEnumNameSpaceProvidersA)
10754     {
10755         win_skip("WSAEnumNameSpaceProvidersA not found\n");
10756         return;
10757     }
10758 
10759     SetLastError(0xdeadbeef);
10760     ret = pWSAEnumNameSpaceProvidersA(&blen, name);
10761     error = WSAGetLastError();
10762 todo_wine
10763     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10764 todo_wine
10765     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10766 
10767     /* Invalid parameter tests */
10768     SetLastError(0xdeadbeef);
10769     ret = pWSAEnumNameSpaceProvidersA(NULL, name);
10770     error = WSAGetLastError();
10771 todo_wine
10772     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10773 todo_wine
10774     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10775 
10776     SetLastError(0xdeadbeef);
10777     ret = pWSAEnumNameSpaceProvidersA(NULL, NULL);
10778     error = WSAGetLastError();
10779 todo_wine
10780     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10781 todo_wine
10782     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10783 
10784     SetLastError(0xdeadbeef);
10785     ret = pWSAEnumNameSpaceProvidersA(&blen, NULL);
10786     error = WSAGetLastError();
10787 todo_wine
10788     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10789 todo_wine
10790     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10791 
10792 #ifdef __REACTOS__ /* ROSTESTS-233 */
10793     if (!blen)
10794     {
10795         skip("Failed to get length needed for name space providers.\n");
10796         return;
10797     }
10798 #endif
10799 
10800     name = HeapAlloc(GetProcessHeap(), 0, blen);
10801     if (!name)
10802     {
10803         skip("Failed to alloc memory\n");
10804         return;
10805     }
10806 
10807     ret = pWSAEnumNameSpaceProvidersA(&blen, name);
10808 todo_wine
10809     ok(ret > 0, "Expected more than zero name space providers\n");
10810 
10811     for (i = 0;i < ret; i++)
10812     {
10813         trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier,
10814               name[i].lpszIdentifier);
10815         switch (name[i].dwNameSpace)
10816         {
10817             case NS_DNS:
10818                 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace);
10819                 break;
10820             case NS_NLA:
10821                 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace);
10822                 break;
10823             default:
10824                 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace);
10825                 break;
10826         }
10827         trace("\tActive:  %d\n", name[i].fActive);
10828         trace("\tVersion: %d\n", name[i].dwVersion);
10829     }
10830 
10831     HeapFree(GetProcessHeap(), 0, name);
10832 }
10833 
10834 static void test_WSAEnumNameSpaceProvidersW(void)
10835 {
10836     LPWSANAMESPACE_INFOW name = NULL;
10837     DWORD ret, error, blen = 0, i;
10838     if (!pWSAEnumNameSpaceProvidersW)
10839     {
10840         win_skip("WSAEnumNameSpaceProvidersW not found\n");
10841         return;
10842     }
10843 
10844     SetLastError(0xdeadbeef);
10845     ret = pWSAEnumNameSpaceProvidersW(&blen, name);
10846     error = WSAGetLastError();
10847 todo_wine
10848     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10849 todo_wine
10850     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10851 
10852     /* Invalid parameter tests */
10853     SetLastError(0xdeadbeef);
10854     ret = pWSAEnumNameSpaceProvidersW(NULL, name);
10855     error = WSAGetLastError();
10856 todo_wine
10857     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10858 todo_wine
10859     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10860 
10861     SetLastError(0xdeadbeef);
10862     ret = pWSAEnumNameSpaceProvidersW(NULL, NULL);
10863     error = WSAGetLastError();
10864 todo_wine
10865     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10866 todo_wine
10867     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10868 
10869     SetLastError(0xdeadbeef);
10870     ret = pWSAEnumNameSpaceProvidersW(&blen, NULL);
10871     error = WSAGetLastError();
10872 todo_wine
10873     ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10874 todo_wine
10875     ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10876 
10877 #ifdef __REACTOS__ /* ROSTESTS-233 */
10878     if (!blen)
10879     {
10880         skip("Failed to get length needed for name space providers.\n");
10881         return;
10882     }
10883 #endif
10884 
10885     name = HeapAlloc(GetProcessHeap(), 0, blen);
10886     if (!name)
10887     {
10888         skip("Failed to alloc memory\n");
10889         return;
10890     }
10891 
10892     ret = pWSAEnumNameSpaceProvidersW(&blen, name);
10893 todo_wine
10894     ok(ret > 0, "Expected more than zero name space providers\n");
10895 
10896     for (i = 0;i < ret; i++)
10897     {
10898         trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier,
10899                wine_dbgstr_w(name[i].lpszIdentifier));
10900         switch (name[i].dwNameSpace)
10901         {
10902             case NS_DNS:
10903                 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace);
10904                 break;
10905             case NS_NLA:
10906                 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace);
10907                 break;
10908             default:
10909                 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace);
10910                 break;
10911         }
10912         trace("\tActive:  %d\n", name[i].fActive);
10913         trace("\tVersion: %d\n", name[i].dwVersion);
10914     }
10915 
10916     HeapFree(GetProcessHeap(), 0, name);
10917 }
10918 
10919 static void sync_read(SOCKET src, SOCKET dst)
10920 {
10921     int ret;
10922     char data[512];
10923 
10924     ret = send(dst, "Hello World!", 12, 0);
10925     ok(ret == 12, "send returned %d\n", ret);
10926 
10927     memset(data, 0, sizeof(data));
10928     ret = recv(src, data, sizeof(data), 0);
10929     ok(ret == 12, "expected 12, got %d\n", ret);
10930     ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", ret, ret, data);
10931 }
10932 
10933 static void iocp_async_read(SOCKET src, SOCKET dst)
10934 {
10935     HANDLE port;
10936     WSAOVERLAPPED ovl, *ovl_iocp;
10937     WSABUF buf;
10938     int ret;
10939     char data[512];
10940     DWORD flags, bytes;
10941     ULONG_PTR key;
10942 
10943     memset(data, 0, sizeof(data));
10944     memset(&ovl, 0, sizeof(ovl));
10945 
10946     port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
10947     ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
10948 
10949     buf.len = sizeof(data);
10950     buf.buf = data;
10951     bytes = 0xdeadbeef;
10952     flags = 0;
10953     SetLastError(0xdeadbeef);
10954     ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL);
10955     ok(ret == SOCKET_ERROR, "got %d\n", ret);
10956     ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
10957     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10958 
10959     bytes = 0xdeadbeef;
10960     key = 0xdeadbeef;
10961     ovl_iocp = (void *)0xdeadbeef;
10962     SetLastError(0xdeadbeef);
10963     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10964     ok(!ret, "got %d\n", ret);
10965     ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
10966     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10967     ok(key == 0xdeadbeef, "got key %#lx\n", key);
10968     ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
10969 
10970     ret = send(dst, "Hello World!", 12, 0);
10971     ok(ret == 12, "send returned %d\n", ret);
10972 
10973     bytes = 0xdeadbeef;
10974     key = 0xdeadbeef;
10975     ovl_iocp = NULL;
10976     SetLastError(0xdeadbeef);
10977     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10978     ok(ret, "got %d\n", ret);
10979     ok(bytes == 12, "got bytes %u\n", bytes);
10980     ok(key == 0x12345678, "got key %#lx\n", key);
10981     ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp);
10982     if (ovl_iocp)
10983     {
10984         ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh);
10985         ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal);
10986         ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data);
10987     }
10988 
10989     bytes = 0xdeadbeef;
10990     key = 0xdeadbeef;
10991     ovl_iocp = (void *)0xdeadbeef;
10992     SetLastError(0xdeadbeef);
10993     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10994     ok(!ret, "got %d\n", ret);
10995     ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
10996     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10997     ok(key == 0xdeadbeef, "got key %#lx\n", key);
10998     ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
10999 
11000     CloseHandle(port);
11001 }
11002 
11003 static void iocp_async_read_closesocket(SOCKET src, int how_to_close)
11004 {
11005     HANDLE port;
11006     WSAOVERLAPPED ovl, *ovl_iocp;
11007     WSABUF buf;
11008     int ret;
11009     char data[512];
11010     DWORD flags, bytes;
11011     ULONG_PTR key;
11012     HWND hwnd;
11013     MSG msg;
11014 
11015     hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11016                            0, 0, 0, 0, NULL, NULL, 0, NULL);
11017     ok(hwnd != 0, "CreateWindowEx failed\n");
11018 
11019     ret = WSAAsyncSelect(src, hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
11020     ok(!ret, "got %d\n", ret);
11021 
11022     Sleep(100);
11023     memset(&msg, 0, sizeof(msg));
11024     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11025     ok(ret, "got %d\n", ret);
11026     ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11027     ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11028     ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11029     ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11030 
11031     memset(data, 0, sizeof(data));
11032     memset(&ovl, 0, sizeof(ovl));
11033 
11034     port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11035     ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11036 
11037     Sleep(100);
11038     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11039     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11040 
11041     buf.len = sizeof(data);
11042     buf.buf = data;
11043     bytes = 0xdeadbeef;
11044     flags = 0;
11045     SetLastError(0xdeadbeef);
11046     ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL);
11047     ok(ret == SOCKET_ERROR, "got %d\n", ret);
11048     ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
11049     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11050 
11051     Sleep(100);
11052     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11053     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11054 
11055     bytes = 0xdeadbeef;
11056     key = 0xdeadbeef;
11057     ovl_iocp = (void *)0xdeadbeef;
11058     SetLastError(0xdeadbeef);
11059     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11060     ok(!ret, "got %d\n", ret);
11061     ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11062     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11063     ok(key == 0xdeadbeef, "got key %#lx\n", key);
11064     ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11065 
11066     Sleep(100);
11067     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11068     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11069 
11070     switch (how_to_close)
11071     {
11072     case 0:
11073         closesocket(src);
11074         break;
11075     case 1:
11076         CloseHandle((HANDLE)src);
11077         break;
11078     case 2:
11079         pNtClose((HANDLE)src);
11080         break;
11081     default:
11082         ok(0, "wrong value %d\n", how_to_close);
11083         break;
11084     }
11085 
11086     Sleep(200);
11087     memset(&msg, 0, sizeof(msg));
11088     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11089     switch (how_to_close)
11090     {
11091     case 0:
11092         ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11093         break;
11094     case 1:
11095     case 2:
11096 todo_wine
11097 {
11098         ok(ret, "got %d\n", ret);
11099         ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11100         ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11101         ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11102         ok(msg.lParam == 0x20, "got %08lx\n", msg.lParam);
11103 }
11104         break;
11105     default:
11106         ok(0, "wrong value %d\n", how_to_close);
11107         break;
11108     }
11109 
11110     bytes = 0xdeadbeef;
11111     key = 0xdeadbeef;
11112     ovl_iocp = NULL;
11113     SetLastError(0xdeadbeef);
11114     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11115     ok(!ret, "got %d\n", ret);
11116 todo_wine
11117     ok(GetLastError() == ERROR_CONNECTION_ABORTED || GetLastError() == ERROR_NETNAME_DELETED /* XP */, "got %u\n", GetLastError());
11118     ok(!bytes, "got bytes %u\n", bytes);
11119     ok(key == 0x12345678, "got key %#lx\n", key);
11120     ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp);
11121     if (ovl_iocp)
11122     {
11123         ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11124 todo_wine
11125         ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal);
11126     }
11127 
11128     bytes = 0xdeadbeef;
11129     key = 0xdeadbeef;
11130     ovl_iocp = (void *)0xdeadbeef;
11131     SetLastError(0xdeadbeef);
11132     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11133     ok(!ret, "got %d\n", ret);
11134     ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11135     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11136     ok(key == 0xdeadbeef, "got key %#lx\n", key);
11137     ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11138 
11139     CloseHandle(port);
11140 
11141     DestroyWindow(hwnd);
11142 }
11143 
11144 static void iocp_async_closesocket(SOCKET src)
11145 {
11146     HANDLE port;
11147     WSAOVERLAPPED *ovl_iocp;
11148     int ret;
11149     DWORD bytes;
11150     ULONG_PTR key;
11151     HWND hwnd;
11152     MSG msg;
11153 
11154     hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11155                            0, 0, 0, 0, NULL, NULL, 0, NULL);
11156     ok(hwnd != 0, "CreateWindowEx failed\n");
11157 
11158     ret = WSAAsyncSelect(src, hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
11159     ok(!ret, "got %d\n", ret);
11160 
11161     Sleep(100);
11162     memset(&msg, 0, sizeof(msg));
11163     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11164     ok(ret, "got %d\n", ret);
11165     ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11166     ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11167     ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11168     ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11169 
11170     port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11171     ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11172 
11173     Sleep(100);
11174     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11175     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11176 
11177     bytes = 0xdeadbeef;
11178     key = 0xdeadbeef;
11179     ovl_iocp = (void *)0xdeadbeef;
11180     SetLastError(0xdeadbeef);
11181     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11182     ok(!ret, "got %d\n", ret);
11183     ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11184     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11185     ok(key == 0xdeadbeef, "got key %lu\n", key);
11186     ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11187 
11188     Sleep(100);
11189     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11190     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11191 
11192     closesocket(src);
11193 
11194     Sleep(100);
11195     memset(&msg, 0, sizeof(msg));
11196     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11197     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11198 
11199     bytes = 0xdeadbeef;
11200     key = 0xdeadbeef;
11201     ovl_iocp = (void *)0xdeadbeef;
11202     SetLastError(0xdeadbeef);
11203     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11204     ok(!ret, "got %d\n", ret);
11205     ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11206     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11207     ok(key == 0xdeadbeef, "got key %lu\n", key);
11208     ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11209 
11210     CloseHandle(port);
11211 
11212     DestroyWindow(hwnd);
11213 }
11214 
11215 struct wsa_async_select_info
11216 {
11217     SOCKET sock;
11218     HWND hwnd;
11219 };
11220 
11221 static DWORD WINAPI wsa_async_select_thread(void *param)
11222 {
11223     struct wsa_async_select_info *info = param;
11224     int ret;
11225 
11226     ret = WSAAsyncSelect(info->sock, info->hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
11227     ok(!ret, "got %d\n", ret);
11228 
11229     return 0;
11230 }
11231 
11232 struct wsa_recv_info
11233 {
11234     SOCKET sock;
11235     WSABUF wsa_buf;
11236     WSAOVERLAPPED ovl;
11237 };
11238 
11239 static DWORD WINAPI wsa_recv_thread(void *param)
11240 {
11241     struct wsa_recv_info *info = param;
11242     int ret;
11243     DWORD flags, bytes;
11244 
11245     bytes = 0xdeadbeef;
11246     flags = 0;
11247     SetLastError(0xdeadbeef);
11248     ret = WSARecv(info->sock, &info->wsa_buf, 1, &bytes, &flags, &info->ovl, NULL);
11249     ok(ret == SOCKET_ERROR, "got %d\n", ret);
11250     ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
11251     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11252 
11253     return 0;
11254 }
11255 
11256 static void iocp_async_read_thread_closesocket(SOCKET src)
11257 {
11258     struct wsa_async_select_info select_info;
11259     struct wsa_recv_info recv_info;
11260     HANDLE port, thread;
11261     WSAOVERLAPPED *ovl_iocp;
11262     int ret;
11263     char data[512];
11264     DWORD bytes, tid;
11265     ULONG_PTR key;
11266     HWND hwnd;
11267     MSG msg;
11268 
11269     hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11270                            0, 0, 0, 0, NULL, NULL, 0, NULL);
11271     ok(hwnd != 0, "CreateWindowEx failed\n");
11272 
11273     select_info.sock = src;
11274     select_info.hwnd = hwnd;
11275     thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid);
11276     ok(thread != 0, "CreateThread error %u\n", GetLastError());
11277     ret = WaitForSingleObject(thread, 10000);
11278     ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11279 
11280     Sleep(100);
11281     memset(&msg, 0, sizeof(msg));
11282     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11283     ok(ret, "got %d\n", ret);
11284     ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11285     ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11286     ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11287     ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11288 
11289     port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11290     ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11291 
11292     Sleep(100);
11293     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11294     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11295 
11296     memset(data, 0, sizeof(data));
11297     memset(&recv_info.ovl, 0, sizeof(recv_info.ovl));
11298     recv_info.sock = src;
11299     recv_info.wsa_buf.len = sizeof(data);
11300     recv_info.wsa_buf.buf = data;
11301     thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid);
11302     ok(thread != 0, "CreateThread error %u\n", GetLastError());
11303     ret = WaitForSingleObject(thread, 10000);
11304     ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11305 
11306     Sleep(100);
11307     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11308     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11309 
11310     bytes = 0xdeadbeef;
11311     key = 0xdeadbeef;
11312     ovl_iocp = (void *)0xdeadbeef;
11313     SetLastError(0xdeadbeef);
11314     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11315     ok(!ret, "got %d\n", ret);
11316     ok(GetLastError() == WAIT_TIMEOUT || broken(GetLastError() == ERROR_OPERATION_ABORTED) /* XP */,
11317        "got %u\n", GetLastError());
11318     if (GetLastError() == WAIT_TIMEOUT)
11319     {
11320         ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11321         ok(key == 0xdeadbeef, "got key %lx\n", key);
11322         ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11323     }
11324     else /* document XP behaviour */
11325     {
11326         ok(!bytes, "got bytes %u\n", bytes);
11327         ok(key == 0x12345678, "got key %#lx\n", key);
11328         ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11329         if (ovl_iocp)
11330         {
11331             ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11332             ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal);
11333         }
11334 
11335         closesocket(src);
11336         goto xp_is_broken;
11337     }
11338 
11339     Sleep(100);
11340     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11341     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11342 
11343     closesocket(src);
11344 
11345     Sleep(100);
11346     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11347     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11348 
11349     bytes = 0xdeadbeef;
11350     key = 0xdeadbeef;
11351     ovl_iocp = NULL;
11352     SetLastError(0xdeadbeef);
11353     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11354     ok(!ret, "got %d\n", ret);
11355 todo_wine
11356     ok(GetLastError() == ERROR_CONNECTION_ABORTED || GetLastError() == ERROR_NETNAME_DELETED /* XP */, "got %u\n", GetLastError());
11357     ok(!bytes, "got bytes %u\n", bytes);
11358     ok(key == 0x12345678, "got key %#lx\n", key);
11359     ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11360     if (ovl_iocp)
11361     {
11362         ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11363 todo_wine
11364         ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal);
11365     }
11366 
11367 xp_is_broken:
11368     bytes = 0xdeadbeef;
11369     key = 0xdeadbeef;
11370     ovl_iocp = (void *)0xdeadbeef;
11371     SetLastError(0xdeadbeef);
11372     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11373     ok(!ret, "got %d\n", ret);
11374     ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11375     ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11376     ok(key == 0xdeadbeef, "got key %lu\n", key);
11377     ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11378 
11379     CloseHandle(port);
11380 
11381     DestroyWindow(hwnd);
11382 }
11383 
11384 static void iocp_async_read_thread(SOCKET src, SOCKET dst)
11385 {
11386     struct wsa_async_select_info select_info;
11387     struct wsa_recv_info recv_info;
11388     HANDLE port, thread;
11389     WSAOVERLAPPED *ovl_iocp;
11390     int ret;
11391     char data[512];
11392     DWORD bytes, tid;
11393     ULONG_PTR key;
11394     HWND hwnd;
11395     MSG msg;
11396 
11397     hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11398                            0, 0, 0, 0, NULL, NULL, 0, NULL);
11399     ok(hwnd != 0, "CreateWindowEx failed\n");
11400 
11401     select_info.sock = src;
11402     select_info.hwnd = hwnd;
11403     thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid);
11404     ok(thread != 0, "CreateThread error %u\n", GetLastError());
11405     ret = WaitForSingleObject(thread, 10000);
11406     ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11407 
11408     Sleep(100);
11409     memset(&msg, 0, sizeof(msg));
11410     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11411     ok(ret, "got %d\n", ret);
11412     ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11413     ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11414     ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11415     ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11416 
11417     port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11418     ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11419 
11420     Sleep(100);
11421     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11422     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11423 
11424     memset(data, 0, sizeof(data));
11425     memset(&recv_info.ovl, 0, sizeof(recv_info.ovl));
11426     recv_info.sock = src;
11427     recv_info.wsa_buf.len = sizeof(data);
11428     recv_info.wsa_buf.buf = data;
11429     thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid);
11430     ok(thread != 0, "CreateThread error %u\n", GetLastError());
11431     ret = WaitForSingleObject(thread, 10000);
11432     ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11433 
11434     Sleep(100);
11435     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11436     ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11437 
11438     bytes = 0xdeadbeef;
11439     key = 0xdeadbeef;
11440     ovl_iocp = (void *)0xdeadbeef;
11441     SetLastError(0xdeadbeef);
11442     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11443     ok(!ret, "got %d\n", ret);
11444     ok(GetLastError() == WAIT_TIMEOUT || broken(GetLastError() == ERROR_OPERATION_ABORTED) /* XP */, "got %u\n", GetLastError());
11445     if (GetLastError() == WAIT_TIMEOUT)
11446     {
11447         ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11448         ok(key == 0xdeadbeef, "got key %lu\n", key);
11449         ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11450     }
11451     else /* document XP behaviour */
11452     {
11453         ok(bytes == 0, "got bytes %u\n", bytes);
11454         ok(key == 0x12345678, "got key %#lx\n", key);
11455         ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11456         if (ovl_iocp)
11457         {
11458             ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11459             ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal);
11460         }
11461     }
11462 
11463     Sleep(100);
11464     memset(&msg, 0, sizeof(msg));
11465     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11466     ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11467     if (ret) /* document XP behaviour */
11468     {
11469         ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11470         ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11471         ok(msg.lParam == 1, "got %08lx\n", msg.lParam);
11472     }
11473 
11474     ret = send(dst, "Hello World!", 12, 0);
11475     ok(ret == 12, "send returned %d\n", ret);
11476 
11477     Sleep(100);
11478     memset(&msg, 0, sizeof(msg));
11479     ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11480     ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11481     if (ret) /* document XP behaviour */
11482     {
11483         ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11484         ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11485         ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11486         ok(msg.lParam == 1, "got %08lx\n", msg.lParam);
11487     }
11488 
11489     bytes = 0xdeadbeef;
11490     key = 0xdeadbeef;
11491     ovl_iocp = (void *)0xdeadbeef;
11492     SetLastError(0xdeadbeef);
11493     ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11494     ok(ret || broken(GetLastError() == WAIT_TIMEOUT) /* XP */, "got %u\n", GetLastError());
11495     if (ret)
11496     {
11497         ok(bytes == 12, "got bytes %u\n", bytes);
11498         ok(key == 0x12345678, "got key %#lx\n", key);
11499         ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11500         if (ovl_iocp)
11501         {
11502             ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh);
11503             ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal);
11504             ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data);
11505         }
11506     }
11507     else /* document XP behaviour */
11508     {
11509         ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11510         ok(key == 0xdeadbeef, "got key %lu\n", key);
11511         ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11512     }
11513 
11514     CloseHandle(port);
11515 
11516     DestroyWindow(hwnd);
11517 }
11518 
11519 static void test_iocp(void)
11520 {
11521     SOCKET src, dst;
11522     int i, ret;
11523 
11524     ret = tcp_socketpair_ovl(&src, &dst);
11525     ok(!ret, "creating socket pair failed\n");
11526     sync_read(src, dst);
11527     iocp_async_read(src, dst);
11528     closesocket(src);
11529     closesocket(dst);
11530 
11531     ret = tcp_socketpair_ovl(&src, &dst);
11532     ok(!ret, "creating socket pair failed\n");
11533     iocp_async_read_thread(src, dst);
11534     closesocket(src);
11535     closesocket(dst);
11536 
11537     for (i = 0; i <= 2; i++)
11538     {
11539         ret = tcp_socketpair_ovl(&src, &dst);
11540         ok(!ret, "creating socket pair failed\n");
11541         iocp_async_read_closesocket(src, i);
11542         closesocket(dst);
11543     }
11544 
11545     ret = tcp_socketpair_ovl(&src, &dst);
11546     ok(!ret, "creating socket pair failed\n");
11547     iocp_async_closesocket(src);
11548     closesocket(dst);
11549 
11550     ret = tcp_socketpair_ovl(&src, &dst);
11551     ok(!ret, "creating socket pair failed\n");
11552     iocp_async_read_thread_closesocket(src);
11553     closesocket(dst);
11554 }
11555 
11556 START_TEST( sock )
11557 {
11558     int i;
11559 
11560 /* Leave these tests at the beginning. They depend on WSAStartup not having been
11561  * called, which is done by Init() below. */
11562     test_WithoutWSAStartup();
11563     test_WithWSAStartup();
11564 
11565     Init();
11566 
11567     test_inet_ntoa();
11568     test_inet_pton();
11569     test_set_getsockopt();
11570     test_so_reuseaddr();
11571     test_ip_pktinfo();
11572     test_extendedSocketOptions();
11573 
11574     for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
11575     {
11576         trace ( " **** STARTING TEST %d ****\n", i );
11577         do_test (  &tests[i] );
11578         trace ( " **** TEST %d COMPLETE ****\n", i );
11579     }
11580 
11581     test_UDP();
11582 
11583     test_getservbyname();
11584     test_WSASocket();
11585     test_WSADuplicateSocket();
11586     test_WSAEnumNetworkEvents();
11587 
11588     test_WSAAddressToStringA();
11589     test_WSAAddressToStringW();
11590 
11591     test_WSAStringToAddressA();
11592     test_WSAStringToAddressW();
11593 
11594     test_errors();
11595     test_listen();
11596     test_select();
11597     test_accept();
11598     test_getpeername();
11599     test_getsockname();
11600     test_inet_addr();
11601     test_addr_to_print();
11602     test_ioctlsocket();
11603     test_dns();
11604     test_gethostbyname();
11605     test_gethostbyname_hack();
11606     test_gethostname();
11607 
11608     test_WSASendMsg();
11609     test_WSASendTo();
11610     test_WSARecv();
11611     test_WSAPoll();
11612     test_write_watch();
11613     test_iocp();
11614 
11615     test_events(0);
11616     test_events(1);
11617 
11618     test_ipv6only();
11619     test_TransmitFile();
11620     test_GetAddrInfoW();
11621     test_GetAddrInfoExW();
11622     test_getaddrinfo();
11623     test_AcceptEx();
11624     test_ConnectEx();
11625     test_DisconnectEx();
11626 
11627     test_sioRoutingInterfaceQuery();
11628     test_sioAddressListChange();
11629 
11630     test_WSALookupService();
11631     test_WSAEnumNameSpaceProvidersA();
11632     test_WSAEnumNameSpaceProvidersW();
11633 
11634     test_WSAAsyncGetServByPort();
11635     test_WSAAsyncGetServByName();
11636 
11637     test_completion_port();
11638     test_address_list_query();
11639 
11640     /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */
11641     test_send();
11642     test_synchronous_WSAIoctl();
11643 
11644     Exit();
11645 }
11646