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