wined3d: Handle the sampler type shift in the frontend.
[wine] / dlls / ws2_32 / tests / sock.c
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  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22
23 #include <stdarg.h>
24
25 #include <windef.h>
26 #include <winbase.h>
27 #include <winsock2.h>
28 #include <ws2tcpip.h>
29 #include <mswsock.h>
30 #include "wine/test.h"
31 #include <winnt.h>
32 #include <winerror.h>
33
34 #define MAX_CLIENTS 4      /* Max number of clients */
35 #define NUM_TESTS   4      /* Number of tests performed */
36 #define FIRST_CHAR 'A'     /* First character in transferred pattern */
37 #define BIND_SLEEP 10      /* seconds to wait between attempts to bind() */
38 #define BIND_TRIES 6       /* Number of bind() attempts */
39 #define TEST_TIMEOUT 30    /* seconds to wait before killing child threads
40                               after server initialization, if something hangs */
41
42 #define NUM_UDP_PEERS 3    /* Number of UDP sockets to create and test > 1 */
43
44 #define NUM_THREADS 3      /* Number of threads to run getservbyname */
45 #define NUM_QUERIES 250    /* Number of getservbyname queries per thread */
46
47 #define SERVERIP "127.0.0.1"   /* IP to bind to */
48 #define SERVERPORT 9374        /* Port number to bind to */
49
50 #define wsa_ok(op, cond, msg) \
51    do { \
52         int tmp, err = 0; \
53         tmp = op; \
54         if ( !(cond tmp) ) err = WSAGetLastError(); \
55         ok ( cond tmp, msg, GetCurrentThreadId(), err); \
56    } while (0);
57
58 /* Function pointers */
59 static void   (WINAPI  *pFreeAddrInfoW)(PADDRINFOW) = 0;
60 static int    (WINAPI  *pGetAddrInfoW)(LPCWSTR,LPCWSTR,const ADDRINFOW *,PADDRINFOW *) = 0;
61 static PCSTR  (WINAPI  *pInetNtop)(INT,LPVOID,LPSTR,ULONG) = 0;
62
63 /**************** Structs and typedefs ***************/
64
65 typedef struct thread_info
66 {
67     HANDLE thread;
68     DWORD id;
69 } thread_info;
70
71 /* Information in the server about open client connections */
72 typedef struct sock_info
73 {
74     SOCKET                 s;
75     struct sockaddr_in     addr;
76     struct sockaddr_in     peer;
77     char                  *buf;
78     int                    n_recvd;
79     int                    n_sent;
80 } sock_info;
81
82 /* Test parameters for both server & client */
83 typedef struct test_params
84 {
85     int          sock_type;
86     int          sock_prot;
87     const char  *inet_addr;
88     short        inet_port;
89     int          chunk_size;
90     int          n_chunks;
91     int          n_clients;
92 } test_params;
93
94 /* server-specific test parameters */
95 typedef struct server_params
96 {
97     test_params   *general;
98     DWORD          sock_flags;
99     int            buflen;
100 } server_params;
101
102 /* client-specific test parameters */
103 typedef struct client_params
104 {
105     test_params   *general;
106     DWORD          sock_flags;
107     int            buflen;
108 } client_params;
109
110 /* This type combines all information for setting up a test scenario */
111 typedef struct test_setup
112 {
113     test_params              general;
114     LPVOID                   srv;
115     server_params            srv_params;
116     LPVOID                   clt;
117     client_params            clt_params;
118 } test_setup;
119
120 /* Thread local storage for server */
121 typedef struct server_memory
122 {
123     SOCKET                  s;
124     struct sockaddr_in      addr;
125     sock_info               sock[MAX_CLIENTS];
126 } server_memory;
127
128 /* Thread local storage for client */
129 typedef struct client_memory
130 {
131     SOCKET s;
132     struct sockaddr_in      addr;
133     char                   *send_buf;
134     char                   *recv_buf;
135 } client_memory;
136
137 /* SelectReadThread thread parameters */
138 typedef struct select_thread_params
139 {
140     SOCKET s;
141     BOOL ReadKilled;
142 } select_thread_params;
143
144 /**************** Static variables ***************/
145
146 static DWORD      tls;              /* Thread local storage index */
147 static HANDLE     thread[1+MAX_CLIENTS];
148 static DWORD      thread_id[1+MAX_CLIENTS];
149 static HANDLE     server_ready;
150 static HANDLE     client_ready[MAX_CLIENTS];
151 static int        client_id;
152
153 /**************** General utility functions ***************/
154
155 static int tcp_socketpair(SOCKET *src, SOCKET *dst)
156 {
157     SOCKET server = INVALID_SOCKET;
158     struct sockaddr_in addr;
159     int len;
160     int ret;
161
162     *src = INVALID_SOCKET;
163     *dst = INVALID_SOCKET;
164
165     *src = socket(AF_INET, SOCK_STREAM, 0);
166     if (*src == INVALID_SOCKET)
167         goto end;
168
169     server = socket(AF_INET, SOCK_STREAM, 0);
170     if (server == INVALID_SOCKET)
171         goto end;
172
173     memset(&addr, 0, sizeof(addr));
174     addr.sin_family = AF_INET;
175     addr.sin_addr.s_addr = inet_addr("127.0.0.1");
176     ret = bind(server, (struct sockaddr*)&addr, sizeof(addr));
177     if (ret != 0)
178         goto end;
179
180     len = sizeof(addr);
181     ret = getsockname(server, (struct sockaddr*)&addr, &len);
182     if (ret != 0)
183         goto end;
184
185     ret = listen(server, 1);
186     if (ret != 0)
187         goto end;
188
189     ret = connect(*src, (struct sockaddr*)&addr, sizeof(addr));
190     if (ret != 0)
191         goto end;
192
193     len = sizeof(addr);
194     *dst = accept(server, (struct sockaddr*)&addr, &len);
195
196 end:
197     if (server != INVALID_SOCKET)
198         closesocket(server);
199     if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET)
200         return 0;
201     closesocket(*src);
202     closesocket(*dst);
203     return -1;
204 }
205
206 static void set_so_opentype ( BOOL overlapped )
207 {
208     int optval = !overlapped, newval, len = sizeof (int);
209
210     ok ( setsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
211                       (LPVOID) &optval, sizeof (optval) ) == 0,
212          "setting SO_OPENTYPE failed\n" );
213     ok ( getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
214                       (LPVOID) &newval, &len ) == 0,
215          "getting SO_OPENTYPE failed\n" );
216     ok ( optval == newval, "failed to set SO_OPENTYPE\n" );
217 }
218
219 static int set_blocking ( SOCKET s, BOOL blocking )
220 {
221     u_long val = !blocking;
222     return ioctlsocket ( s, FIONBIO, &val );
223 }
224
225 static void fill_buffer ( char *buf, int chunk_size, int n_chunks )
226 {
227     char c, *p;
228     for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size )
229         memset ( p, c, chunk_size );
230 }
231
232 static int test_buffer ( char *buf, int chunk_size, int n_chunks )
233 {
234     char c, *p;
235     int i;
236     for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size )
237     {
238         for ( i = 0; i < chunk_size; i++ )
239             if ( p[i] != c ) return i;
240     }
241     return -1;
242 }
243
244 /*
245  * This routine is called when a client / server does not expect any more data,
246  * but needs to acknowledge the closing of the connection (by reading 0 bytes).
247  */
248 static void read_zero_bytes ( SOCKET s )
249 {
250     char buf[256];
251     int tmp, n = 0;
252     while ( ( tmp = recv ( s, buf, 256, 0 ) ) > 0 )
253         n += tmp;
254     ok ( n <= 0, "garbage data received: %d bytes\n", n );
255 }
256
257 static int do_synchronous_send ( SOCKET s, char *buf, int buflen, int sendlen )
258 {
259     char* last = buf + buflen, *p;
260     int n = 1;
261     for ( p = buf; n > 0 && p < last; p += n )
262         n = send ( s, p, min ( sendlen, last - p ), 0 );
263     wsa_ok ( n, 0 <=, "do_synchronous_send (%x): error %d\n" );
264     return p - buf;
265 }
266
267 static int do_synchronous_recv ( SOCKET s, char *buf, int buflen, int recvlen )
268 {
269     char* last = buf + buflen, *p;
270     int n = 1;
271     for ( p = buf; n > 0 && p < last; p += n )
272         n = recv ( s, p, min ( recvlen, last - p ), 0 );
273     wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
274     return p - buf;
275 }
276
277 static int do_synchronous_recvfrom ( SOCKET s, char *buf, int buflen,int flags,struct sockaddr *from, int *fromlen, int recvlen )
278 {
279     char* last = buf + buflen, *p;
280     int n = 1;
281     for ( p = buf; n > 0 && p < last; p += n )
282       n = recvfrom ( s, p, min ( recvlen, last - p ), 0, from, fromlen );
283     wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
284     return p - buf;
285 }
286
287 /*
288  *  Call this routine right after thread startup.
289  *  SO_OPENTYPE must by 0, regardless what the server did.
290  */
291 static void check_so_opentype (void)
292 {
293     int tmp = 1, len;
294     len = sizeof (tmp);
295     getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (LPVOID) &tmp, &len );
296     ok ( tmp == 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp );
297 }
298
299 /**************** Server utility functions ***************/
300
301 /*
302  *  Even if we have closed our server socket cleanly,
303  *  the OS may mark the address "in use" for some time -
304  *  this happens with native Linux apps, too.
305  */
306 static void do_bind ( SOCKET s, struct sockaddr* addr, int addrlen )
307 {
308     int err, wsaerr = 0, n_try = BIND_TRIES;
309
310     while ( ( err = bind ( s, addr, addrlen ) ) != 0 &&
311             ( wsaerr = WSAGetLastError () ) == WSAEADDRINUSE &&
312             n_try-- >= 0)
313     {
314         trace ( "address in use, waiting ...\n" );
315         Sleep ( 1000 * BIND_SLEEP );
316     }
317     ok ( err == 0, "failed to bind: %d\n", wsaerr );
318 }
319
320 static void server_start ( server_params *par )
321 {
322     int i;
323     test_params *gen = par->general;
324     server_memory *mem = LocalAlloc ( LPTR, sizeof ( server_memory ) );
325
326     TlsSetValue ( tls, mem );
327     mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot,
328                           NULL, 0, par->sock_flags );
329     ok ( mem->s != INVALID_SOCKET, "Server: WSASocket failed\n" );
330
331     mem->addr.sin_family = AF_INET;
332     mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr );
333     mem->addr.sin_port = htons ( gen->inet_port );
334
335     for (i = 0; i < MAX_CLIENTS; i++)
336     {
337         mem->sock[i].s = INVALID_SOCKET;
338         mem->sock[i].buf = LocalAlloc ( LPTR, gen->n_chunks * gen->chunk_size );
339         mem->sock[i].n_recvd = 0;
340         mem->sock[i].n_sent = 0;
341     }
342
343     if ( gen->sock_type == SOCK_STREAM )
344         do_bind ( mem->s, (struct sockaddr*) &mem->addr, sizeof (mem->addr) );
345 }
346
347 static void server_stop (void)
348 {
349     int i;
350     server_memory *mem = TlsGetValue ( tls );
351
352     for (i = 0; i < MAX_CLIENTS; i++ )
353     {
354         LocalFree ( mem->sock[i].buf );
355         if ( mem->sock[i].s != INVALID_SOCKET )
356             closesocket ( mem->sock[i].s );
357     }
358     ok ( closesocket ( mem->s ) == 0, "closesocket failed\n" );
359     LocalFree ( mem );
360     ExitThread ( GetCurrentThreadId () );
361 }
362
363 /**************** Client utilitiy functions ***************/
364
365 static void client_start ( client_params *par )
366 {
367     test_params *gen = par->general;
368     client_memory *mem = LocalAlloc (LPTR, sizeof (client_memory));
369
370     TlsSetValue ( tls, mem );
371
372     WaitForSingleObject ( server_ready, INFINITE );
373
374     mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot,
375                           NULL, 0, par->sock_flags );
376
377     mem->addr.sin_family = AF_INET;
378     mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr );
379     mem->addr.sin_port = htons ( gen->inet_port );
380
381     ok ( mem->s != INVALID_SOCKET, "Client: WSASocket failed\n" );
382
383     mem->send_buf = LocalAlloc ( LPTR, 2 * gen->n_chunks * gen->chunk_size );
384     mem->recv_buf = mem->send_buf + gen->n_chunks * gen->chunk_size;
385     fill_buffer ( mem->send_buf, gen->chunk_size, gen->n_chunks );
386
387     SetEvent ( client_ready[client_id] );
388     /* Wait for the other clients to come up */
389     WaitForMultipleObjects ( min ( gen->n_clients, MAX_CLIENTS ), client_ready, TRUE, INFINITE );
390 }
391
392 static void client_stop (void)
393 {
394     client_memory *mem = TlsGetValue ( tls );
395     wsa_ok ( closesocket ( mem->s ), 0 ==, "closesocket error (%x): %d\n" );
396     LocalFree ( mem->send_buf );
397     LocalFree ( mem );
398     ExitThread(0);
399 }
400
401 /**************** Servers ***************/
402
403 /*
404  * simple_server: A very basic server doing synchronous IO.
405  */
406 static VOID WINAPI simple_server ( server_params *par )
407 {
408     test_params *gen = par->general;
409     server_memory *mem;
410     int pos, n_recvd, n_sent, n_expected = gen->n_chunks * gen->chunk_size, tmp, i,
411         id = GetCurrentThreadId();
412
413     trace ( "simple_server (%x) starting\n", id );
414
415     set_so_opentype ( FALSE ); /* non-overlapped */
416     server_start ( par );
417     mem = TlsGetValue ( tls );
418
419     wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "simple_server (%x): failed to set blocking mode: %d\n");
420     wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "simple_server (%x): listen failed: %d\n");
421
422     trace ( "simple_server (%x) ready\n", id );
423     SetEvent ( server_ready ); /* notify clients */
424
425     for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ )
426     {
427         trace ( "simple_server (%x): waiting for client\n", id );
428
429         /* accept a single connection */
430         tmp = sizeof ( mem->sock[0].peer );
431         mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp );
432         wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "simple_server (%x): accept failed: %d\n" );
433
434         ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
435              "simple_server (%x): strange peer address\n", id );
436
437         /* Receive data & check it */
438         n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, par->buflen );
439         ok ( n_recvd == n_expected,
440              "simple_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
441         pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks );
442         ok ( pos == -1, "simple_server (%x): test pattern error: %d\n", id, pos);
443
444         /* Echo data back */
445         n_sent = do_synchronous_send ( mem->sock[0].s, mem->sock[0].buf, n_expected, par->buflen );
446         ok ( n_sent == n_expected,
447              "simple_server (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
448
449         /* cleanup */
450         read_zero_bytes ( mem->sock[0].s );
451         wsa_ok ( closesocket ( mem->sock[0].s ),  0 ==, "simple_server (%x): closesocket error: %d\n" );
452         mem->sock[0].s = INVALID_SOCKET;
453     }
454
455     trace ( "simple_server (%x) exiting\n", id );
456     server_stop ();
457 }
458
459 /*
460  * select_server: A non-blocking server.
461  */
462 static VOID WINAPI select_server ( server_params *par )
463 {
464     test_params *gen = par->general;
465     server_memory *mem;
466     int n_expected = gen->n_chunks * gen->chunk_size, tmp, i,
467         id = GetCurrentThreadId(), n_connections = 0, n_sent, n_recvd,
468         n_set, delta, n_ready;
469     struct timeval timeout = {0,10}; /* wait for 10 milliseconds */
470     fd_set fds_recv, fds_send, fds_openrecv, fds_opensend;
471
472     trace ( "select_server (%x) starting\n", id );
473
474     set_so_opentype ( FALSE ); /* non-overlapped */
475     server_start ( par );
476     mem = TlsGetValue ( tls );
477
478     wsa_ok ( set_blocking ( mem->s, FALSE ), 0 ==, "select_server (%x): failed to set blocking mode: %d\n");
479     wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "select_server (%x): listen failed: %d\n");
480
481     trace ( "select_server (%x) ready\n", id );
482     SetEvent ( server_ready ); /* notify clients */
483
484     FD_ZERO ( &fds_openrecv );
485     FD_ZERO ( &fds_recv );
486     FD_ZERO ( &fds_send );
487     FD_ZERO ( &fds_opensend );
488
489     FD_SET ( mem->s, &fds_openrecv );
490
491     while(1)
492     {
493         fds_recv = fds_openrecv;
494         fds_send = fds_opensend;
495
496         n_set = 0;
497
498         wsa_ok ( ( n_ready = select ( 0, &fds_recv, &fds_send, NULL, &timeout ) ), SOCKET_ERROR !=, 
499             "select_server (%x): select() failed: %d\n" );
500
501         /* check for incoming requests */
502         if ( FD_ISSET ( mem->s, &fds_recv ) ) {
503             n_set += 1;
504
505             trace ( "select_server (%x): accepting client connection\n", id );
506
507             /* accept a single connection */
508             tmp = sizeof ( mem->sock[n_connections].peer );
509             mem->sock[n_connections].s = accept ( mem->s, (struct sockaddr*) &mem->sock[n_connections].peer, &tmp );
510             wsa_ok ( mem->sock[n_connections].s, INVALID_SOCKET !=, "select_server (%x): accept() failed: %d\n" );
511
512             ok ( mem->sock[n_connections].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
513                 "select_server (%x): strange peer address\n", id );
514
515             /* add to list of open connections */
516             FD_SET ( mem->sock[n_connections].s, &fds_openrecv );
517             FD_SET ( mem->sock[n_connections].s, &fds_opensend );
518
519             n_connections++;
520         }
521
522         /* handle open requests */
523
524         for ( i = 0; i < n_connections; i++ )
525         {
526             if ( FD_ISSET( mem->sock[i].s, &fds_recv ) ) {
527                 n_set += 1;
528
529                 if ( mem->sock[i].n_recvd < n_expected ) {
530                     /* Receive data & check it */
531                     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 );
532                     ok ( n_recvd != SOCKET_ERROR, "select_server (%x): error in recv(): %d\n", id, WSAGetLastError() );
533                     mem->sock[i].n_recvd += n_recvd;
534
535                     if ( mem->sock[i].n_recvd == n_expected ) {
536                         int pos = test_buffer ( mem->sock[i].buf, gen->chunk_size, gen->n_chunks );
537                         ok ( pos == -1, "select_server (%x): test pattern error: %d\n", id, pos );
538                         FD_CLR ( mem->sock[i].s, &fds_openrecv );
539                     }
540
541                     ok ( mem->sock[i].n_recvd <= n_expected, "select_server (%x): received too many bytes: %d\n", id, mem->sock[i].n_recvd );
542                 }
543             }
544
545             /* only echo back what we've received */
546             delta = mem->sock[i].n_recvd - mem->sock[i].n_sent;
547
548             if ( FD_ISSET ( mem->sock[i].s, &fds_send ) ) {
549                 n_set += 1;
550
551                 if ( ( delta > 0 ) && ( mem->sock[i].n_sent < n_expected ) ) {
552                     /* Echo data back */
553                     n_sent = send ( mem->sock[i].s, mem->sock[i].buf + mem->sock[i].n_sent, min ( delta, par->buflen ), 0 );
554                     ok ( n_sent != SOCKET_ERROR, "select_server (%x): error in send(): %d\n", id, WSAGetLastError() );
555                     mem->sock[i].n_sent += n_sent;
556
557                     if ( mem->sock[i].n_sent == n_expected ) {
558                         FD_CLR ( mem->sock[i].s, &fds_opensend );
559                     }
560
561                     ok ( mem->sock[i].n_sent <= n_expected, "select_server (%x): sent too many bytes: %d\n", id, mem->sock[i].n_sent );
562                 }
563             }
564         }
565
566         /* check that select returned the correct number of ready sockets */
567         ok ( ( n_set == n_ready ), "select_server (%x): select() returns wrong number of ready sockets\n", id );
568
569         /* check if all clients are done */
570         if ( ( fds_opensend.fd_count == 0 ) 
571             && ( fds_openrecv.fd_count == 1 ) /* initial socket that accepts clients */
572             && ( n_connections  == min ( gen->n_clients, MAX_CLIENTS ) ) ) {
573             break;
574         }
575     }
576
577     for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ )
578     {
579         /* cleanup */
580         read_zero_bytes ( mem->sock[i].s );
581         wsa_ok ( closesocket ( mem->sock[i].s ),  0 ==, "select_server (%x): closesocket error: %d\n" );
582         mem->sock[i].s = INVALID_SOCKET;
583     }
584
585     trace ( "select_server (%x) exiting\n", id );
586     server_stop ();
587 }
588
589 /**************** Clients ***************/
590
591 /*
592  * simple_client: A very basic client doing synchronous IO.
593  */
594 static VOID WINAPI simple_client ( client_params *par )
595 {
596     test_params *gen = par->general;
597     client_memory *mem;
598     int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
599
600     id = GetCurrentThreadId();
601     trace ( "simple_client (%x): starting\n", id );
602     /* wait here because we want to call set_so_opentype before creating a socket */
603     WaitForSingleObject ( server_ready, INFINITE );
604     trace ( "simple_client (%x): server ready\n", id );
605
606     check_so_opentype ();
607     set_so_opentype ( FALSE ); /* non-overlapped */
608     client_start ( par );
609     mem = TlsGetValue ( tls );
610
611     /* Connect */
612     wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
613              0 ==, "simple_client (%x): connect error: %d\n" );
614     ok ( set_blocking ( mem->s, TRUE ) == 0,
615          "simple_client (%x): failed to set blocking mode\n", id );
616     trace ( "simple_client (%x) connected\n", id );
617
618     /* send data to server */
619     n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, par->buflen );
620     ok ( n_sent == n_expected,
621          "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
622
623     /* shutdown send direction */
624     wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
625
626     /* Receive data echoed back & check it */
627     n_recvd = do_synchronous_recv ( mem->s, mem->recv_buf, n_expected, par->buflen );
628     ok ( n_recvd == n_expected,
629          "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
630
631     /* check data */
632     pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
633     ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
634
635     /* cleanup */
636     read_zero_bytes ( mem->s );
637     trace ( "simple_client (%x) exiting\n", id );
638     client_stop ();
639 }
640
641 /*
642  * simple_mixed_client: mixing send and recvfrom
643  */
644 static VOID WINAPI simple_mixed_client ( client_params *par )
645 {
646     test_params *gen = par->general;
647     client_memory *mem;
648     int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
649     int fromLen = sizeof(mem->addr);
650     struct sockaddr test;
651
652     id = GetCurrentThreadId();
653     trace ( "simple_client (%x): starting\n", id );
654     /* wait here because we want to call set_so_opentype before creating a socket */
655     WaitForSingleObject ( server_ready, INFINITE );
656     trace ( "simple_client (%x): server ready\n", id );
657
658     check_so_opentype ();
659     set_so_opentype ( FALSE ); /* non-overlapped */
660     client_start ( par );
661     mem = TlsGetValue ( tls );
662
663     /* Connect */
664     wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
665              0 ==, "simple_client (%x): connect error: %d\n" );
666     ok ( set_blocking ( mem->s, TRUE ) == 0,
667          "simple_client (%x): failed to set blocking mode\n", id );
668     trace ( "simple_client (%x) connected\n", id );
669
670     /* send data to server */
671     n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, par->buflen );
672     ok ( n_sent == n_expected,
673          "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
674
675     /* shutdown send direction */
676     wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
677
678     /* this shouldn't change, since lpFrom, is not updated on
679        connection oriented sockets - exposed by bug 11640
680     */
681     ((struct sockaddr_in*)&test)->sin_addr.s_addr = inet_addr("0.0.0.0");
682
683     /* Receive data echoed back & check it */
684     n_recvd = do_synchronous_recvfrom ( mem->s,
685                                         mem->recv_buf,
686                                         n_expected,
687                                         0,
688                                         (struct sockaddr *)&test,
689                                         &fromLen,
690                                         par->buflen );
691     ok ( n_recvd == n_expected,
692          "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
693
694     /* check that lpFrom was not updated */
695     ok(0 ==
696        strcmp(
697               inet_ntoa(((struct sockaddr_in*)&test)->sin_addr),
698               "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n");
699
700     /* check data */
701     pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
702     ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
703
704     /* cleanup */
705     read_zero_bytes ( mem->s );
706     trace ( "simple_client (%x) exiting\n", id );
707     client_stop ();
708 }
709
710 /*
711  * event_client: An event-driven client
712  */
713 static void WINAPI event_client ( client_params *par )
714 {
715     test_params *gen = par->general;
716     client_memory *mem;
717     int id = GetCurrentThreadId(), n_expected = gen->n_chunks * gen->chunk_size,
718         tmp, err, n;
719     HANDLE event;
720     WSANETWORKEVENTS wsa_events;
721     char *send_last, *recv_last, *send_p, *recv_p;
722     long mask = FD_READ | FD_WRITE | FD_CLOSE;
723
724     trace ( "event_client (%x): starting\n", id );
725     client_start ( par );
726     trace ( "event_client (%x): server ready\n", id );
727
728     mem = TlsGetValue ( tls );
729
730     /* Prepare event notification for connect, makes socket nonblocking */
731     event = WSACreateEvent ();
732     WSAEventSelect ( mem->s, event, FD_CONNECT );
733     tmp = connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) );
734     if ( tmp != 0 ) {
735         err = WSAGetLastError ();
736         ok ( err == WSAEWOULDBLOCK, "event_client (%x): connect error: %d\n", id, err );
737         tmp = WaitForSingleObject ( event, INFINITE );
738         ok ( tmp == WAIT_OBJECT_0, "event_client (%x): wait for connect event failed: %d\n", id, tmp );
739         err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events );
740         wsa_ok ( err, 0 ==, "event_client (%x): WSAEnumNetworkEvents error: %d\n" );
741         err = wsa_events.iErrorCode[ FD_CONNECT_BIT ];
742         ok ( err == 0, "event_client (%x): connect error: %d\n", id, err );
743         if ( err ) goto out;
744     }
745
746     trace ( "event_client (%x) connected\n", id );
747
748     WSAEventSelect ( mem->s, event, mask );
749
750     recv_p = mem->recv_buf;
751     recv_last = mem->recv_buf + n_expected;
752     send_p = mem->send_buf;
753     send_last = mem->send_buf + n_expected;
754
755     while ( TRUE )
756     {
757         err = WaitForSingleObject ( event, INFINITE );
758         ok ( err == WAIT_OBJECT_0, "event_client (%x): wait failed\n", id );
759
760         err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events );
761         wsa_ok ( err, 0 ==, "event_client (%x): WSAEnumNetworkEvents error: %d\n" );
762
763         if ( wsa_events.lNetworkEvents & FD_WRITE )
764         {
765             err = wsa_events.iErrorCode[ FD_WRITE_BIT ];
766             ok ( err == 0, "event_client (%x): FD_WRITE error code: %d\n", id, err );
767
768             if ( err== 0 )
769                 do
770                 {
771                     n = send ( mem->s, send_p, min ( send_last - send_p, par->buflen ), 0 );
772                     if ( n < 0 )
773                     {
774                         err = WSAGetLastError ();
775                         ok ( err == WSAEWOULDBLOCK, "event_client (%x): send error: %d\n", id, err );
776                     }
777                     else
778                         send_p += n;
779                 }
780                 while ( n >= 0 && send_p < send_last );
781
782             if ( send_p == send_last )
783             {
784                 trace ( "event_client (%x): all data sent - shutdown\n", id );
785                 shutdown ( mem->s, SD_SEND );
786                 mask &= ~FD_WRITE;
787                 WSAEventSelect ( mem->s, event, mask );
788             }
789         }
790         if ( wsa_events.lNetworkEvents & FD_READ )
791         {
792             err = wsa_events.iErrorCode[ FD_READ_BIT ];
793             ok ( err == 0, "event_client (%x): FD_READ error code: %d\n", id, err );
794             if ( err != 0 ) break;
795             
796             /* First read must succeed */
797             n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
798             wsa_ok ( n, 0 <=, "event_client (%x): recv error: %d\n" );
799
800             while ( n >= 0 ) {
801                 recv_p += n;
802                 if ( recv_p == recv_last )
803                 {
804                     mask &= ~FD_READ;
805                     trace ( "event_client (%x): all data received\n", id );
806                     WSAEventSelect ( mem->s, event, mask );
807                     break;
808                 }
809                 n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
810                 if ( n < 0 && ( err = WSAGetLastError()) != WSAEWOULDBLOCK )
811                     ok ( 0, "event_client (%x): read error: %d\n", id, err );
812                 
813             }
814         }   
815         if ( wsa_events.lNetworkEvents & FD_CLOSE )
816         {
817             trace ( "event_client (%x): close event\n", id );
818             err = wsa_events.iErrorCode[ FD_CLOSE_BIT ];
819             ok ( err == 0, "event_client (%x): FD_CLOSE error code: %d\n", id, err );
820             break;
821         }
822     }
823
824     n = send_p - mem->send_buf;
825     ok ( send_p == send_last,
826          "simple_client (%x): sent less data than expected: %d of %d\n", id, n, n_expected );
827     n = recv_p - mem->recv_buf;
828     ok ( recv_p == recv_last,
829          "simple_client (%x): received less data than expected: %d of %d\n", id, n, n_expected );
830     n = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
831     ok ( n == -1, "event_client (%x): test pattern error: %d\n", id, n);
832
833 out:
834     WSACloseEvent ( event );
835     trace ( "event_client (%x) exiting\n", id );
836     client_stop ();
837 }
838
839 /**************** Main program utility functions ***************/
840
841 static void Init (void)
842 {
843     WORD ver = MAKEWORD (2, 2);
844     WSADATA data;
845     HMODULE hws2_32 = GetModuleHandle("ws2_32.dll");
846
847     pFreeAddrInfoW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoW");
848     pGetAddrInfoW = (void *)GetProcAddress(hws2_32, "GetAddrInfoW");
849     pInetNtop = (void *)GetProcAddress(hws2_32, "inet_ntop");
850
851     ok ( WSAStartup ( ver, &data ) == 0, "WSAStartup failed\n" );
852     tls = TlsAlloc();
853 }
854
855 static void Exit (void)
856 {
857     INT ret, err;
858     TlsFree ( tls );
859     ret = WSACleanup();
860     err = WSAGetLastError();
861     ok ( ret == 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret, err);
862     ret = WSACleanup();
863     err = WSAGetLastError();
864     ok ( (ret == SOCKET_ERROR && err ==  WSANOTINITIALISED) ||
865          broken(ret == 0),  /* WinME */
866             "WSACleanup returned %d GetLastError is %d\n", ret, err);
867 }
868
869 static void StartServer (LPTHREAD_START_ROUTINE routine,
870                          test_params *general, server_params *par)
871 {
872     par->general = general;
873     thread[0] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[0] );
874     ok ( thread[0] != NULL, "Failed to create server thread\n" );
875 }
876
877 static void StartClients (LPTHREAD_START_ROUTINE routine,
878                           test_params *general, client_params *par)
879 {
880     int i;
881     par->general = general;
882     for ( i = 1; i <= min ( general->n_clients, MAX_CLIENTS ); i++ )
883     {
884         client_id = i - 1;
885         thread[i] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[i] );
886         ok ( thread[i] != NULL, "Failed to create client thread\n" );
887         /* Make sure the client is up and running */
888         WaitForSingleObject ( client_ready[client_id], INFINITE );
889     };
890 }
891
892 static void do_test( test_setup *test )
893 {
894     DWORD i, n = min (test->general.n_clients, MAX_CLIENTS);
895     DWORD wait;
896
897     server_ready = CreateEventA ( NULL, TRUE, FALSE, NULL );
898     for (i = 0; i <= n; i++)
899         client_ready[i] = CreateEventA ( NULL, TRUE, FALSE, NULL );
900
901     StartServer ( test->srv, &test->general, &test->srv_params );
902     StartClients ( test->clt, &test->general, &test->clt_params );
903     WaitForSingleObject ( server_ready, INFINITE );
904
905     wait = WaitForMultipleObjects ( 1 + n, thread, TRUE, 1000 * TEST_TIMEOUT );
906     ok ( wait <= WAIT_OBJECT_0 + n ,
907          "some threads have not completed: %x\n", wait );
908
909     if ( ! ( wait <= WAIT_OBJECT_0 + n ) )
910     {
911         for (i = 0; i <= n; i++)
912         {
913             trace ("terminating thread %08x\n", thread_id[i]);
914             if ( WaitForSingleObject ( thread[i], 0 ) != WAIT_OBJECT_0 )
915                 TerminateThread ( thread [i], 0 );
916         }
917     }
918     CloseHandle ( server_ready );
919     for (i = 0; i <= n; i++)
920         CloseHandle ( client_ready[i] );
921 }
922
923 /********* some tests for getsockopt(setsockopt(X)) == X ***********/
924 /* optname = SO_LINGER */
925 LINGER linger_testvals[] = {
926     {0,0},
927     {0,73}, 
928     {1,0},
929     {5,189}
930 };
931
932 /* optname = SO_RCVTIMEO, SOSNDTIMEO */
933 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a
934                         bug in the linux kernel (fixed in 2.6.8) */ 
935 #define SOCKTIMEOUT2 997000 /* 997 seconds */
936
937 static void test_set_getsockopt(void)
938 {
939     SOCKET s;
940     int i, err, lasterr;
941     int timeout;
942     LINGER lingval;
943     int size;
944
945     s = socket(AF_INET, SOCK_STREAM, 0);
946     ok(s!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
947     if( s == INVALID_SOCKET) return;
948     /* SO_RCVTIMEO */
949     timeout = SOCKTIMEOUT1;
950     size = sizeof(timeout);
951     err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, size); 
952     if( !err)
953         err = getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, &size); 
954     ok( !err, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
955     ok( timeout == SOCKTIMEOUT1, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout);
956     /* SO_SNDTIMEO */
957     timeout = SOCKTIMEOUT2; /* 54 seconds. See remark above */ 
958     size = sizeof(timeout);
959     err = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, size); 
960     if( !err)
961         err = getsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, &size); 
962     ok( !err, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError());
963     ok( timeout == SOCKTIMEOUT2, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout);
964     /* SO_LINGER */
965     for( i = 0; i < sizeof(linger_testvals)/sizeof(LINGER);i++) {
966         size =  sizeof(lingval);
967         lingval = linger_testvals[i];
968         err = setsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, size); 
969         if( !err)
970             err = getsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, &size); 
971         ok( !err, "get/setsockopt(SO_LINGER) failed error: %d\n", WSAGetLastError());
972         ok( !lingval.l_onoff == !linger_testvals[i].l_onoff &&
973                 (lingval.l_linger == linger_testvals[i].l_linger ||
974                  (!lingval.l_linger && !linger_testvals[i].l_onoff))
975                 , "getsockopt(SO_LINGER #%d) returned wrong value %d,%d not %d,%d\n", i, 
976                  lingval.l_onoff, lingval.l_linger,
977                  linger_testvals[i].l_onoff, linger_testvals[i].l_linger);
978     }
979     /* Test for erroneously passing a value instead of a pointer as optval */
980     size = sizeof(char);
981     err = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)1, size);
982     ok(err == SOCKET_ERROR, "setsockopt with optval being a value passed "
983                             "instead of failing.\n");
984     lasterr = WSAGetLastError();
985     ok(lasterr == WSAEFAULT, "setsockopt with optval being a value "
986                              "returned 0x%08x, not WSAEFAULT(0x%08x)\n",
987                              lasterr, WSAEFAULT);
988     closesocket(s);
989 }
990
991 static void test_so_reuseaddr(void)
992 {
993     struct sockaddr_in saddr;
994     SOCKET s1,s2;
995     unsigned int rc,reuse;
996     int size;
997
998     saddr.sin_family      = AF_INET;
999     saddr.sin_port        = htons(9375);
1000     saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
1001
1002     s1=socket(AF_INET, SOCK_STREAM, 0);
1003     ok(s1!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1004     rc = bind(s1, (struct sockaddr*)&saddr, sizeof(saddr));
1005     ok(rc!=SOCKET_ERROR, "bind(s1) failed error: %d\n", WSAGetLastError());
1006
1007     s2=socket(AF_INET, SOCK_STREAM, 0);
1008     ok(s2!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1009
1010     reuse=0x1234;
1011     size=sizeof(reuse);
1012     rc=getsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, &size );
1013     ok(rc==0 && reuse==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc,reuse);
1014
1015     rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1016     ok(rc==SOCKET_ERROR, "bind() succeeded\n");
1017
1018     reuse = 1;
1019     rc = setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
1020     ok(rc==0, "setsockopt() failed error: %d\n", WSAGetLastError());
1021
1022     /* On Win2k3 and above, all SO_REUSEADDR seems to do is to allow binding to
1023      * a port immediately after closing another socket on that port, so
1024      * basically following the BSD socket semantics here. */
1025     closesocket(s1);
1026     rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1027     ok(rc==0, "bind() failed error: %d\n", WSAGetLastError());
1028
1029     closesocket(s2);
1030 }
1031
1032 /************* Array containing the tests to run **********/
1033
1034 #define STD_STREAM_SOCKET \
1035             SOCK_STREAM, \
1036             0, \
1037             SERVERIP, \
1038             SERVERPORT
1039
1040 static test_setup tests [NUM_TESTS] =
1041 {
1042     /* Test 0: synchronous client and server */
1043     {
1044         {
1045             STD_STREAM_SOCKET,
1046             2048,
1047             16,
1048             2
1049         },
1050         simple_server,
1051         {
1052             NULL,
1053             0,
1054             64
1055         },
1056         simple_client,
1057         {
1058             NULL,
1059             0,
1060             128
1061         }
1062     },
1063     /* Test 1: event-driven client, synchronous server */
1064     {
1065         {
1066             STD_STREAM_SOCKET,
1067             2048,
1068             16,
1069             2
1070         },
1071         simple_server,
1072         {
1073             NULL,
1074             0,
1075             64
1076         },
1077         event_client,
1078         {
1079             NULL,
1080             WSA_FLAG_OVERLAPPED,
1081             128
1082         }
1083     },
1084     /* Test 2: synchronous client, non-blocking server via select() */
1085     {
1086         {
1087             STD_STREAM_SOCKET,
1088             2048,
1089             16,
1090             2
1091         },
1092         select_server,
1093         {
1094             NULL,
1095             0,
1096             64
1097         },
1098         simple_client,
1099         {
1100             NULL,
1101             0,
1102             128
1103         }
1104     },
1105         /* Test 3: synchronous mixed client and server */
1106     {
1107         {
1108             STD_STREAM_SOCKET,
1109             2048,
1110             16,
1111             2
1112         },
1113         simple_server,
1114         {
1115             NULL,
1116             0,
1117             64
1118         },
1119         simple_mixed_client,
1120         {
1121             NULL,
1122             0,
1123             128
1124         }
1125     }
1126 };
1127
1128 static void test_UDP(void)
1129 {
1130     /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is
1131        possible that this test fails due to dropped packets. */
1132
1133     /* peer 0 receives data from all other peers */
1134     struct sock_info peer[NUM_UDP_PEERS];
1135     char buf[16];
1136     int ss, i, n_recv, n_sent;
1137
1138     memset (buf,0,sizeof(buf));
1139     for ( i = NUM_UDP_PEERS - 1; i >= 0; i-- ) {
1140         ok ( ( peer[i].s = socket ( AF_INET, SOCK_DGRAM, 0 ) ) != INVALID_SOCKET, "UDP: socket failed\n" );
1141
1142         peer[i].addr.sin_family         = AF_INET;
1143         peer[i].addr.sin_addr.s_addr    = inet_addr ( SERVERIP );
1144
1145         if ( i == 0 ) {
1146             peer[i].addr.sin_port       = htons ( SERVERPORT );
1147         } else {
1148             peer[i].addr.sin_port       = htons ( 0 );
1149         }
1150
1151         do_bind ( peer[i].s, (struct sockaddr *) &peer[i].addr, sizeof( peer[i].addr ) );
1152
1153         /* test getsockname() to get peer's port */
1154         ss = sizeof ( peer[i].addr );
1155         ok ( getsockname ( peer[i].s, (struct sockaddr *) &peer[i].addr, &ss ) != SOCKET_ERROR, "UDP: could not getsockname()\n" );
1156         ok ( peer[i].addr.sin_port != htons ( 0 ), "UDP: bind() did not associate port\n" );
1157     }
1158
1159     /* test getsockname() */
1160     ok ( peer[0].addr.sin_port == htons ( SERVERPORT ), "UDP: getsockname returned incorrect peer port\n" );
1161
1162     for ( i = 1; i < NUM_UDP_PEERS; i++ ) {
1163         /* send client's ip */
1164         memcpy( buf, &peer[i].addr.sin_port, sizeof(peer[i].addr.sin_port) );
1165         n_sent = sendto ( peer[i].s, buf, sizeof(buf), 0, (struct sockaddr*) &peer[0].addr, sizeof(peer[0].addr) );
1166         ok ( n_sent == sizeof(buf), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent );
1167     }
1168
1169     for ( i = 1; i < NUM_UDP_PEERS; i++ ) {
1170         n_recv = recvfrom ( peer[0].s, buf, sizeof(buf), 0,(struct sockaddr *) &peer[0].peer, &ss );
1171         ok ( n_recv == sizeof(buf), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv );
1172         ok ( memcmp ( &peer[0].peer.sin_port, buf, sizeof(peer[0].addr.sin_port) ) == 0, "UDP: port numbers do not match\n" );
1173     }
1174 }
1175
1176 static void WINAPI do_getservbyname( HANDLE *starttest )
1177 {
1178     struct {
1179         const char *name;
1180         const char *proto;
1181         int port;
1182     } serv[2] = { {"domain", "udp", 53}, {"telnet", "tcp", 23} };
1183
1184     int i, j;
1185     struct servent *pserv[2];
1186
1187     ok ( WaitForSingleObject ( *starttest, TEST_TIMEOUT * 1000 ) != WAIT_TIMEOUT, "test_getservbyname: timeout waiting for start signal\n");
1188
1189     /* ensure that necessary buffer resizes are completed */
1190     for ( j = 0; j < 2; j++) {
1191         pserv[j] = getservbyname ( serv[j].name, serv[j].proto );
1192     }
1193
1194     for ( i = 0; i < NUM_QUERIES / 2; i++ ) {
1195         for ( j = 0; j < 2; j++ ) {
1196             pserv[j] = getservbyname ( serv[j].name, serv[j].proto );
1197             ok ( pserv[j] != NULL, "getservbyname could not retrieve information for %s: %d\n", serv[j].name, WSAGetLastError() );
1198             ok ( pserv[j]->s_port == htons(serv[j].port), "getservbyname returned the wrong port for %s: %d\n", serv[j].name, ntohs(pserv[j]->s_port) );
1199             ok ( !strcmp ( pserv[j]->s_proto, serv[j].proto ), "getservbyname returned the wrong protocol for %s: %s\n", serv[j].name, pserv[j]->s_proto );
1200             ok ( !strcmp ( pserv[j]->s_name, serv[j].name ), "getservbyname returned the wrong name for %s: %s\n", serv[j].name, pserv[j]->s_name );
1201         }
1202
1203         ok ( pserv[0] == pserv[1], "getservbyname: winsock resized servent buffer when not necessary\n" );
1204     }
1205 }
1206
1207 static void test_getservbyname(void)
1208 {
1209     int i;
1210     HANDLE starttest, thread[NUM_THREADS];
1211     DWORD thread_id[NUM_THREADS];
1212
1213     starttest = CreateEvent ( NULL, 1, 0, "test_getservbyname_starttest" );
1214
1215     /* create threads */
1216     for ( i = 0; i < NUM_THREADS; i++ ) {
1217         thread[i] = CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE) &do_getservbyname, &starttest, 0, &thread_id[i] );
1218     }
1219
1220     /* signal threads to start */
1221     SetEvent ( starttest );
1222
1223     for ( i = 0; i < NUM_THREADS; i++) {
1224         WaitForSingleObject ( thread[i], TEST_TIMEOUT * 1000 );
1225     }
1226 }
1227
1228 static void test_WSASocket(void)
1229 {
1230     SOCKET sock = INVALID_SOCKET;
1231     WSAPROTOCOL_INFOA *pi;
1232     int providers[] = {6, 0};
1233     int ret, err;
1234     UINT pi_size;
1235
1236     /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
1237      * to avoid a crash on win98.
1238      */
1239     pi_size = 0;
1240     ret = WSAEnumProtocolsA(providers, NULL, &pi_size);
1241     ok(ret == SOCKET_ERROR, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
1242             ret);
1243     err = WSAGetLastError();
1244     ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
1245             err, WSAENOBUFS);
1246
1247     pi = HeapAlloc(GetProcessHeap(), 0, pi_size);
1248     ok(pi != NULL, "Failed to allocate memory\n");
1249     if (pi == NULL) {
1250         skip("Can't continue without memory.\n");
1251         return;
1252     }
1253
1254     ret = WSAEnumProtocolsA(providers, pi, &pi_size);
1255     ok(ret != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n",
1256             WSAGetLastError());
1257
1258     if (ret == 0) {
1259         skip("No protocols enumerated.\n");
1260         HeapFree(GetProcessHeap(), 0, pi);
1261         return;
1262     }
1263
1264     sock = WSASocketA(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
1265                       FROM_PROTOCOL_INFO, &pi[0], 0, 0);
1266     ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
1267             WSAGetLastError());
1268
1269     closesocket(sock);
1270     HeapFree(GetProcessHeap(), 0, pi);
1271 }
1272
1273 static void test_WSAAddressToStringA(void)
1274 {
1275     INT ret;
1276     DWORD len;
1277     int GLE;
1278     SOCKADDR_IN sockaddr;
1279     CHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
1280
1281     CHAR expect1[] = "0.0.0.0";
1282     CHAR expect2[] = "255.255.255.255";
1283     CHAR expect3[] = "0.0.0.0:65535";
1284     CHAR expect4[] = "255.255.255.255:65535";
1285
1286     len = 0;
1287
1288     sockaddr.sin_family = AF_INET;
1289     sockaddr.sin_port = 0;
1290     sockaddr.sin_addr.s_addr = 0;
1291
1292     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1293     GLE = WSAGetLastError();
1294     ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0), 
1295         "WSAAddressToStringA() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
1296         GLE, ret );
1297
1298     len = sizeof(address);
1299
1300     sockaddr.sin_family = AF_INET;
1301     sockaddr.sin_port = 0;
1302     sockaddr.sin_addr.s_addr = 0;
1303
1304     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1305     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1306
1307     ok( !strcmp( address, expect1 ), "Expected: %s, got: %s\n", expect1, address );
1308     ok( len == sizeof( expect1 ), "Got size %d\n", len);
1309
1310     len = sizeof(address);
1311
1312     sockaddr.sin_family = AF_INET;
1313     sockaddr.sin_port = 0;
1314     sockaddr.sin_addr.s_addr = 0xffffffff;
1315
1316     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1317     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1318
1319     ok( !strcmp( address, expect2 ), "Expected: %s, got: %s\n", expect2, address );
1320
1321     len = sizeof(address);
1322
1323     sockaddr.sin_family = AF_INET;
1324     sockaddr.sin_port = 0xffff;
1325     sockaddr.sin_addr.s_addr = 0;
1326
1327     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1328     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1329
1330     ok( !strcmp( address, expect3 ), "Expected: %s, got: %s\n", expect3, address );
1331
1332     len = sizeof(address);
1333
1334     sockaddr.sin_family = AF_INET;
1335     sockaddr.sin_port = 0xffff;
1336     sockaddr.sin_addr.s_addr = 0xffffffff;
1337
1338     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1339     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1340
1341     ok( !strcmp( address, expect4 ), "Expected: %s, got: %s\n", expect4, address );
1342     ok( len == sizeof( expect4 ), "Got size %d\n", len);
1343 }
1344
1345 static void test_WSAAddressToStringW(void)
1346 {
1347     INT ret;
1348     DWORD len;
1349     int GLE;
1350     SOCKADDR_IN sockaddr;
1351     WCHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
1352
1353     WCHAR expect1[] = { '0','.','0','.','0','.','0', 0 };
1354     WCHAR expect2[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
1355     WCHAR expect3[] = { '0','.','0','.','0','.','0', ':', '6', '5', '5', '3', '5', 0 };
1356     WCHAR expect4[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
1357                         '6', '5', '5', '3', '5', 0 };
1358
1359     len = 0;
1360
1361     sockaddr.sin_family = AF_INET;
1362     sockaddr.sin_port = 0;
1363     sockaddr.sin_addr.s_addr = 0;
1364
1365     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1366     GLE = WSAGetLastError();
1367     ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0), 
1368         "WSAAddressToStringW() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
1369         GLE, ret );
1370
1371     len = sizeof(address);
1372
1373     sockaddr.sin_family = AF_INET;
1374     sockaddr.sin_port = 0;
1375     sockaddr.sin_addr.s_addr = 0;
1376
1377     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1378     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1379
1380     ok( !lstrcmpW( address, expect1 ), "Expected different address string\n" );
1381     ok( len == sizeof( expect1 )/sizeof( WCHAR ), "Got size %d\n", len);
1382
1383     len = sizeof(address);
1384
1385     sockaddr.sin_family = AF_INET;
1386     sockaddr.sin_port = 0;
1387     sockaddr.sin_addr.s_addr = 0xffffffff;
1388
1389     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1390     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1391
1392     ok( !lstrcmpW( address, expect2 ), "Expected different address string\n" );
1393
1394     len = sizeof(address);
1395
1396     sockaddr.sin_family = AF_INET;
1397     sockaddr.sin_port = 0xffff;
1398     sockaddr.sin_addr.s_addr = 0;
1399
1400     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1401     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1402
1403     ok( !lstrcmpW( address, expect3 ), "Expected different address string\n" );
1404
1405     len = sizeof(address);
1406
1407     sockaddr.sin_family = AF_INET;
1408     sockaddr.sin_port = 0xffff;
1409     sockaddr.sin_addr.s_addr = 0xffffffff;
1410
1411     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1412     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1413
1414     ok( !lstrcmpW( address, expect4 ), "Expected different address string\n" );
1415     ok( len == sizeof( expect4 )/sizeof( WCHAR ), "Got size %d\n", len);
1416 }
1417
1418 static void test_WSAStringToAddressA(void)
1419 {
1420     INT ret, len;
1421     SOCKADDR_IN sockaddr;
1422     SOCKADDR_IN6 sockaddr6;
1423     int GLE;
1424
1425     CHAR address1[] = "0.0.0.0";
1426     CHAR address2[] = "127.127.127.127";
1427     CHAR address3[] = "255.255.255.255";
1428     CHAR address4[] = "127.127.127.127:65535";
1429     CHAR address5[] = "255.255.255.255:65535";
1430     CHAR address6[] = "::1";
1431     CHAR address7[] = "[::1]";
1432     CHAR address8[] = "[::1]:65535";
1433
1434     len = 0;
1435     sockaddr.sin_family = AF_INET;
1436
1437     ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1438     ok( ret == SOCKET_ERROR, "WSAStringToAddressA() succeeded unexpectedly: %d\n",
1439         WSAGetLastError() );
1440
1441     len = sizeof(sockaddr);
1442     sockaddr.sin_port = 0;
1443     sockaddr.sin_addr.s_addr = 0;
1444
1445     ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1446     ok( !ret && sockaddr.sin_addr.s_addr == 0,
1447         "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
1448
1449     len = sizeof(sockaddr);
1450     sockaddr.sin_port = 0;
1451     sockaddr.sin_addr.s_addr = 0;
1452
1453     ret = WSAStringToAddressA( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1454     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
1455         "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
1456
1457     len = sizeof(sockaddr);
1458     sockaddr.sin_port = 0;
1459     sockaddr.sin_addr.s_addr = 0;
1460
1461     ret = WSAStringToAddressA( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1462     GLE = WSAGetLastError();
1463     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || 
1464         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1465         "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
1466
1467     len = sizeof(sockaddr);
1468     sockaddr.sin_port = 0;
1469     sockaddr.sin_addr.s_addr = 0;
1470
1471     ret = WSAStringToAddressA( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1472     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
1473         "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
1474
1475     len = sizeof(sockaddr);
1476     sockaddr.sin_port = 0;
1477     sockaddr.sin_addr.s_addr = 0;
1478
1479     ret = WSAStringToAddressA( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1480     GLE = WSAGetLastError();
1481     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || 
1482         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1483         "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
1484
1485     len = sizeof(sockaddr6);
1486     memset(&sockaddr6, 0, len);
1487     sockaddr6.sin6_family = AF_INET6;
1488
1489     ret = WSAStringToAddressA( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1490             &len );
1491     GLE = WSAGetLastError();
1492     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1493         "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
1494
1495     len = sizeof(sockaddr6);
1496     memset(&sockaddr6, 0, len);
1497     sockaddr6.sin6_family = AF_INET6;
1498
1499     ret = WSAStringToAddressA( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1500             &len );
1501     GLE = WSAGetLastError();
1502     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1503         "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
1504
1505     len = sizeof(sockaddr6);
1506     memset(&sockaddr6, 0, len);
1507     sockaddr6.sin6_family = AF_INET6;
1508
1509     ret = WSAStringToAddressA( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1510             &len );
1511     GLE = WSAGetLastError();
1512     ok( (ret == 0 && sockaddr6.sin6_port == 0xffff) ||
1513         (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1514         "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
1515
1516 }
1517
1518 static void test_WSAStringToAddressW(void)
1519 {
1520     INT ret, len;
1521     SOCKADDR_IN sockaddr;
1522     SOCKADDR_IN6 sockaddr6;
1523     int GLE;
1524
1525     WCHAR address1[] = { '0','.','0','.','0','.','0', 0 };
1526     WCHAR address2[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 };
1527     WCHAR address3[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
1528     WCHAR address4[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7',
1529                          ':', '6', '5', '5', '3', '5', 0 };
1530     WCHAR address5[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
1531                          '6', '5', '5', '3', '5', 0 };
1532     WCHAR address6[] = {':',':','1','\0'};
1533     WCHAR address7[] = {'[',':',':','1',']','\0'};
1534     WCHAR address8[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'};
1535
1536     len = 0;
1537     sockaddr.sin_family = AF_INET;
1538
1539     ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1540     ok( ret == SOCKET_ERROR, "WSAStringToAddressW() failed unexpectedly: %d\n",
1541         WSAGetLastError() );
1542
1543     len = sizeof(sockaddr);
1544     sockaddr.sin_port = 0;
1545     sockaddr.sin_addr.s_addr = 0;
1546
1547     ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1548     ok( !ret && sockaddr.sin_addr.s_addr == 0,
1549         "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
1550
1551     len = sizeof(sockaddr);
1552     sockaddr.sin_port = 0;
1553     sockaddr.sin_addr.s_addr = 0;
1554
1555     ret = WSAStringToAddressW( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1556     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
1557         "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
1558
1559     len = sizeof(sockaddr);
1560     sockaddr.sin_port = 0;
1561     sockaddr.sin_addr.s_addr = 0;
1562
1563     ret = WSAStringToAddressW( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1564     GLE = WSAGetLastError();
1565     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || 
1566         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1567         "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
1568
1569     len = sizeof(sockaddr);
1570     sockaddr.sin_port = 0;
1571     sockaddr.sin_addr.s_addr = 0;
1572
1573     ret = WSAStringToAddressW( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1574     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
1575         "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
1576
1577     len = sizeof(sockaddr);
1578     sockaddr.sin_port = 0;
1579     sockaddr.sin_addr.s_addr = 0;
1580
1581     ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1582     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || 
1583         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1584         "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
1585
1586     len = sizeof(sockaddr6);
1587     memset(&sockaddr6, 0, len);
1588     sockaddr6.sin6_family = AF_INET6;
1589
1590     ret = WSAStringToAddressW( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1591             &len );
1592     GLE = WSAGetLastError();
1593     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1594         "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
1595
1596     len = sizeof(sockaddr6);
1597     memset(&sockaddr6, 0, len);
1598     sockaddr6.sin6_family = AF_INET6;
1599
1600     ret = WSAStringToAddressW( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1601             &len );
1602     GLE = WSAGetLastError();
1603     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1604         "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
1605
1606     len = sizeof(sockaddr6);
1607     memset(&sockaddr6, 0, len);
1608     sockaddr6.sin6_family = AF_INET6;
1609
1610     ret = WSAStringToAddressW( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1611             &len );
1612     GLE = WSAGetLastError();
1613     ok( (ret == 0 && sockaddr6.sin6_port == 0xffff) ||
1614         (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1615         "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
1616
1617 }
1618
1619 static VOID WINAPI SelectReadThread(select_thread_params *par)
1620 {
1621     fd_set readfds;
1622     int ret;
1623     struct sockaddr_in addr;
1624     struct timeval select_timeout;
1625
1626     FD_ZERO(&readfds);
1627     FD_SET(par->s, &readfds);
1628     select_timeout.tv_sec=5;
1629     select_timeout.tv_usec=0;
1630     addr.sin_family = AF_INET;
1631     addr.sin_addr.s_addr = inet_addr(SERVERIP);
1632     addr.sin_port = htons(SERVERPORT);
1633
1634     do_bind(par->s, (struct sockaddr *)&addr, sizeof(addr));
1635     wsa_ok(listen(par->s, SOMAXCONN ), 0 ==, "SelectReadThread (%x): listen failed: %d\n");
1636
1637     SetEvent(server_ready);
1638     ret = select(par->s+1, &readfds, NULL, NULL, &select_timeout);
1639     par->ReadKilled = (ret == 1);
1640 }
1641
1642 static void test_select(void)
1643 {
1644     SOCKET fdRead, fdWrite;
1645     fd_set readfds, writefds, exceptfds;
1646     unsigned int maxfd;
1647     int ret;
1648     struct timeval select_timeout;
1649     select_thread_params thread_params;
1650     HANDLE thread_handle;
1651     DWORD id;
1652
1653     fdRead = socket(AF_INET, SOCK_STREAM, 0);
1654     ok( (fdRead != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
1655     fdWrite = socket(AF_INET, SOCK_STREAM, 0);
1656     ok( (fdWrite != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
1657  
1658     FD_ZERO(&readfds);
1659     FD_ZERO(&writefds);
1660     FD_ZERO(&exceptfds);
1661     FD_SET(fdRead, &readfds);
1662     FD_SET(fdWrite, &writefds);
1663     FD_SET(fdRead, &exceptfds);
1664     FD_SET(fdWrite, &exceptfds);
1665     select_timeout.tv_sec=0;
1666     select_timeout.tv_usec=500;
1667
1668     maxfd = fdRead;
1669     if (fdWrite > maxfd)
1670         maxfd = fdWrite;
1671        
1672     todo_wine {
1673     ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
1674     ok ( (ret == 0), "select should not return any socket handles\n");
1675     ok ( !FD_ISSET(fdRead, &readfds), "FD should not be set\n");
1676     ok ( !FD_ISSET(fdWrite, &writefds), "FD should not be set\n");
1677     }
1678
1679     ok ( !FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
1680     ok ( !FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n");
1681  
1682     todo_wine {
1683     ok ((listen(fdWrite, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
1684     }
1685     ret = closesocket(fdWrite);
1686     ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
1687
1688     thread_params.s = fdRead;
1689     thread_params.ReadKilled = FALSE;
1690     server_ready = CreateEventA(NULL, TRUE, FALSE, NULL);
1691     thread_handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) &SelectReadThread, &thread_params, 0, &id );
1692     ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError());
1693
1694     WaitForSingleObject (server_ready, INFINITE);
1695     Sleep(200);
1696     ret = closesocket(fdRead);
1697     ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
1698
1699     WaitForSingleObject (thread_handle, 1000);
1700     ok ( (thread_params.ReadKilled) ||
1701          broken(thread_params.ReadKilled == 0), /*Win98*/
1702             "closesocket did not wakeup select\n");
1703
1704 }
1705
1706 static DWORD WINAPI AcceptKillThread(select_thread_params *par)
1707 {
1708     struct sockaddr_in address;
1709     int len = sizeof(address);
1710     SOCKET client_socket;
1711
1712     SetEvent(server_ready);
1713     client_socket = accept(par->s, (struct sockaddr*) &address, &len);
1714     if (client_socket != INVALID_SOCKET)
1715         closesocket(client_socket);
1716     par->ReadKilled = (client_socket == INVALID_SOCKET);
1717     return 0;
1718 }
1719
1720 static void test_accept(void)
1721 {
1722     int ret;
1723     SOCKET server_socket = INVALID_SOCKET;
1724     struct sockaddr_in address;
1725     select_thread_params thread_params;
1726     HANDLE thread_handle = NULL;
1727     DWORD id;
1728
1729     server_socket = socket(AF_INET, SOCK_STREAM, 0);
1730     if (server_socket == INVALID_SOCKET)
1731     {
1732         trace("error creating server socket: %d\n", WSAGetLastError());
1733         goto done;
1734     }
1735
1736     memset(&address, 0, sizeof(address));
1737     address.sin_family = AF_INET;
1738     ret = bind(server_socket, (struct sockaddr*) &address, sizeof(address));
1739     if (ret != 0)
1740     {
1741         trace("error binding server socket: %d\n", WSAGetLastError());
1742         goto done;
1743     }
1744
1745     ret = listen(server_socket, 1);
1746     if (ret != 0)
1747     {
1748         trace("error making server socket listen: %d\n", WSAGetLastError());
1749         goto done;
1750     }
1751
1752     server_ready = CreateEventA(NULL, TRUE, FALSE, NULL);
1753     if (server_ready == INVALID_HANDLE_VALUE)
1754     {
1755         trace("error creating event: %d\n", GetLastError());
1756         goto done;
1757     }
1758
1759     thread_params.s = server_socket;
1760     thread_params.ReadKilled = FALSE;
1761     thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) AcceptKillThread,
1762         &thread_params, 0, &id);
1763     if (thread_handle == NULL)
1764     {
1765         trace("error creating thread: %d\n", GetLastError());
1766         goto done;
1767     }
1768
1769     WaitForSingleObject(server_ready, INFINITE);
1770     Sleep(200);
1771     ret = closesocket(server_socket);
1772     if (ret != 0)
1773     {
1774         trace("closesocket failed: %d\n", WSAGetLastError());
1775         goto done;
1776     }
1777
1778     WaitForSingleObject(thread_handle, 1000);
1779     ok(thread_params.ReadKilled, "closesocket did not wakeup accept\n");
1780
1781 done:
1782     if (thread_handle != NULL)
1783         CloseHandle(thread_handle);
1784     if (server_ready != INVALID_HANDLE_VALUE)
1785         CloseHandle(server_ready);
1786     if (server_socket != INVALID_SOCKET)
1787         closesocket(server_socket);
1788 }
1789
1790 static void test_extendedSocketOptions(void)
1791 {
1792     WSADATA wsa;
1793     SOCKET sock;
1794     struct sockaddr_in sa;
1795     int sa_len = sizeof(struct sockaddr_in);
1796     int optval, optlen = sizeof(int), ret;
1797     BOOL bool_opt_val;
1798     LINGER linger_val;
1799
1800     if(WSAStartup(MAKEWORD(2,0), &wsa)){
1801         trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
1802         return;
1803     }
1804
1805     memset(&sa, 0, sa_len);
1806
1807     sa.sin_family = AF_INET;
1808     sa.sin_port = htons(0);
1809     sa.sin_addr.s_addr = htonl(INADDR_ANY);
1810
1811     if((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == INVALID_SOCKET) {
1812         trace("Creating the socket failed: %d\n", WSAGetLastError());
1813         WSACleanup();
1814         return;
1815     }
1816
1817     if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
1818         trace("Failed to bind socket: %d\n", WSAGetLastError());
1819         closesocket(sock);
1820         WSACleanup();
1821         return;
1822     }
1823
1824     ret = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
1825
1826     ok(ret == 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret);
1827     ok((optval == 65507) || (optval == 65527),
1828             "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval);
1829
1830     optlen = sizeof(LINGER);
1831     ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
1832     todo_wine{
1833     ok(ret == SOCKET_ERROR, "getsockopt should fail for UDP sockets but return value is 0x%08x\n", ret);
1834     }
1835
1836     closesocket(sock);
1837
1838     if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
1839         trace("Creating the socket failed: %d\n", WSAGetLastError());
1840         WSACleanup();
1841         return;
1842     }
1843
1844     if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
1845         trace("Failed to bind socket: %d\n", WSAGetLastError());
1846         closesocket(sock);
1847         WSACleanup();
1848         return;
1849     }
1850
1851     ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
1852     ok(ret == 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret);
1853
1854     optlen = sizeof(BOOL);
1855     ret = getsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (char *)&bool_opt_val, &optlen);
1856     ok(ret == 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret);
1857     ok((linger_val.l_onoff && !bool_opt_val) || (!linger_val.l_onoff && bool_opt_val),
1858             "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
1859             bool_opt_val, linger_val.l_onoff);
1860
1861     closesocket(sock);
1862     WSACleanup();
1863 }
1864
1865 static void test_getsockname(void)
1866 {
1867     WSADATA wsa;
1868     SOCKET sock;
1869     struct sockaddr_in sa_set, sa_get;
1870     int sa_set_len = sizeof(struct sockaddr_in);
1871     int sa_get_len = sa_set_len;
1872     static const unsigned char null_padding[] = {0,0,0,0,0,0,0,0};
1873     int ret;
1874
1875     if(WSAStartup(MAKEWORD(2,0), &wsa)){
1876         trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
1877         return;
1878     }
1879
1880     memset(&sa_set, 0, sa_set_len);
1881
1882     sa_set.sin_family = AF_INET;
1883     sa_set.sin_port = htons(0);
1884     sa_set.sin_addr.s_addr = htonl(INADDR_ANY);
1885
1886     if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
1887         trace("Creating the socket failed: %d\n", WSAGetLastError());
1888         WSACleanup();
1889         return;
1890     }
1891
1892     memcpy(&sa_get, &sa_set, sizeof(sa_set));
1893     if (getsockname(sock, (struct sockaddr*) &sa_get, &sa_get_len) == 0)
1894         ok(0, "getsockname on unbound socket should fail\n");
1895     else {
1896         ok(WSAGetLastError() == WSAEINVAL, "getsockname on unbound socket "
1897             "failed with %d, expected %d\n", WSAGetLastError(), WSAEINVAL);
1898         ok(memcmp(&sa_get, &sa_set, sizeof(sa_get)) == 0,
1899             "failed getsockname modified sockaddr when it shouldn't\n");
1900     }
1901
1902     if(bind(sock, (struct sockaddr *) &sa_set, sa_set_len) < 0){
1903         trace("Failed to bind socket: %d\n", WSAGetLastError());
1904         closesocket(sock);
1905         WSACleanup();
1906         return;
1907     }
1908
1909     if(getsockname(sock, (struct sockaddr *) &sa_get, &sa_get_len) != 0){
1910         trace("Failed to call getsockname: %d\n", WSAGetLastError());
1911         closesocket(sock);
1912         WSACleanup();
1913         return;
1914     }
1915
1916     ret = memcmp(sa_get.sin_zero, null_padding, 8);
1917     ok(ret == 0 || broken(ret != 0), /* NT4 */
1918             "getsockname did not zero the sockaddr_in structure\n");
1919
1920     closesocket(sock);
1921     WSACleanup();
1922 }
1923
1924 static void test_dns(void)
1925 {
1926     struct hostent *h;
1927
1928     h = gethostbyname("");
1929     ok(h != NULL, "gethostbyname(\"\") failed with %d\n", h_errno);
1930 }
1931
1932 /* Our winsock headers don't define gethostname because it conflicts with the
1933  * definition in unistd.h. Define it here to get rid of the warning. */
1934
1935 int WINAPI gethostname(char *name, int namelen);
1936
1937 static void test_gethostbyname_hack(void)
1938 {
1939     struct hostent *he;
1940     char name[256];
1941     static BYTE loopback[] = {127, 0, 0, 1};
1942     static BYTE magic_loopback[] = {127, 12, 34, 56};
1943     int ret;
1944
1945     ret = gethostname(name, 256);
1946     ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
1947
1948     he = gethostbyname("localhost");
1949     ok(he != NULL, "gethostbyname(\"localhost\") failed: %d\n", h_errno);
1950     if(he)
1951     {
1952         if(he->h_length != 4)
1953         {
1954             skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
1955             return;
1956         }
1957
1958         ok(memcmp(he->h_addr_list[0], loopback, he->h_length) == 0,
1959            "gethostbyname(\"localhost\") returned %d.%d.%d.%d\n",
1960            he->h_addr_list[0][0], he->h_addr_list[0][1], he->h_addr_list[0][2],
1961            he->h_addr_list[0][3]);
1962     }
1963
1964     /* No reason to test further with NULL hostname */
1965     if(name == NULL)
1966         return;
1967
1968     if(strcmp(name, "localhost") == 0)
1969     {
1970         skip("hostname seems to be \"localhost\", skipping test.\n");
1971         return;
1972     }
1973
1974     he = NULL;
1975     he = gethostbyname(name);
1976     ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, h_errno);
1977     if(he)
1978     {
1979         if(he->h_length != 4)
1980         {
1981             skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
1982             return;
1983         }
1984
1985         if (he->h_addr_list[0][0] == 127)
1986         {
1987             ok(memcmp(he->h_addr_list[0], magic_loopback, he->h_length) == 0,
1988                "gethostbyname(\"%s\") returned %d.%d.%d.%d not 127.12.34.56\n",
1989                name, he->h_addr_list[0][0], he->h_addr_list[0][1],
1990                he->h_addr_list[0][2], he->h_addr_list[0][3]);
1991         }
1992     }
1993
1994     he = NULL;
1995     he = gethostbyname("nonexistent.winehq.org");
1996     /* Don't check for the return value, as some braindead ISPs will kindly
1997      * resolve nonexistent host names to addresses of the ISP's spam pages. */
1998 }
1999
2000 static void test_inet_addr(void)
2001 {
2002     u_long addr;
2003
2004     addr = inet_addr(NULL);
2005     ok(addr == INADDR_NONE, "inet_addr succeeded unexpectedly\n");
2006 }
2007
2008 static void test_addr_to_print(void)
2009 {
2010     char dst[16];
2011     char dst6[64];
2012     const char * pdst;
2013     struct in_addr in;
2014     struct in6_addr in6;
2015
2016     u_long addr0_Num = 0x00000000;
2017     PCSTR addr0_Str = "0.0.0.0";
2018     u_long addr1_Num = 0x20201015;
2019     PCSTR addr1_Str = "21.16.32.32";
2020     u_char addr2_Num[16] = {0,0,0,0,0,0,0,0,0,0,0xff,0xfe,0xcC,0x98,0xbd,0x74};
2021     PCSTR addr2_Str = "::fffe:cc98:bd74";
2022     u_char addr3_Num[16] = {0x20,0x30,0xa4,0xb1};
2023     PCSTR addr3_Str = "2030:a4b1::";
2024
2025     in.s_addr = addr0_Num;
2026
2027     pdst = inet_ntoa(*((struct in_addr*)&in.s_addr));
2028     ok(pdst != NULL, "inet_ntoa failed %s\n", dst);
2029     ok(!strcmp(pdst, addr0_Str),"Address %s != %s\n", pdst, addr0_Str);
2030
2031     /* Test that inet_ntoa and inet_ntop return the same value */
2032     in.S_un.S_addr = addr1_Num;
2033     pdst = inet_ntoa(*((struct in_addr*)&in.s_addr));
2034     ok(pdst != NULL, "inet_ntoa failed %s\n", dst);
2035     ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
2036
2037     /* InetNtop became available in Vista and Win2008 */
2038     if (!pInetNtop)
2039     {
2040         win_skip("InetNtop not present, not executing tests\n");
2041         return;
2042     }
2043
2044     pdst = pInetNtop(AF_INET,(void*)&in.s_addr, dst, sizeof(dst));
2045     ok(pdst != NULL, "InetNtop failed %s\n", dst);
2046     ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
2047
2048     /* Test invalid parm conditions */
2049     pdst = pInetNtop(1, (void*)&in.s_addr, dst, sizeof(dst));
2050     ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
2051     ok(WSAGetLastError() == WSAEAFNOSUPPORT, "Should be WSAEAFNOSUPPORT\n");
2052
2053     /* Test an zero prefixed IPV6 address */
2054     memcpy(in6.u.Byte, addr2_Num, sizeof(addr2_Num));
2055     pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6));
2056     ok(pdst != NULL, "InetNtop failed %s\n", dst6);
2057     ok(!strcmp(pdst, addr2_Str),"Address %s != %s\n", pdst, addr2_Str);
2058
2059     /* Test an zero suffixed IPV6 address */
2060     memcpy(in6.s6_addr, addr3_Num, sizeof(addr3_Num));
2061     pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6));
2062     ok(pdst != NULL, "InetNtop failed %s\n", dst6);
2063     ok(!strcmp(pdst, addr3_Str),"Address %s != %s\n", pdst, addr3_Str);
2064 }
2065
2066 static void test_ioctlsocket(void)
2067 {
2068     SOCKET sock;
2069     int ret;
2070     static const LONG cmds[] = {FIONBIO, FIONREAD, SIOCATMARK};
2071     UINT i;
2072
2073     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2074     ok(sock != INVALID_SOCKET, "Creating the socket failed: %d\n", WSAGetLastError());
2075     if(sock == INVALID_SOCKET)
2076     {
2077         skip("Can't continue without a socket.\n");
2078         return;
2079     }
2080
2081     for(i = 0; i < sizeof(cmds)/sizeof(cmds[0]); i++)
2082     {
2083         /* broken apps like defcon pass the argp value directly instead of a pointer to it */
2084         ret = ioctlsocket(sock, cmds[i], (u_long *)1);
2085         ok(ret == SOCKET_ERROR, "ioctlsocket succeeded unexpectedly\n");
2086         ret = WSAGetLastError();
2087         ok(ret == WSAEFAULT, "expected WSAEFAULT, got %d instead\n", ret);
2088     }
2089 }
2090
2091 static int drain_pause=0;
2092 static DWORD WINAPI drain_socket_thread(LPVOID arg)
2093 {
2094     char buffer[1024];
2095     SOCKET sock = *(SOCKET*)arg;
2096     int ret;
2097
2098     while ((ret = recv(sock, buffer, sizeof(buffer), 0)) != 0)
2099     {
2100         if (ret < 0)
2101         {
2102             if (WSAGetLastError() == WSAEWOULDBLOCK)
2103             {
2104                 fd_set readset;
2105                 FD_ZERO(&readset);
2106                 FD_SET(sock, &readset);
2107                 select(0, &readset, NULL, NULL, NULL);
2108                 while (drain_pause)
2109                     Sleep(100);
2110             }
2111             else
2112                 break;
2113         }
2114     }
2115     return 0;
2116 }
2117
2118 static void test_send(void)
2119 {
2120     SOCKET src = INVALID_SOCKET;
2121     SOCKET dst = INVALID_SOCKET;
2122     HANDLE hThread = NULL;
2123     const int buflen = 1024*1024;
2124     char *buffer = NULL;
2125     int ret;
2126     DWORD id;
2127
2128     if (tcp_socketpair(&src, &dst) != 0)
2129     {
2130         ok(0, "creating socket pair failed, skipping test\n");
2131         return;
2132     }
2133
2134     hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
2135     if (hThread == NULL)
2136     {
2137         ok(0, "CreateThread failed, error %d\n", GetLastError());
2138         goto end;
2139     }
2140
2141     buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen);
2142     if (buffer == NULL)
2143     {
2144         ok(0, "HeapAlloc failed, error %d\n", GetLastError());
2145         goto end;
2146     }
2147
2148     ret = send(src, buffer, buflen, 0);
2149     if (ret >= 0)
2150         ok(ret == buflen, "send should have sent %d bytes, but it only sent %d\n", buflen, ret);
2151     else
2152         ok(0, "send failed, error %d\n", WSAGetLastError());
2153
2154 end:
2155     if (src != INVALID_SOCKET)
2156         closesocket(src);
2157     if (dst != INVALID_SOCKET)
2158         closesocket(dst);
2159     if (hThread != NULL)
2160         CloseHandle(hThread);
2161     HeapFree(GetProcessHeap(), 0, buffer);
2162 }
2163
2164 static void test_write_events(void)
2165 {
2166     SOCKET src = INVALID_SOCKET;
2167     SOCKET dst = INVALID_SOCKET;
2168     HANDLE hThread = NULL;
2169     HANDLE hEvent = INVALID_HANDLE_VALUE;
2170     char *buffer = NULL;
2171     int bufferSize = 1024*1024;
2172     u_long one = 1;
2173     int ret;
2174     DWORD id;
2175     WSANETWORKEVENTS netEvents;
2176     DWORD dwRet;
2177
2178     if (tcp_socketpair(&src, &dst) != 0)
2179     {
2180         ok(0, "creating socket pair failed, skipping test\n");
2181         return;
2182     }
2183
2184     /* On Windows it seems when a non-blocking socket sends to a
2185        blocking socket on the same host, the send() is BLOCKING,
2186        so make both sockets non-blocking */
2187     ret = ioctlsocket(src, FIONBIO, &one);
2188     if (ret)
2189     {
2190         ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError());
2191         goto end;
2192     }
2193     ret = ioctlsocket(dst, FIONBIO, &one);
2194     if (ret)
2195     {
2196         ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError());
2197         goto end;
2198     }
2199
2200     buffer = HeapAlloc(GetProcessHeap(), 0, bufferSize);
2201     if (buffer == NULL)
2202     {
2203         ok(0, "could not allocate memory for test\n");
2204         goto end;
2205     }
2206
2207     hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
2208     if (hThread == NULL)
2209     {
2210         ok(0, "CreateThread failed, error %d\n", GetLastError());
2211         goto end;
2212     }
2213
2214     hEvent = CreateEventA(NULL, FALSE, TRUE, NULL);
2215     if (hEvent == INVALID_HANDLE_VALUE)
2216     {
2217         ok(0, "CreateEventA failed, error %d\n", GetLastError());
2218         goto end;
2219     }
2220
2221     ret = WSAEventSelect(src, hEvent, FD_WRITE | FD_CLOSE);
2222     if (ret)
2223     {
2224         ok(0, "WSAEventSelect failed, error %d\n", ret);
2225         goto end;
2226     }
2227
2228     /* FD_WRITE should be set initially, and allow us to send at least 1 byte */
2229     dwRet = WaitForSingleObject(hEvent, 5000);
2230     if (dwRet != WAIT_OBJECT_0)
2231     {
2232         ok(0, "Initial WaitForSingleObject failed, error %d\n", dwRet);
2233         goto end;
2234     }
2235     ret = WSAEnumNetworkEvents(src, NULL, &netEvents);
2236     if (ret)
2237     {
2238         ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret);
2239         goto end;
2240     }
2241     if (netEvents.lNetworkEvents & FD_WRITE)
2242     {
2243         ret = send(src, "a", 1, 0);
2244         ok(ret == 1, "sending 1 byte failed, error %d\n", WSAGetLastError());
2245         if (ret != 1)
2246             goto end;
2247     }
2248     else
2249     {
2250         ok(0, "FD_WRITE not among initial events\n");
2251         goto end;
2252     }
2253
2254     /* Now FD_WRITE should not be set, because the socket send buffer isn't full yet */
2255     dwRet = WaitForSingleObject(hEvent, 2000);
2256     if (dwRet == WAIT_OBJECT_0)
2257     {
2258         ok(0, "WaitForSingleObject should have timed out, but succeeded!\n");
2259         goto end;
2260     }
2261
2262     /* Now if we send a ton of data and the 'server' does not drain it fast
2263      * enough (set drain_pause to be sure), the socket send buffer will only
2264      * take some of it, and we will get a short write. This will trigger
2265      * another FD_WRITE event as soon as data is sent and more space becomes
2266      * available, but not any earlier. */
2267     drain_pause=1;
2268     do
2269     {
2270         ret = send(src, buffer, bufferSize, 0);
2271     } while (ret == bufferSize);
2272     drain_pause=0;
2273     if (ret >= 0 || WSAGetLastError() == WSAEWOULDBLOCK)
2274     {
2275         dwRet = WaitForSingleObject(hEvent, 5000);
2276         ok(dwRet == WAIT_OBJECT_0, "Waiting failed with %d\n", dwRet);
2277         if (dwRet == WAIT_OBJECT_0)
2278         {
2279             ret = WSAEnumNetworkEvents(src, NULL, &netEvents);
2280             ok(ret == 0, "WSAEnumNetworkEvents failed, error %d\n", ret);
2281             if (ret == 0)
2282                 goto end;
2283             ok(netEvents.lNetworkEvents & FD_WRITE,
2284                 "FD_WRITE event not set as expected, events are 0x%x\n", netEvents.lNetworkEvents);
2285         }
2286         else
2287             goto end;
2288     }
2289     else
2290     {
2291         ok(0, "sending a lot of data failed with error %d\n", WSAGetLastError());
2292         goto end;
2293     }
2294
2295 end:
2296     HeapFree(GetProcessHeap(), 0, buffer);
2297     if (src != INVALID_SOCKET)
2298         closesocket(src);
2299     if (dst != INVALID_SOCKET)
2300         closesocket(dst);
2301     if (hThread != NULL)
2302         CloseHandle(hThread);
2303     CloseHandle(hEvent);
2304 }
2305
2306 static void test_ipv6only(void)
2307 {
2308     SOCKET v4 = INVALID_SOCKET,
2309            v6 = INVALID_SOCKET;
2310     struct sockaddr_in sin4;
2311     struct sockaddr_in6 sin6;
2312     int ret;
2313
2314     memset(&sin4, 0, sizeof(sin4));
2315     sin4.sin_family = AF_INET;
2316     sin4.sin_port = htons(SERVERPORT);
2317
2318     memset(&sin6, 0, sizeof(sin6));
2319     sin6.sin6_family = AF_INET6;
2320     sin6.sin6_port = htons(SERVERPORT);
2321
2322     v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
2323     if (v6 == INVALID_SOCKET) {
2324         skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
2325             WSAGetLastError(), WSAEAFNOSUPPORT);
2326         goto end;
2327     }
2328     ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6));
2329     if (ret) {
2330         skip("Could not bind IPv6 address (LastError: %d).\n",
2331             WSAGetLastError());
2332         goto end;
2333     }
2334
2335     v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2336     if (v4 == INVALID_SOCKET) {
2337         skip("Could not create IPv4 socket (LastError: %d).\n",
2338             WSAGetLastError());
2339         goto end;
2340     }
2341     ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4));
2342     ok(!ret, "Could not bind IPv4 address (LastError: %d; %d expected if IPv6 binds to IPv4 as well).\n",
2343         WSAGetLastError(), WSAEADDRINUSE);
2344
2345 end:
2346     if (v4 != INVALID_SOCKET)
2347         closesocket(v4);
2348     if (v6 != INVALID_SOCKET)
2349         closesocket(v6);
2350 }
2351
2352 static void test_WSASendTo(void)
2353 {
2354     SOCKET s;
2355     struct sockaddr_in addr;
2356     char buf[12] = "hello world";
2357     WSABUF data_buf;
2358     DWORD bytesSent;
2359
2360     addr.sin_family = AF_INET;
2361     addr.sin_port = htons(139);
2362     addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2363     data_buf.len = sizeof(buf);
2364     data_buf.buf = buf;
2365
2366     if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) {
2367         ok(0, "socket() failed error: %d\n", WSAGetLastError());
2368         return;
2369     }
2370
2371     WSASetLastError(12345);
2372     if(WSASendTo(s, &data_buf, 1, &bytesSent, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL)) {
2373         ok(0, "WSASendTo() failed error: %d\n", WSAGetLastError());
2374         return;
2375     }
2376     ok(!WSAGetLastError(), "WSAGetLastError() should return zero after "
2377             "a successful call to WSASendTo()\n");
2378 }
2379
2380 static void test_GetAddrInfoW(void)
2381 {
2382     static const WCHAR port[] = {'8','0',0};
2383     static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
2384
2385     int ret;
2386     ADDRINFOW *result, hint;
2387
2388     if (!pGetAddrInfoW || !pFreeAddrInfoW)
2389     {
2390         win_skip("GetAddrInfoW and/or FreeAddrInfoW not present\n");
2391         return;
2392     }
2393
2394     memset(&hint, 0, sizeof(ADDRINFOW));
2395
2396     ret = pGetAddrInfoW(NULL, NULL, NULL, &result);
2397     ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
2398
2399     ret = pGetAddrInfoW(localhost, NULL, NULL, &result);
2400     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
2401     pFreeAddrInfoW(result);
2402
2403     ret = pGetAddrInfoW(localhost, port, NULL, &result);
2404     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
2405     pFreeAddrInfoW(result);
2406
2407     ret = pGetAddrInfoW(localhost, port, &hint, &result);
2408     ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
2409     pFreeAddrInfoW(result);
2410 }
2411
2412 /**************** Main program  ***************/
2413
2414 START_TEST( sock )
2415 {
2416     int i;
2417     Init();
2418
2419     test_set_getsockopt();
2420     test_so_reuseaddr();
2421     test_extendedSocketOptions();
2422
2423     for (i = 0; i < NUM_TESTS; i++)
2424     {
2425         trace ( " **** STARTING TEST %d ****\n", i );
2426         do_test (  &tests[i] );
2427         trace ( " **** TEST %d COMPLETE ****\n", i );
2428     }
2429
2430     test_UDP();
2431
2432     test_getservbyname();
2433     test_WSASocket();
2434
2435     test_WSAAddressToStringA();
2436     test_WSAAddressToStringW();
2437
2438     test_WSAStringToAddressA();
2439     test_WSAStringToAddressW();
2440
2441     test_select();
2442     test_accept();
2443     test_getsockname();
2444     test_inet_addr();
2445     test_addr_to_print();
2446     test_ioctlsocket();
2447     test_dns();
2448     test_gethostbyname_hack();
2449
2450     test_send();
2451     test_write_events();
2452
2453     test_WSASendTo();
2454
2455     test_ipv6only();
2456     test_GetAddrInfoW();
2457
2458     Exit();
2459 }