quartz: Make dwSamplesProcessed a longlong.
[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_WSAAddressToStringA(void)
1119 {
1120     INT ret;
1121     DWORD len;
1122     int GLE;
1123     SOCKADDR_IN sockaddr;
1124     CHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
1125
1126     CHAR expect1[] = "0.0.0.0";
1127     CHAR expect2[] = "255.255.255.255";
1128     CHAR expect3[] = "0.0.0.0:65535";
1129     CHAR expect4[] = "255.255.255.255:65535";
1130
1131     len = 0;
1132
1133     sockaddr.sin_family = AF_INET;
1134     sockaddr.sin_port = 0;
1135     sockaddr.sin_addr.s_addr = 0;
1136
1137     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1138     GLE = WSAGetLastError();
1139     ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0), 
1140         "WSAAddressToStringA() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
1141         GLE, ret );
1142
1143     len = sizeof(address);
1144
1145     sockaddr.sin_family = AF_INET;
1146     sockaddr.sin_port = 0;
1147     sockaddr.sin_addr.s_addr = 0;
1148
1149     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1150     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1151
1152     ok( !strcmp( address, expect1 ), "Expected: %s, got: %s\n", expect1, address );
1153
1154     len = sizeof(address);
1155
1156     sockaddr.sin_family = AF_INET;
1157     sockaddr.sin_port = 0;
1158     sockaddr.sin_addr.s_addr = 0xffffffff;
1159
1160     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1161     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1162
1163     ok( !strcmp( address, expect2 ), "Expected: %s, got: %s\n", expect2, address );
1164
1165     len = sizeof(address);
1166
1167     sockaddr.sin_family = AF_INET;
1168     sockaddr.sin_port = 0xffff;
1169     sockaddr.sin_addr.s_addr = 0;
1170
1171     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1172     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1173
1174     ok( !strcmp( address, expect3 ), "Expected: %s, got: %s\n", expect3, address );
1175
1176     len = sizeof(address);
1177
1178     sockaddr.sin_family = AF_INET;
1179     sockaddr.sin_port = 0xffff;
1180     sockaddr.sin_addr.s_addr = 0xffffffff;
1181
1182     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1183     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
1184
1185     ok( !strcmp( address, expect4 ), "Expected: %s, got: %s\n", expect4, address );
1186 }
1187
1188 static void test_WSAAddressToStringW(void)
1189 {
1190     INT ret;
1191     DWORD len;
1192     int GLE;
1193     SOCKADDR_IN sockaddr;
1194     WCHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
1195
1196     WCHAR expect1[] = { '0','.','0','.','0','.','0', 0 };
1197     WCHAR expect2[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
1198     WCHAR expect3[] = { '0','.','0','.','0','.','0', ':', '6', '5', '5', '3', '5', 0 };
1199     WCHAR expect4[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
1200                         '6', '5', '5', '3', '5', 0 };
1201
1202     len = 0;
1203
1204     sockaddr.sin_family = AF_INET;
1205     sockaddr.sin_port = 0;
1206     sockaddr.sin_addr.s_addr = 0;
1207
1208     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1209     GLE = WSAGetLastError();
1210     ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0), 
1211         "WSAAddressToStringW() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
1212         GLE, ret );
1213
1214     len = sizeof(address);
1215
1216     sockaddr.sin_family = AF_INET;
1217     sockaddr.sin_port = 0;
1218     sockaddr.sin_addr.s_addr = 0;
1219
1220     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1221     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1222
1223     ok( !lstrcmpW( address, expect1 ), "Expected different address string\n" );
1224
1225     len = sizeof(address);
1226
1227     sockaddr.sin_family = AF_INET;
1228     sockaddr.sin_port = 0;
1229     sockaddr.sin_addr.s_addr = 0xffffffff;
1230
1231     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1232     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1233
1234     ok( !lstrcmpW( address, expect2 ), "Expected different address string\n" );
1235
1236     len = sizeof(address);
1237
1238     sockaddr.sin_family = AF_INET;
1239     sockaddr.sin_port = 0xffff;
1240     sockaddr.sin_addr.s_addr = 0;
1241
1242     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1243     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1244
1245     ok( !lstrcmpW( address, expect3 ), "Expected different address string\n" );
1246
1247     len = sizeof(address);
1248
1249     sockaddr.sin_family = AF_INET;
1250     sockaddr.sin_port = 0xffff;
1251     sockaddr.sin_addr.s_addr = 0xffffffff;
1252
1253     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
1254     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
1255
1256     ok( !lstrcmpW( address, expect4 ), "Expected different address string\n" );
1257 }
1258
1259 static void test_WSAStringToAddressA(void)
1260 {
1261     INT ret, len;
1262     SOCKADDR_IN sockaddr;
1263     SOCKADDR_IN6 sockaddr6;
1264     int GLE;
1265
1266     CHAR address1[] = "0.0.0.0";
1267     CHAR address2[] = "127.127.127.127";
1268     CHAR address3[] = "255.255.255.255";
1269     CHAR address4[] = "127.127.127.127:65535";
1270     CHAR address5[] = "255.255.255.255:65535";
1271     CHAR address6[] = "::1";
1272     CHAR address7[] = "[::1]";
1273     CHAR address8[] = "[::1]:65535";
1274
1275     len = 0;
1276     sockaddr.sin_family = AF_INET;
1277
1278     ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1279     ok( ret == SOCKET_ERROR, "WSAStringToAddressA() succeeded unexpectedly: %d\n",
1280         WSAGetLastError() );
1281
1282     len = sizeof(sockaddr);
1283     sockaddr.sin_port = 0;
1284     sockaddr.sin_addr.s_addr = 0;
1285
1286     ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1287     ok( !ret && sockaddr.sin_addr.s_addr == 0,
1288         "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
1289
1290     len = sizeof(sockaddr);
1291     sockaddr.sin_port = 0;
1292     sockaddr.sin_addr.s_addr = 0;
1293
1294     ret = WSAStringToAddressA( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1295     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
1296         "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
1297
1298     len = sizeof(sockaddr);
1299     sockaddr.sin_port = 0;
1300     sockaddr.sin_addr.s_addr = 0;
1301
1302     ret = WSAStringToAddressA( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1303     GLE = WSAGetLastError();
1304     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || 
1305         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1306         "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
1307
1308     len = sizeof(sockaddr);
1309     sockaddr.sin_port = 0;
1310     sockaddr.sin_addr.s_addr = 0;
1311
1312     ret = WSAStringToAddressA( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1313     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
1314         "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
1315
1316     len = sizeof(sockaddr);
1317     sockaddr.sin_port = 0;
1318     sockaddr.sin_addr.s_addr = 0;
1319
1320     ret = WSAStringToAddressA( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1321     GLE = WSAGetLastError();
1322     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || 
1323         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1324         "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
1325
1326     len = sizeof(sockaddr6);
1327     memset(&sockaddr6, 0, len);
1328     sockaddr6.sin6_family = AF_INET6;
1329
1330     ret = WSAStringToAddressA( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1331             &len );
1332     GLE = WSAGetLastError();
1333     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1334         "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
1335
1336     len = sizeof(sockaddr6);
1337     memset(&sockaddr6, 0, len);
1338     sockaddr6.sin6_family = AF_INET6;
1339
1340     ret = WSAStringToAddressA( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1341             &len );
1342     GLE = WSAGetLastError();
1343     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1344         "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
1345
1346     len = sizeof(sockaddr6);
1347     memset(&sockaddr6, 0, len);
1348     sockaddr6.sin6_family = AF_INET6;
1349
1350     ret = WSAStringToAddressA( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1351             &len );
1352     GLE = WSAGetLastError();
1353     ok( (ret == 0 && sockaddr6.sin6_port == 0xffff) ||
1354         (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1355         "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
1356
1357 }
1358
1359 static void test_WSAStringToAddressW(void)
1360 {
1361     INT ret, len;
1362     SOCKADDR_IN sockaddr;
1363     SOCKADDR_IN6 sockaddr6;
1364     int GLE;
1365
1366     WCHAR address1[] = { '0','.','0','.','0','.','0', 0 };
1367     WCHAR address2[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 };
1368     WCHAR address3[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
1369     WCHAR address4[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7',
1370                          ':', '6', '5', '5', '3', '5', 0 };
1371     WCHAR address5[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
1372                          '6', '5', '5', '3', '5', 0 };
1373     WCHAR address6[] = {':',':','1','\0'};
1374     WCHAR address7[] = {'[',':',':','1',']','\0'};
1375     WCHAR address8[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'};
1376
1377     len = 0;
1378     sockaddr.sin_family = AF_INET;
1379
1380     ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1381     ok( ret == SOCKET_ERROR, "WSAStringToAddressW() failed unexpectedly: %d\n",
1382         WSAGetLastError() );
1383
1384     len = sizeof(sockaddr);
1385     sockaddr.sin_port = 0;
1386     sockaddr.sin_addr.s_addr = 0;
1387
1388     ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1389     ok( !ret && sockaddr.sin_addr.s_addr == 0,
1390         "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
1391
1392     len = sizeof(sockaddr);
1393     sockaddr.sin_port = 0;
1394     sockaddr.sin_addr.s_addr = 0;
1395
1396     ret = WSAStringToAddressW( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1397     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
1398         "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
1399
1400     len = sizeof(sockaddr);
1401     sockaddr.sin_port = 0;
1402     sockaddr.sin_addr.s_addr = 0;
1403
1404     ret = WSAStringToAddressW( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1405     GLE = WSAGetLastError();
1406     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || 
1407         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1408         "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
1409
1410     len = sizeof(sockaddr);
1411     sockaddr.sin_port = 0;
1412     sockaddr.sin_addr.s_addr = 0;
1413
1414     ret = WSAStringToAddressW( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1415     ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
1416         "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
1417
1418     len = sizeof(sockaddr);
1419     sockaddr.sin_port = 0;
1420     sockaddr.sin_addr.s_addr = 0;
1421
1422     ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
1423     ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || 
1424         (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
1425         "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
1426
1427     len = sizeof(sockaddr6);
1428     memset(&sockaddr6, 0, len);
1429     sockaddr6.sin6_family = AF_INET6;
1430
1431     ret = WSAStringToAddressW( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1432             &len );
1433     GLE = WSAGetLastError();
1434     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1435         "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
1436
1437     len = sizeof(sockaddr6);
1438     memset(&sockaddr6, 0, len);
1439     sockaddr6.sin6_family = AF_INET6;
1440
1441     ret = WSAStringToAddressW( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1442             &len );
1443     GLE = WSAGetLastError();
1444     ok( ret == 0 || (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1445         "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
1446
1447     len = sizeof(sockaddr6);
1448     memset(&sockaddr6, 0, len);
1449     sockaddr6.sin6_family = AF_INET6;
1450
1451     ret = WSAStringToAddressW( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
1452             &len );
1453     GLE = WSAGetLastError();
1454     ok( (ret == 0 && sockaddr6.sin6_port == 0xffff) ||
1455         (ret == SOCKET_ERROR && GLE == WSAEINVAL),
1456         "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
1457
1458 }
1459
1460 static VOID WINAPI SelectReadThread(select_thread_params *par)
1461 {
1462     fd_set readfds;
1463     int ret;
1464     struct sockaddr_in addr;
1465     struct timeval select_timeout;
1466
1467     FD_ZERO(&readfds);
1468     FD_SET(par->s, &readfds);
1469     select_timeout.tv_sec=5;
1470     select_timeout.tv_usec=0;
1471     addr.sin_family = AF_INET;
1472     addr.sin_addr.s_addr = inet_addr(SERVERIP);
1473     addr.sin_port = htons(SERVERPORT);
1474
1475     do_bind(par->s, (struct sockaddr *)&addr, sizeof(addr));
1476     wsa_ok(listen(par->s, SOMAXCONN ), 0 ==, "SelectReadThread (%x): listen failed: %d\n");
1477
1478     SetEvent(server_ready);
1479     ret = select(par->s+1, &readfds, NULL, NULL, &select_timeout);
1480     par->ReadKilled = (ret == 1);
1481 }
1482
1483 static void test_select(void)
1484 {
1485     SOCKET fdRead, fdWrite;
1486     fd_set readfds, writefds, exceptfds;
1487     unsigned int maxfd;
1488     int ret;
1489     struct timeval select_timeout;
1490     select_thread_params thread_params;
1491     HANDLE thread_handle;
1492     DWORD id;
1493
1494     fdRead = socket(AF_INET, SOCK_STREAM, 0);
1495     ok( (fdRead != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
1496     fdWrite = socket(AF_INET, SOCK_STREAM, 0);
1497     ok( (fdWrite != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
1498  
1499     FD_ZERO(&readfds);
1500     FD_ZERO(&writefds);
1501     FD_ZERO(&exceptfds);
1502     FD_SET(fdRead, &readfds);
1503     FD_SET(fdWrite, &writefds);
1504     FD_SET(fdRead, &exceptfds);
1505     FD_SET(fdWrite, &exceptfds);
1506     select_timeout.tv_sec=0;
1507     select_timeout.tv_usec=500;
1508
1509     maxfd = fdRead;
1510     if (fdWrite > maxfd)
1511         maxfd = fdWrite;
1512        
1513     todo_wine {
1514     ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
1515     ok ( (ret == 0), "select should not return any socket handles\n");
1516     ok ( !FD_ISSET(fdRead, &readfds), "FD should not be set\n");
1517     ok ( !FD_ISSET(fdWrite, &writefds), "FD should not be set\n");
1518     }
1519
1520     ok ( !FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
1521     ok ( !FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n");
1522  
1523     todo_wine {
1524     ok ((listen(fdWrite, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
1525     }
1526     ret = closesocket(fdWrite);
1527     ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
1528
1529     thread_params.s = fdRead;
1530     thread_params.ReadKilled = FALSE;
1531     server_ready = CreateEventW(NULL, TRUE, FALSE, NULL);
1532     thread_handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) &SelectReadThread, &thread_params, 0, &id );
1533     ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError());
1534
1535     WaitForSingleObject (server_ready, INFINITE);
1536     Sleep(200);
1537     ret = closesocket(fdRead);
1538     ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
1539
1540     WaitForSingleObject (thread_handle, 1000);
1541     ok ( (thread_params.ReadKilled), "closesocket did not wakeup select\n");
1542
1543 }
1544
1545 static DWORD WINAPI AcceptKillThread(select_thread_params *par)
1546 {
1547     struct sockaddr_in address;
1548     int len = sizeof(address);
1549     SOCKET client_socket;
1550
1551     SetEvent(server_ready);
1552     client_socket = accept(par->s, (struct sockaddr*) &address, &len);
1553     if (client_socket != INVALID_SOCKET)
1554         closesocket(client_socket);
1555     par->ReadKilled = (client_socket == INVALID_SOCKET);
1556     return 0;
1557 }
1558
1559 static void test_accept(void)
1560 {
1561     int ret;
1562     SOCKET server_socket = INVALID_SOCKET;
1563     struct sockaddr_in address;
1564     select_thread_params thread_params;
1565     HANDLE thread_handle = NULL;
1566     DWORD id;
1567
1568     server_socket = socket(AF_INET, SOCK_STREAM, 0);
1569     if (server_socket == INVALID_SOCKET)
1570     {
1571         trace("error creating server socket: %d\n", WSAGetLastError());
1572         goto done;
1573     }
1574
1575     memset(&address, 0, sizeof(address));
1576     address.sin_family = AF_INET;
1577     ret = bind(server_socket, (struct sockaddr*) &address, sizeof(address));
1578     if (ret != 0)
1579     {
1580         trace("error binding server socket: %d\n", WSAGetLastError());
1581         goto done;
1582     }
1583
1584     ret = listen(server_socket, 1);
1585     if (ret != 0)
1586     {
1587         trace("error making server socket listen: %d\n", WSAGetLastError());
1588         goto done;
1589     }
1590
1591     server_ready = CreateEventW(NULL, TRUE, FALSE, NULL);
1592     if (server_ready == INVALID_HANDLE_VALUE)
1593     {
1594         trace("error creating event: %d\n", GetLastError());
1595         goto done;
1596     }
1597
1598     thread_params.s = server_socket;
1599     thread_params.ReadKilled = FALSE;
1600     thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) AcceptKillThread,
1601         &thread_params, 0, &id);
1602     if (thread_handle == NULL)
1603     {
1604         trace("error creating thread: %d\n", GetLastError());
1605         goto done;
1606     }
1607
1608     WaitForSingleObject(server_ready, INFINITE);
1609     Sleep(200);
1610     ret = closesocket(server_socket);
1611     if (ret != 0)
1612     {
1613         trace("closesocket failed: %d\n", WSAGetLastError());
1614         goto done;
1615     }
1616
1617     WaitForSingleObject(thread_handle, 1000);
1618     ok(thread_params.ReadKilled, "closesocket did not wakeup accept\n");
1619
1620 done:
1621     if (thread_handle != NULL)
1622         CloseHandle(thread_handle);
1623     if (server_ready != INVALID_HANDLE_VALUE)
1624         CloseHandle(server_ready);
1625     if (server_socket != INVALID_SOCKET)
1626         closesocket(server_socket);
1627 }
1628
1629 static void test_extendedSocketOptions(void)
1630 {
1631     WSADATA wsa;
1632     SOCKET sock;
1633     struct sockaddr_in sa;
1634     int sa_len = sizeof(struct sockaddr_in);
1635     int optval, optlen = sizeof(int), ret;
1636     BOOL bool_opt_val;
1637     LINGER linger_val;
1638
1639     if(WSAStartup(MAKEWORD(2,0), &wsa)){
1640         trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
1641         return;
1642     }
1643
1644     memset(&sa, 0, sa_len);
1645
1646     sa.sin_family = AF_INET;
1647     sa.sin_port = htons(0);
1648     sa.sin_addr.s_addr = htonl(INADDR_ANY);
1649
1650     if((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == INVALID_SOCKET) {
1651         trace("Creating the socket failed: %d\n", WSAGetLastError());
1652         WSACleanup();
1653         return;
1654     }
1655
1656     if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
1657         trace("Failed to bind socket: %d\n", WSAGetLastError());
1658         closesocket(sock);
1659         WSACleanup();
1660         return;
1661     }
1662
1663     ret = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
1664
1665     ok(ret == 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret);
1666     ok(optval == 65507, "SO_MAX_MSG_SIZE reported %d, expected 65507\n", optval);
1667
1668     optlen = sizeof(LINGER);
1669     ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
1670     todo_wine{
1671     ok(ret == SOCKET_ERROR, "getsockopt should fail for UDP sockets but return value is 0x%08x\n", ret);
1672     }
1673
1674     closesocket(sock);
1675
1676     if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
1677         trace("Creating the socket failed: %d\n", WSAGetLastError());
1678         WSACleanup();
1679         return;
1680     }
1681
1682     if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
1683         trace("Failed to bind socket: %d\n", WSAGetLastError());
1684         closesocket(sock);
1685         WSACleanup();
1686         return;
1687     }
1688
1689     ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
1690     ok(ret == 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret);
1691
1692     optlen = sizeof(BOOL);
1693     ret = getsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (char *)&bool_opt_val, &optlen);
1694     ok(ret == 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret);
1695     ok((linger_val.l_onoff && !bool_opt_val) || (!linger_val.l_onoff && bool_opt_val),
1696             "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
1697             bool_opt_val, linger_val.l_onoff);
1698
1699     closesocket(sock);
1700     WSACleanup();
1701 }
1702
1703 static void test_getsockname(void)
1704 {
1705     WSADATA wsa;
1706     SOCKET sock;
1707     struct sockaddr_in sa_set, sa_get;
1708     int sa_set_len = sizeof(struct sockaddr_in);
1709     int sa_get_len = sa_set_len;
1710     static const unsigned char null_padding[] = {0,0,0,0,0,0,0,0};
1711
1712     if(WSAStartup(MAKEWORD(2,0), &wsa)){
1713         trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
1714         return;
1715     }
1716
1717     memset(&sa_set, 0, sa_set_len);
1718
1719     sa_set.sin_family = AF_INET;
1720     sa_set.sin_port = htons(0);
1721     sa_set.sin_addr.s_addr = htonl(INADDR_ANY);
1722
1723     if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
1724         trace("Creating the socket failed: %d\n", WSAGetLastError());
1725         WSACleanup();
1726         return;
1727     }
1728
1729     memcpy(&sa_get, &sa_set, sizeof(sa_set));
1730     if (getsockname(sock, (struct sockaddr*) &sa_get, &sa_get_len) == 0)
1731         ok(0, "getsockname on unbound socket should fail\n");
1732     else {
1733         ok(WSAGetLastError() == WSAEINVAL, "getsockname on unbound socket "
1734             "failed with %d, expected %d\n", WSAGetLastError(), WSAEINVAL);
1735         ok(memcmp(&sa_get, &sa_set, sizeof(sa_get)) == 0,
1736             "failed getsockname modified sockaddr when it shouldn't\n");
1737     }
1738
1739     if(bind(sock, (struct sockaddr *) &sa_set, sa_set_len) < 0){
1740         trace("Failed to bind socket: %d\n", WSAGetLastError());
1741         closesocket(sock);
1742         WSACleanup();
1743         return;
1744     }
1745
1746     if(getsockname(sock, (struct sockaddr *) &sa_get, &sa_get_len) != 0){
1747         trace("Failed to call getsockname: %d\n", WSAGetLastError());
1748         closesocket(sock);
1749         WSACleanup();
1750         return;
1751     }
1752
1753     ok(memcmp(sa_get.sin_zero, null_padding, 8) == 0,
1754             "getsockname did not zero the sockaddr_in structure\n");
1755
1756     closesocket(sock);
1757     WSACleanup();
1758 }
1759
1760 static void test_dns(void)
1761 {
1762     struct hostent *h;
1763
1764     h = gethostbyname("");
1765     ok(h != NULL, "gethostbyname(\"\") failed with %d\n", h_errno);
1766 }
1767
1768 static void test_inet_addr(void)
1769 {
1770     u_long addr;
1771
1772     addr = inet_addr(NULL);
1773     ok(addr == INADDR_NONE, "inet_addr succeeded unexpectedly\n");
1774 }
1775
1776 static DWORD WINAPI drain_socket_thread(LPVOID arg)
1777 {
1778     char buffer[1024];
1779     SOCKET sock = *(SOCKET*)arg;
1780
1781     while (recv(sock, buffer, sizeof(buffer), 0) > 0)
1782         ;
1783     return 0;
1784 }
1785
1786 static void test_send(void)
1787 {
1788     SOCKET src = INVALID_SOCKET;
1789     SOCKET dst = INVALID_SOCKET;
1790     HANDLE hThread = NULL;
1791     const int buflen = 1024*1024;
1792     char *buffer = NULL;
1793     int ret;
1794     DWORD id;
1795
1796     if (tcp_socketpair(&src, &dst) != 0)
1797     {
1798         ok(0, "creating socket pair failed, skipping test\n");
1799         return;
1800     }
1801
1802     hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
1803     if (hThread == NULL)
1804     {
1805         ok(0, "CreateThread failed, error %d\n", GetLastError());
1806         goto end;
1807     }
1808
1809     buffer = HeapAlloc(GetProcessHeap(), 0, buflen);
1810     if (buffer == NULL)
1811     {
1812         ok(0, "HeapAlloc failed, error %d\n", GetLastError());
1813         goto end;
1814     }
1815
1816     ret = send(src, buffer, buflen, 0);
1817     if (ret >= 0)
1818         ok(ret == buflen, "send should have sent %d bytes, but it only sent %d\n", buflen, ret);
1819     else
1820         ok(0, "send failed, error %d\n", WSAGetLastError());
1821
1822 end:
1823     if (src != INVALID_SOCKET)
1824         closesocket(src);
1825     if (dst != INVALID_SOCKET)
1826         closesocket(dst);
1827     if (hThread != NULL)
1828         CloseHandle(hThread);
1829     HeapFree(GetProcessHeap(), 0, buffer);
1830 }
1831
1832 static void test_write_events(void)
1833 {
1834     SOCKET src = INVALID_SOCKET;
1835     SOCKET dst = INVALID_SOCKET;
1836     HANDLE hThread = NULL;
1837     HANDLE hEvent = INVALID_HANDLE_VALUE;
1838     int len;
1839     u_long one = 1;
1840     int ret;
1841     DWORD id;
1842
1843     if (tcp_socketpair(&src, &dst) != 0)
1844     {
1845         ok(0, "creating socket pair failed, skipping test\n");
1846         return;
1847     }
1848
1849     hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
1850     if (hThread == NULL)
1851     {
1852         ok(0, "CreateThread failed, error %d\n", GetLastError());
1853         goto end;
1854     }
1855
1856     hEvent = CreateEventW(NULL, FALSE, TRUE, NULL);
1857     if (hEvent == INVALID_HANDLE_VALUE)
1858     {
1859         ok(0, "CreateEventW failed, error %d\n", GetLastError());
1860         goto end;
1861     }
1862
1863     ret = ioctlsocket(src, FIONBIO, &one);
1864     if (ret)
1865     {
1866         ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError());
1867         goto end;
1868     }
1869
1870     ret = WSAEventSelect(src, hEvent, FD_WRITE | FD_CLOSE);
1871     if (ret)
1872     {
1873         ok(0, "WSAEventSelect failed, error %d\n", ret);
1874         goto end;
1875     }
1876
1877     for (len = 100; len > 0; --len)
1878     {
1879          WSANETWORKEVENTS netEvents;
1880          DWORD dwRet = WaitForSingleObject(hEvent, 5000);
1881          if (dwRet != WAIT_OBJECT_0)
1882          {
1883              ok(0, "WaitForSingleObject failed, error %d\n", dwRet);
1884              goto end;
1885          }
1886
1887          ret = WSAEnumNetworkEvents(src, NULL, &netEvents);
1888          if (ret)
1889          {
1890              ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret);
1891              goto end;
1892          }
1893
1894          if (netEvents.lNetworkEvents & FD_WRITE)
1895          {
1896              ret = send(src, "a", 1, 0);
1897              if (ret < 0 && WSAGetLastError() != WSAEWOULDBLOCK)
1898              {
1899                  ok(0, "send failed, error %d\n", WSAGetLastError());
1900                  goto end;
1901              }
1902          }
1903
1904          if (netEvents.lNetworkEvents & FD_CLOSE)
1905          {
1906              ok(0, "unexpected close\n");
1907              goto end;
1908          }
1909     }
1910
1911 end:
1912     if (src != INVALID_SOCKET)
1913         closesocket(src);
1914     if (dst != INVALID_SOCKET)
1915         closesocket(dst);
1916     if (hThread != NULL)
1917         CloseHandle(hThread);
1918     CloseHandle(hEvent);
1919 }
1920
1921 static void test_ipv6only(void)
1922 {
1923     SOCKET v4 = INVALID_SOCKET,
1924            v6 = INVALID_SOCKET;
1925     struct sockaddr_in sin4;
1926     struct sockaddr_in6 sin6;
1927     int ret;
1928
1929     memset(&sin4, 0, sizeof(sin4));
1930     sin4.sin_family = AF_INET;
1931     sin4.sin_port = htons(SERVERPORT);
1932
1933     memset(&sin6, 0, sizeof(sin6));
1934     sin6.sin6_family = AF_INET6;
1935     sin6.sin6_port = htons(SERVERPORT);
1936
1937     v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
1938     if (v6 == INVALID_SOCKET) {
1939         skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
1940             WSAGetLastError(), WSAEAFNOSUPPORT);
1941         goto end;
1942     }
1943     ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6));
1944     if (ret) {
1945         skip("Could not bind IPv6 address (LastError: %d).\n",
1946             WSAGetLastError());
1947         goto end;
1948     }
1949
1950     v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1951     if (v4 == INVALID_SOCKET) {
1952         skip("Could not create IPv4 socket (LastError: %d).\n",
1953             WSAGetLastError());
1954         goto end;
1955     }
1956     ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4));
1957     ok(!ret, "Could not bind IPv4 address (LastError: %d; %d expected if IPv6 binds to IPv4 as well).\n",
1958         WSAGetLastError(), WSAEADDRINUSE);
1959
1960 end:
1961     if (v4 != INVALID_SOCKET)
1962         closesocket(v4);
1963     if (v6 != INVALID_SOCKET)
1964         closesocket(v6);
1965 }
1966
1967 /**************** Main program  ***************/
1968
1969 START_TEST( sock )
1970 {
1971     int i;
1972     Init();
1973
1974     test_set_getsockopt();
1975     test_so_reuseaddr();
1976     test_extendedSocketOptions();
1977
1978     for (i = 0; i < NUM_TESTS; i++)
1979     {
1980         trace ( " **** STARTING TEST %d ****\n", i );
1981         do_test (  &tests[i] );
1982         trace ( " **** TEST %d COMPLETE ****\n", i );
1983     }
1984
1985     test_UDP();
1986
1987     test_getservbyname();
1988
1989     test_WSAAddressToStringA();
1990     test_WSAAddressToStringW();
1991
1992     test_WSAStringToAddressA();
1993     test_WSAStringToAddressW();
1994
1995     test_select();
1996     test_accept();
1997     test_getsockname();
1998     test_inet_addr();
1999     test_dns();
2000
2001     test_send();
2002     test_write_events();
2003
2004     test_ipv6only();
2005
2006     Exit();
2007 }