1 /* 2 * Unit test suite for winsock functions 3 * 4 * Copyright 2002 Martin Wilck 5 * Copyright 2005 Thomas Kho 6 * Copyright 2008 Jeff Zaroyko 7 * Copyright 2017 Dmitry Timoshkov 8 * 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2.1 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with this library; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 22 */ 23 24 #ifdef __REACTOS__ 25 #undef _WIN32_WINNT 26 #define _WIN32_WINNT 0x0600 27 #endif 28 29 #include <ntstatus.h> 30 #define WIN32_NO_STATUS 31 #include <winsock2.h> 32 #include <windows.h> 33 #include <winternl.h> 34 #include <ws2tcpip.h> 35 #include <wsipx.h> 36 #include <wsnwlink.h> 37 #include <mswsock.h> 38 #include <mstcpip.h> 39 #include <iphlpapi.h> 40 #include <stdio.h> 41 #include "wine/test.h" 42 43 // ReactOS: Wine has this in mstcpip.h, but it doesn't belong there 44 #define WSA_CMSG_ALIGN(len) (((len) + sizeof(SIZE_T) - 1) & ~(sizeof(SIZE_T) - 1)) 45 46 #define MAX_CLIENTS 4 /* Max number of clients */ 47 #define FIRST_CHAR 'A' /* First character in transferred pattern */ 48 #define BIND_SLEEP 10 /* seconds to wait between attempts to bind() */ 49 #define BIND_TRIES 6 /* Number of bind() attempts */ 50 #define TEST_TIMEOUT 30 /* seconds to wait before killing child threads 51 after server initialization, if something hangs */ 52 53 #define NUM_UDP_PEERS 3 /* Number of UDP sockets to create and test > 1 */ 54 55 #define NUM_THREADS 3 /* Number of threads to run getservbyname */ 56 #define NUM_QUERIES 250 /* Number of getservbyname queries per thread */ 57 58 #define SERVERIP "127.0.0.1" /* IP to bind to */ 59 #define SERVERPORT 9374 /* Port number to bind to */ 60 61 #define wsa_ok(op, cond, msg) \ 62 do { \ 63 int tmp, err = 0; \ 64 tmp = op; \ 65 if ( !(cond tmp) ) err = WSAGetLastError(); \ 66 ok ( cond tmp, msg, GetCurrentThreadId(), err); \ 67 } while (0); 68 69 #define make_keepalive(k, enable, time, interval) \ 70 k.onoff = enable; \ 71 k.keepalivetime = time; \ 72 k.keepaliveinterval = interval; 73 74 /* Function pointers */ 75 static void (WINAPI *pfreeaddrinfo)(struct addrinfo *); 76 static int (WINAPI *pgetaddrinfo)(LPCSTR,LPCSTR,const struct addrinfo *,struct addrinfo **); 77 static void (WINAPI *pFreeAddrInfoW)(PADDRINFOW); 78 static void (WINAPI *pFreeAddrInfoExW)(ADDRINFOEXW *ai); 79 static int (WINAPI *pGetAddrInfoW)(LPCWSTR,LPCWSTR,const ADDRINFOW *,PADDRINFOW *); 80 static int (WINAPI *pGetAddrInfoExW)(const WCHAR *name, const WCHAR *servname, DWORD namespace, 81 GUID *namespace_id, const ADDRINFOEXW *hints, ADDRINFOEXW **result, 82 struct timeval *timeout, OVERLAPPED *overlapped, 83 LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine, HANDLE *handle); 84 static int (WINAPI *pGetAddrInfoExOverlappedResult)(OVERLAPPED *overlapped); 85 static PCSTR (WINAPI *pInetNtop)(INT,LPVOID,LPSTR,ULONG); 86 static PCWSTR(WINAPI *pInetNtopW)(INT,LPVOID,LPWSTR,ULONG); 87 static int (WINAPI *pInetPtonA)(INT,LPCSTR,LPVOID); 88 static int (WINAPI *pInetPtonW)(INT,LPWSTR,LPVOID); 89 static int (WINAPI *pWSALookupServiceBeginW)(LPWSAQUERYSETW,DWORD,LPHANDLE); 90 static int (WINAPI *pWSALookupServiceEnd)(HANDLE); 91 static int (WINAPI *pWSALookupServiceNextW)(HANDLE,DWORD,LPDWORD,LPWSAQUERYSETW); 92 static int (WINAPI *pWSAEnumNameSpaceProvidersA)(LPDWORD,LPWSANAMESPACE_INFOA); 93 static int (WINAPI *pWSAEnumNameSpaceProvidersW)(LPDWORD,LPWSANAMESPACE_INFOW); 94 static int (WINAPI *pWSAPoll)(WSAPOLLFD *,ULONG,INT); 95 96 /* Function pointers from ntdll */ 97 static NTSTATUS (WINAPI *pNtSetInformationFile)(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS); 98 static NTSTATUS (WINAPI *pNtQueryInformationFile)(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS); 99 100 /* Function pointers from iphlpapi */ 101 static DWORD (WINAPI *pGetAdaptersInfo)(PIP_ADAPTER_INFO,PULONG); 102 static DWORD (WINAPI *pGetIpForwardTable)(PMIB_IPFORWARDTABLE,PULONG,BOOL); 103 104 /* Function pointers from ntdll */ 105 static DWORD (WINAPI *pNtClose)(HANDLE); 106 107 /**************** Structs and typedefs ***************/ 108 109 typedef struct thread_info 110 { 111 HANDLE thread; 112 DWORD id; 113 } thread_info; 114 115 /* Information in the server about open client connections */ 116 typedef struct sock_info 117 { 118 SOCKET s; 119 struct sockaddr_in addr; 120 struct sockaddr_in peer; 121 char *buf; 122 int n_recvd; 123 int n_sent; 124 } sock_info; 125 126 /* Test parameters for both server & client */ 127 typedef struct test_params 128 { 129 int sock_type; 130 int sock_prot; 131 const char *inet_addr; 132 short inet_port; 133 int chunk_size; 134 int n_chunks; 135 int n_clients; 136 } test_params; 137 138 /* server-specific test parameters */ 139 typedef struct server_params 140 { 141 test_params *general; 142 DWORD sock_flags; 143 int buflen; 144 } server_params; 145 146 /* client-specific test parameters */ 147 typedef struct client_params 148 { 149 test_params *general; 150 DWORD sock_flags; 151 int buflen; 152 } client_params; 153 154 /* This type combines all information for setting up a test scenario */ 155 typedef struct test_setup 156 { 157 test_params general; 158 LPVOID srv; 159 server_params srv_params; 160 LPVOID clt; 161 client_params clt_params; 162 } test_setup; 163 164 /* Thread local storage for server */ 165 typedef struct server_memory 166 { 167 SOCKET s; 168 struct sockaddr_in addr; 169 sock_info sock[MAX_CLIENTS]; 170 } server_memory; 171 172 /* Thread local storage for client */ 173 typedef struct client_memory 174 { 175 SOCKET s; 176 struct sockaddr_in addr; 177 char *send_buf; 178 char *recv_buf; 179 } client_memory; 180 181 /* SelectReadThread thread parameters */ 182 typedef struct select_thread_params 183 { 184 SOCKET s; 185 BOOL ReadKilled; 186 } select_thread_params; 187 188 /* Tests used in both getaddrinfo and GetAddrInfoW */ 189 static const struct addr_hint_tests 190 { 191 int family, socktype, protocol; 192 DWORD error; 193 } hinttests[] = { 194 {AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0 }, 195 {AF_UNSPEC, SOCK_STREAM, IPPROTO_UDP, 0 }, 196 {AF_UNSPEC, SOCK_STREAM, IPPROTO_IPV6,0 }, 197 {AF_UNSPEC, SOCK_DGRAM, IPPROTO_TCP, 0 }, 198 {AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, 0 }, 199 {AF_UNSPEC, SOCK_DGRAM, IPPROTO_IPV6,0 }, 200 {AF_INET, SOCK_STREAM, IPPROTO_TCP, 0 }, 201 {AF_INET, SOCK_STREAM, IPPROTO_UDP, 0 }, 202 {AF_INET, SOCK_STREAM, IPPROTO_IPV6,0 }, 203 {AF_INET, SOCK_DGRAM, IPPROTO_TCP, 0 }, 204 {AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0 }, 205 {AF_INET, SOCK_DGRAM, IPPROTO_IPV6,0 }, 206 {AF_UNSPEC, 0, IPPROTO_TCP, 0 }, 207 {AF_UNSPEC, 0, IPPROTO_UDP, 0 }, 208 {AF_UNSPEC, 0, IPPROTO_IPV6,0 }, 209 {AF_UNSPEC, SOCK_STREAM, 0, 0 }, 210 {AF_UNSPEC, SOCK_DGRAM, 0, 0 }, 211 {AF_INET, 0, IPPROTO_TCP, 0 }, 212 {AF_INET, 0, IPPROTO_UDP, 0 }, 213 {AF_INET, 0, IPPROTO_IPV6,0 }, 214 {AF_INET, SOCK_STREAM, 0, 0 }, 215 {AF_INET, SOCK_DGRAM, 0, 0 }, 216 {AF_UNSPEC, 999, IPPROTO_TCP, WSAESOCKTNOSUPPORT }, 217 {AF_UNSPEC, 999, IPPROTO_UDP, WSAESOCKTNOSUPPORT }, 218 {AF_UNSPEC, 999, IPPROTO_IPV6,WSAESOCKTNOSUPPORT }, 219 {AF_INET, 999, IPPROTO_TCP, WSAESOCKTNOSUPPORT }, 220 {AF_INET, 999, IPPROTO_UDP, WSAESOCKTNOSUPPORT }, 221 {AF_INET, 999, IPPROTO_IPV6,WSAESOCKTNOSUPPORT }, 222 {AF_UNSPEC, SOCK_STREAM, 999, 0 }, 223 {AF_UNSPEC, SOCK_STREAM, 999, 0 }, 224 {AF_INET, SOCK_DGRAM, 999, 0 }, 225 {AF_INET, SOCK_DGRAM, 999, 0 }, 226 }; 227 228 /**************** Static variables ***************/ 229 230 static DWORD tls; /* Thread local storage index */ 231 static HANDLE thread[1+MAX_CLIENTS]; 232 static DWORD thread_id[1+MAX_CLIENTS]; 233 static HANDLE server_ready; 234 static HANDLE client_ready[MAX_CLIENTS]; 235 static int client_id; 236 237 /**************** General utility functions ***************/ 238 239 static SOCKET setup_server_socket(struct sockaddr_in *addr, int *len); 240 static SOCKET setup_connector_socket(struct sockaddr_in *addr, int len, BOOL nonblock); 241 242 static int tcp_socketpair(SOCKET *src, SOCKET *dst) 243 { 244 SOCKET server = INVALID_SOCKET; 245 struct sockaddr_in addr; 246 int len; 247 int ret; 248 249 *src = INVALID_SOCKET; 250 *dst = INVALID_SOCKET; 251 252 *src = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 253 if (*src == INVALID_SOCKET) 254 goto end; 255 256 server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 257 if (server == INVALID_SOCKET) 258 goto end; 259 260 memset(&addr, 0, sizeof(addr)); 261 addr.sin_family = AF_INET; 262 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 263 ret = bind(server, (struct sockaddr*)&addr, sizeof(addr)); 264 if (ret != 0) 265 goto end; 266 267 len = sizeof(addr); 268 ret = getsockname(server, (struct sockaddr*)&addr, &len); 269 if (ret != 0) 270 goto end; 271 272 ret = listen(server, 1); 273 if (ret != 0) 274 goto end; 275 276 ret = connect(*src, (struct sockaddr*)&addr, sizeof(addr)); 277 if (ret != 0) 278 goto end; 279 280 len = sizeof(addr); 281 *dst = accept(server, (struct sockaddr*)&addr, &len); 282 283 end: 284 if (server != INVALID_SOCKET) 285 closesocket(server); 286 if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET) 287 return 0; 288 closesocket(*src); 289 closesocket(*dst); 290 return -1; 291 } 292 293 static int tcp_socketpair_ovl(SOCKET *src, SOCKET *dst) 294 { 295 SOCKET server = INVALID_SOCKET; 296 struct sockaddr_in addr; 297 int len, ret; 298 299 *src = INVALID_SOCKET; 300 *dst = INVALID_SOCKET; 301 302 *src = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 303 if (*src == INVALID_SOCKET) 304 goto end; 305 306 server = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 307 if (server == INVALID_SOCKET) 308 goto end; 309 310 memset(&addr, 0, sizeof(addr)); 311 addr.sin_family = AF_INET; 312 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 313 ret = bind(server, (struct sockaddr *)&addr, sizeof(addr)); 314 if (ret != 0) 315 goto end; 316 317 len = sizeof(addr); 318 ret = getsockname(server, (struct sockaddr *)&addr, &len); 319 if (ret != 0) 320 goto end; 321 322 ret = listen(server, 1); 323 if (ret != 0) 324 goto end; 325 326 ret = connect(*src, (struct sockaddr *)&addr, sizeof(addr)); 327 if (ret != 0) 328 goto end; 329 330 len = sizeof(addr); 331 *dst = accept(server, (struct sockaddr *)&addr, &len); 332 333 end: 334 if (server != INVALID_SOCKET) 335 closesocket(server); 336 if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET) 337 return 0; 338 closesocket(*src); 339 closesocket(*dst); 340 return -1; 341 } 342 343 static void set_so_opentype ( BOOL overlapped ) 344 { 345 int optval = !overlapped, newval, len = sizeof (int); 346 347 ok ( setsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, 348 (LPVOID) &optval, sizeof (optval) ) == 0, 349 "setting SO_OPENTYPE failed\n" ); 350 ok ( getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, 351 (LPVOID) &newval, &len ) == 0, 352 "getting SO_OPENTYPE failed\n" ); 353 ok ( optval == newval, "failed to set SO_OPENTYPE\n" ); 354 } 355 356 static int set_blocking ( SOCKET s, BOOL blocking ) 357 { 358 u_long val = !blocking; 359 return ioctlsocket ( s, FIONBIO, &val ); 360 } 361 362 static void fill_buffer ( char *buf, int chunk_size, int n_chunks ) 363 { 364 char c, *p; 365 for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size ) 366 memset ( p, c, chunk_size ); 367 } 368 369 static int test_buffer ( char *buf, int chunk_size, int n_chunks ) 370 { 371 char c, *p; 372 int i; 373 for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size ) 374 { 375 for ( i = 0; i < chunk_size; i++ ) 376 if ( p[i] != c ) return i; 377 } 378 return -1; 379 } 380 381 /* 382 * This routine is called when a client / server does not expect any more data, 383 * but needs to acknowledge the closing of the connection (by reading 0 bytes). 384 */ 385 static void read_zero_bytes ( SOCKET s ) 386 { 387 char buf[256]; 388 int tmp, n = 0; 389 while ( ( tmp = recv ( s, buf, 256, 0 ) ) > 0 ) 390 n += tmp; 391 ok ( n <= 0, "garbage data received: %d bytes\n", n ); 392 } 393 394 static int do_synchronous_send ( SOCKET s, char *buf, int buflen, int flags, int sendlen ) 395 { 396 char* last = buf + buflen, *p; 397 int n = 1; 398 for ( p = buf; n > 0 && p < last; ) 399 { 400 n = send ( s, p, min ( sendlen, last - p ), flags ); 401 if (n > 0) p += n; 402 } 403 wsa_ok ( n, 0 <=, "do_synchronous_send (%x): error %d\n" ); 404 return p - buf; 405 } 406 407 static int do_synchronous_recv ( SOCKET s, char *buf, int buflen, int flags, int recvlen ) 408 { 409 char* last = buf + buflen, *p; 410 int n = 1; 411 for ( p = buf; n > 0 && p < last; ) 412 { 413 n = recv ( s, p, min ( recvlen, last - p ), flags ); 414 if (n > 0) p += n; 415 } 416 wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" ); 417 return p - buf; 418 } 419 420 static int do_synchronous_recvfrom ( SOCKET s, char *buf, int buflen, int flags, struct sockaddr *from, int *fromlen, int recvlen ) 421 { 422 char* last = buf + buflen, *p; 423 int n = 1; 424 for ( p = buf; n > 0 && p < last; ) 425 { 426 n = recvfrom ( s, p, min ( recvlen, last - p ), flags, from, fromlen ); 427 if (n > 0) p += n; 428 } 429 wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" ); 430 return p - buf; 431 } 432 433 /* 434 * Call this routine right after thread startup. 435 * SO_OPENTYPE must by 0, regardless what the server did. 436 */ 437 static void check_so_opentype (void) 438 { 439 int tmp = 1, len; 440 len = sizeof (tmp); 441 getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (LPVOID) &tmp, &len ); 442 ok ( tmp == 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp ); 443 } 444 445 static void compare_addrinfo (ADDRINFO *a, ADDRINFO *b) 446 { 447 for (; a && b ; a = a->ai_next, b = b->ai_next) 448 { 449 ok(a->ai_flags == b->ai_flags, 450 "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags); 451 ok(a->ai_family == b->ai_family, 452 "Wrong family %d != %d\n", a->ai_family, b->ai_family); 453 ok(a->ai_socktype == b->ai_socktype, 454 "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype); 455 ok(a->ai_protocol == b->ai_protocol, 456 "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol); 457 ok(a->ai_addrlen == b->ai_addrlen, 458 "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen); 459 ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)), 460 "Wrong address data\n"); 461 if (a->ai_canonname && b->ai_canonname) 462 { 463 ok(!strcmp(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n", 464 a->ai_canonname, b->ai_canonname); 465 } 466 else 467 ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n", 468 a->ai_canonname, b->ai_canonname); 469 } 470 ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b); 471 } 472 473 static void compare_addrinfow (ADDRINFOW *a, ADDRINFOW *b) 474 { 475 for (; a && b ; a = a->ai_next, b = b->ai_next) 476 { 477 ok(a->ai_flags == b->ai_flags, 478 "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags); 479 ok(a->ai_family == b->ai_family, 480 "Wrong family %d != %d\n", a->ai_family, b->ai_family); 481 ok(a->ai_socktype == b->ai_socktype, 482 "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype); 483 ok(a->ai_protocol == b->ai_protocol, 484 "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol); 485 ok(a->ai_addrlen == b->ai_addrlen, 486 "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen); 487 ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)), 488 "Wrong address data\n"); 489 if (a->ai_canonname && b->ai_canonname) 490 { 491 ok(!lstrcmpW(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n", 492 wine_dbgstr_w(a->ai_canonname), wine_dbgstr_w(b->ai_canonname)); 493 } 494 else 495 ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n", 496 a->ai_canonname, b->ai_canonname); 497 } 498 ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b); 499 } 500 501 /**************** Server utility functions ***************/ 502 503 /* 504 * Even if we have closed our server socket cleanly, 505 * the OS may mark the address "in use" for some time - 506 * this happens with native Linux apps, too. 507 */ 508 static void do_bind ( SOCKET s, struct sockaddr* addr, int addrlen ) 509 { 510 int err, wsaerr = 0, n_try = BIND_TRIES; 511 512 while ( ( err = bind ( s, addr, addrlen ) ) != 0 && 513 ( wsaerr = WSAGetLastError () ) == WSAEADDRINUSE && 514 n_try-- >= 0) 515 { 516 trace ( "address in use, waiting ...\n" ); 517 Sleep ( 1000 * BIND_SLEEP ); 518 } 519 ok ( err == 0, "failed to bind: %d\n", wsaerr ); 520 } 521 522 static void server_start ( server_params *par ) 523 { 524 int i; 525 test_params *gen = par->general; 526 server_memory *mem = LocalAlloc ( LPTR, sizeof ( server_memory ) ); 527 528 TlsSetValue ( tls, mem ); 529 mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot, 530 NULL, 0, par->sock_flags ); 531 ok ( mem->s != INVALID_SOCKET, "Server: WSASocket failed\n" ); 532 533 mem->addr.sin_family = AF_INET; 534 mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr ); 535 mem->addr.sin_port = htons ( gen->inet_port ); 536 537 for (i = 0; i < MAX_CLIENTS; i++) 538 { 539 mem->sock[i].s = INVALID_SOCKET; 540 mem->sock[i].buf = LocalAlloc ( LPTR, gen->n_chunks * gen->chunk_size ); 541 mem->sock[i].n_recvd = 0; 542 mem->sock[i].n_sent = 0; 543 } 544 545 if ( gen->sock_type == SOCK_STREAM ) 546 do_bind ( mem->s, (struct sockaddr*) &mem->addr, sizeof (mem->addr) ); 547 } 548 549 static void server_stop (void) 550 { 551 int i; 552 server_memory *mem = TlsGetValue ( tls ); 553 554 for (i = 0; i < MAX_CLIENTS; i++ ) 555 { 556 LocalFree ( mem->sock[i].buf ); 557 if ( mem->sock[i].s != INVALID_SOCKET ) 558 closesocket ( mem->sock[i].s ); 559 } 560 ok ( closesocket ( mem->s ) == 0, "closesocket failed\n" ); 561 LocalFree ( mem ); 562 ExitThread ( GetCurrentThreadId () ); 563 } 564 565 /**************** Client utilitiy functions ***************/ 566 567 static void client_start ( client_params *par ) 568 { 569 test_params *gen = par->general; 570 client_memory *mem = LocalAlloc (LPTR, sizeof (client_memory)); 571 572 TlsSetValue ( tls, mem ); 573 574 WaitForSingleObject ( server_ready, INFINITE ); 575 576 mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot, 577 NULL, 0, par->sock_flags ); 578 579 mem->addr.sin_family = AF_INET; 580 mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr ); 581 mem->addr.sin_port = htons ( gen->inet_port ); 582 583 ok ( mem->s != INVALID_SOCKET, "Client: WSASocket failed\n" ); 584 585 mem->send_buf = LocalAlloc ( LPTR, 2 * gen->n_chunks * gen->chunk_size ); 586 mem->recv_buf = mem->send_buf + gen->n_chunks * gen->chunk_size; 587 fill_buffer ( mem->send_buf, gen->chunk_size, gen->n_chunks ); 588 589 SetEvent ( client_ready[client_id] ); 590 /* Wait for the other clients to come up */ 591 WaitForMultipleObjects ( min ( gen->n_clients, MAX_CLIENTS ), client_ready, TRUE, INFINITE ); 592 } 593 594 static void client_stop (void) 595 { 596 client_memory *mem = TlsGetValue ( tls ); 597 wsa_ok ( closesocket ( mem->s ), 0 ==, "closesocket error (%x): %d\n" ); 598 LocalFree ( mem->send_buf ); 599 LocalFree ( mem ); 600 ExitThread(0); 601 } 602 603 /**************** Servers ***************/ 604 605 /* 606 * simple_server: A very basic server doing synchronous IO. 607 */ 608 static VOID WINAPI simple_server ( server_params *par ) 609 { 610 test_params *gen = par->general; 611 server_memory *mem; 612 int pos, n_recvd, n_sent, n_expected = gen->n_chunks * gen->chunk_size, tmp, i, 613 id = GetCurrentThreadId(); 614 615 trace ( "simple_server (%x) starting\n", id ); 616 617 set_so_opentype ( FALSE ); /* non-overlapped */ 618 server_start ( par ); 619 mem = TlsGetValue ( tls ); 620 621 wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "simple_server (%x): failed to set blocking mode: %d\n"); 622 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "simple_server (%x): listen failed: %d\n"); 623 624 trace ( "simple_server (%x) ready\n", id ); 625 SetEvent ( server_ready ); /* notify clients */ 626 627 for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ ) 628 { 629 trace ( "simple_server (%x): waiting for client\n", id ); 630 631 /* accept a single connection */ 632 tmp = sizeof ( mem->sock[0].peer ); 633 mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp ); 634 wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "simple_server (%x): accept failed: %d\n" ); 635 636 ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ), 637 "simple_server (%x): strange peer address\n", id ); 638 639 /* Receive data & check it */ 640 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen ); 641 ok ( n_recvd == n_expected, 642 "simple_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected ); 643 pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks ); 644 ok ( pos == -1, "simple_server (%x): test pattern error: %d\n", id, pos); 645 646 /* Echo data back */ 647 n_sent = do_synchronous_send ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen ); 648 ok ( n_sent == n_expected, 649 "simple_server (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); 650 651 /* cleanup */ 652 read_zero_bytes ( mem->sock[0].s ); 653 wsa_ok ( closesocket ( mem->sock[0].s ), 0 ==, "simple_server (%x): closesocket error: %d\n" ); 654 mem->sock[0].s = INVALID_SOCKET; 655 } 656 657 trace ( "simple_server (%x) exiting\n", id ); 658 server_stop (); 659 } 660 661 /* 662 * oob_server: A very basic server receiving out-of-band data. 663 */ 664 static VOID WINAPI oob_server ( server_params *par ) 665 { 666 test_params *gen = par->general; 667 server_memory *mem; 668 u_long atmark = 0; 669 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, tmp, 670 id = GetCurrentThreadId(); 671 672 trace ( "oob_server (%x) starting\n", id ); 673 674 set_so_opentype ( FALSE ); /* non-overlapped */ 675 server_start ( par ); 676 mem = TlsGetValue ( tls ); 677 678 wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "oob_server (%x): failed to set blocking mode: %d\n"); 679 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "oob_server (%x): listen failed: %d\n"); 680 681 trace ( "oob_server (%x) ready\n", id ); 682 SetEvent ( server_ready ); /* notify clients */ 683 684 trace ( "oob_server (%x): waiting for client\n", id ); 685 686 /* accept a single connection */ 687 tmp = sizeof ( mem->sock[0].peer ); 688 mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp ); 689 wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "oob_server (%x): accept failed: %d\n" ); 690 691 ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ), 692 "oob_server (%x): strange peer address\n", id ); 693 694 /* check initial atmark state */ 695 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); 696 ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark ); 697 698 /* Receive normal data */ 699 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen ); 700 ok ( n_recvd == n_expected, 701 "oob_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected ); 702 pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks ); 703 ok ( pos == -1, "oob_server (%x): test pattern error: %d\n", id, pos); 704 705 /* check atmark state */ 706 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); 707 ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark ); 708 709 /* Echo data back */ 710 n_sent = do_synchronous_send ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen ); 711 ok ( n_sent == n_expected, 712 "oob_server (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); 713 714 /* Receive a part of the out-of-band data and print atmark state */ 715 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, 8, 0, par->buflen ); 716 ok ( n_recvd == 8, 717 "oob_server (%x): received less data than expected: %d of %d\n", id, n_recvd, 8 ); 718 n_expected -= 8; 719 720 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); 721 trace( "oob_server (%x): %s the OOB mark: %i\n", id, atmark == 1 ? "not at" : "at", atmark ); 722 723 /* Receive the rest of the out-of-band data and check atmark state */ 724 do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen ); 725 726 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); 727 todo_wine ok ( atmark == 0, "oob_server (%x): not at the OOB mark: %i\n", id, atmark ); 728 729 /* cleanup */ 730 wsa_ok ( closesocket ( mem->sock[0].s ), 0 ==, "oob_server (%x): closesocket error: %d\n" ); 731 mem->sock[0].s = INVALID_SOCKET; 732 733 trace ( "oob_server (%x) exiting\n", id ); 734 server_stop (); 735 } 736 737 /* 738 * select_server: A non-blocking server. 739 */ 740 static VOID WINAPI select_server ( server_params *par ) 741 { 742 test_params *gen = par->general; 743 server_memory *mem; 744 int n_expected = gen->n_chunks * gen->chunk_size, tmp, i, 745 id = GetCurrentThreadId(), n_connections = 0, n_sent, n_recvd, 746 n_set, delta, n_ready; 747 struct timeval timeout = {0,10}; /* wait for 10 milliseconds */ 748 fd_set fds_recv, fds_send, fds_openrecv, fds_opensend; 749 750 trace ( "select_server (%x) starting\n", id ); 751 752 set_so_opentype ( FALSE ); /* non-overlapped */ 753 server_start ( par ); 754 mem = TlsGetValue ( tls ); 755 756 wsa_ok ( set_blocking ( mem->s, FALSE ), 0 ==, "select_server (%x): failed to set blocking mode: %d\n"); 757 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "select_server (%x): listen failed: %d\n"); 758 759 trace ( "select_server (%x) ready\n", id ); 760 SetEvent ( server_ready ); /* notify clients */ 761 762 FD_ZERO ( &fds_openrecv ); 763 FD_ZERO ( &fds_recv ); 764 FD_ZERO ( &fds_send ); 765 FD_ZERO ( &fds_opensend ); 766 767 FD_SET ( mem->s, &fds_openrecv ); 768 769 while(1) 770 { 771 fds_recv = fds_openrecv; 772 fds_send = fds_opensend; 773 774 n_set = 0; 775 776 wsa_ok ( ( n_ready = select ( 0, &fds_recv, &fds_send, NULL, &timeout ) ), SOCKET_ERROR !=, 777 "select_server (%x): select() failed: %d\n" ); 778 779 /* check for incoming requests */ 780 if ( FD_ISSET ( mem->s, &fds_recv ) ) { 781 n_set += 1; 782 783 trace ( "select_server (%x): accepting client connection\n", id ); 784 785 /* accept a single connection */ 786 tmp = sizeof ( mem->sock[n_connections].peer ); 787 mem->sock[n_connections].s = accept ( mem->s, (struct sockaddr*) &mem->sock[n_connections].peer, &tmp ); 788 wsa_ok ( mem->sock[n_connections].s, INVALID_SOCKET !=, "select_server (%x): accept() failed: %d\n" ); 789 790 ok ( mem->sock[n_connections].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ), 791 "select_server (%x): strange peer address\n", id ); 792 793 /* add to list of open connections */ 794 FD_SET ( mem->sock[n_connections].s, &fds_openrecv ); 795 FD_SET ( mem->sock[n_connections].s, &fds_opensend ); 796 797 n_connections++; 798 } 799 800 /* handle open requests */ 801 802 for ( i = 0; i < n_connections; i++ ) 803 { 804 if ( FD_ISSET( mem->sock[i].s, &fds_recv ) ) { 805 n_set += 1; 806 807 if ( mem->sock[i].n_recvd < n_expected ) { 808 /* Receive data & check it */ 809 n_recvd = recv ( mem->sock[i].s, mem->sock[i].buf + mem->sock[i].n_recvd, min ( n_expected - mem->sock[i].n_recvd, par->buflen ), 0 ); 810 ok ( n_recvd != SOCKET_ERROR, "select_server (%x): error in recv(): %d\n", id, WSAGetLastError() ); 811 mem->sock[i].n_recvd += n_recvd; 812 813 if ( mem->sock[i].n_recvd == n_expected ) { 814 int pos = test_buffer ( mem->sock[i].buf, gen->chunk_size, gen->n_chunks ); 815 ok ( pos == -1, "select_server (%x): test pattern error: %d\n", id, pos ); 816 FD_CLR ( mem->sock[i].s, &fds_openrecv ); 817 } 818 819 ok ( mem->sock[i].n_recvd <= n_expected, "select_server (%x): received too many bytes: %d\n", id, mem->sock[i].n_recvd ); 820 } 821 } 822 823 /* only echo back what we've received */ 824 delta = mem->sock[i].n_recvd - mem->sock[i].n_sent; 825 826 if ( FD_ISSET ( mem->sock[i].s, &fds_send ) ) { 827 n_set += 1; 828 829 if ( ( delta > 0 ) && ( mem->sock[i].n_sent < n_expected ) ) { 830 /* Echo data back */ 831 n_sent = send ( mem->sock[i].s, mem->sock[i].buf + mem->sock[i].n_sent, min ( delta, par->buflen ), 0 ); 832 ok ( n_sent != SOCKET_ERROR, "select_server (%x): error in send(): %d\n", id, WSAGetLastError() ); 833 mem->sock[i].n_sent += n_sent; 834 835 if ( mem->sock[i].n_sent == n_expected ) { 836 FD_CLR ( mem->sock[i].s, &fds_opensend ); 837 } 838 839 ok ( mem->sock[i].n_sent <= n_expected, "select_server (%x): sent too many bytes: %d\n", id, mem->sock[i].n_sent ); 840 } 841 } 842 } 843 844 /* check that select returned the correct number of ready sockets */ 845 ok ( ( n_set == n_ready ), "select_server (%x): select() returns wrong number of ready sockets\n", id ); 846 847 /* check if all clients are done */ 848 if ( ( fds_opensend.fd_count == 0 ) 849 && ( fds_openrecv.fd_count == 1 ) /* initial socket that accepts clients */ 850 && ( n_connections == min ( gen->n_clients, MAX_CLIENTS ) ) ) { 851 break; 852 } 853 } 854 855 for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ ) 856 { 857 /* cleanup */ 858 read_zero_bytes ( mem->sock[i].s ); 859 wsa_ok ( closesocket ( mem->sock[i].s ), 0 ==, "select_server (%x): closesocket error: %d\n" ); 860 mem->sock[i].s = INVALID_SOCKET; 861 } 862 863 trace ( "select_server (%x) exiting\n", id ); 864 server_stop (); 865 } 866 867 /**************** Clients ***************/ 868 869 /* 870 * simple_client: A very basic client doing synchronous IO. 871 */ 872 static VOID WINAPI simple_client ( client_params *par ) 873 { 874 test_params *gen = par->general; 875 client_memory *mem; 876 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id; 877 878 id = GetCurrentThreadId(); 879 trace ( "simple_client (%x): starting\n", id ); 880 /* wait here because we want to call set_so_opentype before creating a socket */ 881 WaitForSingleObject ( server_ready, INFINITE ); 882 trace ( "simple_client (%x): server ready\n", id ); 883 884 check_so_opentype (); 885 set_so_opentype ( FALSE ); /* non-overlapped */ 886 client_start ( par ); 887 mem = TlsGetValue ( tls ); 888 889 /* Connect */ 890 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ), 891 0 ==, "simple_client (%x): connect error: %d\n" ); 892 ok ( set_blocking ( mem->s, TRUE ) == 0, 893 "simple_client (%x): failed to set blocking mode\n", id ); 894 trace ( "simple_client (%x) connected\n", id ); 895 896 /* send data to server */ 897 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen ); 898 ok ( n_sent == n_expected, 899 "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); 900 901 /* shutdown send direction */ 902 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" ); 903 904 /* Receive data echoed back & check it */ 905 n_recvd = do_synchronous_recv ( mem->s, mem->recv_buf, n_expected, 0, par->buflen ); 906 ok ( n_recvd == n_expected, 907 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected ); 908 909 /* check data */ 910 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks ); 911 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos); 912 913 /* cleanup */ 914 read_zero_bytes ( mem->s ); 915 trace ( "simple_client (%x) exiting\n", id ); 916 client_stop (); 917 } 918 919 /* 920 * oob_client: A very basic client sending out-of-band data. 921 */ 922 static VOID WINAPI oob_client ( client_params *par ) 923 { 924 test_params *gen = par->general; 925 client_memory *mem; 926 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id; 927 928 id = GetCurrentThreadId(); 929 trace ( "oob_client (%x): starting\n", id ); 930 /* wait here because we want to call set_so_opentype before creating a socket */ 931 WaitForSingleObject ( server_ready, INFINITE ); 932 trace ( "oob_client (%x): server ready\n", id ); 933 934 check_so_opentype (); 935 set_so_opentype ( FALSE ); /* non-overlapped */ 936 client_start ( par ); 937 mem = TlsGetValue ( tls ); 938 939 /* Connect */ 940 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ), 941 0 ==, "oob_client (%x): connect error: %d\n" ); 942 ok ( set_blocking ( mem->s, TRUE ) == 0, 943 "oob_client (%x): failed to set blocking mode\n", id ); 944 trace ( "oob_client (%x) connected\n", id ); 945 946 /* send data to server */ 947 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen ); 948 ok ( n_sent == n_expected, 949 "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); 950 951 /* Receive data echoed back & check it */ 952 n_recvd = do_synchronous_recv ( mem->s, mem->recv_buf, n_expected, 0, par->buflen ); 953 ok ( n_recvd == n_expected, 954 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected ); 955 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks ); 956 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos); 957 958 /* send out-of-band data to server */ 959 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, MSG_OOB, par->buflen ); 960 ok ( n_sent == n_expected, 961 "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); 962 963 /* shutdown send direction */ 964 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" ); 965 966 /* cleanup */ 967 read_zero_bytes ( mem->s ); 968 trace ( "oob_client (%x) exiting\n", id ); 969 client_stop (); 970 } 971 972 /* 973 * simple_mixed_client: mixing send and recvfrom 974 */ 975 static VOID WINAPI simple_mixed_client ( client_params *par ) 976 { 977 test_params *gen = par->general; 978 client_memory *mem; 979 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id; 980 int fromLen = sizeof(mem->addr); 981 struct sockaddr test; 982 983 id = GetCurrentThreadId(); 984 trace ( "simple_client (%x): starting\n", id ); 985 /* wait here because we want to call set_so_opentype before creating a socket */ 986 WaitForSingleObject ( server_ready, INFINITE ); 987 trace ( "simple_client (%x): server ready\n", id ); 988 989 check_so_opentype (); 990 set_so_opentype ( FALSE ); /* non-overlapped */ 991 client_start ( par ); 992 mem = TlsGetValue ( tls ); 993 994 /* Connect */ 995 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ), 996 0 ==, "simple_client (%x): connect error: %d\n" ); 997 ok ( set_blocking ( mem->s, TRUE ) == 0, 998 "simple_client (%x): failed to set blocking mode\n", id ); 999 trace ( "simple_client (%x) connected\n", id ); 1000 1001 /* send data to server */ 1002 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen ); 1003 ok ( n_sent == n_expected, 1004 "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); 1005 1006 /* shutdown send direction */ 1007 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" ); 1008 1009 /* this shouldn't change, since lpFrom, is not updated on 1010 connection oriented sockets - exposed by bug 11640 1011 */ 1012 ((struct sockaddr_in*)&test)->sin_addr.s_addr = inet_addr("0.0.0.0"); 1013 1014 /* Receive data echoed back & check it */ 1015 n_recvd = do_synchronous_recvfrom ( mem->s, 1016 mem->recv_buf, 1017 n_expected, 1018 0, 1019 (struct sockaddr *)&test, 1020 &fromLen, 1021 par->buflen ); 1022 ok ( n_recvd == n_expected, 1023 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected ); 1024 1025 /* check that lpFrom was not updated */ 1026 ok(0 == 1027 strcmp( 1028 inet_ntoa(((struct sockaddr_in*)&test)->sin_addr), 1029 "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n"); 1030 1031 /* check data */ 1032 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks ); 1033 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos); 1034 1035 /* cleanup */ 1036 read_zero_bytes ( mem->s ); 1037 trace ( "simple_client (%x) exiting\n", id ); 1038 client_stop (); 1039 } 1040 1041 /* 1042 * event_client: An event-driven client 1043 */ 1044 static void WINAPI event_client ( client_params *par ) 1045 { 1046 test_params *gen = par->general; 1047 client_memory *mem; 1048 int id = GetCurrentThreadId(), n_expected = gen->n_chunks * gen->chunk_size, 1049 tmp, err, n; 1050 HANDLE event; 1051 WSANETWORKEVENTS wsa_events; 1052 char *send_last, *recv_last, *send_p, *recv_p; 1053 LONG mask = FD_READ | FD_WRITE | FD_CLOSE; 1054 1055 trace ( "event_client (%x): starting\n", id ); 1056 client_start ( par ); 1057 trace ( "event_client (%x): server ready\n", id ); 1058 1059 mem = TlsGetValue ( tls ); 1060 1061 /* Prepare event notification for connect, makes socket nonblocking */ 1062 event = WSACreateEvent (); 1063 WSAEventSelect ( mem->s, event, FD_CONNECT ); 1064 tmp = connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ); 1065 if ( tmp != 0 ) { 1066 err = WSAGetLastError (); 1067 ok ( err == WSAEWOULDBLOCK, "event_client (%x): connect error: %d\n", id, err ); 1068 tmp = WaitForSingleObject ( event, INFINITE ); 1069 ok ( tmp == WAIT_OBJECT_0, "event_client (%x): wait for connect event failed: %d\n", id, tmp ); 1070 err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events ); 1071 ok ( err == 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id, err ); 1072 err = wsa_events.iErrorCode[ FD_CONNECT_BIT ]; 1073 ok ( err == 0, "event_client (%x): connect error: %d\n", id, err ); 1074 if ( err ) goto out; 1075 } 1076 1077 trace ( "event_client (%x) connected\n", id ); 1078 1079 WSAEventSelect ( mem->s, event, mask ); 1080 1081 recv_p = mem->recv_buf; 1082 recv_last = mem->recv_buf + n_expected; 1083 send_p = mem->send_buf; 1084 send_last = mem->send_buf + n_expected; 1085 1086 while ( TRUE ) 1087 { 1088 err = WaitForSingleObject ( event, INFINITE ); 1089 ok ( err == WAIT_OBJECT_0, "event_client (%x): wait failed\n", id ); 1090 1091 err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events ); 1092 ok( err == 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id, err ); 1093 1094 if ( wsa_events.lNetworkEvents & FD_WRITE ) 1095 { 1096 err = wsa_events.iErrorCode[ FD_WRITE_BIT ]; 1097 ok ( err == 0, "event_client (%x): FD_WRITE error code: %d\n", id, err ); 1098 1099 if ( err== 0 ) 1100 do 1101 { 1102 n = send ( mem->s, send_p, min ( send_last - send_p, par->buflen ), 0 ); 1103 if ( n < 0 ) 1104 { 1105 err = WSAGetLastError (); 1106 ok ( err == WSAEWOULDBLOCK, "event_client (%x): send error: %d\n", id, err ); 1107 } 1108 else 1109 send_p += n; 1110 } 1111 while ( n >= 0 && send_p < send_last ); 1112 1113 if ( send_p == send_last ) 1114 { 1115 trace ( "event_client (%x): all data sent - shutdown\n", id ); 1116 shutdown ( mem->s, SD_SEND ); 1117 mask &= ~FD_WRITE; 1118 WSAEventSelect ( mem->s, event, mask ); 1119 } 1120 } 1121 if ( wsa_events.lNetworkEvents & FD_READ ) 1122 { 1123 err = wsa_events.iErrorCode[ FD_READ_BIT ]; 1124 ok ( err == 0, "event_client (%x): FD_READ error code: %d\n", id, err ); 1125 if ( err != 0 ) break; 1126 1127 /* First read must succeed */ 1128 n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 ); 1129 wsa_ok ( n, 0 <=, "event_client (%x): recv error: %d\n" ); 1130 1131 while ( n >= 0 ) { 1132 recv_p += n; 1133 if ( recv_p == recv_last ) 1134 { 1135 mask &= ~FD_READ; 1136 trace ( "event_client (%x): all data received\n", id ); 1137 WSAEventSelect ( mem->s, event, mask ); 1138 break; 1139 } 1140 n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 ); 1141 if ( n < 0 && ( err = WSAGetLastError()) != WSAEWOULDBLOCK ) 1142 ok ( 0, "event_client (%x): read error: %d\n", id, err ); 1143 1144 } 1145 } 1146 if ( wsa_events.lNetworkEvents & FD_CLOSE ) 1147 { 1148 trace ( "event_client (%x): close event\n", id ); 1149 err = wsa_events.iErrorCode[ FD_CLOSE_BIT ]; 1150 ok ( err == 0, "event_client (%x): FD_CLOSE error code: %d\n", id, err ); 1151 break; 1152 } 1153 } 1154 1155 n = send_p - mem->send_buf; 1156 ok ( send_p == send_last, 1157 "simple_client (%x): sent less data than expected: %d of %d\n", id, n, n_expected ); 1158 n = recv_p - mem->recv_buf; 1159 ok ( recv_p == recv_last, 1160 "simple_client (%x): received less data than expected: %d of %d\n", id, n, n_expected ); 1161 n = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks ); 1162 ok ( n == -1, "event_client (%x): test pattern error: %d\n", id, n); 1163 1164 out: 1165 WSACloseEvent ( event ); 1166 trace ( "event_client (%x) exiting\n", id ); 1167 client_stop (); 1168 } 1169 1170 /* Tests for WSAStartup */ 1171 static void test_WithoutWSAStartup(void) 1172 { 1173 DWORD err; 1174 1175 WSASetLastError(0xdeadbeef); 1176 ok(WSASocketA(0, 0, 0, NULL, 0, 0) == INVALID_SOCKET, "WSASocketA should have failed\n"); 1177 err = WSAGetLastError(); 1178 ok(err == WSANOTINITIALISED, "Expected 10093, received %d\n", err); 1179 1180 WSASetLastError(0xdeadbeef); 1181 ok(gethostbyname("localhost") == NULL, "gethostbyname() succeeded unexpectedly\n"); 1182 err = WSAGetLastError(); 1183 ok(err == WSANOTINITIALISED, "Expected 10093, received %d\n", err); 1184 } 1185 1186 static void test_WithWSAStartup(void) 1187 { 1188 WSADATA data; 1189 WORD version = MAKEWORD( 2, 2 ); 1190 INT res, socks, i, j; 1191 SOCKET sock; 1192 LPVOID ptr; 1193 struct 1194 { 1195 SOCKET src, dst, dup_src, dup_dst; 1196 } pairs[32]; 1197 DWORD error; 1198 1199 res = WSAStartup( version, &data ); 1200 ok(res == 0, "WSAStartup() failed unexpectedly: %d\n", res); 1201 1202 ptr = gethostbyname("localhost"); 1203 ok(ptr != NULL, "gethostbyname() failed unexpectedly: %d\n", WSAGetLastError()); 1204 1205 /* Alloc some sockets to check if they are destroyed on WSACleanup */ 1206 for (socks = 0; socks < sizeof(pairs) / sizeof(pairs[0]); socks++) 1207 { 1208 WSAPROTOCOL_INFOA info; 1209 if (tcp_socketpair(&pairs[socks].src, &pairs[socks].dst)) break; 1210 1211 memset(&info, 0, sizeof(info)); 1212 ok(!WSADuplicateSocketA(pairs[socks].src, GetCurrentProcessId(), &info), 1213 "WSADuplicateSocketA should have worked\n"); 1214 pairs[socks].dup_src = WSASocketA(0, 0, 0, &info, 0, 0); 1215 ok(pairs[socks].dup_src != SOCKET_ERROR, "expected != -1\n"); 1216 1217 memset(&info, 0, sizeof(info)); 1218 ok(!WSADuplicateSocketA(pairs[socks].dst, GetCurrentProcessId(), &info), 1219 "WSADuplicateSocketA should have worked\n"); 1220 pairs[socks].dup_dst = WSASocketA(0, 0, 0, &info, 0, 0); 1221 ok(pairs[socks].dup_dst != SOCKET_ERROR, "expected != -1\n"); 1222 } 1223 1224 res = send(pairs[0].src, "TEST", 4, 0); 1225 ok(res == 4, "send failed with error %d\n", WSAGetLastError()); 1226 1227 WSACleanup(); 1228 1229 res = WSAStartup( version, &data ); 1230 ok(res == 0, "WSAStartup() failed unexpectedly: %d\n", res); 1231 1232 /* show that sockets are destroyed automatically after WSACleanup */ 1233 SetLastError(0xdeadbeef); 1234 res = send(pairs[0].src, "TEST", 4, 0); 1235 error = WSAGetLastError(); 1236 ok(res == SOCKET_ERROR, "send should have failed\n"); 1237 todo_wine ok(error == WSAENOTSOCK, "expected 10038, got %d\n", error); 1238 1239 SetLastError(0xdeadbeef); 1240 res = send(pairs[0].dst, "TEST", 4, 0); 1241 error = WSAGetLastError(); 1242 ok(res == SOCKET_ERROR, "send should have failed\n"); 1243 todo_wine ok(error == WSAENOTSOCK, "expected 10038, got %d\n", error); 1244 1245 /* Check that all sockets were destroyed */ 1246 for (i = 0; i < socks; i++) 1247 { 1248 for (j = 0; j < 4; j++) 1249 { 1250 struct sockaddr_in saddr; 1251 int size = sizeof(saddr); 1252 switch(j) 1253 { 1254 case 0: sock = pairs[i].src; break; 1255 case 1: sock = pairs[i].dup_src; break; 1256 case 2: sock = pairs[i].dst; break; 1257 case 3: sock = pairs[i].dup_dst; break; 1258 } 1259 1260 SetLastError(0xdeadbeef); 1261 res = getsockname(sock, (struct sockaddr *)&saddr, &size); 1262 error = WSAGetLastError(); 1263 ok(res == SOCKET_ERROR, "Test[%d]: getsockname should have failed\n", i); 1264 todo_wine ok(error == WSAENOTSOCK, "Test[%d]: expected 10038, got %d\n", i, error); 1265 } 1266 } 1267 1268 /* While wine is not fixed, close all sockets manually */ 1269 for (i = 0; i < socks; i++) 1270 { 1271 closesocket(pairs[i].src); 1272 closesocket(pairs[i].dst); 1273 closesocket(pairs[i].dup_src); 1274 closesocket(pairs[i].dup_dst); 1275 } 1276 1277 res = WSACleanup(); 1278 ok(res == 0, "expected 0, got %d\n", res); 1279 WSASetLastError(0xdeadbeef); 1280 res = WSACleanup(); 1281 error = WSAGetLastError(); 1282 ok ( res == SOCKET_ERROR && error == WSANOTINITIALISED, 1283 "WSACleanup returned %d WSAGetLastError is %d\n", res, error); 1284 } 1285 1286 /**************** Main program utility functions ***************/ 1287 1288 static void Init (void) 1289 { 1290 WORD ver = MAKEWORD (2, 2); 1291 WSADATA data; 1292 HMODULE hws2_32 = GetModuleHandleA("ws2_32.dll"), hiphlpapi, ntdll; 1293 1294 pfreeaddrinfo = (void *)GetProcAddress(hws2_32, "freeaddrinfo"); 1295 pgetaddrinfo = (void *)GetProcAddress(hws2_32, "getaddrinfo"); 1296 pFreeAddrInfoW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoW"); 1297 pFreeAddrInfoExW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoExW"); 1298 pGetAddrInfoW = (void *)GetProcAddress(hws2_32, "GetAddrInfoW"); 1299 pGetAddrInfoExW = (void *)GetProcAddress(hws2_32, "GetAddrInfoExW"); 1300 pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(hws2_32, "GetAddrInfoExOverlappedResult"); 1301 pInetNtop = (void *)GetProcAddress(hws2_32, "inet_ntop"); 1302 pInetNtopW = (void *)GetProcAddress(hws2_32, "InetNtopW"); 1303 pInetPtonA = (void *)GetProcAddress(hws2_32, "inet_pton"); 1304 pInetPtonW = (void *)GetProcAddress(hws2_32, "InetPtonW"); 1305 pWSALookupServiceBeginW = (void *)GetProcAddress(hws2_32, "WSALookupServiceBeginW"); 1306 pWSALookupServiceEnd = (void *)GetProcAddress(hws2_32, "WSALookupServiceEnd"); 1307 pWSALookupServiceNextW = (void *)GetProcAddress(hws2_32, "WSALookupServiceNextW"); 1308 pWSAEnumNameSpaceProvidersA = (void *)GetProcAddress(hws2_32, "WSAEnumNameSpaceProvidersA"); 1309 pWSAEnumNameSpaceProvidersW = (void *)GetProcAddress(hws2_32, "WSAEnumNameSpaceProvidersW"); 1310 pWSAPoll = (void *)GetProcAddress(hws2_32, "WSAPoll"); 1311 1312 hiphlpapi = LoadLibraryA("iphlpapi.dll"); 1313 if (hiphlpapi) 1314 { 1315 pGetIpForwardTable = (void *)GetProcAddress(hiphlpapi, "GetIpForwardTable"); 1316 pGetAdaptersInfo = (void *)GetProcAddress(hiphlpapi, "GetAdaptersInfo"); 1317 } 1318 1319 ntdll = LoadLibraryA("ntdll.dll"); 1320 if (ntdll) 1321 { 1322 pNtClose = (void *)GetProcAddress(ntdll, "NtClose"); 1323 pNtSetInformationFile = (void *)GetProcAddress(ntdll, "NtSetInformationFile"); 1324 pNtQueryInformationFile = (void *)GetProcAddress(ntdll, "NtQueryInformationFile"); 1325 } 1326 1327 ok ( WSAStartup ( ver, &data ) == 0, "WSAStartup failed\n" ); 1328 tls = TlsAlloc(); 1329 } 1330 1331 static void Exit (void) 1332 { 1333 INT ret, err; 1334 TlsFree ( tls ); 1335 ret = WSACleanup(); 1336 err = WSAGetLastError(); 1337 ok ( ret == 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret, err); 1338 } 1339 1340 static void StartServer (LPTHREAD_START_ROUTINE routine, 1341 test_params *general, server_params *par) 1342 { 1343 par->general = general; 1344 thread[0] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[0] ); 1345 ok ( thread[0] != NULL, "Failed to create server thread\n" ); 1346 } 1347 1348 static void StartClients (LPTHREAD_START_ROUTINE routine, 1349 test_params *general, client_params *par) 1350 { 1351 int i; 1352 par->general = general; 1353 for ( i = 1; i <= min ( general->n_clients, MAX_CLIENTS ); i++ ) 1354 { 1355 client_id = i - 1; 1356 thread[i] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[i] ); 1357 ok ( thread[i] != NULL, "Failed to create client thread\n" ); 1358 /* Make sure the client is up and running */ 1359 WaitForSingleObject ( client_ready[client_id], INFINITE ); 1360 }; 1361 } 1362 1363 static void do_test( test_setup *test ) 1364 { 1365 DWORD i, n = min (test->general.n_clients, MAX_CLIENTS); 1366 DWORD wait; 1367 1368 server_ready = CreateEventA ( NULL, TRUE, FALSE, NULL ); 1369 for (i = 0; i <= n; i++) 1370 client_ready[i] = CreateEventA ( NULL, TRUE, FALSE, NULL ); 1371 1372 StartServer ( test->srv, &test->general, &test->srv_params ); 1373 StartClients ( test->clt, &test->general, &test->clt_params ); 1374 WaitForSingleObject ( server_ready, INFINITE ); 1375 1376 wait = WaitForMultipleObjects ( 1 + n, thread, TRUE, 1000 * TEST_TIMEOUT ); 1377 ok ( wait <= WAIT_OBJECT_0 + n , 1378 "some threads have not completed: %x\n", wait ); 1379 1380 if ( ! ( wait <= WAIT_OBJECT_0 + n ) ) 1381 { 1382 for (i = 0; i <= n; i++) 1383 { 1384 if ( WaitForSingleObject ( thread[i], 0 ) != WAIT_OBJECT_0 ) 1385 { 1386 trace ("terminating thread %08x\n", thread_id[i]); 1387 TerminateThread ( thread [i], 0 ); 1388 } 1389 } 1390 } 1391 CloseHandle ( server_ready ); 1392 for (i = 0; i <= n; i++) 1393 CloseHandle ( client_ready[i] ); 1394 } 1395 1396 /********* some tests for getsockopt(setsockopt(X)) == X ***********/ 1397 /* optname = SO_LINGER */ 1398 static const LINGER linger_testvals[] = { 1399 {0,0}, 1400 {0,73}, 1401 {1,0}, 1402 {5,189} 1403 }; 1404 1405 /* optname = SO_RCVTIMEO, SOSNDTIMEO */ 1406 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a 1407 bug in the linux kernel (fixed in 2.6.8) */ 1408 #define SOCKTIMEOUT2 997000 /* 997 seconds */ 1409 1410 static void test_set_getsockopt(void) 1411 { 1412 SOCKET s, s2; 1413 int i, err, lasterr; 1414 int timeout; 1415 LINGER lingval; 1416 int size; 1417 WSAPROTOCOL_INFOA infoA; 1418 WSAPROTOCOL_INFOW infoW; 1419 char providername[WSAPROTOCOL_LEN + 1]; 1420 DWORD value; 1421 struct _prottest 1422 { 1423 int family, type, proto; 1424 } prottest[] = { 1425 {AF_INET, SOCK_STREAM, IPPROTO_TCP}, 1426 {AF_INET, SOCK_DGRAM, IPPROTO_UDP}, 1427 {AF_INET6, SOCK_STREAM, IPPROTO_TCP}, 1428 {AF_INET6, SOCK_DGRAM, IPPROTO_UDP} 1429 }; 1430 union _csspace 1431 { 1432 CSADDR_INFO cs; 1433 char space[128]; 1434 } csinfoA, csinfoB; 1435 1436 s = socket(AF_INET, SOCK_STREAM, 0); 1437 ok(s!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError()); 1438 if( s == INVALID_SOCKET) return; 1439 /* SO_RCVTIMEO */ 1440 timeout = SOCKTIMEOUT1; 1441 size = sizeof(timeout); 1442 err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, size); 1443 if( !err) 1444 err = getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, &size); 1445 ok( !err, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError()); 1446 ok( timeout == SOCKTIMEOUT1, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout); 1447 1448 timeout = 0; 1449 size = sizeof(timeout); 1450 err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, size); 1451 if( !err) 1452 err = getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, &size); 1453 ok( !err, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError()); 1454 ok( timeout == 0, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout); 1455 1456 /* SO_SNDTIMEO */ 1457 timeout = SOCKTIMEOUT2; /* 997 seconds. See remark above */ 1458 size = sizeof(timeout); 1459 err = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, size); 1460 if( !err) 1461 err = getsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, &size); 1462 ok( !err, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError()); 1463 ok( timeout == SOCKTIMEOUT2, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout); 1464 1465 /* SO_SNDBUF */ 1466 value = 4096; 1467 size = sizeof(value); 1468 err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&value, size); 1469 ok( !err, "setsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() ); 1470 value = 0xdeadbeef; 1471 err = getsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&value, &size); 1472 ok( !err, "getsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() ); 1473 ok( value == 4096, "expected 4096, got %u\n", value ); 1474 1475 /* SO_RCVBUF */ 1476 value = 4096; 1477 size = sizeof(value); 1478 err = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&value, size); 1479 ok( !err, "setsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() ); 1480 value = 0xdeadbeef; 1481 err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&value, &size); 1482 ok( !err, "getsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() ); 1483 ok( value == 4096, "expected 4096, got %u\n", value ); 1484 1485 /* SO_LINGER */ 1486 for( i = 0; i < sizeof(linger_testvals)/sizeof(LINGER);i++) { 1487 size = sizeof(lingval); 1488 lingval = linger_testvals[i]; 1489 err = setsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, size); 1490 if( !err) 1491 err = getsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, &size); 1492 ok( !err, "get/setsockopt(SO_LINGER) failed error: %d\n", WSAGetLastError()); 1493 ok( !lingval.l_onoff == !linger_testvals[i].l_onoff && 1494 (lingval.l_linger == linger_testvals[i].l_linger || 1495 (!lingval.l_linger && !linger_testvals[i].l_onoff)) 1496 , "getsockopt(SO_LINGER #%d) returned wrong value %d,%d not %d,%d\n", i, 1497 lingval.l_onoff, lingval.l_linger, 1498 linger_testvals[i].l_onoff, linger_testvals[i].l_linger); 1499 } 1500 1501 size = sizeof(lingval); 1502 err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, size); 1503 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 1504 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); 1505 err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, 0); 1506 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 1507 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); 1508 1509 size = sizeof(BOOL); 1510 err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, size); 1511 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 1512 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); 1513 err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, 0); 1514 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 1515 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); 1516 1517 /* Test for erroneously passing a value instead of a pointer as optval */ 1518 size = sizeof(char); 1519 err = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)1, size); 1520 ok(err == SOCKET_ERROR, "setsockopt with optval being a value passed " 1521 "instead of failing.\n"); 1522 lasterr = WSAGetLastError(); 1523 ok(lasterr == WSAEFAULT, "setsockopt with optval being a value " 1524 "returned 0x%08x, not WSAEFAULT(0x%08x)\n", 1525 lasterr, WSAEFAULT); 1526 1527 /* SO_RCVTIMEO with invalid values for level */ 1528 size = sizeof(timeout); 1529 timeout = SOCKTIMEOUT1; 1530 SetLastError(0xdeadbeef); 1531 err = setsockopt(s, 0xffffffff, SO_RCVTIMEO, (char *) &timeout, size); 1532 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL), 1533 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n", 1534 err, WSAGetLastError()); 1535 1536 timeout = SOCKTIMEOUT1; 1537 SetLastError(0xdeadbeef); 1538 err = setsockopt(s, 0x00008000, SO_RCVTIMEO, (char *) &timeout, size); 1539 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL), 1540 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n", 1541 err, WSAGetLastError()); 1542 1543 /* Test SO_ERROR set/get */ 1544 SetLastError(0xdeadbeef); 1545 i = 1234; 1546 err = setsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, size); 1547 todo_wine 1548 ok( !err && !WSAGetLastError(), 1549 "got %d with %d (expected 0 with 0)\n", 1550 err, WSAGetLastError()); 1551 1552 SetLastError(0xdeadbeef); 1553 i = 4321; 1554 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size); 1555 todo_wine 1556 ok( !err && !WSAGetLastError(), 1557 "got %d with %d (expected 0 with 0)\n", 1558 err, WSAGetLastError()); 1559 todo_wine 1560 ok (i == 1234, "got %d (expected 1234)\n", i); 1561 1562 /* Test invalid optlen */ 1563 SetLastError(0xdeadbeef); 1564 size = 1; 1565 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size); 1566 todo_wine 1567 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEFAULT), 1568 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", 1569 err, WSAGetLastError()); 1570 1571 closesocket(s); 1572 /* Test with the closed socket */ 1573 SetLastError(0xdeadbeef); 1574 size = sizeof(i); 1575 i = 1234; 1576 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size); 1577 todo_wine 1578 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAENOTSOCK), 1579 "got %d with %d (expected SOCKET_ERROR with WSAENOTSOCK)\n", 1580 err, WSAGetLastError()); 1581 ok (i == 1234, "expected 1234, got %d\n", i); 1582 1583 /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */ 1584 s = socket(AF_INET, SOCK_DGRAM, 0); 1585 ok(s != INVALID_SOCKET, "Failed to create socket\n"); 1586 size = sizeof(i); 1587 i = 0x0000000a; 1588 err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &i, size); 1589 if (!err) 1590 { 1591 for (i = 0; i < 4; i++) 1592 { 1593 int k, j; 1594 const int tests[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d}; 1595 err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &tests[i], i + 1); 1596 ok(!err, "Test [%d] Expected 0, got %d\n", i, err); 1597 err = getsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &k, &size); 1598 ok(!err, "Test [%d] Expected 0, got %d\n", i, err); 1599 j = i != 3 ? tests[i] & ((1 << (i + 1) * 8) - 1) : tests[i]; 1600 ok(k == j, "Test [%d] Expected 0x%x, got 0x%x\n", i, j, k); 1601 } 1602 } 1603 else 1604 win_skip("IP_MULTICAST_TTL is unsupported\n"); 1605 closesocket(s); 1606 1607 /* test SO_PROTOCOL_INFOA invalid parameters */ 1608 ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL), 1609 "getsockopt should have failed\n"); 1610 err = WSAGetLastError(); 1611 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err); 1612 size = sizeof(WSAPROTOCOL_INFOA); 1613 ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size), 1614 "getsockopt should have failed\n"); 1615 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size); 1616 err = WSAGetLastError(); 1617 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err); 1618 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 1619 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL), 1620 "getsockopt should have failed\n"); 1621 err = WSAGetLastError(); 1622 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err); 1623 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, NULL), 1624 "getsockopt should have failed\n"); 1625 err = WSAGetLastError(); 1626 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err); 1627 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, &size), 1628 "getsockopt should have failed\n"); 1629 err = WSAGetLastError(); 1630 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err); 1631 size = sizeof(WSAPROTOCOL_INFOA) / 2; 1632 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size), 1633 "getsockopt should have failed\n"); 1634 err = WSAGetLastError(); 1635 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err); 1636 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size); 1637 size = sizeof(WSAPROTOCOL_INFOA) * 2; 1638 err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size); 1639 ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); 1640 ok(size == sizeof(WSAPROTOCOL_INFOA) * 2, "got size %d\n", size); 1641 1642 closesocket(s); 1643 1644 /* test SO_PROTOCOL_INFO structure returned for different protocols */ 1645 for (i = 0; i < sizeof(prottest) / sizeof(prottest[0]); i++) 1646 { 1647 int k; 1648 1649 s = socket(prottest[i].family, prottest[i].type, prottest[i].proto); 1650 if (s == INVALID_SOCKET && prottest[i].family == AF_INET6) continue; 1651 1652 ok(s != INVALID_SOCKET, "Failed to create socket: %d\n", 1653 WSAGetLastError()); 1654 1655 /* compare both A and W version */ 1656 infoA.szProtocol[0] = 0; 1657 size = sizeof(WSAPROTOCOL_INFOA); 1658 err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size); 1659 ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); 1660 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size); 1661 1662 infoW.szProtocol[0] = 0; 1663 size = sizeof(WSAPROTOCOL_INFOW); 1664 err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOW, (char *) &infoW, &size); 1665 ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); 1666 ok(size == sizeof(WSAPROTOCOL_INFOW), "got size %d\n", size); 1667 1668 trace("provider name '%s', family %d, type %d, proto %d\n", 1669 infoA.szProtocol, prottest[i].family, prottest[i].type, prottest[i].proto); 1670 1671 ok(infoA.szProtocol[0], "WSAPROTOCOL_INFOA was not filled\n"); 1672 ok(infoW.szProtocol[0], "WSAPROTOCOL_INFOW was not filled\n"); 1673 1674 WideCharToMultiByte(CP_ACP, 0, infoW.szProtocol, -1, 1675 providername, sizeof(providername), NULL, NULL); 1676 ok(!strcmp(infoA.szProtocol,providername), 1677 "different provider names '%s' != '%s'\n", infoA.szProtocol, providername); 1678 1679 ok(!memcmp(&infoA, &infoW, FIELD_OFFSET(WSAPROTOCOL_INFOA, szProtocol)), 1680 "SO_PROTOCOL_INFO[A/W] comparison failed\n"); 1681 1682 /* Remove IF when WSAEnumProtocols support IPV6 data */ 1683 todo_wine_if (prottest[i].family == AF_INET6) 1684 ok(infoA.iAddressFamily == prottest[i].family, "socket family invalid, expected %d received %d\n", 1685 prottest[i].family, infoA.iAddressFamily); 1686 ok(infoA.iSocketType == prottest[i].type, "socket type invalid, expected %d received %d\n", 1687 prottest[i].type, infoA.iSocketType); 1688 ok(infoA.iProtocol == prottest[i].proto, "socket protocol invalid, expected %d received %d\n", 1689 prottest[i].proto, infoA.iProtocol); 1690 1691 /* IP_HDRINCL is supported only on SOCK_RAW but passed to SOCK_DGRAM by Impossible Creatures */ 1692 size = sizeof(i); 1693 k = 1; 1694 SetLastError(0xdeadbeef); 1695 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size); 1696 if (err == -1) /* >= Vista */ 1697 { 1698 todo_wine { 1699 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError()); 1700 k = 99; 1701 SetLastError(0xdeadbeef); 1702 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size); 1703 ok(err == -1, "Expected -1, got %d\n", err); 1704 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError()); 1705 ok(k == 99, "Expected 99, got %d\n", k); 1706 1707 size = sizeof(k); 1708 k = 0; 1709 SetLastError(0xdeadbeef); 1710 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size); 1711 } 1712 ok(err == -1, "Expected -1, got %d\n", err); 1713 todo_wine { 1714 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError()); 1715 k = 99; 1716 SetLastError(0xdeadbeef); 1717 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size); 1718 ok(err == -1, "Expected -1, got %d\n", err); 1719 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError()); 1720 ok(k == 99, "Expected 99, got %d\n", k); 1721 } 1722 } 1723 else /* <= 2003 the tests differ between TCP and UDP, UDP silently accepts */ 1724 { 1725 SetLastError(0xdeadbeef); 1726 k = 99; 1727 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size); 1728 if (prottest[i].type == SOCK_DGRAM) 1729 { 1730 ok(err == 0, "Expected 0, got %d\n", err); 1731 ok(k == 1, "Expected 1, got %d\n", k); 1732 } 1733 else 1734 { 1735 /* contratry to what we could expect the function returns error but k is changed */ 1736 ok(err == -1, "Expected -1, got %d\n", err); 1737 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError()); 1738 ok(k == 0, "Expected 0, got %d\n", k); 1739 } 1740 1741 k = 0; 1742 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size); 1743 ok(err == 0, "Expected 0, got %d\n", err); 1744 1745 k = 99; 1746 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size); 1747 if (prottest[i].type == SOCK_DGRAM) 1748 { 1749 ok(err == 0, "Expected 0, got %d\n", err); 1750 ok(k == 0, "Expected 0, got %d\n", k); 1751 } 1752 else 1753 { 1754 /* contratry to what we could expect the function returns error but k is changed */ 1755 ok(err == -1, "Expected -1, got %d\n", err); 1756 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError()); 1757 ok(k == 0, "Expected 0, got %d\n", k); 1758 } 1759 } 1760 1761 closesocket(s); 1762 } 1763 1764 /* Test SO_BSP_STATE - Present only in >= Win 2008 */ 1765 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 1766 ok(s != INVALID_SOCKET, "Failed to create socket\n"); 1767 s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 1768 ok(s2 != INVALID_SOCKET, "Failed to create socket\n"); 1769 1770 SetLastError(0xdeadbeef); 1771 size = sizeof(csinfoA); 1772 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); 1773 if (!err) 1774 { 1775 struct sockaddr_in saddr; 1776 memset(&saddr, 0, sizeof(saddr)); 1777 saddr.sin_family = AF_INET; 1778 saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 1779 1780 /* Socket is not bound, no information provided */ 1781 ok(!csinfoA.cs.LocalAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength); 1782 ok(csinfoA.cs.LocalAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr); 1783 /* Socket is not connected, no information provided */ 1784 ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.RemoteAddr.iSockaddrLength); 1785 ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.RemoteAddr.lpSockaddr); 1786 1787 err = bind(s, (struct sockaddr*)&saddr, sizeof(saddr)); 1788 ok(!err, "Expected 0, got %d\n", err); 1789 size = sizeof(csinfoA); 1790 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); 1791 ok(!err, "Expected 0, got %d\n", err); 1792 1793 /* Socket is bound */ 1794 ok(csinfoA.cs.LocalAddr.iSockaddrLength, "Expected non-zero\n"); 1795 ok(csinfoA.cs.LocalAddr.lpSockaddr != NULL, "Expected non-null\n"); 1796 /* Socket is not connected, no information provided */ 1797 ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.RemoteAddr.iSockaddrLength); 1798 ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.RemoteAddr.lpSockaddr); 1799 1800 err = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr)); 1801 ok(!err, "Expected 0, got %d\n", err); 1802 err = getsockname(s2, (struct sockaddr *)&saddr, &size); 1803 ok(!err, "Expected 0, got %d\n", err); 1804 err = listen(s2, 1); 1805 ok(!err, "Expected 0, got %d\n", err); 1806 err = connect(s, (struct sockaddr*)&saddr, sizeof(saddr)); 1807 ok(!err, "Expected 0, got %d\n", err); 1808 size = sizeof(saddr); 1809 err = accept(s2, (struct sockaddr*)&saddr, &size); 1810 ok(err != INVALID_SOCKET, "Failed to accept socket\n"); 1811 closesocket(s2); 1812 s2 = err; 1813 1814 size = sizeof(csinfoA); 1815 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); 1816 ok(!err, "Expected 0, got %d\n", err); 1817 err = getsockopt(s2, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoB, &size); 1818 ok(!err, "Expected 0, got %d\n", err); 1819 ok(size == sizeof(csinfoA), "Got %d\n", size); 1820 size = sizeof(saddr); 1821 ok(size == csinfoA.cs.LocalAddr.iSockaddrLength, "Expected %d, got %d\n", size, 1822 csinfoA.cs.LocalAddr.iSockaddrLength); 1823 ok(size == csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected %d, got %d\n", size, 1824 csinfoA.cs.RemoteAddr.iSockaddrLength); 1825 ok(!memcmp(csinfoA.cs.LocalAddr.lpSockaddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), 1826 "Expected matching addresses\n"); 1827 ok(!memcmp(csinfoB.cs.LocalAddr.lpSockaddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), 1828 "Expected matching addresses\n"); 1829 ok(csinfoA.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n"); 1830 ok(csinfoB.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n"); 1831 ok(csinfoA.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n"); 1832 ok(csinfoB.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n"); 1833 1834 err = getpeername(s, (struct sockaddr *)&saddr, &size); 1835 ok(!err, "Expected 0, got %d\n", err); 1836 ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); 1837 ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); 1838 err = getpeername(s2, (struct sockaddr *)&saddr, &size); 1839 ok(!err, "Expected 0, got %d\n", err); 1840 ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); 1841 ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); 1842 err = getsockname(s, (struct sockaddr *)&saddr, &size); 1843 ok(!err, "Expected 0, got %d\n", err); 1844 ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); 1845 ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); 1846 err = getsockname(s2, (struct sockaddr *)&saddr, &size); 1847 ok(!err, "Expected 0, got %d\n", err); 1848 ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); 1849 ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); 1850 1851 SetLastError(0xdeadbeef); 1852 size = sizeof(CSADDR_INFO); 1853 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); 1854 ok(err, "Expected non-zero\n"); 1855 ok(size == sizeof(CSADDR_INFO), "Got %d\n", size); 1856 ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError()); 1857 1858 /* At least for IPv4 the size is exactly 56 bytes */ 1859 size = sizeof(*csinfoA.cs.LocalAddr.lpSockaddr) * 2 + sizeof(csinfoA.cs); 1860 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); 1861 ok(!err, "Expected 0, got %d\n", err); 1862 size--; 1863 SetLastError(0xdeadbeef); 1864 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); 1865 ok(err, "Expected non-zero\n"); 1866 ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError()); 1867 } 1868 else 1869 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError()); 1870 1871 closesocket(s); 1872 closesocket(s2); 1873 1874 for (i = 0; i < 2; i++) 1875 { 1876 int family, level; 1877 1878 if (i) 1879 { 1880 family = AF_INET6; 1881 level = IPPROTO_IPV6; 1882 } 1883 else 1884 { 1885 family = AF_INET; 1886 level = IPPROTO_IP; 1887 } 1888 1889 s = socket(family, SOCK_DGRAM, 0); 1890 if (s == INVALID_SOCKET && i) 1891 { 1892 skip("IPv6 is not supported\n"); 1893 break; 1894 } 1895 ok(s != INVALID_SOCKET, "socket failed with error %d\n", GetLastError()); 1896 1897 size = sizeof(value); 1898 value = 0xdead; 1899 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size); 1900 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError()); 1901 ok(value == 0, "Expected 0, got %d\n", value); 1902 1903 size = sizeof(value); 1904 value = 1; 1905 err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size); 1906 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError()); 1907 1908 value = 0xdead; 1909 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size); 1910 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError()); 1911 ok(value == 1, "Expected 1, got %d\n", value); 1912 1913 size = sizeof(value); 1914 value = 0xdead; 1915 err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size); 1916 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError()); 1917 1918 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size); 1919 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError()); 1920 ok(value == 1, "Expected 1, got %d\n", value); 1921 1922 closesocket(s); 1923 } 1924 } 1925 1926 static void test_so_reuseaddr(void) 1927 { 1928 struct sockaddr_in saddr; 1929 SOCKET s1,s2; 1930 unsigned int rc,reuse; 1931 int size; 1932 DWORD err; 1933 1934 saddr.sin_family = AF_INET; 1935 saddr.sin_port = htons(SERVERPORT+1); 1936 saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 1937 1938 s1=socket(AF_INET, SOCK_STREAM, 0); 1939 ok(s1!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError()); 1940 rc = bind(s1, (struct sockaddr*)&saddr, sizeof(saddr)); 1941 ok(rc!=SOCKET_ERROR, "bind(s1) failed error: %d\n", WSAGetLastError()); 1942 1943 s2=socket(AF_INET, SOCK_STREAM, 0); 1944 ok(s2!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError()); 1945 1946 reuse=0x1234; 1947 size=sizeof(reuse); 1948 rc=getsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, &size ); 1949 ok(rc==0 && reuse==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc,reuse); 1950 1951 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr)); 1952 ok(rc==SOCKET_ERROR, "bind() succeeded\n"); 1953 1954 reuse = 1; 1955 rc = setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)); 1956 ok(rc==0, "setsockopt() failed error: %d\n", WSAGetLastError()); 1957 1958 /* On Win2k3 and above, all SO_REUSEADDR seems to do is to allow binding to 1959 * a port immediately after closing another socket on that port, so 1960 * basically following the BSD socket semantics here. */ 1961 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr)); 1962 if(rc==0) 1963 { 1964 int s3=socket(AF_INET, SOCK_STREAM, 0), s4; 1965 trace("<= Win XP behavior of SO_REUSEADDR\n"); 1966 1967 /* If we could bind again in the same port this is Windows version <= XP. 1968 * Lets test if we can really connect to one of them. */ 1969 set_blocking(s1, FALSE); 1970 set_blocking(s2, FALSE); 1971 rc = listen(s1, 1); 1972 ok(!rc, "listen() failed with error: %d\n", WSAGetLastError()); 1973 rc = listen(s2, 1); 1974 ok(!rc, "listen() failed with error: %d\n", WSAGetLastError()); 1975 rc = connect(s3, (struct sockaddr*)&saddr, sizeof(saddr)); 1976 ok(!rc, "connecting to accepting socket failed %d\n", WSAGetLastError()); 1977 1978 /* the delivery of the connection is random so we need to try on both sockets */ 1979 size = sizeof(saddr); 1980 s4 = accept(s1, (struct sockaddr*)&saddr, &size); 1981 if(s4 == INVALID_SOCKET) 1982 s4 = accept(s2, (struct sockaddr*)&saddr, &size); 1983 ok(s4 != INVALID_SOCKET, "none of the listening sockets could get the connection\n"); 1984 1985 closesocket(s1); 1986 closesocket(s3); 1987 closesocket(s4); 1988 } 1989 else 1990 { 1991 trace(">= Win 2003 behavior of SO_REUSEADDR\n"); 1992 err = WSAGetLastError(); 1993 ok(err==WSAEACCES, "expected 10013, got %d\n", err); 1994 1995 closesocket(s1); 1996 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr)); 1997 ok(rc==0, "bind() failed error: %d\n", WSAGetLastError()); 1998 } 1999 2000 closesocket(s2); 2001 } 2002 2003 #define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo))) 2004 2005 static void test_ip_pktinfo(void) 2006 { 2007 ULONG addresses[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY)}; 2008 char recvbuf[10], pktbuf[512], msg[] = "HELLO"; 2009 struct sockaddr_in s1addr, s2addr, s3addr; 2010 GUID WSARecvMsg_GUID = WSAID_WSARECVMSG; 2011 LPFN_WSARECVMSG pWSARecvMsg = NULL; 2012 unsigned int rc, yes = 1; 2013 BOOL foundhdr; 2014 DWORD dwBytes, dwSize, dwFlags; 2015 socklen_t addrlen; 2016 WSACMSGHDR *cmsg; 2017 WSAOVERLAPPED ov; 2018 WSABUF iovec[1]; 2019 SOCKET s1, s2; 2020 WSAMSG hdr; 2021 int i, err; 2022 2023 memset(&ov, 0, sizeof(ov)); 2024 ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 2025 if (ov.hEvent == INVALID_HANDLE_VALUE) 2026 { 2027 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError()); 2028 return; 2029 } 2030 2031 memset(&hdr, 0x00, sizeof(hdr)); 2032 s1addr.sin_family = AF_INET; 2033 s1addr.sin_port = htons(0); 2034 /* Note: s1addr.sin_addr is set below */ 2035 iovec[0].buf = recvbuf; 2036 iovec[0].len = sizeof(recvbuf); 2037 hdr.name = (struct sockaddr*)&s3addr; 2038 hdr.namelen = sizeof(s3addr); 2039 hdr.lpBuffers = &iovec[0]; 2040 hdr.dwBufferCount = 1; 2041 hdr.Control.buf = pktbuf; 2042 /* Note: hdr.Control.len is set below */ 2043 hdr.dwFlags = 0; 2044 2045 for (i=0;i<sizeof(addresses)/sizeof(UINT32);i++) 2046 { 2047 s1addr.sin_addr.s_addr = addresses[i]; 2048 2049 /* Build "server" side socket */ 2050 s1=socket(AF_INET, SOCK_DGRAM, 0); 2051 if (s1 == INVALID_SOCKET) 2052 { 2053 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError()); 2054 goto cleanup; 2055 } 2056 2057 /* Obtain the WSARecvMsg function */ 2058 WSAIoctl(s1, SIO_GET_EXTENSION_FUNCTION_POINTER, &WSARecvMsg_GUID, sizeof(WSARecvMsg_GUID), 2059 &pWSARecvMsg, sizeof(pWSARecvMsg), &dwBytes, NULL, NULL); 2060 if (!pWSARecvMsg) 2061 { 2062 win_skip("WSARecvMsg is unsupported, some tests will be skipped.\n"); 2063 closesocket(s1); 2064 goto cleanup; 2065 } 2066 2067 /* Setup the server side socket */ 2068 rc=bind(s1, (struct sockaddr*)&s1addr, sizeof(s1addr)); 2069 ok(rc != SOCKET_ERROR, "bind() failed error: %d\n", WSAGetLastError()); 2070 rc=setsockopt(s1, IPPROTO_IP, IP_PKTINFO, (const char*)&yes, sizeof(yes)); 2071 ok(rc == 0, "failed to set IPPROTO_IP flag IP_PKTINFO!\n"); 2072 2073 /* Build "client" side socket */ 2074 addrlen = sizeof(s2addr); 2075 if (getsockname(s1, (struct sockaddr *) &s2addr, &addrlen) != 0) 2076 { 2077 skip("Failed to call getsockname, some tests skipped: %d\n", WSAGetLastError()); 2078 closesocket(s1); 2079 goto cleanup; 2080 } 2081 s2addr.sin_addr.s_addr = addresses[0]; /* Always target the local adapter address */ 2082 s2=socket(AF_INET, SOCK_DGRAM, 0); 2083 if (s2 == INVALID_SOCKET) 2084 { 2085 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError()); 2086 closesocket(s1); 2087 goto cleanup; 2088 } 2089 2090 /* Test an empty message header */ 2091 rc=pWSARecvMsg(s1, NULL, NULL, NULL, NULL); 2092 err=WSAGetLastError(); 2093 ok(rc == SOCKET_ERROR && err == WSAEFAULT, "WSARecvMsg() failed error: %d (ret = %d)\n", err, rc); 2094 2095 /* 2096 * Send a packet from the client to the server and test for specifying 2097 * a short control header. 2098 */ 2099 SetLastError(0xdeadbeef); 2100 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr)); 2101 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError()); 2102 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 2103 hdr.Control.len = 1; 2104 rc=pWSARecvMsg(s1, &hdr, &dwSize, NULL, NULL); 2105 err=WSAGetLastError(); 2106 ok(rc == SOCKET_ERROR && err == WSAEMSGSIZE && (hdr.dwFlags & MSG_CTRUNC), 2107 "WSARecvMsg() failed error: %d (ret: %d, flags: %d)\n", err, rc, hdr.dwFlags); 2108 hdr.dwFlags = 0; /* Reset flags */ 2109 2110 /* Perform another short control header test, this time with an overlapped receive */ 2111 hdr.Control.len = 1; 2112 rc=pWSARecvMsg(s1, &hdr, NULL, &ov, NULL); 2113 err=WSAGetLastError(); 2114 ok(rc != 0 && err == WSA_IO_PENDING, "WSARecvMsg() failed error: %d\n", err); 2115 SetLastError(0xdeadbeef); 2116 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr)); 2117 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError()); 2118 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 2119 if (WaitForSingleObject(ov.hEvent, 100) != WAIT_OBJECT_0) 2120 { 2121 skip("Server side did not receive packet, some tests skipped.\n"); 2122 closesocket(s2); 2123 closesocket(s1); 2124 continue; 2125 } 2126 dwFlags = 0; 2127 WSAGetOverlappedResult(s1, &ov, NULL, FALSE, &dwFlags); 2128 ok(dwFlags == 0, 2129 "WSAGetOverlappedResult() returned unexpected flags %d!\n", dwFlags); 2130 ok(hdr.dwFlags == MSG_CTRUNC, 2131 "WSARecvMsg() overlapped operation set unexpected flags %d.\n", hdr.dwFlags); 2132 hdr.dwFlags = 0; /* Reset flags */ 2133 2134 /* 2135 * Setup an overlapped receive, send a packet, then wait for the packet to be retrieved 2136 * on the server end and check that the returned packet matches what was sent. 2137 */ 2138 hdr.Control.len = sizeof(pktbuf); 2139 rc=pWSARecvMsg(s1, &hdr, NULL, &ov, NULL); 2140 err=WSAGetLastError(); 2141 ok(rc != 0 && err == WSA_IO_PENDING, "WSARecvMsg() failed error: %d\n", err); 2142 ok(hdr.Control.len == sizeof(pktbuf), 2143 "WSARecvMsg() control length mismatch (%d != sizeof pktbuf).\n", hdr.Control.len); 2144 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr)); 2145 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError()); 2146 if (WaitForSingleObject(ov.hEvent, 100) != WAIT_OBJECT_0) 2147 { 2148 skip("Server side did not receive packet, some tests skipped.\n"); 2149 closesocket(s2); 2150 closesocket(s1); 2151 continue; 2152 } 2153 dwSize = 0; 2154 WSAGetOverlappedResult(s1, &ov, &dwSize, FALSE, NULL); 2155 ok(dwSize == sizeof(msg), 2156 "WSARecvMsg() buffer length does not match transmitted data!\n"); 2157 ok(strncmp(iovec[0].buf, msg, sizeof(msg)) == 0, 2158 "WSARecvMsg() buffer does not match transmitted data!\n"); 2159 ok(hdr.Control.len == IP_PKTINFO_LEN, 2160 "WSARecvMsg() control length mismatch (%d).\n", hdr.Control.len); 2161 2162 /* Test for the expected IP_PKTINFO return information. */ 2163 foundhdr = FALSE; 2164 for (cmsg = WSA_CMSG_FIRSTHDR(&hdr); cmsg != NULL; cmsg = WSA_CMSG_NXTHDR(&hdr, cmsg)) 2165 { 2166 if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) 2167 { 2168 struct in_pktinfo *pi = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg); 2169 2170 ok(pi->ipi_addr.s_addr == s2addr.sin_addr.s_addr, "destination ip mismatch!\n"); 2171 foundhdr = TRUE; 2172 } 2173 } 2174 ok(foundhdr, "IP_PKTINFO header information was not returned!\n"); 2175 2176 closesocket(s2); 2177 closesocket(s1); 2178 } 2179 2180 cleanup: 2181 CloseHandle(ov.hEvent); 2182 } 2183 2184 /************* Array containing the tests to run **********/ 2185 2186 #define STD_STREAM_SOCKET \ 2187 SOCK_STREAM, \ 2188 0, \ 2189 SERVERIP, \ 2190 SERVERPORT 2191 2192 static test_setup tests [] = 2193 { 2194 /* Test 0: synchronous client and server */ 2195 { 2196 { 2197 STD_STREAM_SOCKET, 2198 2048, 2199 16, 2200 2 2201 }, 2202 simple_server, 2203 { 2204 NULL, 2205 0, 2206 64 2207 }, 2208 simple_client, 2209 { 2210 NULL, 2211 0, 2212 128 2213 } 2214 }, 2215 /* Test 1: event-driven client, synchronous server */ 2216 { 2217 { 2218 STD_STREAM_SOCKET, 2219 2048, 2220 16, 2221 2 2222 }, 2223 simple_server, 2224 { 2225 NULL, 2226 0, 2227 64 2228 }, 2229 event_client, 2230 { 2231 NULL, 2232 WSA_FLAG_OVERLAPPED, 2233 128 2234 } 2235 }, 2236 /* Test 2: synchronous client, non-blocking server via select() */ 2237 { 2238 { 2239 STD_STREAM_SOCKET, 2240 2048, 2241 16, 2242 2 2243 }, 2244 select_server, 2245 { 2246 NULL, 2247 0, 2248 64 2249 }, 2250 simple_client, 2251 { 2252 NULL, 2253 0, 2254 128 2255 } 2256 }, 2257 /* Test 3: OOB client, OOB server */ 2258 { 2259 { 2260 STD_STREAM_SOCKET, 2261 128, 2262 16, 2263 1 2264 }, 2265 oob_server, 2266 { 2267 NULL, 2268 0, 2269 128 2270 }, 2271 oob_client, 2272 { 2273 NULL, 2274 0, 2275 128 2276 } 2277 }, 2278 /* Test 4: synchronous mixed client and server */ 2279 { 2280 { 2281 STD_STREAM_SOCKET, 2282 2048, 2283 16, 2284 2 2285 }, 2286 simple_server, 2287 { 2288 NULL, 2289 0, 2290 64 2291 }, 2292 simple_mixed_client, 2293 { 2294 NULL, 2295 0, 2296 128 2297 } 2298 } 2299 }; 2300 2301 static void test_UDP(void) 2302 { 2303 /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is 2304 possible that this test fails due to dropped packets. */ 2305 2306 /* peer 0 receives data from all other peers */ 2307 struct sock_info peer[NUM_UDP_PEERS]; 2308 char buf[16]; 2309 int ss, i, n_recv, n_sent; 2310 2311 memset (buf,0,sizeof(buf)); 2312 for ( i = NUM_UDP_PEERS - 1; i >= 0; i-- ) { 2313 ok ( ( peer[i].s = socket ( AF_INET, SOCK_DGRAM, 0 ) ) != INVALID_SOCKET, "UDP: socket failed\n" ); 2314 2315 peer[i].addr.sin_family = AF_INET; 2316 peer[i].addr.sin_addr.s_addr = inet_addr ( SERVERIP ); 2317 2318 if ( i == 0 ) { 2319 peer[i].addr.sin_port = htons ( SERVERPORT ); 2320 } else { 2321 peer[i].addr.sin_port = htons ( 0 ); 2322 } 2323 2324 do_bind ( peer[i].s, (struct sockaddr *) &peer[i].addr, sizeof( peer[i].addr ) ); 2325 2326 /* test getsockname() to get peer's port */ 2327 ss = sizeof ( peer[i].addr ); 2328 ok ( getsockname ( peer[i].s, (struct sockaddr *) &peer[i].addr, &ss ) != SOCKET_ERROR, "UDP: could not getsockname()\n" ); 2329 ok ( peer[i].addr.sin_port != htons ( 0 ), "UDP: bind() did not associate port\n" ); 2330 } 2331 2332 /* test getsockname() */ 2333 ok ( peer[0].addr.sin_port == htons ( SERVERPORT ), "UDP: getsockname returned incorrect peer port\n" ); 2334 2335 for ( i = 1; i < NUM_UDP_PEERS; i++ ) { 2336 /* send client's ip */ 2337 memcpy( buf, &peer[i].addr.sin_port, sizeof(peer[i].addr.sin_port) ); 2338 n_sent = sendto ( peer[i].s, buf, sizeof(buf), 0, (struct sockaddr*) &peer[0].addr, sizeof(peer[0].addr) ); 2339 ok ( n_sent == sizeof(buf), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent ); 2340 } 2341 2342 for ( i = 1; i < NUM_UDP_PEERS; i++ ) { 2343 n_recv = recvfrom ( peer[0].s, buf, sizeof(buf), 0,(struct sockaddr *) &peer[0].peer, &ss ); 2344 ok ( n_recv == sizeof(buf), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv ); 2345 ok ( memcmp ( &peer[0].peer.sin_port, buf, sizeof(peer[0].addr.sin_port) ) == 0, "UDP: port numbers do not match\n" ); 2346 } 2347 } 2348 2349 static DWORD WINAPI do_getservbyname( void *param ) 2350 { 2351 struct { 2352 const char *name; 2353 const char *proto; 2354 int port; 2355 } serv[2] = { {"domain", "udp", 53}, {"telnet", "tcp", 23} }; 2356 2357 HANDLE *starttest = param; 2358 int i, j; 2359 struct servent *pserv[2]; 2360 2361 ok ( WaitForSingleObject ( *starttest, TEST_TIMEOUT * 1000 ) != WAIT_TIMEOUT, 2362 "test_getservbyname: timeout waiting for start signal\n" ); 2363 2364 /* ensure that necessary buffer resizes are completed */ 2365 for ( j = 0; j < 2; j++) { 2366 pserv[j] = getservbyname ( serv[j].name, serv[j].proto ); 2367 } 2368 2369 for ( i = 0; i < NUM_QUERIES / 2; i++ ) { 2370 for ( j = 0; j < 2; j++ ) { 2371 pserv[j] = getservbyname ( serv[j].name, serv[j].proto ); 2372 ok ( pserv[j] != NULL || broken(pserv[j] == NULL) /* win8, fixed in win81 */, 2373 "getservbyname could not retrieve information for %s: %d\n", serv[j].name, WSAGetLastError() ); 2374 if ( !pserv[j] ) continue; 2375 ok ( pserv[j]->s_port == htons(serv[j].port), 2376 "getservbyname returned the wrong port for %s: %d\n", serv[j].name, ntohs(pserv[j]->s_port) ); 2377 ok ( !strcmp ( pserv[j]->s_proto, serv[j].proto ), 2378 "getservbyname returned the wrong protocol for %s: %s\n", serv[j].name, pserv[j]->s_proto ); 2379 ok ( !strcmp ( pserv[j]->s_name, serv[j].name ), 2380 "getservbyname returned the wrong name for %s: %s\n", serv[j].name, pserv[j]->s_name ); 2381 } 2382 2383 ok ( pserv[0] == pserv[1] || broken(pserv[0] != pserv[1]) /* win8, fixed in win81 */, 2384 "getservbyname: winsock resized servent buffer when not necessary\n" ); 2385 } 2386 2387 return 0; 2388 } 2389 2390 static void test_getservbyname(void) 2391 { 2392 int i; 2393 HANDLE starttest, thread[NUM_THREADS]; 2394 DWORD thread_id[NUM_THREADS]; 2395 2396 starttest = CreateEventA ( NULL, 1, 0, "test_getservbyname_starttest" ); 2397 2398 /* create threads */ 2399 for ( i = 0; i < NUM_THREADS; i++ ) { 2400 thread[i] = CreateThread ( NULL, 0, do_getservbyname, &starttest, 0, &thread_id[i] ); 2401 } 2402 2403 /* signal threads to start */ 2404 SetEvent ( starttest ); 2405 2406 for ( i = 0; i < NUM_THREADS; i++) { 2407 WaitForSingleObject ( thread[i], TEST_TIMEOUT * 1000 ); 2408 } 2409 } 2410 2411 static void test_WSASocket(void) 2412 { 2413 SOCKET sock = INVALID_SOCKET; 2414 WSAPROTOCOL_INFOA *pi; 2415 int wsaproviders[] = {IPPROTO_TCP, IPPROTO_IP}; 2416 int autoprotocols[] = {IPPROTO_TCP, IPPROTO_UDP}; 2417 int items, err, size, socktype, i, j; 2418 UINT pi_size; 2419 2420 SetLastError(0xdeadbeef); 2421 ok(WSASocketA(0, 0, 0, NULL, 0, 0) == INVALID_SOCKET, 2422 "WSASocketA should have failed\n"); 2423 err = WSAGetLastError(); 2424 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err); 2425 2426 sock = WSASocketA(AF_INET, 0, 0, NULL, 0, 0); 2427 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2428 closesocket(sock); 2429 2430 sock = WSASocketA(AF_INET, SOCK_STREAM, 0, NULL, 0, 0); 2431 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2432 closesocket(sock); 2433 2434 SetLastError(0xdeadbeef); 2435 ok(WSASocketA(0, SOCK_STREAM, -1, NULL, 0, 0) == INVALID_SOCKET, 2436 "WSASocketA should have failed\n"); 2437 err = WSAGetLastError(); 2438 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); 2439 2440 SetLastError(0xdeadbeef); 2441 ok(WSASocketA(0, -1, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET, 2442 "WSASocketA should have failed\n"); 2443 err = WSAGetLastError(); 2444 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err); 2445 2446 SetLastError(0xdeadbeef); 2447 ok(WSASocketA(0, -1, 0, NULL, 0, 0) == INVALID_SOCKET, 2448 "WSASocketA should have failed\n"); 2449 err = WSAGetLastError(); 2450 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err); 2451 2452 SetLastError(0xdeadbeef); 2453 ok(WSASocketA(AF_INET, -1, 0, NULL, 0, 0) == INVALID_SOCKET, 2454 "WSASocketA should have failed\n"); 2455 err = WSAGetLastError(); 2456 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err); 2457 2458 SetLastError(0xdeadbeef); 2459 ok(WSASocketA(AF_INET, 0, -1, NULL, 0, 0) == INVALID_SOCKET, 2460 "WSASocketA should have failed\n"); 2461 err = WSAGetLastError(); 2462 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); 2463 2464 SetLastError(0xdeadbeef); 2465 ok(WSASocketA(0, -1, -1, NULL, 0, 0) == INVALID_SOCKET, 2466 "WSASocketA should have failed\n"); 2467 err = WSAGetLastError(); 2468 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err); 2469 2470 SetLastError(0xdeadbeef); 2471 ok(WSASocketA(-1, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET, 2472 "WSASocketA should have failed\n"); 2473 err = WSAGetLastError(); 2474 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err); 2475 2476 sock = WSASocketA(AF_INET, 0, IPPROTO_TCP, NULL, 0, 0); 2477 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2478 closesocket(sock); 2479 2480 SetLastError(0xdeadbeef); 2481 ok(WSASocketA(0, SOCK_STREAM, 0, NULL, 0, 0) == INVALID_SOCKET, 2482 "WSASocketA should have failed\n"); 2483 err = WSAGetLastError(); 2484 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err); 2485 2486 SetLastError(0xdeadbeef); 2487 ok(WSASocketA(0, 0, 0xdead, NULL, 0, 0) == INVALID_SOCKET, 2488 "WSASocketA should have failed\n"); 2489 err = WSAGetLastError(); 2490 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); 2491 2492 SetLastError(0xdeadbeef); 2493 ok(WSASocketA(AF_INET, 0xdead, 0, NULL, 0, 0) == INVALID_SOCKET, 2494 "WSASocketA should have failed\n"); 2495 err = WSAGetLastError(); 2496 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err); 2497 2498 SetLastError(0xdeadbeef); 2499 ok(WSASocketA(0, 0xdead, 0, NULL, 0, 0) == INVALID_SOCKET, 2500 "WSASocketA should have failed\n"); 2501 err = WSAGetLastError(); 2502 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err); 2503 2504 sock = WSASocketA(0, 0, IPPROTO_TCP, NULL, 0, 0); 2505 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2506 closesocket(sock); 2507 2508 /* SOCK_STREAM does not support IPPROTO_UDP */ 2509 SetLastError(0xdeadbeef); 2510 ok(WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET, 2511 "WSASocketA should have failed\n"); 2512 err = WSAGetLastError(); 2513 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); 2514 2515 /* SOCK_DGRAM does not support IPPROTO_TCP */ 2516 SetLastError(0xdeadbeef); 2517 ok(WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_TCP, NULL, 0, 0) == INVALID_SOCKET, 2518 "WSASocketA should have failed\n"); 2519 err = WSAGetLastError(); 2520 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); 2521 2522 /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA) 2523 * to avoid a crash on win98. 2524 */ 2525 pi_size = 0; 2526 items = WSAEnumProtocolsA(wsaproviders, NULL, &pi_size); 2527 ok(items == SOCKET_ERROR, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n", 2528 items); 2529 err = WSAGetLastError(); 2530 ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n", 2531 err, WSAENOBUFS); 2532 2533 pi = HeapAlloc(GetProcessHeap(), 0, pi_size); 2534 ok(pi != NULL, "Failed to allocate memory\n"); 2535 if (pi == NULL) { 2536 skip("Can't continue without memory.\n"); 2537 return; 2538 } 2539 2540 items = WSAEnumProtocolsA(wsaproviders, pi, &pi_size); 2541 ok(items != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n", 2542 WSAGetLastError()); 2543 2544 if (items == 0) { 2545 skip("No protocols enumerated.\n"); 2546 HeapFree(GetProcessHeap(), 0, pi); 2547 return; 2548 } 2549 2550 sock = WSASocketA(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, 2551 FROM_PROTOCOL_INFO, &pi[0], 0, 0); 2552 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2553 WSAGetLastError()); 2554 closesocket(sock); 2555 2556 /* find what parameters are used first: plain parameters or protocol info struct */ 2557 pi[0].iProtocol = -1; 2558 pi[0].iSocketType = -1; 2559 pi[0].iAddressFamily = -1; 2560 ok(WSASocketA(0, 0, IPPROTO_UDP, &pi[0], 0, 0) == INVALID_SOCKET, 2561 "WSASocketA should have failed\n"); 2562 err = WSAGetLastError(); 2563 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err); 2564 2565 pi[0].iProtocol = 0; 2566 pi[0].iSocketType = 0; 2567 pi[0].iAddressFamily = 0; 2568 sock = WSASocketA(0, 0, IPPROTO_UDP, &pi[0], 0, 0); 2569 if(sock != INVALID_SOCKET) 2570 { 2571 win_skip("must work only in OS <= 2003\n"); 2572 closesocket(sock); 2573 } 2574 else 2575 { 2576 err = WSAGetLastError(); 2577 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err); 2578 } 2579 2580 pi[0].iProtocol = IPPROTO_UDP; 2581 pi[0].iSocketType = SOCK_DGRAM; 2582 pi[0].iAddressFamily = AF_INET; 2583 sock = WSASocketA(0, 0, 0, &pi[0], 0, 0); 2584 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2585 WSAGetLastError()); 2586 size = sizeof(socktype); 2587 socktype = 0xdead; 2588 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2589 ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); 2590 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n", 2591 SOCK_DGRAM, socktype); 2592 closesocket(sock); 2593 2594 sock = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, &pi[0], 0, 0); 2595 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2596 WSAGetLastError()); 2597 size = sizeof(socktype); 2598 socktype = 0xdead; 2599 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2600 ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); 2601 ok(socktype == SOCK_STREAM, "Wrong socket type, expected %d received %d\n", 2602 SOCK_STREAM, socktype); 2603 closesocket(sock); 2604 2605 HeapFree(GetProcessHeap(), 0, pi); 2606 2607 pi_size = 0; 2608 items = WSAEnumProtocolsA(NULL, NULL, &pi_size); 2609 ok(items == SOCKET_ERROR, "WSAEnumProtocolsA(NULL, NULL, 0) returned %d\n", 2610 items); 2611 err = WSAGetLastError(); 2612 ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n", 2613 err, WSAENOBUFS); 2614 2615 pi = HeapAlloc(GetProcessHeap(), 0, pi_size); 2616 ok(pi != NULL, "Failed to allocate memory\n"); 2617 if (pi == NULL) { 2618 skip("Can't continue without memory.\n"); 2619 return; 2620 } 2621 2622 items = WSAEnumProtocolsA(NULL, pi, &pi_size); 2623 ok(items != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n", 2624 WSAGetLastError()); 2625 2626 /* when no protocol and socket type are specified the first entry 2627 * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO 2628 * is returned */ 2629 sock = WSASocketA(AF_INET, 0, 0, NULL, 0, 0); 2630 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2631 WSAGetLastError()); 2632 2633 size = sizeof(socktype); 2634 socktype = 0xdead; 2635 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2636 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 2637 for(i = 0; i < items; i++) 2638 { 2639 if(pi[i].dwProviderFlags & PFL_MATCHES_PROTOCOL_ZERO) 2640 { 2641 ok(socktype == pi[i].iSocketType, "Wrong socket type, expected %d received %d\n", 2642 pi[i].iSocketType, socktype); 2643 break; 2644 } 2645 } 2646 ok(i != items, "Creating a socket without protocol and socket type didn't work\n"); 2647 closesocket(sock); 2648 2649 /* when no socket type is specified the first entry from WSAEnumProtocols 2650 * that matches the protocol is returned */ 2651 for (i = 0; i < sizeof(autoprotocols) / sizeof(autoprotocols[0]); i++) 2652 { 2653 sock = WSASocketA(0, 0, autoprotocols[i], NULL, 0, 0); 2654 ok(sock != INVALID_SOCKET, "Failed to create socket for protocol %d, received %d\n", 2655 autoprotocols[i], WSAGetLastError()); 2656 2657 size = sizeof(socktype); 2658 socktype = 0xdead; 2659 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2660 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 2661 2662 for (err = 1, j = 0; j < items; j++) 2663 { 2664 if (pi[j].iProtocol == autoprotocols[i]) 2665 { 2666 if (socktype == pi[j].iSocketType) 2667 err = 0; 2668 else 2669 ok(0, "Wrong socket type, expected %d received %d\n", 2670 pi[j].iSocketType, socktype); 2671 break; 2672 } 2673 } 2674 ok(!err, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols[i]); 2675 2676 closesocket(sock); 2677 } 2678 2679 HeapFree(GetProcessHeap(), 0, pi); 2680 2681 SetLastError(0xdeadbeef); 2682 /* starting on vista the socket function returns error during the socket 2683 creation and no longer in the socket operations (sendto, readfrom) */ 2684 sock = WSASocketA(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0); 2685 if (sock == INVALID_SOCKET) 2686 { 2687 err = WSAGetLastError(); 2688 ok(err == WSAEACCES, "Expected 10013, received %d\n", err); 2689 skip("SOCK_RAW is not supported\n"); 2690 } 2691 else 2692 { 2693 trace("SOCK_RAW is supported\n"); 2694 2695 size = sizeof(socktype); 2696 socktype = 0xdead; 2697 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2698 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 2699 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n", 2700 SOCK_RAW, socktype); 2701 closesocket(sock); 2702 2703 todo_wine { 2704 sock = WSASocketA(0, 0, IPPROTO_RAW, NULL, 0, 0); 2705 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2706 WSAGetLastError()); 2707 size = sizeof(socktype); 2708 socktype = 0xdead; 2709 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2710 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 2711 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n", 2712 SOCK_RAW, socktype); 2713 closesocket(sock); 2714 } 2715 2716 sock = WSASocketA(AF_INET, SOCK_RAW, IPPROTO_TCP, NULL, 0, 0); 2717 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2718 WSAGetLastError()); 2719 size = sizeof(socktype); 2720 socktype = 0xdead; 2721 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2722 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 2723 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n", 2724 SOCK_RAW, socktype); 2725 closesocket(sock); 2726 } 2727 2728 /* IPX socket tests */ 2729 2730 SetLastError(0xdeadbeef); 2731 sock = WSASocketA(AF_IPX, SOCK_DGRAM, NSPROTO_IPX, NULL, 0, 0); 2732 if (sock == INVALID_SOCKET) 2733 { 2734 err = WSAGetLastError(); 2735 todo_wine_if (err == WSAEPROTONOSUPPORT) 2736 ok(err == WSAEAFNOSUPPORT || broken(err == WSAEPROTONOSUPPORT), "Expected 10047, received %d\n", err); 2737 skip("IPX is not supported\n"); 2738 } 2739 else 2740 { 2741 WSAPROTOCOL_INFOA info; 2742 closesocket(sock); 2743 2744 trace("IPX is supported\n"); 2745 2746 sock = WSASocketA(0, 0, NSPROTO_IPX, NULL, 0, 0); 2747 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2748 WSAGetLastError()); 2749 2750 size = sizeof(socktype); 2751 socktype = 0xdead; 2752 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2753 ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); 2754 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n", 2755 SOCK_DGRAM, socktype); 2756 2757 /* check socket family, type and protocol */ 2758 size = sizeof(WSAPROTOCOL_INFOA); 2759 err = getsockopt(sock, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &info, &size); 2760 ok(!err,"getsockopt failed with %d\n", WSAGetLastError()); 2761 ok(info.iProtocol == NSPROTO_IPX, "expected protocol %d, received %d\n", 2762 NSPROTO_IPX, info.iProtocol); 2763 ok(info.iAddressFamily == AF_IPX, "expected family %d, received %d\n", 2764 AF_IPX, info.iProtocol); 2765 ok(info.iSocketType == SOCK_DGRAM, "expected type %d, received %d\n", 2766 SOCK_DGRAM, info.iSocketType); 2767 closesocket(sock); 2768 2769 /* SOCK_STREAM does not support NSPROTO_IPX */ 2770 SetLastError(0xdeadbeef); 2771 ok(WSASocketA(AF_IPX, SOCK_STREAM, NSPROTO_IPX, NULL, 0, 0) == INVALID_SOCKET, 2772 "WSASocketA should have failed\n"); 2773 err = WSAGetLastError(); 2774 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err); 2775 2776 /* test extended IPX support - that is adding any number between 0 and 255 2777 * to the IPX protocol value will make it be used as IPX packet type */ 2778 for(i = 0;i <= 255;i += 17) 2779 { 2780 SetLastError(0xdeadbeef); 2781 sock = WSASocketA(0, 0, NSPROTO_IPX + i, NULL, 0, 0); 2782 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n", 2783 WSAGetLastError()); 2784 2785 size = sizeof(int); 2786 socktype = -1; 2787 err = getsockopt(sock, NSPROTO_IPX, IPX_PTYPE, (char *) &socktype, &size); 2788 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 2789 ok(socktype == i, "Wrong IPX packet type, expected %d received %d\n", 2790 i, socktype); 2791 2792 closesocket(sock); 2793 } 2794 } 2795 } 2796 2797 static void test_WSADuplicateSocket(void) 2798 { 2799 SOCKET source, dupsock; 2800 WSAPROTOCOL_INFOA info; 2801 DWORD err; 2802 struct sockaddr_in addr; 2803 int socktype, size, addrsize, ret; 2804 char teststr[] = "TEST", buffer[16]; 2805 2806 source = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); 2807 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2808 2809 /* test invalid parameters */ 2810 SetLastError(0xdeadbeef); 2811 ok(WSADuplicateSocketA(0, 0, NULL), "WSADuplicateSocketA should have failed\n"); 2812 err = WSAGetLastError(); 2813 ok(err == WSAENOTSOCK, "expected 10038, received %d\n", err); 2814 2815 SetLastError(0xdeadbeef); 2816 ok(WSADuplicateSocketA(source, 0, NULL), 2817 "WSADuplicateSocketA should have failed\n"); 2818 err = WSAGetLastError(); 2819 ok(err == WSAEINVAL, "expected 10022, received %d\n", err); 2820 2821 SetLastError(0xdeadbeef); 2822 ok(WSADuplicateSocketA(source, ~0, &info), 2823 "WSADuplicateSocketA should have failed\n"); 2824 err = WSAGetLastError(); 2825 ok(err == WSAEINVAL, "expected 10022, received %d\n", err); 2826 2827 SetLastError(0xdeadbeef); 2828 ok(WSADuplicateSocketA(0, GetCurrentProcessId(), &info), 2829 "WSADuplicateSocketA should have failed\n"); 2830 err = WSAGetLastError(); 2831 ok(err == WSAENOTSOCK, "expected 10038, received %d\n", err); 2832 2833 SetLastError(0xdeadbeef); 2834 ok(WSADuplicateSocketA(source, GetCurrentProcessId(), NULL), 2835 "WSADuplicateSocketA should have failed\n"); 2836 err = WSAGetLastError(); 2837 ok(err == WSAEFAULT, "expected 10014, received %d\n", err); 2838 2839 /* test returned structure */ 2840 memset(&info, 0, sizeof(info)); 2841 ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &info), 2842 "WSADuplicateSocketA should have worked\n"); 2843 2844 ok(info.iProtocol == IPPROTO_TCP, "expected protocol %d, received %d\n", 2845 IPPROTO_TCP, info.iProtocol); 2846 ok(info.iAddressFamily == AF_INET, "expected family %d, received %d\n", 2847 AF_INET, info.iProtocol); 2848 ok(info.iSocketType == SOCK_STREAM, "expected type %d, received %d\n", 2849 SOCK_STREAM, info.iSocketType); 2850 2851 dupsock = WSASocketA(0, 0, 0, &info, 0, 0); 2852 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2853 2854 closesocket(dupsock); 2855 closesocket(source); 2856 2857 /* create a socket, bind it, duplicate it then send data on source and 2858 * receive in the duplicated socket */ 2859 source = WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0); 2860 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2861 2862 memset(&info, 0, sizeof(info)); 2863 ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &info), 2864 "WSADuplicateSocketA should have worked\n"); 2865 2866 ok(info.iProtocol == IPPROTO_UDP, "expected protocol %d, received %d\n", 2867 IPPROTO_UDP, info.iProtocol); 2868 ok(info.iAddressFamily == AF_INET, "expected family %d, received %d\n", 2869 AF_INET, info.iProtocol); 2870 ok(info.iSocketType == SOCK_DGRAM, "expected type %d, received %d\n", 2871 SOCK_DGRAM, info.iSocketType); 2872 2873 memset(&addr, 0, sizeof(addr)); 2874 addr.sin_family = AF_INET; 2875 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 2876 ok(!bind(source, (struct sockaddr*)&addr, sizeof(addr)), 2877 "bind should have worked\n"); 2878 2879 /* read address to find out the port number to be used in sendto */ 2880 memset(&addr, 0, sizeof(addr)); 2881 addrsize = sizeof(addr); 2882 ok(!getsockname(source, (struct sockaddr *) &addr, &addrsize), 2883 "getsockname should have worked\n"); 2884 ok(addr.sin_port, "socket port should be != 0\n"); 2885 2886 dupsock = WSASocketA(0, 0, 0, &info, 0, 0); 2887 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2888 2889 size = sizeof(int); 2890 ret = getsockopt(dupsock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size); 2891 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError()); 2892 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n", 2893 SOCK_DGRAM, socktype); 2894 2895 set_blocking(source, TRUE); 2896 2897 /* send data on source socket */ 2898 addrsize = sizeof(addr); 2899 size = sendto(source, teststr, sizeof(teststr), 0, (struct sockaddr *) &addr, addrsize); 2900 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError()); 2901 2902 /* receive on duplicated socket */ 2903 addrsize = sizeof(addr); 2904 memset(buffer, 0, sizeof(buffer)); 2905 size = recvfrom(dupsock, buffer, sizeof(teststr), 0, (struct sockaddr *) &addr, &addrsize); 2906 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError()); 2907 buffer[sizeof(teststr) - 1] = 0; 2908 ok(!strcmp(buffer, teststr), "expected '%s', received '%s'\n", teststr, buffer); 2909 2910 closesocket(dupsock); 2911 closesocket(source); 2912 2913 /* show that the source socket need to be bound before the duplicated 2914 * socket is created */ 2915 source = WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0); 2916 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2917 2918 memset(&info, 0, sizeof(info)); 2919 ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &info), 2920 "WSADuplicateSocketA should have worked\n"); 2921 2922 dupsock = WSASocketA(0, 0, 0, &info, 0, 0); 2923 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n"); 2924 2925 memset(&addr, 0, sizeof(addr)); 2926 addr.sin_family = AF_INET; 2927 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 2928 ok(!bind(source, (struct sockaddr*)&addr, sizeof(addr)), 2929 "bind should have worked\n"); 2930 2931 /* read address to find out the port number to be used in sendto */ 2932 memset(&addr, 0, sizeof(addr)); 2933 addrsize = sizeof(addr); 2934 ok(!getsockname(source, (struct sockaddr *) &addr, &addrsize), 2935 "getsockname should have worked\n"); 2936 ok(addr.sin_port, "socket port should be != 0\n"); 2937 2938 set_blocking(source, TRUE); 2939 2940 addrsize = sizeof(addr); 2941 size = sendto(source, teststr, sizeof(teststr), 0, (struct sockaddr *) &addr, addrsize); 2942 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError()); 2943 2944 SetLastError(0xdeadbeef); 2945 addrsize = sizeof(addr); 2946 memset(buffer, 0, sizeof(buffer)); 2947 todo_wine { 2948 ok(recvfrom(dupsock, buffer, sizeof(teststr), 0, (struct sockaddr *) &addr, &addrsize) == -1, 2949 "recvfrom should have failed\n"); 2950 err = WSAGetLastError(); 2951 ok(err == WSAEINVAL, "expected 10022, received %d\n", err); 2952 } 2953 2954 closesocket(dupsock); 2955 closesocket(source); 2956 } 2957 2958 static void test_WSAEnumNetworkEvents(void) 2959 { 2960 SOCKET s, s2; 2961 int sock_type[] = {SOCK_STREAM, SOCK_DGRAM, SOCK_STREAM}, i, j, k, l; 2962 struct sockaddr_in address; 2963 HANDLE event; 2964 WSANETWORKEVENTS net_events; 2965 2966 memset(&address, 0, sizeof(address)); 2967 address.sin_addr.s_addr = htonl(INADDR_ANY); 2968 address.sin_family = AF_INET; 2969 2970 /* This test follows the steps from bugs 10204 and 24946 */ 2971 for (l = 0; l < 2; l++) 2972 { 2973 for (i = 0; i < sizeof(sock_type) / sizeof(sock_type[0]); i++) 2974 { 2975 if (i == 2) 2976 ok(!tcp_socketpair(&s, &s2), "Test[%d]: creating socket pair failed\n", i); 2977 else 2978 { 2979 s = socket(AF_INET, sock_type[i], 0); 2980 ok (s != SOCKET_ERROR, "Test[%d]: failed to create socket\n", i); 2981 ok (!bind(s, (struct sockaddr*) &address, sizeof(address)), "Test[%d]: bind failed\n", i); 2982 } 2983 event = WSACreateEvent(); 2984 ok (event != NULL, "Test[%d]: failed to create event\n", i); 2985 for (j = 0; j < 5; j++) /* Repeat sometimes and the result must be the same */ 2986 { 2987 /* When the TCP socket is not connected NO events will be returned. 2988 * When connected and no data pending it will get the write event. 2989 * UDP sockets don't have connections so as soon as they are bound 2990 * they can read/write data. Since nobody is sendind us data only 2991 * the write event will be returned and ONLY once. 2992 */ 2993 ok (!WSAEventSelect(s, event, FD_READ | FD_WRITE), "Test[%d]: WSAEventSelect failed\n", i); 2994 memset(&net_events, 0xAB, sizeof(net_events)); 2995 ok (!WSAEnumNetworkEvents(s, l == 0 ? event : NULL, &net_events), 2996 "Test[%d]: WSAEnumNetworkEvents failed\n", i); 2997 if (i >= 1 && j == 0) /* FD_WRITE is SET on first try for UDP and connected TCP */ 2998 { 2999 todo_wine_if (i == 0 || net_events.lNetworkEvents == 0) 3000 ok (net_events.lNetworkEvents == FD_WRITE, "Test[%d]: expected 2, got %d\n", 3001 i, net_events.lNetworkEvents); 3002 } 3003 else 3004 { 3005 todo_wine_if (i != 0 && net_events.lNetworkEvents != 0) 3006 ok (net_events.lNetworkEvents == 0, "Test[%d]: expected 0, got %d\n", 3007 i, net_events.lNetworkEvents); 3008 } 3009 for (k = 0; k < FD_MAX_EVENTS; k++) 3010 { 3011 if (net_events.lNetworkEvents & (1 << k)) 3012 { 3013 ok (net_events.iErrorCode[k] == 0x0, "Test[%d][%d]: expected 0x0, got 0x%x\n", 3014 i, k, net_events.iErrorCode[k]); 3015 } 3016 else 3017 { 3018 /* Bits that are not set in lNetworkEvents MUST not be changed */ 3019 ok (net_events.iErrorCode[k] == 0xABABABAB, "Test[%d][%d]: expected 0xABABABAB, got 0x%x\n", 3020 i, k, net_events.iErrorCode[k]); 3021 } 3022 } 3023 } 3024 closesocket(s); 3025 WSACloseEvent(event); 3026 if (i == 2) closesocket(s2); 3027 } 3028 } 3029 } 3030 3031 static void test_WSAAddressToStringA(void) 3032 { 3033 SOCKET v6 = INVALID_SOCKET; 3034 INT ret; 3035 DWORD len; 3036 int GLE; 3037 SOCKADDR_IN sockaddr; 3038 CHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */ 3039 3040 CHAR expect1[] = "0.0.0.0"; 3041 CHAR expect2[] = "255.255.255.255"; 3042 CHAR expect3[] = "0.0.0.0:65535"; 3043 CHAR expect4[] = "255.255.255.255:65535"; 3044 3045 SOCKADDR_IN6 sockaddr6; 3046 CHAR address6[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */ 3047 3048 CHAR addr6_1[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 3049 CHAR addr6_2[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 3050 CHAR addr6_3[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01}; 3051 3052 CHAR expect6_1[] = "::1"; 3053 CHAR expect6_2[] = "20ab::1"; 3054 CHAR expect6_3[] = "[20ab::2001]:33274"; 3055 CHAR expect6_3_2[] = "[20ab::2001%4660]:33274"; 3056 CHAR expect6_3_3[] = "20ab::2001%4660"; 3057 3058 len = 0; 3059 3060 sockaddr.sin_family = AF_INET; 3061 sockaddr.sin_port = 0; 3062 sockaddr.sin_addr.s_addr = 0; 3063 3064 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3065 GLE = WSAGetLastError(); 3066 ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0), 3067 "WSAAddressToStringA() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n", 3068 GLE, ret ); 3069 3070 len = sizeof(address); 3071 3072 sockaddr.sin_family = AF_INET; 3073 sockaddr.sin_port = 0; 3074 sockaddr.sin_addr.s_addr = 0; 3075 3076 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3077 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3078 3079 ok( !strcmp( address, expect1 ), "Expected: %s, got: %s\n", expect1, address ); 3080 ok( len == sizeof( expect1 ), "Got size %d\n", len); 3081 3082 len = sizeof(address); 3083 3084 sockaddr.sin_family = AF_INET; 3085 sockaddr.sin_port = 0; 3086 sockaddr.sin_addr.s_addr = 0xffffffff; 3087 3088 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3089 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3090 3091 ok( !strcmp( address, expect2 ), "Expected: %s, got: %s\n", expect2, address ); 3092 3093 len = sizeof(address); 3094 3095 sockaddr.sin_family = AF_INET; 3096 sockaddr.sin_port = 0xffff; 3097 sockaddr.sin_addr.s_addr = 0; 3098 3099 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3100 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3101 3102 ok( !strcmp( address, expect3 ), "Expected: %s, got: %s\n", expect3, address ); 3103 3104 len = sizeof(address); 3105 3106 sockaddr.sin_family = AF_INET; 3107 sockaddr.sin_port = 0xffff; 3108 sockaddr.sin_addr.s_addr = 0xffffffff; 3109 3110 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3111 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3112 3113 ok( !strcmp( address, expect4 ), "Expected: %s, got: %s\n", expect4, address ); 3114 ok( len == sizeof( expect4 ), "Got size %d\n", len); 3115 3116 /*check to see it IPv6 is available */ 3117 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); 3118 if (v6 == INVALID_SOCKET) { 3119 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n", 3120 WSAGetLastError(), WSAEAFNOSUPPORT); 3121 goto end; 3122 } 3123 /* Test a short IPv6 address */ 3124 len = sizeof(address6); 3125 3126 sockaddr6.sin6_family = AF_INET6; 3127 sockaddr6.sin6_port = 0x0000; 3128 sockaddr6.sin6_scope_id = 0; 3129 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1)); 3130 3131 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3132 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3133 ok( !strcmp( address6, expect6_1 ), "Expected: %s, got: %s\n", expect6_1, address6 ); 3134 ok( len == sizeof(expect6_1), "Got size %d\n", len); 3135 3136 /* Test a longer IPv6 address */ 3137 len = sizeof(address6); 3138 3139 sockaddr6.sin6_family = AF_INET6; 3140 sockaddr6.sin6_port = 0x0000; 3141 sockaddr6.sin6_scope_id = 0; 3142 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2)); 3143 3144 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3145 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3146 ok( !strcmp( address6, expect6_2 ), "Expected: %s, got: %s\n", expect6_2, address6 ); 3147 ok( len == sizeof(expect6_2), "Got size %d\n", len); 3148 3149 /* Test IPv6 address and port number */ 3150 len = sizeof(address6); 3151 3152 sockaddr6.sin6_family = AF_INET6; 3153 sockaddr6.sin6_port = 0xfa81; 3154 sockaddr6.sin6_scope_id = 0; 3155 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3)); 3156 3157 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3158 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3159 ok( !strcmp( address6, expect6_3 ), "Expected: %s, got: %s\n", expect6_3, address6 ); 3160 ok( len == sizeof(expect6_3), "Got size %d\n", len ); 3161 3162 /* Test IPv6 address, port number and scope_id */ 3163 len = sizeof(address6); 3164 3165 sockaddr6.sin6_family = AF_INET6; 3166 sockaddr6.sin6_port = 0xfa81; 3167 sockaddr6.sin6_scope_id = 0x1234; 3168 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3)); 3169 3170 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3171 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3172 ok( !strcmp( address6, expect6_3_2 ), "Expected: %s, got: %s\n", expect6_3_2, address6 ); 3173 ok( len == sizeof(expect6_3_2), "Got size %d\n", len ); 3174 3175 /* Test IPv6 address and scope_id */ 3176 len = sizeof(address6); 3177 3178 sockaddr6.sin6_family = AF_INET6; 3179 sockaddr6.sin6_port = 0x0000; 3180 sockaddr6.sin6_scope_id = 0x1234; 3181 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3)); 3182 3183 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3184 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() ); 3185 ok( !strcmp( address6, expect6_3_3 ), "Expected: %s, got: %s\n", expect6_3_3, address6 ); 3186 ok( len == sizeof(expect6_3_3), "Got size %d\n", len ); 3187 3188 end: 3189 if (v6 != INVALID_SOCKET) 3190 closesocket(v6); 3191 } 3192 3193 static void test_WSAAddressToStringW(void) 3194 { 3195 SOCKET v6 = INVALID_SOCKET; 3196 INT ret; 3197 DWORD len; 3198 int GLE; 3199 SOCKADDR_IN sockaddr; 3200 WCHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */ 3201 3202 WCHAR expect1[] = { '0','.','0','.','0','.','0', 0 }; 3203 WCHAR expect2[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 }; 3204 WCHAR expect3[] = { '0','.','0','.','0','.','0', ':', '6', '5', '5', '3', '5', 0 }; 3205 WCHAR expect4[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':', 3206 '6', '5', '5', '3', '5', 0 }; 3207 3208 SOCKADDR_IN6 sockaddr6; 3209 WCHAR address6[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */ 3210 3211 CHAR addr6_1[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 3212 CHAR addr6_2[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 3213 CHAR addr6_3[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01}; 3214 3215 WCHAR expect6_1[] = {':',':','1',0}; 3216 WCHAR expect6_2[] = {'2','0','a','b',':',':','1',0}; 3217 WCHAR expect6_3[] = {'[','2','0','a','b',':',':','2','0','0','1',']',':','3','3','2','7','4',0}; 3218 WCHAR expect6_3_2[] = {'[','2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',']',':','3','3','2','7','4',0}; 3219 WCHAR expect6_3_3[] = {'2','0','a','b',':',':','2','0','0','1','%','6','5','5','3','4',0}; 3220 3221 len = 0; 3222 3223 sockaddr.sin_family = AF_INET; 3224 sockaddr.sin_port = 0; 3225 sockaddr.sin_addr.s_addr = 0; 3226 3227 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3228 GLE = WSAGetLastError(); 3229 ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0), 3230 "WSAAddressToStringW() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n", 3231 GLE, ret ); 3232 3233 len = sizeof(address); 3234 3235 sockaddr.sin_family = AF_INET; 3236 sockaddr.sin_port = 0; 3237 sockaddr.sin_addr.s_addr = 0; 3238 3239 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3240 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3241 3242 ok( !lstrcmpW( address, expect1 ), "Expected different address string\n" ); 3243 ok( len == sizeof( expect1 )/sizeof( WCHAR ), "Got size %d\n", len); 3244 3245 len = sizeof(address); 3246 3247 sockaddr.sin_family = AF_INET; 3248 sockaddr.sin_port = 0; 3249 sockaddr.sin_addr.s_addr = 0xffffffff; 3250 3251 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3252 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3253 3254 ok( !lstrcmpW( address, expect2 ), "Expected different address string\n" ); 3255 3256 len = sizeof(address); 3257 3258 sockaddr.sin_family = AF_INET; 3259 sockaddr.sin_port = 0xffff; 3260 sockaddr.sin_addr.s_addr = 0; 3261 3262 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3263 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3264 3265 ok( !lstrcmpW( address, expect3 ), "Expected different address string\n" ); 3266 3267 len = sizeof(address); 3268 3269 sockaddr.sin_family = AF_INET; 3270 sockaddr.sin_port = 0xffff; 3271 sockaddr.sin_addr.s_addr = 0xffffffff; 3272 3273 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len ); 3274 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3275 3276 ok( !lstrcmpW( address, expect4 ), "Expected different address string\n" ); 3277 ok( len == sizeof( expect4 )/sizeof( WCHAR ), "Got %d\n", len); 3278 3279 /*check to see it IPv6 is available */ 3280 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); 3281 if (v6 == INVALID_SOCKET) { 3282 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n", 3283 WSAGetLastError(), WSAEAFNOSUPPORT); 3284 goto end; 3285 } 3286 3287 /* Test a short IPv6 address */ 3288 len = sizeof(address6)/sizeof(WCHAR); 3289 3290 sockaddr6.sin6_family = AF_INET6; 3291 sockaddr6.sin6_port = 0x0000; 3292 sockaddr6.sin6_scope_id = 0; 3293 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1)); 3294 3295 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3296 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3297 ok( !lstrcmpW( address6, expect6_1 ), "Wrong string returned\n" ); 3298 ok( len == sizeof(expect6_1)/sizeof(WCHAR), "Got %d\n", len); 3299 3300 /* Test a longer IPv6 address */ 3301 len = sizeof(address6)/sizeof(WCHAR); 3302 3303 sockaddr6.sin6_family = AF_INET6; 3304 sockaddr6.sin6_port = 0x0000; 3305 sockaddr6.sin6_scope_id = 0; 3306 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2)); 3307 3308 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3309 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3310 3311 ok( !lstrcmpW( address6, expect6_2 ), "Wrong string returned\n" ); 3312 ok( len == sizeof(expect6_2)/sizeof(WCHAR), "Got %d\n", len); 3313 3314 /* Test IPv6 address and port number */ 3315 len = sizeof(address6)/sizeof(WCHAR); 3316 3317 sockaddr6.sin6_family = AF_INET6; 3318 sockaddr6.sin6_port = 0xfa81; 3319 sockaddr6.sin6_scope_id = 0; 3320 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3)); 3321 3322 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3323 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3324 ok( !lstrcmpW( address6, expect6_3 ), 3325 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3), wine_dbgstr_w(address6) ); 3326 ok( len == sizeof(expect6_3)/sizeof(WCHAR), "Got %d\n", len ); 3327 3328 /* Test IPv6 address, port number and scope_id */ 3329 len = sizeof(address6)/sizeof(WCHAR); 3330 3331 sockaddr6.sin6_family = AF_INET6; 3332 sockaddr6.sin6_port = 0xfa81; 3333 sockaddr6.sin6_scope_id = 0x1234; 3334 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3)); 3335 3336 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3337 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3338 ok( !lstrcmpW( address6, expect6_3_2 ), 3339 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_2), wine_dbgstr_w(address6) ); 3340 ok( len == sizeof(expect6_3_2)/sizeof(WCHAR), "Got %d\n", len ); 3341 3342 /* Test IPv6 address and scope_id */ 3343 len = sizeof(address6)/sizeof(WCHAR); 3344 3345 sockaddr6.sin6_family = AF_INET6; 3346 sockaddr6.sin6_port = 0x0000; 3347 sockaddr6.sin6_scope_id = 0xfffe; 3348 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3)); 3349 3350 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len ); 3351 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() ); 3352 ok( !lstrcmpW( address6, expect6_3_3 ), 3353 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_3), wine_dbgstr_w(address6) ); 3354 ok( len == sizeof(expect6_3_3)/sizeof(WCHAR), "Got %d\n", len ); 3355 3356 end: 3357 if (v6 != INVALID_SOCKET) 3358 closesocket(v6); 3359 } 3360 3361 static void test_WSAStringToAddressA(void) 3362 { 3363 INT ret, len; 3364 SOCKADDR_IN sockaddr; 3365 SOCKADDR_IN6 sockaddr6; 3366 int GLE; 3367 3368 CHAR address1[] = "0.0.0.0"; 3369 CHAR address2[] = "127.127.127.127"; 3370 CHAR address3[] = "255.255.255.255"; 3371 CHAR address4[] = "127.127.127.127:65535"; 3372 CHAR address5[] = "255.255.255.255:65535"; 3373 CHAR address6[] = "::1"; 3374 CHAR address7[] = "[::1]"; 3375 CHAR address8[] = "[::1]:65535"; 3376 CHAR address9[] = "2001::1"; 3377 3378 len = 0; 3379 sockaddr.sin_family = AF_INET; 3380 3381 ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3382 ok( ret == SOCKET_ERROR, "WSAStringToAddressA() succeeded unexpectedly: %d\n", 3383 WSAGetLastError() ); 3384 3385 len = sizeof(sockaddr); 3386 sockaddr.sin_port = 0; 3387 sockaddr.sin_addr.s_addr = 0; 3388 3389 ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3390 ok( !ret && sockaddr.sin_addr.s_addr == 0, 3391 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() ); 3392 3393 len = sizeof(sockaddr); 3394 sockaddr.sin_port = 0; 3395 sockaddr.sin_addr.s_addr = 0; 3396 3397 ret = WSAStringToAddressA( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3398 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f, 3399 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() ); 3400 3401 len = sizeof(sockaddr); 3402 sockaddr.sin_port = 0; 3403 sockaddr.sin_addr.s_addr = 0; 3404 3405 ret = WSAStringToAddressA( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3406 GLE = WSAGetLastError(); 3407 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || 3408 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), 3409 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE ); 3410 3411 len = sizeof(sockaddr); 3412 sockaddr.sin_port = 0; 3413 sockaddr.sin_addr.s_addr = 0; 3414 3415 ret = WSAStringToAddressA( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3416 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff, 3417 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() ); 3418 3419 len = sizeof(sockaddr); 3420 sockaddr.sin_port = 0; 3421 sockaddr.sin_addr.s_addr = 0; 3422 3423 ret = WSAStringToAddressA( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3424 GLE = WSAGetLastError(); 3425 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || 3426 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), 3427 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE ); 3428 3429 len = sizeof(sockaddr); 3430 3431 ret = WSAStringToAddressA( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3432 GLE = WSAGetLastError(); 3433 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), 3434 "WSAStringToAddressA() should have failed with %d\n", GLE ); 3435 3436 len = sizeof(sockaddr6); 3437 memset(&sockaddr6, 0, len); 3438 sockaddr6.sin6_family = AF_INET6; 3439 3440 ret = WSAStringToAddressA( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, 3441 &len ); 3442 if (ret == SOCKET_ERROR) 3443 { 3444 win_skip("IPv6 not supported\n"); 3445 return; 3446 } 3447 3448 GLE = WSAGetLastError(); 3449 ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE); 3450 3451 len = sizeof(sockaddr6); 3452 memset(&sockaddr6, 0, len); 3453 sockaddr6.sin6_family = AF_INET6; 3454 3455 ret = WSAStringToAddressA( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, 3456 &len ); 3457 GLE = WSAGetLastError(); 3458 ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE); 3459 3460 len = sizeof(sockaddr6); 3461 memset(&sockaddr6, 0, len); 3462 sockaddr6.sin6_family = AF_INET6; 3463 3464 ret = WSAStringToAddressA( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, 3465 &len ); 3466 GLE = WSAGetLastError(); 3467 ok( ret == 0 && sockaddr6.sin6_port == 0xffff, 3468 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE); 3469 3470 len = sizeof(sockaddr6); 3471 3472 ret = WSAStringToAddressA( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); 3473 GLE = WSAGetLastError(); 3474 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), 3475 "WSAStringToAddressW() should have failed with %d\n", GLE ); 3476 3477 len = sizeof(sockaddr6); 3478 3479 ret = WSAStringToAddressA( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); 3480 GLE = WSAGetLastError(); 3481 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), 3482 "WSAStringToAddressW() should have failed with %d\n", GLE ); 3483 } 3484 3485 static void test_WSAStringToAddressW(void) 3486 { 3487 INT ret, len; 3488 SOCKADDR_IN sockaddr, *sin; 3489 SOCKADDR_IN6 sockaddr6; 3490 SOCKADDR_STORAGE sockaddr_storage; 3491 int GLE; 3492 3493 WCHAR address1[] = { '0','.','0','.','0','.','0', 0 }; 3494 WCHAR address2[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 }; 3495 WCHAR address3[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 }; 3496 WCHAR address4[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 3497 ':', '6', '5', '5', '3', '5', 0 }; 3498 WCHAR address5[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':', 3499 '6', '5', '5', '3', '5', 0 }; 3500 WCHAR address6[] = {':',':','1','\0'}; 3501 WCHAR address7[] = {'[',':',':','1',']','\0'}; 3502 WCHAR address8[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'}; 3503 WCHAR address9[] = {'2','0','0','1',':',':','1','\0'}; 3504 3505 len = 0; 3506 sockaddr.sin_family = AF_INET; 3507 3508 ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3509 ok( ret == SOCKET_ERROR, "WSAStringToAddressW() failed unexpectedly: %d\n", 3510 WSAGetLastError() ); 3511 3512 len = sizeof(sockaddr); 3513 sockaddr.sin_port = 0; 3514 sockaddr.sin_addr.s_addr = 0; 3515 3516 ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3517 ok( !ret && sockaddr.sin_addr.s_addr == 0, 3518 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() ); 3519 3520 len = sizeof(sockaddr); 3521 sockaddr.sin_port = 0; 3522 sockaddr.sin_addr.s_addr = 0; 3523 3524 ret = WSAStringToAddressW( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3525 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f, 3526 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() ); 3527 3528 len = sizeof(sockaddr); 3529 sockaddr.sin_port = 0; 3530 sockaddr.sin_addr.s_addr = 0; 3531 3532 ret = WSAStringToAddressW( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3533 GLE = WSAGetLastError(); 3534 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || 3535 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), 3536 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); 3537 3538 len = sizeof(sockaddr); 3539 sockaddr.sin_port = 0; 3540 sockaddr.sin_addr.s_addr = 0; 3541 3542 ret = WSAStringToAddressW( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3543 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff, 3544 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() ); 3545 3546 len = sizeof(sockaddr); 3547 sockaddr.sin_port = 0; 3548 sockaddr.sin_addr.s_addr = 0; 3549 3550 ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3551 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || 3552 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), 3553 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); 3554 3555 /* Test with a larger buffer than necessary */ 3556 len = sizeof(sockaddr_storage); 3557 sin = (SOCKADDR_IN *)&sockaddr_storage; 3558 sin->sin_port = 0; 3559 sin->sin_addr.s_addr = 0; 3560 3561 ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)sin, &len ); 3562 ok( (ret == 0 && sin->sin_addr.s_addr == 0xffffffff && sin->sin_port == 0xffff) || 3563 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), 3564 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); 3565 ok( len == sizeof(SOCKADDR_IN), "unexpected length %d\n", len ); 3566 3567 len = sizeof(sockaddr); 3568 3569 ret = WSAStringToAddressW( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); 3570 GLE = WSAGetLastError(); 3571 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), 3572 "WSAStringToAddressW() should have failed with %d\n", GLE ); 3573 3574 len = sizeof(sockaddr6); 3575 memset(&sockaddr6, 0, len); 3576 sockaddr6.sin6_family = AF_INET6; 3577 3578 ret = WSAStringToAddressW( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, 3579 &len ); 3580 if (ret == SOCKET_ERROR) 3581 { 3582 win_skip("IPv6 not supported\n"); 3583 return; 3584 } 3585 3586 GLE = WSAGetLastError(); 3587 ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE); 3588 3589 len = sizeof(sockaddr6); 3590 memset(&sockaddr6, 0, len); 3591 sockaddr6.sin6_family = AF_INET6; 3592 3593 ret = WSAStringToAddressW( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, 3594 &len ); 3595 GLE = WSAGetLastError(); 3596 ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE); 3597 3598 len = sizeof(sockaddr6); 3599 memset(&sockaddr6, 0, len); 3600 sockaddr6.sin6_family = AF_INET6; 3601 3602 ret = WSAStringToAddressW( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, 3603 &len ); 3604 GLE = WSAGetLastError(); 3605 ok( ret == 0 && sockaddr6.sin6_port == 0xffff, 3606 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE); 3607 3608 len = sizeof(sockaddr6); 3609 3610 ret = WSAStringToAddressW( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); 3611 GLE = WSAGetLastError(); 3612 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), 3613 "WSAStringToAddressW() should have failed with %d\n", GLE ); 3614 3615 len = sizeof(sockaddr6); 3616 3617 ret = WSAStringToAddressW( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); 3618 GLE = WSAGetLastError(); 3619 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), 3620 "WSAStringToAddressW() should have failed with %d\n", GLE ); 3621 } 3622 3623 static DWORD WINAPI SelectReadThread(void *param) 3624 { 3625 select_thread_params *par = param; 3626 fd_set readfds; 3627 int ret; 3628 struct sockaddr_in addr; 3629 struct timeval select_timeout; 3630 3631 memset(&readfds, 0, sizeof(readfds)); 3632 FD_ZERO(&readfds); 3633 FD_SET(par->s, &readfds); 3634 select_timeout.tv_sec=5; 3635 select_timeout.tv_usec=0; 3636 addr.sin_family = AF_INET; 3637 addr.sin_addr.s_addr = inet_addr(SERVERIP); 3638 addr.sin_port = htons(SERVERPORT); 3639 3640 do_bind(par->s, (struct sockaddr *)&addr, sizeof(addr)); 3641 wsa_ok(listen(par->s, SOMAXCONN ), 0 ==, "SelectReadThread (%x): listen failed: %d\n"); 3642 3643 SetEvent(server_ready); 3644 ret = select(par->s+1, &readfds, NULL, NULL, &select_timeout); 3645 par->ReadKilled = (ret == 1); 3646 3647 return 0; 3648 } 3649 3650 static DWORD WINAPI SelectCloseThread(void *param) 3651 { 3652 SOCKET s = *(SOCKET*)param; 3653 Sleep(500); 3654 closesocket(s); 3655 return 0; 3656 } 3657 3658 static void test_errors(void) 3659 { 3660 SOCKET sock; 3661 SOCKADDR_IN SockAddr; 3662 int ret, err; 3663 3664 WSASetLastError(NO_ERROR); 3665 sock = socket(PF_INET, SOCK_STREAM, 0); 3666 ok( (sock != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() ); 3667 memset(&SockAddr, 0, sizeof(SockAddr)); 3668 SockAddr.sin_family = AF_INET; 3669 SockAddr.sin_port = htons(6924); 3670 SockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 3671 3672 ret = connect(sock, (PSOCKADDR)&SockAddr, sizeof(SockAddr)); 3673 ok( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got: %d\n", ret ); 3674 if (ret == SOCKET_ERROR) 3675 { 3676 err = WSAGetLastError(); 3677 ok( (err == WSAECONNREFUSED), "expected WSAECONNREFUSED, got: %d\n", err ); 3678 } 3679 3680 { 3681 TIMEVAL timeval; 3682 fd_set set = {1, {sock}}; 3683 3684 timeval.tv_sec = 0; 3685 timeval.tv_usec = 50000; 3686 3687 ret = select(1, NULL, &set, NULL, &timeval); 3688 ok( (ret == 0), "expected 0 (timeout), got: %d\n", ret ); 3689 } 3690 3691 ret = closesocket(sock); 3692 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", WSAGetLastError()); 3693 } 3694 3695 static void test_listen(void) 3696 { 3697 SOCKET fdA, fdB; 3698 int ret, acceptc, olen = sizeof(acceptc); 3699 struct sockaddr_in address; 3700 3701 memset(&address, 0, sizeof(address)); 3702 address.sin_addr.s_addr = inet_addr("127.0.0.1"); 3703 address.sin_family = AF_INET; 3704 address.sin_port = htons(SERVERPORT); 3705 3706 /* invalid socket tests */ 3707 SetLastError(0xdeadbeef); 3708 ok ((listen(0, 0) == SOCKET_ERROR), "listen did not fail\n"); 3709 ret = WSAGetLastError(); 3710 ok (ret == WSAENOTSOCK, "expected 10038, received %d\n", ret); 3711 3712 SetLastError(0xdeadbeef); 3713 ok ((listen(0xdeadbeef, 0) == SOCKET_ERROR), "listen did not fail\n"); 3714 ret = WSAGetLastError(); 3715 ok (ret == WSAENOTSOCK, "expected 10038, received %d\n", ret); 3716 3717 /* tcp tests */ 3718 fdA = socket(AF_INET, SOCK_STREAM, 0); 3719 ok ((fdA != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() ); 3720 3721 fdB = socket(AF_INET, SOCK_STREAM, 0); 3722 ok ((fdB != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() ); 3723 3724 SetLastError(0xdeadbeef); 3725 ok ((listen(fdA, -2) == SOCKET_ERROR), "listen did not fail\n"); 3726 ret = WSAGetLastError(); 3727 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret); 3728 3729 SetLastError(0xdeadbeef); 3730 ok ((listen(fdA, 1) == SOCKET_ERROR), "listen did not fail\n"); 3731 ret = WSAGetLastError(); 3732 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret); 3733 3734 SetLastError(0xdeadbeef); 3735 ok ((listen(fdA, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n"); 3736 ret = WSAGetLastError(); 3737 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret); 3738 3739 ok (!bind(fdA, (struct sockaddr*) &address, sizeof(address)), "bind failed\n"); 3740 3741 SetLastError(0xdeadbeef); 3742 ok (bind(fdB, (struct sockaddr*) &address, sizeof(address)), "bind should have failed\n"); 3743 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret); 3744 3745 acceptc = 0xdead; 3746 ret = getsockopt(fdA, SOL_SOCKET, SO_ACCEPTCONN, (char*)&acceptc, &olen); 3747 ok (!ret, "getsockopt failed\n"); 3748 ok (acceptc == 0, "SO_ACCEPTCONN should be 0, received %d\n", acceptc); 3749 3750 ok (!listen(fdA, 0), "listen failed\n"); 3751 ok (!listen(fdA, SOMAXCONN), "double listen failed\n"); 3752 3753 acceptc = 0xdead; 3754 ret = getsockopt(fdA, SOL_SOCKET, SO_ACCEPTCONN, (char*)&acceptc, &olen); 3755 ok (!ret, "getsockopt failed\n"); 3756 ok (acceptc == 1, "SO_ACCEPTCONN should be 1, received %d\n", acceptc); 3757 3758 SetLastError(0xdeadbeef); 3759 ok ((listen(fdB, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n"); 3760 ret = WSAGetLastError(); 3761 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret); 3762 3763 ret = closesocket(fdB); 3764 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret); 3765 3766 fdB = socket(AF_INET, SOCK_STREAM, 0); 3767 ok ((fdB != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() ); 3768 3769 SetLastError(0xdeadbeef); 3770 ok (bind(fdB, (struct sockaddr*) &address, sizeof(address)), "bind should have failed\n"); 3771 ret = WSAGetLastError(); 3772 ok (ret == WSAEADDRINUSE, "expected 10048, received %d\n", ret); 3773 3774 ret = closesocket(fdA); 3775 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret); 3776 ret = closesocket(fdB); 3777 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret); 3778 } 3779 3780 #define FD_ZERO_ALL() { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); } 3781 #define FD_SET_ALL(s) { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); } 3782 static void test_select(void) 3783 { 3784 static char tmp_buf[1024]; 3785 3786 SOCKET fdListen, fdRead, fdWrite; 3787 fd_set readfds, writefds, exceptfds; 3788 unsigned int maxfd; 3789 int ret, len; 3790 char buffer; 3791 struct timeval select_timeout; 3792 struct sockaddr_in address; 3793 select_thread_params thread_params; 3794 HANDLE thread_handle; 3795 DWORD ticks, id; 3796 3797 fdRead = socket(AF_INET, SOCK_STREAM, 0); 3798 ok( (fdRead != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() ); 3799 fdWrite = socket(AF_INET, SOCK_STREAM, 0); 3800 ok( (fdWrite != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() ); 3801 3802 maxfd = fdRead; 3803 if (fdWrite > maxfd) 3804 maxfd = fdWrite; 3805 3806 FD_ZERO_ALL(); 3807 FD_SET_ALL(fdRead); 3808 FD_SET_ALL(fdWrite); 3809 select_timeout.tv_sec=0; 3810 select_timeout.tv_usec=0; 3811 3812 ticks = GetTickCount(); 3813 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout); 3814 ticks = GetTickCount() - ticks; 3815 ok(ret == 0, "select should not return any socket handles\n"); 3816 ok(ticks < 10, "select was blocking for %u ms, expected < 10 ms\n", ticks); 3817 ok(!FD_ISSET(fdRead, &readfds), "FD should not be set\n"); 3818 ok(!FD_ISSET(fdWrite, &writefds), "FD should not be set\n"); 3819 ok(!FD_ISSET(fdRead, &exceptfds), "FD should not be set\n"); 3820 ok(!FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n"); 3821 3822 FD_ZERO_ALL(); 3823 FD_SET_ALL(fdRead); 3824 FD_SET_ALL(fdWrite); 3825 select_timeout.tv_sec=0; 3826 select_timeout.tv_usec=500; 3827 3828 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout); 3829 ok(ret == 0, "select should not return any socket handles\n"); 3830 ok(!FD_ISSET(fdRead, &readfds), "FD should not be set\n"); 3831 ok(!FD_ISSET(fdWrite, &writefds), "FD should not be set\n"); 3832 ok(!FD_ISSET(fdRead, &exceptfds), "FD should not be set\n"); 3833 ok(!FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n"); 3834 3835 ok ((listen(fdWrite, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n"); 3836 ret = closesocket(fdWrite); 3837 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret); 3838 3839 thread_params.s = fdRead; 3840 thread_params.ReadKilled = FALSE; 3841 server_ready = CreateEventA(NULL, TRUE, FALSE, NULL); 3842 thread_handle = CreateThread (NULL, 0, SelectReadThread, &thread_params, 0, &id ); 3843 ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError()); 3844 3845 WaitForSingleObject (server_ready, INFINITE); 3846 Sleep(200); 3847 ret = closesocket(fdRead); 3848 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret); 3849 3850 WaitForSingleObject (thread_handle, 1000); 3851 ok ( thread_params.ReadKilled, "closesocket did not wake up select\n"); 3852 ret = recv(fdRead, &buffer, 1, MSG_PEEK); 3853 ok( (ret == -1), "peek at closed socket expected -1 got %d\n", ret); 3854 3855 /* Test selecting invalid handles */ 3856 FD_ZERO_ALL(); 3857 3858 SetLastError(0); 3859 ret = select(maxfd+1, 0, 0, 0, &select_timeout); 3860 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret); 3861 ok ( WSAGetLastError() == WSAEINVAL, "expected WSAEINVAL, got %i\n", WSAGetLastError()); 3862 3863 SetLastError(0); 3864 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout); 3865 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret); 3866 ok ( WSAGetLastError() == WSAEINVAL, "expected WSAEINVAL, got %i\n", WSAGetLastError()); 3867 3868 FD_SET(INVALID_SOCKET, &readfds); 3869 SetLastError(0); 3870 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout); 3871 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret); 3872 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError()); 3873 ok ( !FD_ISSET(fdRead, &readfds), "FD should not be set\n"); 3874 3875 FD_ZERO(&readfds); 3876 FD_SET(INVALID_SOCKET, &writefds); 3877 SetLastError(0); 3878 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout); 3879 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret); 3880 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError()); 3881 ok ( !FD_ISSET(fdRead, &writefds), "FD should not be set\n"); 3882 3883 FD_ZERO(&writefds); 3884 FD_SET(INVALID_SOCKET, &exceptfds); 3885 SetLastError(0); 3886 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout); 3887 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret); 3888 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError()); 3889 ok ( !FD_ISSET(fdRead, &exceptfds), "FD should not be set\n"); 3890 3891 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n"); 3892 maxfd = fdRead; 3893 if(fdWrite > maxfd) maxfd = fdWrite; 3894 3895 FD_ZERO(&readfds); 3896 FD_SET(fdRead, &readfds); 3897 ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout); 3898 ok(!ret, "select returned %d\n", ret); 3899 3900 FD_ZERO(&writefds); 3901 FD_SET(fdWrite, &writefds); 3902 ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout); 3903 ok(ret == 1, "select returned %d\n", ret); 3904 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n"); 3905 3906 /* tests for overlapping fd_set pointers */ 3907 FD_ZERO(&readfds); 3908 FD_SET(fdWrite, &readfds); 3909 ret = select(fdWrite+1, &readfds, &readfds, NULL, &select_timeout); 3910 ok(ret == 1, "select returned %d\n", ret); 3911 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); 3912 3913 FD_ZERO(&readfds); 3914 FD_SET(fdWrite, &readfds); 3915 FD_SET(fdRead, &readfds); 3916 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); 3917 ok(ret == 2, "select returned %d\n", ret); 3918 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); 3919 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); 3920 3921 ok(send(fdWrite, "test", 4, 0) == 4, "failed to send data\n"); 3922 FD_ZERO(&readfds); 3923 FD_SET(fdRead, &readfds); 3924 ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout); 3925 ok(ret == 1, "select returned %d\n", ret); 3926 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); 3927 3928 FD_ZERO(&readfds); 3929 FD_SET(fdWrite, &readfds); 3930 FD_SET(fdRead, &readfds); 3931 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); 3932 ok(ret == 2, "select returned %d\n", ret); 3933 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); 3934 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); 3935 3936 #if ROSTESTS_233_IS_FIXED 3937 while(1) { 3938 FD_ZERO(&writefds); 3939 FD_SET(fdWrite, &writefds); 3940 ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout); 3941 if(!ret) break; 3942 ok(send(fdWrite, tmp_buf, sizeof(tmp_buf), 0) > 0, "failed to send data\n"); 3943 } 3944 #endif /* ROSTESTS_233_IS_FIXED */ 3945 3946 FD_ZERO(&readfds); 3947 FD_SET(fdWrite, &readfds); 3948 FD_SET(fdRead, &readfds); 3949 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); 3950 ok(ret == 1, "select returned %d\n", ret); 3951 ok(!FD_ISSET(fdWrite, &readfds), "fdWrite socket is in the set\n"); 3952 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); 3953 3954 ok(send(fdRead, "test", 4, 0) == 4, "failed to send data\n"); 3955 Sleep(100); 3956 FD_ZERO(&readfds); 3957 FD_SET(fdWrite, &readfds); 3958 FD_SET(fdRead, &readfds); 3959 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); 3960 ok(ret == 2, "select returned %d\n", ret); 3961 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); 3962 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); 3963 3964 closesocket(fdRead); 3965 closesocket(fdWrite); 3966 3967 /* select() works in 3 distinct states: 3968 * - to check if a connection attempt ended with success or error; 3969 * - to check if a pending connection is waiting for acceptance; 3970 * - to check for data to read, availability for write and OOB data 3971 * 3972 * The tests below ensure that all conditions are tested. 3973 */ 3974 memset(&address, 0, sizeof(address)); 3975 address.sin_addr.s_addr = inet_addr("127.0.0.1"); 3976 address.sin_family = AF_INET; 3977 len = sizeof(address); 3978 fdListen = setup_server_socket(&address, &len); 3979 select_timeout.tv_sec = 1; 3980 select_timeout.tv_usec = 250000; 3981 3982 /* When no events are pending select returns 0 with no error */ 3983 FD_ZERO_ALL(); 3984 FD_SET_ALL(fdListen); 3985 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 3986 ok(ret == 0, "expected 0, got %d\n", ret); 3987 3988 /* When a socket is attempting to connect the listening socket receives the read descriptor */ 3989 fdWrite = setup_connector_socket(&address, len, TRUE); 3990 FD_ZERO_ALL(); 3991 FD_SET_ALL(fdListen); 3992 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 3993 ok(ret == 1, "expected 1, got %d\n", ret); 3994 ok(FD_ISSET(fdListen, &readfds), "fdListen socket is not in the set\n"); 3995 len = sizeof(address); 3996 fdRead = accept(fdListen, (struct sockaddr*) &address, &len); 3997 ok(fdRead != INVALID_SOCKET, "expected a valid socket\n"); 3998 3999 /* The connector is signaled through the write descriptor */ 4000 FD_ZERO_ALL(); 4001 FD_SET_ALL(fdListen); 4002 FD_SET_ALL(fdRead); 4003 FD_SET_ALL(fdWrite); 4004 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 4005 ok(ret == 2, "expected 2, got %d\n", ret); 4006 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n"); 4007 ok(FD_ISSET(fdRead, &writefds), "fdRead socket is not in the set\n"); 4008 len = sizeof(id); 4009 id = 0xdeadbeef; 4010 ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len); 4011 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError()); 4012 ok(id == 0, "expected 0, got %d\n", id); 4013 4014 /* When data is received the receiver gets the read descriptor */ 4015 ret = send(fdWrite, "1234", 4, 0); 4016 ok(ret == 4, "expected 4, got %d\n", ret); 4017 FD_ZERO_ALL(); 4018 FD_SET_ALL(fdListen); 4019 FD_SET(fdRead, &readfds); 4020 FD_SET(fdRead, &exceptfds); 4021 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 4022 ok(ret == 1, "expected 1, got %d\n", ret); 4023 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); 4024 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0); 4025 ok(ret == 4, "expected 4, got %d\n", ret); 4026 ok(!strcmp(tmp_buf, "1234"), "data received differs from sent\n"); 4027 4028 /* When OOB data is received the socket is set in the except descriptor */ 4029 ret = send(fdWrite, "A", 1, MSG_OOB); 4030 ok(ret == 1, "expected 1, got %d\n", ret); 4031 FD_ZERO_ALL(); 4032 FD_SET_ALL(fdListen); 4033 FD_SET(fdRead, &readfds); 4034 FD_SET(fdRead, &exceptfds); 4035 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 4036 ok(ret == 1, "expected 1, got %d\n", ret); 4037 ok(FD_ISSET(fdRead, &exceptfds), "fdRead socket is not in the set\n"); 4038 tmp_buf[0] = 0xAF; 4039 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB); 4040 ok(ret == 1, "expected 1, got %d\n", ret); 4041 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]); 4042 4043 /* If the socket is OOBINLINED it will not receive the OOB in except fds */ 4044 ret = 1; 4045 ret = setsockopt(fdRead, SOL_SOCKET, SO_OOBINLINE, (char*) &ret, sizeof(ret)); 4046 ok(ret == 0, "expected 0, got %d\n", ret); 4047 ret = send(fdWrite, "A", 1, MSG_OOB); 4048 ok(ret == 1, "expected 1, got %d\n", ret); 4049 FD_ZERO_ALL(); 4050 FD_SET_ALL(fdListen); 4051 FD_SET(fdRead, &readfds); 4052 FD_SET(fdRead, &exceptfds); 4053 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 4054 ok(ret == 1, "expected 1, got %d\n", ret); 4055 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); 4056 tmp_buf[0] = 0xAF; 4057 SetLastError(0xdeadbeef); 4058 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB); 4059 ok(ret == SOCKET_ERROR, "expected SOCKET_ERROR, got %d\n", ret); 4060 ok(GetLastError() == WSAEINVAL, "expected 10022, got %d\n", GetLastError()); 4061 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0); 4062 ok(ret == 1, "expected 1, got %d\n", ret); 4063 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]); 4064 4065 /* When the connection is closed the socket is set in the read descriptor */ 4066 ret = closesocket(fdRead); 4067 ok(ret == 0, "expected 0, got %d\n", ret); 4068 FD_ZERO_ALL(); 4069 FD_SET_ALL(fdListen); 4070 FD_SET(fdWrite, &readfds); 4071 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 4072 ok(ret == 1, "expected 1, got %d\n", ret); 4073 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); 4074 ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0); 4075 ok(ret == 0, "expected 0, got %d\n", ret); 4076 4077 /* When a connection is attempted to a non-listening socket it will get to the except descriptor */ 4078 ret = closesocket(fdWrite); 4079 ok(ret == 0, "expected 0, got %d\n", ret); 4080 ret = closesocket(fdListen); 4081 ok(ret == 0, "expected 0, got %d\n", ret); 4082 len = sizeof(address); 4083 fdWrite = setup_connector_socket(&address, len, TRUE); 4084 FD_ZERO_ALL(); 4085 FD_SET(fdWrite, &writefds); 4086 FD_SET(fdWrite, &exceptfds); 4087 select_timeout.tv_sec = 2; /* requires more time to realize it will not connect */ 4088 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 4089 ok(ret == 1, "expected 1, got %d\n", ret); 4090 len = sizeof(id); 4091 id = 0xdeadbeef; 4092 ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len); 4093 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError()); 4094 ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id); 4095 ok(FD_ISSET(fdWrite, &exceptfds), "fdWrite socket is not in the set\n"); 4096 ok(select_timeout.tv_usec == 250000, "select timeout should not have changed\n"); 4097 closesocket(fdWrite); 4098 4099 /* Try select() on a closed socket after connection */ 4100 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n"); 4101 closesocket(fdRead); 4102 FD_ZERO_ALL(); 4103 FD_SET_ALL(fdWrite); 4104 FD_SET_ALL(fdRead); 4105 SetLastError(0xdeadbeef); 4106 ret = select(0, &readfds, NULL, &exceptfds, &select_timeout); 4107 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 4108 todo_wine 4109 ok(GetLastError() == WSAENOTSOCK, "expected 10038, got %d\n", GetLastError()); 4110 /* descriptor sets are unchanged */ 4111 ok(readfds.fd_count == 2, "expected 2, got %d\n", readfds.fd_count); 4112 ok(exceptfds.fd_count == 2, "expected 2, got %d\n", exceptfds.fd_count); 4113 closesocket(fdWrite); 4114 4115 #if ROSTESTS_233_IS_FIXED 4116 4117 /* Close the socket currently being selected in a thread - bug 38399 */ 4118 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n"); 4119 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id); 4120 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError()); 4121 FD_ZERO_ALL(); 4122 FD_SET_ALL(fdWrite); 4123 ret = select(0, &readfds, NULL, &exceptfds, &select_timeout); 4124 ok(ret == 1, "expected 1, got %d\n", ret); 4125 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); 4126 WaitForSingleObject (thread_handle, 1000); 4127 closesocket(fdRead); 4128 /* test again with only the except descriptor */ 4129 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n"); 4130 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id); 4131 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError()); 4132 FD_ZERO_ALL(); 4133 FD_SET(fdWrite, &exceptfds); 4134 SetLastError(0xdeadbeef); 4135 ret = select(0, NULL, NULL, &exceptfds, &select_timeout); 4136 todo_wine 4137 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 4138 todo_wine 4139 ok(GetLastError() == WSAENOTSOCK, "expected 10038, got %d\n", GetLastError()); 4140 WaitForSingleObject (thread_handle, 1000); 4141 closesocket(fdRead); 4142 4143 #endif /* ROSTESTS_233_IS_FIXED */ 4144 4145 /* test UDP behavior of unbound sockets */ 4146 select_timeout.tv_sec = 0; 4147 select_timeout.tv_usec = 250000; 4148 fdWrite = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 4149 ok(fdWrite != INVALID_SOCKET, "socket call failed\n"); 4150 FD_ZERO_ALL(); 4151 FD_SET_ALL(fdWrite); 4152 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout); 4153 ok(ret == 1, "expected 1, got %d\n", ret); 4154 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n"); 4155 closesocket(fdWrite); 4156 } 4157 #undef FD_SET_ALL 4158 #undef FD_ZERO_ALL 4159 4160 static DWORD WINAPI AcceptKillThread(void *param) 4161 { 4162 select_thread_params *par = param; 4163 struct sockaddr_in address; 4164 int len = sizeof(address); 4165 SOCKET client_socket; 4166 4167 SetEvent(server_ready); 4168 client_socket = accept(par->s, (struct sockaddr*) &address, &len); 4169 if (client_socket != INVALID_SOCKET) 4170 closesocket(client_socket); 4171 par->ReadKilled = (client_socket == INVALID_SOCKET); 4172 return 0; 4173 } 4174 4175 4176 static int CALLBACK AlwaysDeferConditionFunc(LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos, 4177 LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData, 4178 GROUP *g, DWORD_PTR dwCallbackData) 4179 { 4180 return CF_DEFER; 4181 } 4182 4183 static SOCKET setup_server_socket(struct sockaddr_in *addr, int *len) 4184 { 4185 int ret, val; 4186 SOCKET server_socket; 4187 4188 server_socket = socket(AF_INET, SOCK_STREAM, 0); 4189 if (server_socket == INVALID_SOCKET) 4190 { 4191 trace("error creating server socket: %d\n", WSAGetLastError()); 4192 return INVALID_SOCKET; 4193 } 4194 4195 val = 1; 4196 ret = setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val)); 4197 if (ret) 4198 { 4199 trace("error setting SO_REUSEADDR: %d\n", WSAGetLastError()); 4200 closesocket(server_socket); 4201 return INVALID_SOCKET; 4202 } 4203 4204 ret = bind(server_socket, (struct sockaddr *)addr, *len); 4205 if (ret) 4206 { 4207 trace("error binding server socket: %d\n", WSAGetLastError()); 4208 } 4209 4210 ret = getsockname(server_socket, (struct sockaddr *)addr, len); 4211 if (ret) 4212 { 4213 skip("failed to lookup bind address: %d\n", WSAGetLastError()); 4214 closesocket(server_socket); 4215 return INVALID_SOCKET; 4216 } 4217 4218 ret = listen(server_socket, 5); 4219 if (ret) 4220 { 4221 trace("error making server socket listen: %d\n", WSAGetLastError()); 4222 closesocket(server_socket); 4223 return INVALID_SOCKET; 4224 } 4225 4226 return server_socket; 4227 } 4228 4229 static SOCKET setup_connector_socket(struct sockaddr_in *addr, int len, BOOL nonblock) 4230 { 4231 int ret; 4232 SOCKET connector; 4233 4234 connector = socket(AF_INET, SOCK_STREAM, 0); 4235 ok(connector != INVALID_SOCKET, "failed to create connector socket %d\n", WSAGetLastError()); 4236 4237 if (nonblock) 4238 set_blocking(connector, !nonblock); 4239 4240 ret = connect(connector, (struct sockaddr *)addr, len); 4241 if (!nonblock) 4242 ok(!ret, "connecting to accepting socket failed %d\n", WSAGetLastError()); 4243 else if (ret == SOCKET_ERROR) 4244 { 4245 DWORD error = WSAGetLastError(); 4246 ok(error == WSAEWOULDBLOCK || error == WSAEINPROGRESS, 4247 "expected 10035 or 10036, got %d\n", error); 4248 } 4249 4250 return connector; 4251 } 4252 4253 static void test_accept(void) 4254 { 4255 int ret; 4256 SOCKET server_socket, accepted = INVALID_SOCKET, connector; 4257 struct sockaddr_in address; 4258 SOCKADDR_STORAGE ss, ss_empty; 4259 int socklen; 4260 select_thread_params thread_params; 4261 HANDLE thread_handle = NULL; 4262 DWORD id; 4263 4264 memset(&address, 0, sizeof(address)); 4265 address.sin_addr.s_addr = inet_addr("127.0.0.1"); 4266 address.sin_family = AF_INET; 4267 4268 socklen = sizeof(address); 4269 server_socket = setup_server_socket(&address, &socklen); 4270 if (server_socket == INVALID_SOCKET) 4271 { 4272 trace("error creating server socket: %d\n", WSAGetLastError()); 4273 return; 4274 } 4275 4276 connector = setup_connector_socket(&address, socklen, FALSE); 4277 if (connector == INVALID_SOCKET) goto done; 4278 4279 trace("Blocking accept next\n"); 4280 4281 accepted = WSAAccept(server_socket, NULL, NULL, AlwaysDeferConditionFunc, 0); 4282 ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError()); 4283 4284 accepted = accept(server_socket, NULL, 0); 4285 ok(accepted != INVALID_SOCKET, "Failed to accept deferred connection, error %d\n", WSAGetLastError()); 4286 4287 server_ready = CreateEventA(NULL, TRUE, FALSE, NULL); 4288 if (server_ready == INVALID_HANDLE_VALUE) 4289 { 4290 trace("error creating event: %d\n", GetLastError()); 4291 goto done; 4292 } 4293 4294 thread_params.s = server_socket; 4295 thread_params.ReadKilled = FALSE; 4296 thread_handle = CreateThread(NULL, 0, AcceptKillThread, &thread_params, 0, &id); 4297 if (thread_handle == NULL) 4298 { 4299 trace("error creating thread: %d\n", GetLastError()); 4300 goto done; 4301 } 4302 4303 WaitForSingleObject(server_ready, INFINITE); 4304 Sleep(200); 4305 ret = closesocket(server_socket); 4306 if (ret != 0) 4307 { 4308 trace("closesocket failed: %d\n", WSAGetLastError()); 4309 goto done; 4310 } 4311 4312 WaitForSingleObject(thread_handle, 1000); 4313 ok(thread_params.ReadKilled, "closesocket did not wake up accept\n"); 4314 4315 closesocket(accepted); 4316 closesocket(connector); 4317 accepted = connector = INVALID_SOCKET; 4318 4319 socklen = sizeof(address); 4320 server_socket = setup_server_socket(&address, &socklen); 4321 if (server_socket == INVALID_SOCKET) goto done; 4322 4323 connector = setup_connector_socket(&address, socklen, FALSE); 4324 if (connector == INVALID_SOCKET) goto done; 4325 4326 socklen = 0; 4327 accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0); 4328 ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError()); 4329 ok(!socklen, "got %d\n", socklen); 4330 closesocket(connector); 4331 connector = INVALID_SOCKET; 4332 4333 socklen = sizeof(address); 4334 connector = setup_connector_socket(&address, socklen, FALSE); 4335 if (connector == INVALID_SOCKET) goto done; 4336 4337 accepted = WSAAccept(server_socket, NULL, NULL, NULL, 0); 4338 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError()); 4339 closesocket(accepted); 4340 closesocket(connector); 4341 accepted = connector = INVALID_SOCKET; 4342 4343 socklen = sizeof(address); 4344 connector = setup_connector_socket(&address, socklen, FALSE); 4345 if (connector == INVALID_SOCKET) goto done; 4346 4347 socklen = sizeof(ss); 4348 memset(&ss, 0, sizeof(ss)); 4349 accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0); 4350 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError()); 4351 ok(socklen != sizeof(ss), "unexpected length\n"); 4352 ok(ss.ss_family, "family not set\n"); 4353 closesocket(accepted); 4354 closesocket(connector); 4355 accepted = connector = INVALID_SOCKET; 4356 4357 socklen = sizeof(address); 4358 connector = setup_connector_socket(&address, socklen, FALSE); 4359 if (connector == INVALID_SOCKET) goto done; 4360 4361 socklen = 0; 4362 accepted = accept(server_socket, (struct sockaddr *)&ss, &socklen); 4363 ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError()); 4364 ok(!socklen, "got %d\n", socklen); 4365 closesocket(connector); 4366 accepted = connector = INVALID_SOCKET; 4367 4368 socklen = sizeof(address); 4369 connector = setup_connector_socket(&address, socklen, FALSE); 4370 if (connector == INVALID_SOCKET) goto done; 4371 4372 accepted = accept(server_socket, NULL, NULL); 4373 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError()); 4374 closesocket(accepted); 4375 closesocket(connector); 4376 accepted = connector = INVALID_SOCKET; 4377 4378 socklen = sizeof(address); 4379 connector = setup_connector_socket(&address, socklen, FALSE); 4380 if (connector == INVALID_SOCKET) goto done; 4381 4382 socklen = sizeof(ss); 4383 memset(&ss, 0, sizeof(ss)); 4384 accepted = accept(server_socket, (struct sockaddr *)&ss, &socklen); 4385 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError()); 4386 ok(socklen != sizeof(ss), "unexpected length\n"); 4387 ok(ss.ss_family, "family not set\n"); 4388 closesocket(accepted); 4389 closesocket(connector); 4390 accepted = connector = INVALID_SOCKET; 4391 4392 socklen = sizeof(address); 4393 connector = setup_connector_socket(&address, socklen, FALSE); 4394 if (connector == INVALID_SOCKET) goto done; 4395 4396 memset(&ss, 0, sizeof(ss)); 4397 memset(&ss_empty, 0, sizeof(ss_empty)); 4398 accepted = accept(server_socket, (struct sockaddr *)&ss, NULL); 4399 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError()); 4400 ok(!memcmp(&ss, &ss_empty, sizeof(ss)), "structure is different\n"); 4401 4402 done: 4403 if (accepted != INVALID_SOCKET) 4404 closesocket(accepted); 4405 if (connector != INVALID_SOCKET) 4406 closesocket(connector); 4407 if (thread_handle != NULL) 4408 CloseHandle(thread_handle); 4409 if (server_ready != INVALID_HANDLE_VALUE) 4410 CloseHandle(server_ready); 4411 if (server_socket != INVALID_SOCKET) 4412 closesocket(server_socket); 4413 } 4414 4415 static void test_extendedSocketOptions(void) 4416 { 4417 WSADATA wsa; 4418 SOCKET sock; 4419 struct sockaddr_in sa; 4420 int sa_len = sizeof(struct sockaddr_in); 4421 int optval, optlen = sizeof(int), ret; 4422 BOOL bool_opt_val; 4423 LINGER linger_val; 4424 4425 if(WSAStartup(MAKEWORD(2,0), &wsa)){ 4426 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError()); 4427 return; 4428 } 4429 4430 memset(&sa, 0, sa_len); 4431 4432 sa.sin_family = AF_INET; 4433 sa.sin_port = htons(0); 4434 sa.sin_addr.s_addr = htonl(INADDR_ANY); 4435 4436 if((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == INVALID_SOCKET) { 4437 trace("Creating the socket failed: %d\n", WSAGetLastError()); 4438 WSACleanup(); 4439 return; 4440 } 4441 4442 if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){ 4443 trace("Failed to bind socket: %d\n", WSAGetLastError()); 4444 closesocket(sock); 4445 WSACleanup(); 4446 return; 4447 } 4448 4449 ret = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optval, &optlen); 4450 4451 ok(ret == 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret); 4452 ok((optval == 65507) || (optval == 65527), 4453 "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval); 4454 4455 /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */ 4456 SetLastError(0xdeadbeef); 4457 optval = 0xdeadbeef; 4458 optlen = sizeof(int); 4459 ret = getsockopt(sock, 0xffffffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen); 4460 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL), 4461 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n", 4462 ret, WSAGetLastError(), optval, optval); 4463 4464 /* more invalid values for level */ 4465 SetLastError(0xdeadbeef); 4466 optval = 0xdeadbeef; 4467 optlen = sizeof(int); 4468 ret = getsockopt(sock, 0x1234ffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen); 4469 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL), 4470 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n", 4471 ret, WSAGetLastError(), optval, optval); 4472 4473 SetLastError(0xdeadbeef); 4474 optval = 0xdeadbeef; 4475 optlen = sizeof(int); 4476 ret = getsockopt(sock, 0x8000ffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen); 4477 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL), 4478 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n", 4479 ret, WSAGetLastError(), optval, optval); 4480 4481 SetLastError(0xdeadbeef); 4482 optval = 0xdeadbeef; 4483 optlen = sizeof(int); 4484 ret = getsockopt(sock, 0x00008000, SO_MAX_MSG_SIZE, (char *)&optval, &optlen); 4485 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL), 4486 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n", 4487 ret, WSAGetLastError(), optval, optval); 4488 4489 SetLastError(0xdeadbeef); 4490 optval = 0xdeadbeef; 4491 optlen = sizeof(int); 4492 ret = getsockopt(sock, 0x00000800, SO_MAX_MSG_SIZE, (char *)&optval, &optlen); 4493 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL), 4494 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n", 4495 ret, WSAGetLastError(), optval, optval); 4496 4497 SetLastError(0xdeadbeef); 4498 optlen = sizeof(LINGER); 4499 ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen); 4500 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAENOPROTOOPT), 4501 "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n", 4502 ret, WSAGetLastError()); 4503 closesocket(sock); 4504 4505 if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) { 4506 trace("Creating the socket failed: %d\n", WSAGetLastError()); 4507 WSACleanup(); 4508 return; 4509 } 4510 4511 if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){ 4512 trace("Failed to bind socket: %d\n", WSAGetLastError()); 4513 closesocket(sock); 4514 WSACleanup(); 4515 return; 4516 } 4517 4518 ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen); 4519 ok(ret == 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret); 4520 4521 optlen = sizeof(BOOL); 4522 ret = getsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (char *)&bool_opt_val, &optlen); 4523 ok(ret == 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret); 4524 ok((linger_val.l_onoff && !bool_opt_val) || (!linger_val.l_onoff && bool_opt_val), 4525 "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n", 4526 bool_opt_val, linger_val.l_onoff); 4527 4528 closesocket(sock); 4529 WSACleanup(); 4530 } 4531 4532 static void test_getsockname(void) 4533 { 4534 WSADATA wsa; 4535 SOCKET sock; 4536 struct sockaddr_in sa_set, sa_get; 4537 int sa_set_len = sizeof(struct sockaddr_in); 4538 int sa_get_len = sa_set_len; 4539 static const unsigned char null_padding[] = {0,0,0,0,0,0,0,0}; 4540 int ret; 4541 struct hostent *h; 4542 4543 if(WSAStartup(MAKEWORD(2,0), &wsa)){ 4544 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError()); 4545 return; 4546 } 4547 4548 memset(&sa_set, 0, sa_set_len); 4549 4550 sa_set.sin_family = AF_INET; 4551 sa_set.sin_port = htons(0); 4552 sa_set.sin_addr.s_addr = htonl(INADDR_ANY); 4553 4554 if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) { 4555 trace("Creating the socket failed: %d\n", WSAGetLastError()); 4556 WSACleanup(); 4557 return; 4558 } 4559 4560 sa_get = sa_set; 4561 if (getsockname(sock, (struct sockaddr*) &sa_get, &sa_get_len) == 0) 4562 ok(0, "getsockname on unbound socket should fail\n"); 4563 else { 4564 ok(WSAGetLastError() == WSAEINVAL, "getsockname on unbound socket " 4565 "failed with %d, expected %d\n", WSAGetLastError(), WSAEINVAL); 4566 ok(memcmp(&sa_get, &sa_set, sizeof(sa_get)) == 0, 4567 "failed getsockname modified sockaddr when it shouldn't\n"); 4568 } 4569 4570 if(bind(sock, (struct sockaddr *) &sa_set, sa_set_len) < 0){ 4571 trace("Failed to bind socket: %d\n", WSAGetLastError()); 4572 closesocket(sock); 4573 WSACleanup(); 4574 return; 4575 } 4576 4577 if(getsockname(sock, (struct sockaddr *) &sa_get, &sa_get_len) != 0){ 4578 trace("Failed to call getsockname: %d\n", WSAGetLastError()); 4579 closesocket(sock); 4580 WSACleanup(); 4581 return; 4582 } 4583 4584 ret = memcmp(sa_get.sin_zero, null_padding, 8); 4585 ok(ret == 0, "getsockname did not zero the sockaddr_in structure\n"); 4586 4587 closesocket(sock); 4588 4589 h = gethostbyname(""); 4590 if (h && h->h_length == 4) /* this test is only meaningful in IPv4 */ 4591 { 4592 int i; 4593 for (i = 0; h->h_addr_list[i]; i++) 4594 { 4595 char ipstr[32]; 4596 struct in_addr ip; 4597 ip.s_addr = *(ULONG *) h->h_addr_list[i]; 4598 4599 sock = socket(AF_INET, SOCK_DGRAM, 0); 4600 ok(sock != INVALID_SOCKET, "socket failed with %d\n", GetLastError()); 4601 4602 memset(&sa_set, 0, sizeof(sa_set)); 4603 sa_set.sin_family = AF_INET; 4604 sa_set.sin_addr.s_addr = ip.s_addr; 4605 /* The same address we bind must be the same address we get */ 4606 ret = bind(sock, (struct sockaddr*)&sa_set, sizeof(sa_set)); 4607 ok(ret == 0, "bind failed with %d\n", GetLastError()); 4608 sa_get_len = sizeof(sa_get); 4609 ret = getsockname(sock, (struct sockaddr*)&sa_get, &sa_get_len); 4610 ok(ret == 0, "getsockname failed with %d\n", GetLastError()); 4611 strcpy(ipstr, inet_ntoa(sa_get.sin_addr)); 4612 trace("testing bind on interface %s\n", ipstr); 4613 ok(sa_get.sin_addr.s_addr == sa_set.sin_addr.s_addr, 4614 "address does not match: %s != %s\n", ipstr, inet_ntoa(sa_set.sin_addr)); 4615 4616 closesocket(sock); 4617 } 4618 } 4619 4620 WSACleanup(); 4621 } 4622 4623 static void test_dns(void) 4624 { 4625 struct hostent *h; 4626 union memaddress 4627 { 4628 char *chr; 4629 void *mem; 4630 } addr; 4631 char **ptr; 4632 int acount; 4633 4634 h = gethostbyname(""); 4635 ok(h != NULL, "gethostbyname(\"\") failed with %d\n", h_errno); 4636 4637 /* Use an address with valid alias names if possible */ 4638 h = gethostbyname("source.winehq.org"); 4639 if(!h) 4640 { 4641 skip("Can't test the hostent structure because gethostbyname failed\n"); 4642 return; 4643 } 4644 4645 /* The returned struct must be allocated in a very strict way. First we need to 4646 * count how many aliases there are because they must be located right after 4647 * the struct hostent size. Knowing the amount of aliases we know the exact 4648 * location of the first IP returned. Rule valid for >= XP, for older OS's 4649 * it's somewhat the opposite. */ 4650 addr.mem = h + 1; 4651 if(h->h_addr_list == addr.mem) /* <= W2K */ 4652 { 4653 win_skip("Skipping hostent tests since this OS is unsupported\n"); 4654 return; 4655 } 4656 4657 ok(h->h_aliases == addr.mem, 4658 "hostent->h_aliases should be in %p, it is in %p\n", addr.mem, h->h_aliases); 4659 4660 for(ptr = h->h_aliases, acount = 1; *ptr; ptr++) acount++; 4661 addr.chr += sizeof(*ptr) * acount; 4662 ok(h->h_addr_list == addr.mem, 4663 "hostent->h_addr_list should be in %p, it is in %p\n", addr.mem, h->h_addr_list); 4664 4665 for(ptr = h->h_addr_list, acount = 1; *ptr; ptr++) acount++; 4666 4667 addr.chr += sizeof(*ptr) * acount; 4668 ok(h->h_addr_list[0] == addr.mem, 4669 "hostent->h_addr_list[0] should be in %p, it is in %p\n", addr.mem, h->h_addr_list[0]); 4670 } 4671 4672 #ifndef __REACTOS__ 4673 /* Our winsock headers don't define gethostname because it conflicts with the 4674 * definition in unistd.h. Define it here to get rid of the warning. */ 4675 4676 int WINAPI gethostname(char *name, int namelen); 4677 #endif 4678 4679 static void test_gethostbyname(void) 4680 { 4681 struct hostent *he; 4682 struct in_addr **addr_list; 4683 char name[256], first_ip[16]; 4684 int ret, i, count; 4685 PMIB_IPFORWARDTABLE routes = NULL; 4686 PIP_ADAPTER_INFO adapters = NULL, k; 4687 DWORD adap_size = 0, route_size = 0; 4688 BOOL found_default = FALSE; 4689 BOOL local_ip = FALSE; 4690 4691 ret = gethostname(name, sizeof(name)); 4692 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError()); 4693 4694 he = gethostbyname(name); 4695 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError()); 4696 #ifdef __REACTOS__ /* ROSTESTS-233 */ 4697 count = 0; 4698 if (he != NULL) 4699 { 4700 #endif 4701 addr_list = (struct in_addr **)he->h_addr_list; 4702 strcpy(first_ip, inet_ntoa(*addr_list[0])); 4703 4704 trace("List of local IPs:\n"); 4705 for(count = 0; addr_list[count] != NULL; count++) 4706 { 4707 char *ip = inet_ntoa(*addr_list[count]); 4708 if (!strcmp(ip, "127.0.0.1")) 4709 local_ip = TRUE; 4710 trace("%s\n", ip); 4711 } 4712 #ifdef __REACTOS__ /* ROSTESTS-233 */ 4713 } 4714 #endif 4715 4716 if (local_ip) 4717 { 4718 ok (count == 1, "expected 127.0.0.1 to be the only IP returned\n"); 4719 skip("Only the loopback address is present, skipping tests\n"); 4720 return; 4721 } 4722 4723 if (!pGetAdaptersInfo || !pGetIpForwardTable) 4724 { 4725 win_skip("GetAdaptersInfo and/or GetIpForwardTable not found, skipping tests\n"); 4726 return; 4727 } 4728 4729 ret = pGetAdaptersInfo(NULL, &adap_size); 4730 ok (ret == ERROR_BUFFER_OVERFLOW, "GetAdaptersInfo failed with a different error: %d\n", ret); 4731 ret = pGetIpForwardTable(NULL, &route_size, FALSE); 4732 ok (ret == ERROR_INSUFFICIENT_BUFFER, "GetIpForwardTable failed with a different error: %d\n", ret); 4733 4734 adapters = HeapAlloc(GetProcessHeap(), 0, adap_size); 4735 routes = HeapAlloc(GetProcessHeap(), 0, route_size); 4736 4737 ret = pGetAdaptersInfo(adapters, &adap_size); 4738 ok (ret == NO_ERROR, "GetAdaptersInfo failed, error: %d\n", ret); 4739 ret = pGetIpForwardTable(routes, &route_size, FALSE); 4740 ok (ret == NO_ERROR, "GetIpForwardTable failed, error: %d\n", ret); 4741 4742 /* This test only has meaning if there is more than one IP configured */ 4743 if (adapters->Next == NULL && count == 1) 4744 { 4745 skip("Only one IP is present, skipping tests\n"); 4746 goto cleanup; 4747 } 4748 4749 for (i = 0; !found_default && i < routes->dwNumEntries; i++) 4750 { 4751 /* default route (ip 0.0.0.0) ? */ 4752 if (routes->table[i].dwForwardDest) continue; 4753 4754 for (k = adapters; k != NULL; k = k->Next) 4755 { 4756 char *ip; 4757 4758 if (k->Index != routes->table[i].dwForwardIfIndex) continue; 4759 4760 /* the first IP returned from gethostbyname must be a default route */ 4761 ip = k->IpAddressList.IpAddress.String; 4762 if (!strcmp(first_ip, ip)) 4763 { 4764 found_default = TRUE; 4765 break; 4766 } 4767 } 4768 } 4769 ok (found_default, "failed to find the first IP from gethostbyname!\n"); 4770 4771 cleanup: 4772 HeapFree(GetProcessHeap(), 0, adapters); 4773 HeapFree(GetProcessHeap(), 0, routes); 4774 } 4775 4776 static void test_gethostbyname_hack(void) 4777 { 4778 struct hostent *he; 4779 char name[256]; 4780 static BYTE loopback[] = {127, 0, 0, 1}; 4781 static BYTE magic_loopback[] = {127, 12, 34, 56}; 4782 int ret; 4783 4784 ret = gethostname(name, 256); 4785 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError()); 4786 4787 he = gethostbyname("localhost"); 4788 ok(he != NULL, "gethostbyname(\"localhost\") failed: %d\n", h_errno); 4789 if(he) 4790 { 4791 if(he->h_length != 4) 4792 { 4793 skip("h_length is %d, not IPv4, skipping test.\n", he->h_length); 4794 return; 4795 } 4796 4797 ok(memcmp(he->h_addr_list[0], loopback, he->h_length) == 0, 4798 "gethostbyname(\"localhost\") returned %u.%u.%u.%u\n", 4799 he->h_addr_list[0][0], he->h_addr_list[0][1], he->h_addr_list[0][2], 4800 he->h_addr_list[0][3]); 4801 } 4802 4803 if(strcmp(name, "localhost") == 0) 4804 { 4805 skip("hostname seems to be \"localhost\", skipping test.\n"); 4806 return; 4807 } 4808 4809 he = gethostbyname(name); 4810 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, h_errno); 4811 if(he) 4812 { 4813 if(he->h_length != 4) 4814 { 4815 skip("h_length is %d, not IPv4, skipping test.\n", he->h_length); 4816 return; 4817 } 4818 4819 if (he->h_addr_list[0][0] == 127) 4820 { 4821 ok(memcmp(he->h_addr_list[0], magic_loopback, he->h_length) == 0, 4822 "gethostbyname(\"%s\") returned %u.%u.%u.%u not 127.12.34.56\n", 4823 name, he->h_addr_list[0][0], he->h_addr_list[0][1], 4824 he->h_addr_list[0][2], he->h_addr_list[0][3]); 4825 } 4826 } 4827 4828 gethostbyname("nonexistent.winehq.org"); 4829 /* Don't check for the return value, as some braindead ISPs will kindly 4830 * resolve nonexistent host names to addresses of the ISP's spam pages. */ 4831 } 4832 4833 static void test_gethostname(void) 4834 { 4835 struct hostent *he; 4836 char name[256]; 4837 int ret, len; 4838 4839 WSASetLastError(0xdeadbeef); 4840 ret = gethostname(NULL, 256); 4841 ok(ret == -1, "gethostname() returned %d\n", ret); 4842 ok(WSAGetLastError() == WSAEFAULT, "gethostname with null buffer " 4843 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT); 4844 4845 ret = gethostname(name, sizeof(name)); 4846 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError()); 4847 he = gethostbyname(name); 4848 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError()); 4849 4850 len = strlen(name); 4851 WSASetLastError(0xdeadbeef); 4852 strcpy(name, "deadbeef"); 4853 ret = gethostname(name, len); 4854 ok(ret == -1, "gethostname() returned %d\n", ret); 4855 ok(!strcmp(name, "deadbeef"), "name changed unexpected!\n"); 4856 ok(WSAGetLastError() == WSAEFAULT, "gethostname with insufficient length " 4857 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT); 4858 4859 len++; 4860 ret = gethostname(name, len); 4861 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError()); 4862 he = gethostbyname(name); 4863 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError()); 4864 } 4865 4866 static void test_inet_addr(void) 4867 { 4868 u_long addr; 4869 4870 addr = inet_addr(NULL); 4871 ok(addr == INADDR_NONE, "inet_addr succeeded unexpectedly\n"); 4872 } 4873 4874 static void test_addr_to_print(void) 4875 { 4876 char dst[16]; 4877 char dst6[64]; 4878 const char * pdst; 4879 struct in_addr in; 4880 struct in6_addr in6; 4881 4882 u_long addr0_Num = 0x00000000; 4883 PCSTR addr0_Str = "0.0.0.0"; 4884 u_long addr1_Num = 0x20201015; 4885 PCSTR addr1_Str = "21.16.32.32"; 4886 u_char addr2_Num[16] = {0,0,0,0,0,0,0,0,0,0,0xff,0xfe,0xcC,0x98,0xbd,0x74}; 4887 PCSTR addr2_Str = "::fffe:cc98:bd74"; 4888 u_char addr3_Num[16] = {0x20,0x30,0xa4,0xb1}; 4889 PCSTR addr3_Str = "2030:a4b1::"; 4890 u_char addr4_Num[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0xcC,0x98,0xbd,0x74}; 4891 PCSTR addr4_Str = "::204.152.189.116"; 4892 4893 /* Test IPv4 addresses */ 4894 in.s_addr = addr0_Num; 4895 4896 pdst = inet_ntoa(*((struct in_addr*)&in.s_addr)); 4897 ok(pdst != NULL, "inet_ntoa failed %s\n", dst); 4898 ok(!strcmp(pdst, addr0_Str),"Address %s != %s\n", pdst, addr0_Str); 4899 4900 /* Test that inet_ntoa and inet_ntop return the same value */ 4901 in.S_un.S_addr = addr1_Num; 4902 pdst = inet_ntoa(*((struct in_addr*)&in.s_addr)); 4903 ok(pdst != NULL, "inet_ntoa failed %s\n", dst); 4904 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str); 4905 4906 /* InetNtop became available in Vista and Win2008 */ 4907 if (!pInetNtop) 4908 { 4909 win_skip("InetNtop not present, not executing tests\n"); 4910 return; 4911 } 4912 4913 /* Second part of test */ 4914 pdst = pInetNtop(AF_INET,(void*)&in.s_addr, dst, sizeof(dst)); 4915 ok(pdst != NULL, "InetNtop failed %s\n", dst); 4916 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str); 4917 4918 /* Test invalid parm conditions */ 4919 pdst = pInetNtop(1, (void*)&in.s_addr, dst, sizeof(dst)); 4920 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst); 4921 ok(WSAGetLastError() == WSAEAFNOSUPPORT, "Should be WSAEAFNOSUPPORT\n"); 4922 4923 /* Test Null destination */ 4924 pdst = NULL; 4925 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, NULL, sizeof(dst)); 4926 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst); 4927 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */, 4928 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError()); 4929 4930 /* Test zero length passed */ 4931 WSASetLastError(0); 4932 pdst = NULL; 4933 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, 0); 4934 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst); 4935 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */, 4936 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError()); 4937 4938 /* Test length one shorter than the address length */ 4939 WSASetLastError(0); 4940 pdst = NULL; 4941 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, 6); 4942 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst); 4943 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */, 4944 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError()); 4945 4946 /* Test longer length is ok */ 4947 WSASetLastError(0); 4948 pdst = NULL; 4949 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, sizeof(dst)+1); 4950 ok(pdst != NULL, "The pointer should be returned (%p)\n", pdst); 4951 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str); 4952 4953 /* Test the IPv6 addresses */ 4954 4955 /* Test an zero prefixed IPV6 address */ 4956 memcpy(in6.u.Byte, addr2_Num, sizeof(addr2_Num)); 4957 pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6)); 4958 ok(pdst != NULL, "InetNtop failed %s\n", dst6); 4959 ok(!strcmp(pdst, addr2_Str),"Address %s != %s\n", pdst, addr2_Str); 4960 4961 /* Test an zero suffixed IPV6 address */ 4962 memcpy(in6.s6_addr, addr3_Num, sizeof(addr3_Num)); 4963 pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6)); 4964 ok(pdst != NULL, "InetNtop failed %s\n", dst6); 4965 ok(!strcmp(pdst, addr3_Str),"Address %s != %s\n", pdst, addr3_Str); 4966 4967 /* Test the IPv6 address contains the IPv4 address in IPv4 notation */ 4968 memcpy(in6.s6_addr, addr4_Num, sizeof(addr4_Num)); 4969 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, sizeof(dst6)); 4970 ok(pdst != NULL, "InetNtop failed %s\n", dst6); 4971 ok(!strcmp(pdst, addr4_Str),"Address %s != %s\n", pdst, addr4_Str); 4972 4973 /* Test invalid parm conditions */ 4974 memcpy(in6.u.Byte, addr2_Num, sizeof(addr2_Num)); 4975 4976 /* Test Null destination */ 4977 pdst = NULL; 4978 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, NULL, sizeof(dst6)); 4979 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst); 4980 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */, 4981 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError()); 4982 4983 /* Test zero length passed */ 4984 WSASetLastError(0); 4985 pdst = NULL; 4986 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 0); 4987 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst); 4988 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */, 4989 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError()); 4990 4991 /* Test length one shorter than the address length */ 4992 WSASetLastError(0); 4993 pdst = NULL; 4994 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 16); 4995 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst); 4996 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */, 4997 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError()); 4998 4999 /* Test longer length is ok */ 5000 WSASetLastError(0); 5001 pdst = NULL; 5002 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 18); 5003 ok(pdst != NULL, "The pointer should be returned (%p)\n", pdst); 5004 } 5005 static void test_inet_pton(void) 5006 { 5007 struct TEST_DATA 5008 { 5009 int family, ret; 5010 DWORD err; 5011 const char *printable, *collapsed, *raw_data; 5012 } tests[] = { 5013 {AF_UNSPEC, -1, WSAEFAULT, /* Test 0 */ 5014 NULL, NULL, NULL}, 5015 {AF_INET, -1, WSAEFAULT, 5016 NULL, NULL, NULL}, 5017 {AF_INET6, -1, WSAEFAULT, 5018 NULL, NULL, NULL}, 5019 {AF_UNSPEC, -1, WSAEAFNOSUPPORT, 5020 "127.0.0.1", NULL, NULL}, 5021 {AF_INET, 1, 0, 5022 "127.0.0.1", "127.0.0.1", 5023 "\x7f\x00\x00\x01"}, 5024 {AF_INET6, 0, 0, 5025 "127.0.0.1", "127.0.0.1", NULL}, 5026 {AF_INET, 0, 0, 5027 "::1/128", NULL, NULL}, 5028 {AF_INET6, 0, 0, 5029 "::1/128", NULL, NULL}, 5030 {AF_UNSPEC, -1, WSAEAFNOSUPPORT, 5031 "broken", NULL, NULL}, 5032 {AF_INET, 0, 0, 5033 "broken", NULL, NULL}, 5034 {AF_INET6, 0, 0, /* Test 10 */ 5035 "broken", NULL, NULL}, 5036 {AF_UNSPEC, -1, WSAEAFNOSUPPORT, 5037 "177.32.45.20", NULL, NULL}, 5038 {AF_INET, 1, 0, 5039 "177.32.45.20", "177.32.45.20", 5040 "\xb1\x20\x2d\x14"}, 5041 {AF_INET6, 0, 0, 5042 "177.32.45.20", NULL, NULL}, 5043 {AF_INET, 0, 0, 5044 "2607:f0d0:1002:51::4", NULL, NULL}, 5045 {AF_INET6, 1, 0, 5046 "2607:f0d0:1002:51::4", "2607:f0d0:1002:51::4", 5047 "\x26\x07\xf0\xd0\x10\x02\x00\x51\x00\x00\x00\x00\x00\x00\x00\x04"}, 5048 {AF_INET, 0, 0, 5049 "::177.32.45.20", NULL, NULL}, 5050 {AF_INET6, 1, 0, 5051 "::177.32.45.20", "::177.32.45.20", 5052 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x20\x2d\x14"}, 5053 {AF_INET, 0, 0, 5054 "fe80::0202:b3ff:fe1e:8329", NULL, NULL}, 5055 {AF_INET6, 1, 0, 5056 "fe80::0202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329", 5057 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"}, 5058 {AF_INET6, 1, 0, /* Test 20 */ 5059 "fe80::202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329", 5060 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"}, 5061 {AF_INET, 0, 0, 5062 "a", NULL, NULL}, 5063 {AF_INET, 0, 0, 5064 "a.b", NULL, NULL}, 5065 {AF_INET, 0, 0, 5066 "a.b.c", NULL, NULL}, 5067 {AF_INET, 0, 0, 5068 "a.b.c.d", NULL, NULL}, 5069 {AF_INET6, 1, 0, 5070 "2001:cdba:0000:0000:0000:0000:3257:9652", "2001:cdba::3257:9652", 5071 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}, 5072 {AF_INET6, 1, 0, 5073 "2001:cdba::3257:9652", "2001:cdba::3257:9652", 5074 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}, 5075 {AF_INET6, 1, 0, 5076 "2001:cdba:0:0:0:0:3257:9652", "2001:cdba::3257:9652", 5077 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"} 5078 }; 5079 int i, ret; 5080 DWORD err; 5081 char buffer[64],str[64]; 5082 WCHAR printableW[64], collapsedW[64]; 5083 const char *ptr; 5084 const WCHAR *ptrW; 5085 5086 /* InetNtop and InetPton became available in Vista and Win2008 */ 5087 if (!pInetNtop || !pInetNtopW || !pInetPtonA || !pInetPtonW) 5088 { 5089 win_skip("InetNtop and/or InetPton not present, not executing tests\n"); 5090 return; 5091 } 5092 5093 for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) 5094 { 5095 WSASetLastError(0xdeadbeef); 5096 ret = pInetPtonA(tests[i].family, tests[i].printable, buffer); 5097 ok (ret == tests[i].ret, "Test [%d]: Expected %d, got %d\n", i, tests[i].ret, ret); 5098 if (tests[i].ret == -1) 5099 { 5100 err = WSAGetLastError(); 5101 ok (tests[i].err == err, "Test [%d]: Expected 0x%x, got 0x%x\n", i, tests[i].err, err); 5102 } 5103 if (tests[i].ret != 1) continue; 5104 ok (memcmp(buffer, tests[i].raw_data, 5105 tests[i].family == AF_INET ? sizeof(struct in_addr) : sizeof(struct in6_addr)) == 0, 5106 "Test [%d]: Expected binary data differs\n", i); 5107 5108 /* Test the result from Pton with Ntop */ 5109 strcpy (str, "deadbeef"); 5110 ptr = pInetNtop(tests[i].family, buffer, str, sizeof(str)); 5111 ok (ptr != NULL, "Test [%d]: Failed with NULL\n", i); 5112 ok (ptr == str, "Test [%d]: Pointers differ (%p != %p)\n", i, ptr, str); 5113 if (!ptr) continue; 5114 ok (strcmp(ptr, tests[i].collapsed) == 0, "Test [%d]: Expected '%s', got '%s'\n", 5115 i, tests[i].collapsed, ptr); 5116 } 5117 5118 for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) 5119 { 5120 if (tests[i].printable) 5121 MultiByteToWideChar(CP_ACP, 0, tests[i].printable, -1, printableW, 5122 sizeof(printableW) / sizeof(printableW[0])); 5123 WSASetLastError(0xdeadbeef); 5124 ret = pInetPtonW(tests[i].family, tests[i].printable ? printableW : NULL, buffer); 5125 ok(ret == tests[i].ret, "Test [%d]: Expected %d, got %d\n", i, tests[i].ret, ret); 5126 if (tests[i].ret == -1) 5127 { 5128 err = WSAGetLastError(); 5129 ok(tests[i].err == err, "Test [%d]: Expected 0x%x, got 0x%x\n", i, tests[i].err, err); 5130 } 5131 if (tests[i].ret != 1) continue; 5132 ok(memcmp(buffer, tests[i].raw_data, 5133 tests[i].family == AF_INET ? sizeof(struct in_addr) : sizeof(struct in6_addr)) == 0, 5134 "Test [%d]: Expected binary data differs\n", i); 5135 5136 /* Test the result from Pton with Ntop */ 5137 printableW[0] = 0xdead; 5138 ptrW = pInetNtopW(tests[i].family, buffer, printableW, sizeof(printableW) / sizeof(printableW[0])); 5139 ok (ptrW != NULL, "Test [%d]: Failed with NULL\n", i); 5140 ok (ptrW == printableW, "Test [%d]: Pointers differ (%p != %p)\n", i, ptrW, printableW); 5141 if (!ptrW) continue; 5142 5143 MultiByteToWideChar(CP_ACP, 0, tests[i].collapsed, -1, collapsedW, 5144 sizeof(collapsedW) / sizeof(collapsedW[0])); 5145 ok (lstrcmpW(ptrW, collapsedW) == 0, "Test [%d]: Expected '%s', got '%s'\n", 5146 i, tests[i].collapsed, wine_dbgstr_w(ptrW)); 5147 } 5148 } 5149 5150 static void test_ioctlsocket(void) 5151 { 5152 SOCKET sock, src, dst; 5153 struct tcp_keepalive kalive; 5154 struct sockaddr_in address; 5155 int ret, optval; 5156 static const LONG cmds[] = {FIONBIO, FIONREAD, SIOCATMARK}; 5157 UINT i, bytes_rec; 5158 char data; 5159 WSABUF bufs; 5160 u_long arg = 0; 5161 5162 sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 5163 ok(sock != INVALID_SOCKET, "Creating the socket failed: %d\n", WSAGetLastError()); 5164 if(sock == INVALID_SOCKET) 5165 { 5166 skip("Can't continue without a socket.\n"); 5167 return; 5168 } 5169 5170 for(i = 0; i < sizeof(cmds)/sizeof(cmds[0]); i++) 5171 { 5172 /* broken apps like defcon pass the argp value directly instead of a pointer to it */ 5173 ret = ioctlsocket(sock, cmds[i], (u_long *)1); 5174 ok(ret == SOCKET_ERROR, "ioctlsocket succeeded unexpectedly\n"); 5175 ret = WSAGetLastError(); 5176 ok(ret == WSAEFAULT, "expected WSAEFAULT, got %d instead\n", ret); 5177 } 5178 5179 /* A fresh and not connected socket has no urgent data, this test shows 5180 * that normal(not urgent) data returns a non-zero value for SIOCATMARK. */ 5181 5182 ret = ioctlsocket(sock, SIOCATMARK, &arg); 5183 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n"); 5184 ok(arg, "SIOCATMARK expected a non-zero value\n"); 5185 5186 /* when SO_OOBINLINE is set SIOCATMARK must always return TRUE */ 5187 optval = 1; 5188 ret = setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval)); 5189 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n"); 5190 arg = 0; 5191 ret = ioctlsocket(sock, SIOCATMARK, &arg); 5192 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n"); 5193 ok(arg, "SIOCATMARK expected a non-zero value\n"); 5194 5195 /* disable SO_OOBINLINE and get the same old behavior */ 5196 optval = 0; 5197 ret = setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval)); 5198 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n"); 5199 arg = 0; 5200 ret = ioctlsocket(sock, SIOCATMARK, &arg); 5201 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n"); 5202 ok(arg, "SIOCATMARK expected a non-zero value\n"); 5203 5204 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &arg, 0, NULL, 0, &arg, NULL, NULL); 5205 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n"); 5206 ret = WSAGetLastError(); 5207 ok(ret == WSAEFAULT || broken(ret == WSAEINVAL), "expected WSAEFAULT, got %d instead\n", ret); 5208 5209 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, NULL, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL); 5210 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n"); 5211 ret = WSAGetLastError(); 5212 ok(ret == WSAEFAULT || broken(ret == WSAEINVAL), "expected WSAEFAULT, got %d instead\n", ret); 5213 5214 make_keepalive(kalive, 0, 0, 0); 5215 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL); 5216 ok(ret == 0, "WSAIoctl failed unexpectedly\n"); 5217 5218 make_keepalive(kalive, 1, 0, 0); 5219 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL); 5220 ok(ret == 0, "WSAIoctl failed unexpectedly\n"); 5221 5222 make_keepalive(kalive, 1, 1000, 1000); 5223 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL); 5224 ok(ret == 0, "WSAIoctl failed unexpectedly\n"); 5225 5226 make_keepalive(kalive, 1, 10000, 10000); 5227 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL); 5228 ok(ret == 0, "WSAIoctl failed unexpectedly\n"); 5229 5230 make_keepalive(kalive, 1, 100, 100); 5231 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL); 5232 ok(ret == 0, "WSAIoctl failed unexpectedly\n"); 5233 5234 make_keepalive(kalive, 0, 100, 100); 5235 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL); 5236 ok(ret == 0, "WSAIoctl failed unexpectedly\n"); 5237 5238 closesocket(sock); 5239 5240 sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 5241 ok(sock != INVALID_SOCKET, "Creating the socket failed: %d\n", WSAGetLastError()); 5242 if(sock == INVALID_SOCKET) 5243 { 5244 skip("Can't continue without a socket.\n"); 5245 return; 5246 } 5247 5248 /* test FIONREAD with a fresh and non-connected socket */ 5249 arg = 0xdeadbeef; 5250 ret = ioctlsocket(sock, FIONREAD, &arg); 5251 ok(ret == 0, "ioctlsocket failed unexpectedly with error %d\n", WSAGetLastError()); 5252 ok(arg == 0, "expected 0, got %u\n", arg); 5253 5254 memset(&address, 0, sizeof(address)); 5255 address.sin_family = AF_INET; 5256 address.sin_addr.s_addr = inet_addr( SERVERIP ); 5257 address.sin_port = htons( SERVERPORT ); 5258 ret = bind(sock, (struct sockaddr *)&address, sizeof(address)); 5259 ok(ret == 0, "bind failed unexpectedly with error %d\n", WSAGetLastError()); 5260 5261 ret = listen(sock, SOMAXCONN); 5262 ok(ret == 0, "listen failed unexpectedly with error %d\n", WSAGetLastError()); 5263 5264 /* test FIONREAD with listening socket */ 5265 arg = 0xdeadbeef; 5266 ret = ioctlsocket(sock, FIONREAD, &arg); 5267 ok(ret == 0, "ioctlsocket failed unexpectedly with error %d\n", WSAGetLastError()); 5268 ok(arg == 0, "expected 0, got %u\n", arg); 5269 5270 closesocket(sock); 5271 5272 if (tcp_socketpair(&src, &dst) != 0) 5273 { 5274 ok(0, "creating socket pair failed, skipping test\n"); 5275 return; 5276 } 5277 5278 /* test FIONREAD on TCP sockets */ 5279 optval = 0xdeadbeef; 5280 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL); 5281 ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError()); 5282 ok(optval == 0, "FIONREAD should have returned 0 bytes, got %d instead\n", optval); 5283 5284 optval = 0xdeadbeef; 5285 ok(send(src, "TEST", 4, 0) == 4, "failed to send test data\n"); 5286 Sleep(100); 5287 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL); 5288 ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError()); 5289 ok(optval == 4, "FIONREAD should have returned 4 bytes, got %d instead\n", optval); 5290 5291 /* trying to read from an OOB inlined socket with MSG_OOB results in WSAEINVAL */ 5292 set_blocking(dst, FALSE); 5293 i = MSG_OOB; 5294 SetLastError(0xdeadbeef); 5295 ret = recv(dst, &data, 1, i); 5296 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 5297 ret = GetLastError(); 5298 ok(ret == WSAEWOULDBLOCK, "expected 10035, got %d\n", ret); 5299 bufs.len = sizeof(char); 5300 bufs.buf = &data; 5301 ret = WSARecv(dst, &bufs, 1, &bytes_rec, &i, NULL, NULL); 5302 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 5303 ret = GetLastError(); 5304 ok(ret == WSAEWOULDBLOCK, "expected 10035, got %d\n", ret); 5305 optval = 1; 5306 ret = setsockopt(dst, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval)); 5307 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n"); 5308 i = MSG_OOB; 5309 SetLastError(0xdeadbeef); 5310 ret = recv(dst, &data, 1, i); 5311 ok(ret == SOCKET_ERROR, "expected SOCKET_ERROR, got %d\n", ret); 5312 ret = GetLastError(); 5313 ok(ret == WSAEINVAL, "expected 10022, got %d\n", ret); 5314 bufs.len = sizeof(char); 5315 bufs.buf = &data; 5316 ret = WSARecv(dst, &bufs, 1, &bytes_rec, &i, NULL, NULL); 5317 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 5318 ret = GetLastError(); 5319 ok(ret == WSAEINVAL, "expected 10022, got %d\n", ret); 5320 5321 closesocket(dst); 5322 optval = 0xdeadbeef; 5323 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL); 5324 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n"); 5325 ok(optval == 0xdeadbeef, "FIONREAD should not have changed last error, got %d instead\n", optval); 5326 closesocket(src); 5327 } 5328 5329 static BOOL drain_pause = FALSE; 5330 static DWORD WINAPI drain_socket_thread(LPVOID arg) 5331 { 5332 char buffer[1024]; 5333 SOCKET sock = *(SOCKET*)arg; 5334 int ret; 5335 5336 while ((ret = recv(sock, buffer, sizeof(buffer), 0)) != 0) 5337 { 5338 if (ret < 0) 5339 { 5340 if (WSAGetLastError() == WSAEWOULDBLOCK) 5341 { 5342 fd_set readset; 5343 FD_ZERO(&readset); 5344 FD_SET(sock, &readset); 5345 select(sock+1, &readset, NULL, NULL, NULL); 5346 while (drain_pause) 5347 Sleep(100); 5348 } 5349 else 5350 break; 5351 } 5352 } 5353 return 0; 5354 } 5355 5356 static void test_send(void) 5357 { 5358 SOCKET src = INVALID_SOCKET; 5359 SOCKET dst = INVALID_SOCKET; 5360 HANDLE hThread = NULL; 5361 const int buflen = 1024*1024; 5362 char *buffer = NULL; 5363 int ret, i, zero = 0; 5364 WSABUF buf; 5365 OVERLAPPED ov; 5366 BOOL bret; 5367 DWORD id, bytes_sent, dwRet; 5368 DWORD expected_time, connect_time; 5369 socklen_t optlen; 5370 5371 memset(&ov, 0, sizeof(ov)); 5372 5373 if (tcp_socketpair(&src, &dst) != 0) 5374 { 5375 ok(0, "creating socket pair failed, skipping test\n"); 5376 return; 5377 } 5378 expected_time = GetTickCount(); 5379 5380 set_blocking(dst, FALSE); 5381 /* force disable buffering so we can get a pending overlapped request */ 5382 ret = setsockopt(dst, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof(zero)); 5383 ok(!ret, "setsockopt SO_SNDBUF failed: %d - %d\n", ret, GetLastError()); 5384 5385 hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id); 5386 if (hThread == NULL) 5387 { 5388 ok(0, "CreateThread failed, error %d\n", GetLastError()); 5389 goto end; 5390 } 5391 5392 buffer = HeapAlloc(GetProcessHeap(), 0, buflen); 5393 if (buffer == NULL) 5394 { 5395 ok(0, "HeapAlloc failed, error %d\n", GetLastError()); 5396 goto end; 5397 } 5398 5399 /* fill the buffer with some nonsense */ 5400 for (i = 0; i < buflen; ++i) 5401 { 5402 buffer[i] = (char) i; 5403 } 5404 5405 ret = send(src, buffer, buflen, 0); 5406 if (ret >= 0) 5407 ok(ret == buflen, "send should have sent %d bytes, but it only sent %d\n", buflen, ret); 5408 else 5409 ok(0, "send failed, error %d\n", WSAGetLastError()); 5410 5411 buf.buf = buffer; 5412 buf.len = buflen; 5413 5414 ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 5415 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError()); 5416 if (!ov.hEvent) 5417 goto end; 5418 5419 bytes_sent = 0; 5420 WSASetLastError(12345); 5421 ret = WSASend(dst, &buf, 1, &bytes_sent, 0, &ov, NULL); 5422 ok((ret == SOCKET_ERROR && WSAGetLastError() == ERROR_IO_PENDING) || broken(bytes_sent == buflen), 5423 "Failed to start overlapped send %d - %d - %d/%d\n", ret, WSAGetLastError(), bytes_sent, buflen); 5424 5425 /* don't check for completion yet, we may need to drain the buffer while still sending */ 5426 set_blocking(src, FALSE); 5427 for (i = 0; i < buflen; ++i) 5428 { 5429 int j = 0; 5430 5431 ret = recv(src, buffer, 1, 0); 5432 while (ret == SOCKET_ERROR && GetLastError() == WSAEWOULDBLOCK && j < 100) 5433 { 5434 j++; 5435 Sleep(50); 5436 ret = recv(src, buffer, 1, 0); 5437 } 5438 5439 ok(ret == 1, "Failed to receive data %d - %d (got %d/%d)\n", ret, GetLastError(), i, buflen); 5440 if (ret != 1) 5441 break; 5442 5443 ok(buffer[0] == (char) i, "Received bad data at position %d\n", i); 5444 } 5445 5446 dwRet = WaitForSingleObject(ov.hEvent, 1000); 5447 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError()); 5448 if (dwRet == WAIT_OBJECT_0) 5449 { 5450 bret = GetOverlappedResult((HANDLE)dst, &ov, &bytes_sent, FALSE); 5451 ok(bret && bytes_sent == buflen, 5452 "Got %d instead of %d (%d - %d)\n", bytes_sent, buflen, bret, GetLastError()); 5453 } 5454 5455 WSASetLastError(12345); 5456 ret = WSASend(INVALID_SOCKET, &buf, 1, NULL, 0, &ov, NULL); 5457 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAENOTSOCK, 5458 "WSASend failed %d - %d\n", ret, WSAGetLastError()); 5459 5460 WSASetLastError(12345); 5461 ret = WSASend(dst, &buf, 1, NULL, 0, &ov, NULL); 5462 ok(ret == SOCKET_ERROR && WSAGetLastError() == ERROR_IO_PENDING, 5463 "Failed to start overlapped send %d - %d\n", ret, WSAGetLastError()); 5464 5465 expected_time = (GetTickCount() - expected_time) / 1000; 5466 5467 connect_time = 0xdeadbeef; 5468 optlen = sizeof(connect_time); 5469 ret = getsockopt(dst, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen); 5470 ok(!ret, "getsockopt failed %d\n", WSAGetLastError()); 5471 ok(connect_time >= expected_time && connect_time <= expected_time + 1, 5472 "unexpected connect time %u, expected %u\n", connect_time, expected_time); 5473 5474 connect_time = 0xdeadbeef; 5475 optlen = sizeof(connect_time); 5476 ret = getsockopt(src, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen); 5477 ok(!ret, "getsockopt failed %d\n", WSAGetLastError()); 5478 ok(connect_time >= expected_time && connect_time <= expected_time + 1, 5479 "unexpected connect time %u, expected %u\n", connect_time, expected_time); 5480 5481 end: 5482 if (src != INVALID_SOCKET) 5483 closesocket(src); 5484 if (dst != INVALID_SOCKET) 5485 closesocket(dst); 5486 if (hThread != NULL) 5487 { 5488 dwRet = WaitForSingleObject(hThread, 500); 5489 ok(dwRet == WAIT_OBJECT_0, "failed to wait for thread termination: %d\n", GetLastError()); 5490 CloseHandle(hThread); 5491 } 5492 if (ov.hEvent) 5493 CloseHandle(ov.hEvent); 5494 HeapFree(GetProcessHeap(), 0, buffer); 5495 } 5496 5497 typedef struct async_message 5498 { 5499 SOCKET socket; 5500 LPARAM lparam; 5501 struct async_message *next; 5502 } async_message; 5503 5504 static struct async_message *messages_received; 5505 5506 #define WM_SOCKET (WM_USER+100) 5507 static LRESULT CALLBACK ws2_test_WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 5508 { 5509 struct async_message *message; 5510 5511 switch (msg) 5512 { 5513 case WM_SOCKET: 5514 message = HeapAlloc(GetProcessHeap(), 0, sizeof(*message)); 5515 message->socket = (SOCKET) wparam; 5516 message->lparam = lparam; 5517 message->next = NULL; 5518 5519 if (messages_received) 5520 { 5521 struct async_message *last = messages_received; 5522 while (last->next) last = last->next; 5523 last->next = message; 5524 } 5525 else 5526 messages_received = message; 5527 return 0; 5528 } 5529 5530 return DefWindowProcA(hwnd, msg, wparam, lparam); 5531 } 5532 5533 static void get_event_details(int event, int *bit, char *name) 5534 { 5535 switch (event) 5536 { 5537 case FD_ACCEPT: 5538 if (bit) *bit = FD_ACCEPT_BIT; 5539 if (name) strcpy(name, "FD_ACCEPT"); 5540 break; 5541 case FD_CONNECT: 5542 if (bit) *bit = FD_CONNECT_BIT; 5543 if (name) strcpy(name, "FD_CONNECT"); 5544 break; 5545 case FD_READ: 5546 if (bit) *bit = FD_READ_BIT; 5547 if (name) strcpy(name, "FD_READ"); 5548 break; 5549 case FD_OOB: 5550 if (bit) *bit = FD_OOB_BIT; 5551 if (name) strcpy(name, "FD_OOB"); 5552 break; 5553 case FD_WRITE: 5554 if (bit) *bit = FD_WRITE_BIT; 5555 if (name) strcpy(name, "FD_WRITE"); 5556 break; 5557 case FD_CLOSE: 5558 if (bit) *bit = FD_CLOSE_BIT; 5559 if (name) strcpy(name, "FD_CLOSE"); 5560 break; 5561 default: 5562 if (bit) *bit = -1; 5563 if (name) sprintf(name, "bad%x", event); 5564 } 5565 } 5566 5567 static const char *dbgstr_event_seq(const LPARAM *seq) 5568 { 5569 static char message[1024]; 5570 char name[12]; 5571 int len = 1; 5572 5573 message[0] = '['; 5574 message[1] = 0; 5575 while (*seq) 5576 { 5577 get_event_details(WSAGETSELECTEVENT(*seq), NULL, name); 5578 len += sprintf(message + len, "%s(%d) ", name, WSAGETSELECTERROR(*seq)); 5579 seq++; 5580 } 5581 if (len > 1) len--; 5582 strcpy( message + len, "]" ); 5583 return message; 5584 } 5585 5586 static char *dbgstr_event_seq_result(SOCKET s, WSANETWORKEVENTS *netEvents) 5587 { 5588 static char message[1024]; 5589 struct async_message *curr = messages_received; 5590 int index, error, bit = 0; 5591 char name[12]; 5592 int len = 1; 5593 5594 message[0] = '['; 5595 message[1] = 0; 5596 while (1) 5597 { 5598 if (netEvents) 5599 { 5600 if (bit >= FD_MAX_EVENTS) break; 5601 if ( !(netEvents->lNetworkEvents & (1 << bit)) ) 5602 { 5603 bit++; 5604 continue; 5605 } 5606 get_event_details(1 << bit, &index, name); 5607 error = netEvents->iErrorCode[index]; 5608 bit++; 5609 } 5610 else 5611 { 5612 if (!curr) break; 5613 if (curr->socket != s) 5614 { 5615 curr = curr->next; 5616 continue; 5617 } 5618 get_event_details(WSAGETSELECTEVENT(curr->lparam), NULL, name); 5619 error = WSAGETSELECTERROR(curr->lparam); 5620 curr = curr->next; 5621 } 5622 5623 len += sprintf(message + len, "%s(%d) ", name, error); 5624 } 5625 if (len > 1) len--; 5626 strcpy( message + len, "]" ); 5627 return message; 5628 } 5629 5630 static void flush_events(SOCKET s, HANDLE hEvent) 5631 { 5632 WSANETWORKEVENTS netEvents; 5633 struct async_message *prev = NULL, *curr = messages_received; 5634 int ret; 5635 DWORD dwRet; 5636 5637 if (hEvent != INVALID_HANDLE_VALUE) 5638 { 5639 dwRet = WaitForSingleObject(hEvent, 100); 5640 if (dwRet == WAIT_OBJECT_0) 5641 { 5642 ret = WSAEnumNetworkEvents(s, hEvent, &netEvents); 5643 if (ret) 5644 ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret); 5645 } 5646 } 5647 else 5648 { 5649 while (curr) 5650 { 5651 if (curr->socket == s) 5652 { 5653 if (prev) prev->next = curr->next; 5654 else messages_received = curr->next; 5655 5656 HeapFree(GetProcessHeap(), 0, curr); 5657 5658 if (prev) curr = prev->next; 5659 else curr = messages_received; 5660 } 5661 else 5662 { 5663 prev = curr; 5664 curr = curr->next; 5665 } 5666 } 5667 } 5668 } 5669 5670 static int match_event_sequence(SOCKET s, WSANETWORKEVENTS *netEvents, const LPARAM *seq) 5671 { 5672 int event, index, error, events; 5673 struct async_message *curr; 5674 5675 if (netEvents) 5676 { 5677 events = netEvents->lNetworkEvents; 5678 while (*seq) 5679 { 5680 event = WSAGETSELECTEVENT(*seq); 5681 error = WSAGETSELECTERROR(*seq); 5682 get_event_details(event, &index, NULL); 5683 5684 if (!(events & event) && index != -1) 5685 return 0; 5686 if (events & event && index != -1) 5687 { 5688 if (netEvents->iErrorCode[index] != error) 5689 return 0; 5690 } 5691 events &= ~event; 5692 seq++; 5693 } 5694 if (events) 5695 return 0; 5696 } 5697 else 5698 { 5699 curr = messages_received; 5700 while (curr) 5701 { 5702 if (curr->socket == s) 5703 { 5704 if (!*seq) return 0; 5705 if (*seq != curr->lparam) return 0; 5706 seq++; 5707 } 5708 curr = curr->next; 5709 } 5710 if (*seq) 5711 return 0; 5712 } 5713 return 1; 5714 } 5715 5716 /* checks for a sequence of events, (order only checked if window is used) */ 5717 static void ok_event_sequence(SOCKET s, HANDLE hEvent, const LPARAM *seq, const LPARAM **broken_seqs, int completelyBroken) 5718 { 5719 MSG msg; 5720 WSANETWORKEVENTS events, *netEvents = NULL; 5721 int ret; 5722 DWORD dwRet; 5723 5724 if (hEvent != INVALID_HANDLE_VALUE) 5725 { 5726 netEvents = &events; 5727 5728 dwRet = WaitForSingleObject(hEvent, 200); 5729 if (dwRet == WAIT_OBJECT_0) 5730 { 5731 ret = WSAEnumNetworkEvents(s, hEvent, netEvents); 5732 if (ret) 5733 { 5734 winetest_ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret); 5735 return; 5736 } 5737 } 5738 else 5739 memset(netEvents, 0, sizeof(*netEvents)); 5740 } 5741 else 5742 { 5743 Sleep(200); 5744 /* Run the message loop a little */ 5745 while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) 5746 { 5747 DispatchMessageA(&msg); 5748 } 5749 } 5750 5751 if (match_event_sequence(s, netEvents, seq)) 5752 { 5753 winetest_ok(1, "Sequence matches expected: %s\n", dbgstr_event_seq(seq)); 5754 flush_events(s, hEvent); 5755 return; 5756 } 5757 5758 if (broken_seqs) 5759 { 5760 for (; *broken_seqs; broken_seqs++) 5761 { 5762 if (match_event_sequence(s, netEvents, *broken_seqs)) 5763 { 5764 winetest_ok(broken(1), "Sequence matches broken: %s, expected %s\n", dbgstr_event_seq_result(s, netEvents), dbgstr_event_seq(seq)); 5765 flush_events(s, hEvent); 5766 return; 5767 } 5768 } 5769 } 5770 5771 winetest_ok(broken(completelyBroken), "Expected event sequence %s, got %s\n", dbgstr_event_seq(seq), 5772 dbgstr_event_seq_result(s, netEvents)); 5773 flush_events(s, hEvent); 5774 } 5775 5776 #define ok_event_seq (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : ok_event_sequence 5777 5778 static void test_events(int useMessages) 5779 { 5780 SOCKET server = INVALID_SOCKET; 5781 SOCKET src = INVALID_SOCKET, src2 = INVALID_SOCKET; 5782 SOCKET dst = INVALID_SOCKET, dst2 = INVALID_SOCKET; 5783 struct sockaddr_in addr; 5784 HANDLE hThread = NULL; 5785 HANDLE hEvent = INVALID_HANDLE_VALUE, hEvent2 = INVALID_HANDLE_VALUE; 5786 WNDCLASSEXA wndclass; 5787 HWND hWnd = NULL; 5788 char *buffer = NULL; 5789 int bufferSize = 1024*1024; 5790 WSABUF bufs; 5791 OVERLAPPED ov, ov2; 5792 DWORD flags = 0; 5793 DWORD bytesReturned; 5794 DWORD id; 5795 int len; 5796 int ret; 5797 DWORD dwRet; 5798 BOOL bret; 5799 static char szClassName[] = "wstestclass"; 5800 const LPARAM *broken_seq[3]; 5801 static const LPARAM empty_seq[] = { 0 }; 5802 static const LPARAM close_seq[] = { WSAMAKESELECTREPLY(FD_CLOSE, 0), 0 }; 5803 static const LPARAM write_seq[] = { WSAMAKESELECTREPLY(FD_WRITE, 0), 0 }; 5804 static const LPARAM read_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0), 0 }; 5805 static const LPARAM oob_seq[] = { WSAMAKESELECTREPLY(FD_OOB, 0), 0 }; 5806 static const LPARAM connect_seq[] = { WSAMAKESELECTREPLY(FD_CONNECT, 0), 5807 WSAMAKESELECTREPLY(FD_WRITE, 0), 0 }; 5808 static const LPARAM read_read_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0), 5809 WSAMAKESELECTREPLY(FD_READ, 0), 0 }; 5810 static const LPARAM read_write_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0), 5811 WSAMAKESELECTREPLY(FD_WRITE, 0), 0 }; 5812 static const LPARAM read_close_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0), 5813 WSAMAKESELECTREPLY(FD_CLOSE, 0), 0 }; 5814 5815 memset(&ov, 0, sizeof(ov)); 5816 memset(&ov2, 0, sizeof(ov2)); 5817 5818 /* don't use socketpair, we want connection event */ 5819 src = socket(AF_INET, SOCK_STREAM, 0); 5820 if (src == INVALID_SOCKET) 5821 { 5822 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5823 goto end; 5824 } 5825 5826 ret = set_blocking(src, TRUE); 5827 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError()); 5828 5829 src2 = socket(AF_INET, SOCK_STREAM, 0); 5830 if (src2 == INVALID_SOCKET) 5831 { 5832 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5833 goto end; 5834 } 5835 5836 ret = set_blocking(src2, TRUE); 5837 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError()); 5838 5839 len = sizeof(BOOL); 5840 if (getsockopt(src, SOL_SOCKET, SO_OOBINLINE, (void *)&bret, &len) == SOCKET_ERROR) 5841 { 5842 ok(0, "failed to get oobinline status, %d\n", GetLastError()); 5843 goto end; 5844 } 5845 ok(bret == FALSE, "OOB not inline\n"); 5846 5847 if (useMessages) 5848 { 5849 trace("Event test using messages\n"); 5850 5851 wndclass.cbSize = sizeof(wndclass); 5852 wndclass.style = CS_HREDRAW | CS_VREDRAW; 5853 wndclass.lpfnWndProc = ws2_test_WndProc; 5854 wndclass.cbClsExtra = 0; 5855 wndclass.cbWndExtra = 0; 5856 wndclass.hInstance = GetModuleHandleA(NULL); 5857 wndclass.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); 5858 wndclass.hIconSm = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); 5859 wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW); 5860 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 5861 wndclass.lpszClassName = szClassName; 5862 wndclass.lpszMenuName = NULL; 5863 RegisterClassExA(&wndclass); 5864 5865 hWnd = CreateWindowA(szClassName, "WS2Test", WS_OVERLAPPEDWINDOW, 5866 0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL); 5867 if (!hWnd) 5868 { 5869 ok(0, "failed to create window: %d\n", GetLastError()); 5870 return; 5871 } 5872 5873 ret = WSAAsyncSelect(src, hWnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE); 5874 if (ret) 5875 { 5876 ok(0, "WSAAsyncSelect failed, error %d\n", ret); 5877 goto end; 5878 } 5879 5880 ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n"); 5881 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError()); 5882 5883 ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE); 5884 if (ret) 5885 { 5886 ok(0, "WSAAsyncSelect failed, error %d\n", ret); 5887 goto end; 5888 } 5889 5890 ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n"); 5891 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError()); 5892 } 5893 else 5894 { 5895 trace("Event test using events\n"); 5896 5897 hEvent = WSACreateEvent(); 5898 if (hEvent == INVALID_HANDLE_VALUE) 5899 { 5900 ok(0, "WSACreateEvent failed, error %d\n", GetLastError()); 5901 goto end; 5902 } 5903 5904 hEvent2 = WSACreateEvent(); 5905 if (hEvent2 == INVALID_HANDLE_VALUE) 5906 { 5907 ok(0, "WSACreateEvent failed, error %d\n", GetLastError()); 5908 goto end; 5909 } 5910 5911 ret = WSAEventSelect(src, hEvent, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE); 5912 if (ret) 5913 { 5914 ok(0, "WSAEventSelect failed, error %d\n", ret); 5915 goto end; 5916 } 5917 5918 ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n"); 5919 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError()); 5920 5921 ret = WSAEventSelect(src2, hEvent2, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE); 5922 if (ret) 5923 { 5924 ok(0, "WSAEventSelect failed, error %d\n", ret); 5925 goto end; 5926 } 5927 5928 ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n"); 5929 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError()); 5930 } 5931 5932 server = socket(AF_INET, SOCK_STREAM, 0); 5933 if (server == INVALID_SOCKET) 5934 { 5935 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5936 goto end; 5937 } 5938 5939 memset(&addr, 0, sizeof(addr)); 5940 addr.sin_family = AF_INET; 5941 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 5942 ret = bind(server, (struct sockaddr*)&addr, sizeof(addr)); 5943 if (ret != 0) 5944 { 5945 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5946 goto end; 5947 } 5948 5949 len = sizeof(addr); 5950 ret = getsockname(server, (struct sockaddr*)&addr, &len); 5951 if (ret != 0) 5952 { 5953 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5954 goto end; 5955 } 5956 5957 ret = listen(server, 2); 5958 if (ret != 0) 5959 { 5960 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5961 goto end; 5962 } 5963 5964 SetLastError(0xdeadbeef); 5965 ret = connect(src, NULL, 0); 5966 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 5967 ok(GetLastError() == WSAEFAULT, "expected 10014, got %d\n", GetLastError()); 5968 5969 ret = connect(src, (struct sockaddr*)&addr, sizeof(addr)); 5970 if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) 5971 { 5972 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5973 goto end; 5974 } 5975 5976 ret = connect(src2, (struct sockaddr*)&addr, sizeof(addr)); 5977 if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) 5978 { 5979 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5980 goto end; 5981 } 5982 5983 len = sizeof(addr); 5984 dst = accept(server, (struct sockaddr*)&addr, &len); 5985 if (dst == INVALID_SOCKET) 5986 { 5987 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5988 goto end; 5989 } 5990 5991 len = sizeof(addr); 5992 dst2 = accept(server, (struct sockaddr*)&addr, &len); 5993 if (dst2 == INVALID_SOCKET) 5994 { 5995 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError()); 5996 goto end; 5997 } 5998 5999 closesocket(server); 6000 server = INVALID_SOCKET; 6001 6002 /* On Windows it seems when a non-blocking socket sends to a 6003 blocking socket on the same host, the send() is BLOCKING, 6004 so make both sockets non-blocking. src is already non-blocking 6005 from the async select */ 6006 6007 if (set_blocking(dst, FALSE)) 6008 { 6009 ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError()); 6010 goto end; 6011 } 6012 6013 buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufferSize); 6014 if (buffer == NULL) 6015 { 6016 ok(0, "could not allocate memory for test\n"); 6017 goto end; 6018 } 6019 6020 ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 6021 if (ov.hEvent == NULL) 6022 { 6023 ok(0, "could not create event object, errno = %d\n", GetLastError()); 6024 goto end; 6025 } 6026 6027 ov2.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 6028 if (ov2.hEvent == NULL) 6029 { 6030 ok(0, "could not create event object, errno = %d\n", GetLastError()); 6031 goto end; 6032 } 6033 6034 /* FD_WRITE should be set initially, and allow us to send at least 1 byte */ 6035 ok_event_seq(src, hEvent, connect_seq, NULL, 1); 6036 ok_event_seq(src2, hEvent2, connect_seq, NULL, 1); 6037 /* broken on all windows - FD_CONNECT error is garbage */ 6038 6039 /* Test simple send/recv */ 6040 SetLastError(0xdeadbeef); 6041 ret = send(dst, buffer, 100, 0); 6042 ok(ret == 100, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6043 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6044 ok_event_seq(src, hEvent, read_seq, NULL, 0); 6045 6046 SetLastError(0xdeadbeef); 6047 ret = recv(src, buffer, 1, MSG_PEEK); 6048 ok(ret == 1, "Failed to peek at recv buffer %d err %d\n", ret, GetLastError()); 6049 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6050 ok_event_seq(src, hEvent, read_seq, NULL, 0); 6051 6052 SetLastError(0xdeadbeef); 6053 ret = recv(src, buffer, 50, 0); 6054 ok(ret == 50, "Failed to recv buffer %d err %d\n", ret, GetLastError()); 6055 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6056 ok_event_seq(src, hEvent, read_seq, NULL, 0); 6057 6058 ret = recv(src, buffer, 50, 0); 6059 ok(ret == 50, "Failed to recv buffer %d err %d\n", ret, GetLastError()); 6060 ok_event_seq(src, hEvent, empty_seq, NULL, 0); 6061 6062 /* fun fact - events are re-enabled even on failure, but only for messages */ 6063 ret = send(dst, "1", 1, 0); 6064 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6065 ok_event_seq(src, hEvent, read_seq, NULL, 0); 6066 6067 ret = recv(src, buffer, -1, 0); 6068 ok(ret == SOCKET_ERROR && (GetLastError() == WSAEFAULT || GetLastError() == WSAENOBUFS), 6069 "Failed to recv buffer %d err %d\n", ret, GetLastError()); 6070 if (useMessages) 6071 { 6072 broken_seq[0] = empty_seq; /* win9x */ 6073 broken_seq[1] = NULL; 6074 todo_wine ok_event_seq(src, hEvent, read_seq, broken_seq, 0); 6075 } 6076 else 6077 ok_event_seq(src, hEvent, empty_seq, NULL, 0); 6078 6079 SetLastError(0xdeadbeef); 6080 ret = recv(src, buffer, 1, 0); 6081 ok(ret == 1, "Failed to recv buffer %d err %d\n", ret, GetLastError()); 6082 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6083 ok_event_seq(src, hEvent, empty_seq, NULL, 0); 6084 6085 /* Interaction with overlapped */ 6086 bufs.len = sizeof(char); 6087 bufs.buf = buffer; 6088 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov, NULL); 6089 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, 6090 "WSARecv failed - %d error %d\n", ret, GetLastError()); 6091 6092 bufs.len = sizeof(char); 6093 bufs.buf = buffer+1; 6094 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov2, NULL); 6095 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, 6096 "WSARecv failed - %d error %d\n", ret, GetLastError()); 6097 6098 ret = send(dst, "12", 2, 0); 6099 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6100 broken_seq[0] = read_read_seq; /* win9x */ 6101 broken_seq[1] = NULL; 6102 ok_event_seq(src, hEvent, empty_seq, broken_seq, 0); 6103 6104 dwRet = WaitForSingleObject(ov.hEvent, 100); 6105 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError()); 6106 if (dwRet == WAIT_OBJECT_0) 6107 { 6108 bret = GetOverlappedResult((HANDLE)src, &ov, &bytesReturned, FALSE); 6109 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */, 6110 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError()); 6111 ok(buffer[0] == '1', "Got %c instead of 1\n", buffer[0]); 6112 } 6113 6114 dwRet = WaitForSingleObject(ov2.hEvent, 100); 6115 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError()); 6116 if (dwRet == WAIT_OBJECT_0) 6117 { 6118 bret = GetOverlappedResult((HANDLE)src, &ov2, &bytesReturned, FALSE); 6119 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */, 6120 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError()); 6121 ok(buffer[1] == '2', "Got %c instead of 2\n", buffer[1]); 6122 } 6123 6124 SetLastError(0xdeadbeef); 6125 ret = send(dst, "1", 1, 0); 6126 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6127 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6128 ok_event_seq(src, hEvent, read_seq, NULL, 0); 6129 6130 ret = recv(src, buffer, 1, 0); 6131 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError()); 6132 ok_event_seq(src, hEvent, empty_seq, NULL, 0); 6133 6134 /* Notifications are delivered as soon as possible, blocked only on 6135 * async requests on the same type */ 6136 bufs.len = sizeof(char); 6137 bufs.buf = buffer; 6138 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov, NULL); 6139 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, 6140 "WSARecv failed - %d error %d\n", ret, GetLastError()); 6141 6142 if (0) { 6143 ret = send(dst, "1", 1, MSG_OOB); 6144 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6145 ok_event_seq(src, hEvent, oob_seq, NULL, 0); 6146 } 6147 6148 dwRet = WaitForSingleObject(ov.hEvent, 100); 6149 ok(dwRet == WAIT_TIMEOUT, "OOB message activated read?: %d - %d\n", dwRet, GetLastError()); 6150 6151 ret = send(dst, "2", 1, 0); 6152 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6153 broken_seq[0] = read_seq; /* win98 */ 6154 broken_seq[1] = NULL; 6155 ok_event_seq(src, hEvent, empty_seq, broken_seq, 0); 6156 6157 dwRet = WaitForSingleObject(ov.hEvent, 100); 6158 ok(dwRet == WAIT_OBJECT_0 || broken(dwRet == WAIT_TIMEOUT), 6159 "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError()); 6160 if (dwRet == WAIT_OBJECT_0) 6161 { 6162 bret = GetOverlappedResult((HANDLE)src, &ov, &bytesReturned, FALSE); 6163 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */, 6164 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError()); 6165 ok(buffer[0] == '2', "Got %c instead of 2\n", buffer[0]); 6166 } 6167 6168 if (0) { 6169 ret = recv(src, buffer, 1, MSG_OOB); 6170 todo_wine ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError()); 6171 /* We get OOB notification, but no data on wine */ 6172 ok_event_seq(src, hEvent, empty_seq, NULL, 0); 6173 } 6174 6175 /* Flood the send queue */ 6176 hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id); 6177 if (hThread == NULL) 6178 { 6179 ok(0, "CreateThread failed, error %d\n", GetLastError()); 6180 goto end; 6181 } 6182 6183 /* Now FD_WRITE should not be set, because the socket send buffer isn't full yet */ 6184 ok_event_seq(src, hEvent, empty_seq, NULL, 0); 6185 6186 /* Now if we send a ton of data and the 'server' does not drain it fast 6187 * enough (set drain_pause to be sure), the socket send buffer will only 6188 * take some of it, and we will get a short write. This will trigger 6189 * another FD_WRITE event as soon as data is sent and more space becomes 6190 * available, but not any earlier. */ 6191 drain_pause = TRUE; 6192 do 6193 { 6194 ret = send(src, buffer, bufferSize, 0); 6195 } while (ret == bufferSize); 6196 drain_pause = FALSE; 6197 if (ret >= 0 || WSAGetLastError() == WSAEWOULDBLOCK) 6198 { 6199 Sleep(400); /* win9x */ 6200 broken_seq[0] = read_write_seq; 6201 broken_seq[1] = NULL; 6202 ok_event_seq(src, hEvent, write_seq, broken_seq, 0); 6203 } 6204 else 6205 { 6206 ok(0, "sending a lot of data failed with error %d\n", WSAGetLastError()); 6207 } 6208 6209 /* Test how FD_CLOSE is handled */ 6210 ret = send(dst, "12", 2, 0); 6211 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6212 6213 /* Wait a little and let the send complete */ 6214 Sleep(100); 6215 closesocket(dst); 6216 dst = INVALID_SOCKET; 6217 Sleep(100); 6218 6219 /* We can never implement this in wine, best we can hope for is 6220 sending FD_CLOSE after the reads complete */ 6221 broken_seq[0] = read_seq; /* win9x */ 6222 broken_seq[1] = NULL; 6223 todo_wine ok_event_seq(src, hEvent, read_close_seq, broken_seq, 0); 6224 6225 ret = recv(src, buffer, 1, 0); 6226 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError()); 6227 ok_event_seq(src, hEvent, read_seq, NULL, 0); 6228 6229 ret = recv(src, buffer, 1, 0); 6230 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError()); 6231 /* want it? it's here, but you can't have it */ 6232 broken_seq[0] = close_seq; /* win9x */ 6233 broken_seq[1] = NULL; 6234 todo_wine ok_event_seq(src, hEvent, empty_seq, /* wine sends FD_CLOSE here */ 6235 broken_seq, 0); 6236 6237 /* Test how FD_CLOSE is handled */ 6238 ret = send(dst2, "12", 2, 0); 6239 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError()); 6240 6241 Sleep(200); 6242 shutdown(dst2, SD_SEND); 6243 Sleep(200); 6244 6245 /* Some of the below are technically todo_wine, but our event sequence is still valid, so to prevent 6246 regressions, don't mark them as todo_wine, and mark windows as broken */ 6247 broken_seq[0] = read_close_seq; 6248 broken_seq[1] = close_seq; 6249 broken_seq[2] = NULL; 6250 ok_event_seq(src2, hEvent2, read_seq, broken_seq, 0); 6251 6252 ret = recv(src2, buffer, 1, 0); 6253 ok(ret == 1 || broken(!ret), "Failed to empty buffer: %d - %d\n", ret, GetLastError()); 6254 broken_seq[0] = close_seq; /* win98 */ 6255 broken_seq[1] = NULL; 6256 ok_event_seq(src2, hEvent2, read_seq, broken_seq, 0); 6257 6258 ret = recv(src2, buffer, 1, 0); 6259 ok(ret == 1 || broken(!ret), "Failed to empty buffer: %d - %d\n", ret, GetLastError()); 6260 broken_seq[0] = empty_seq; 6261 broken_seq[1] = NULL; 6262 ok_event_seq(src2, hEvent2, close_seq, broken_seq, 0); 6263 6264 ret = send(src2, "1", 1, 0); 6265 ok(ret == 1, "Sending to half-closed socket failed %d err %d\n", ret, GetLastError()); 6266 ok_event_seq(src2, hEvent2, empty_seq, NULL, 0); 6267 6268 ret = send(src2, "1", 1, 0); 6269 ok(ret == 1, "Sending to half-closed socket failed %d err %d\n", ret, GetLastError()); 6270 ok_event_seq(src2, hEvent2, empty_seq, NULL, 0); 6271 6272 if (useMessages) 6273 { 6274 ret = WSAAsyncSelect(src, hWnd, WM_SOCKET, 0); 6275 if (ret) 6276 { 6277 ok(0, "WSAAsyncSelect failed, error %d\n", ret); 6278 goto end; 6279 } 6280 6281 ret = set_blocking(src, TRUE); 6282 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError()); 6283 6284 ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, 0); 6285 if (ret) 6286 { 6287 ok(0, "WSAAsyncSelect failed, error %d\n", ret); 6288 goto end; 6289 } 6290 6291 ret = set_blocking(src2, TRUE); 6292 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError()); 6293 } 6294 else 6295 { 6296 ret = WSAEventSelect(src, hEvent2, 0); 6297 if (ret) 6298 { 6299 ok(0, "WSAAsyncSelect failed, error %d\n", ret); 6300 goto end; 6301 } 6302 6303 ret = set_blocking(src, TRUE); 6304 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError()); 6305 6306 ret = WSAEventSelect(src2, hEvent2, 0); 6307 if (ret) 6308 { 6309 ok(0, "WSAAsyncSelect failed, error %d\n", ret); 6310 goto end; 6311 } 6312 6313 ret = set_blocking(src2, TRUE); 6314 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError()); 6315 } 6316 6317 end: 6318 if (src != INVALID_SOCKET) 6319 { 6320 flush_events(src, hEvent); 6321 closesocket(src); 6322 } 6323 if (src2 != INVALID_SOCKET) 6324 { 6325 flush_events(src2, hEvent2); 6326 closesocket(src2); 6327 } 6328 HeapFree(GetProcessHeap(), 0, buffer); 6329 if (server != INVALID_SOCKET) 6330 closesocket(server); 6331 if (dst != INVALID_SOCKET) 6332 closesocket(dst); 6333 if (dst2 != INVALID_SOCKET) 6334 closesocket(dst2); 6335 if (hThread != NULL) 6336 CloseHandle(hThread); 6337 if (hWnd != NULL) 6338 DestroyWindow(hWnd); 6339 if (hEvent != NULL) 6340 CloseHandle(hEvent); 6341 if (hEvent2 != NULL) 6342 CloseHandle(hEvent2); 6343 if (ov.hEvent != NULL) 6344 CloseHandle(ov.hEvent); 6345 if (ov2.hEvent != NULL) 6346 CloseHandle(ov2.hEvent); 6347 } 6348 6349 static void test_ipv6only(void) 6350 { 6351 SOCKET v4 = INVALID_SOCKET, v6; 6352 struct sockaddr_in sin4; 6353 struct sockaddr_in6 sin6; 6354 int ret, enabled, len = sizeof(enabled); 6355 6356 memset(&sin4, 0, sizeof(sin4)); 6357 sin4.sin_family = AF_INET; 6358 sin4.sin_port = htons(SERVERPORT); 6359 6360 memset(&sin6, 0, sizeof(sin6)); 6361 sin6.sin6_family = AF_INET6; 6362 sin6.sin6_port = htons(SERVERPORT); 6363 6364 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); 6365 if (v6 == INVALID_SOCKET) 6366 { 6367 skip("Could not create IPv6 socket (LastError: %d)\n", WSAGetLastError()); 6368 goto end; 6369 } 6370 6371 enabled = 2; 6372 ret = getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len); 6373 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6374 ok(enabled == 1, "expected 1, got %d\n", enabled); 6375 6376 ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6)); 6377 if (ret) 6378 { 6379 skip("Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError()); 6380 goto end; 6381 } 6382 6383 v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 6384 ok(v4 != INVALID_SOCKET, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError()); 6385 6386 todo_wine { 6387 enabled = 2; 6388 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len); 6389 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6390 ok(enabled == 1, "expected 1, got %d\n", enabled); 6391 } 6392 6393 enabled = 0; 6394 len = sizeof(enabled); 6395 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len); 6396 ok(!ret, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6397 6398 todo_wine { 6399 enabled = 2; 6400 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len); 6401 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6402 ok(!enabled, "expected 0, got %d\n", enabled); 6403 } 6404 6405 enabled = 1; 6406 len = sizeof(enabled); 6407 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len); 6408 ok(!ret, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6409 6410 /* bind on IPv4 socket should succeed - IPV6_V6ONLY is enabled by default */ 6411 ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4)); 6412 ok(!ret, "Could not bind IPv4 address (LastError: %d)\n", WSAGetLastError()); 6413 6414 todo_wine { 6415 enabled = 2; 6416 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len); 6417 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6418 ok(enabled == 1, "expected 1, got %d\n", enabled); 6419 } 6420 6421 enabled = 0; 6422 len = sizeof(enabled); 6423 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len); 6424 ok(ret, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError()); 6425 6426 todo_wine { 6427 enabled = 0; 6428 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len); 6429 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6430 ok(enabled == 1, "expected 1, got %d\n", enabled); 6431 } 6432 6433 enabled = 1; 6434 len = sizeof(enabled); 6435 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len); 6436 ok(ret, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError()); 6437 6438 closesocket(v4); 6439 closesocket(v6); 6440 6441 /* Test again, this time disabling IPV6_V6ONLY. */ 6442 sin4.sin_port = htons(SERVERPORT+2); 6443 sin6.sin6_port = htons(SERVERPORT+2); 6444 6445 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); 6446 ok(v6 != INVALID_SOCKET, "Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n", 6447 WSAGetLastError(), WSAEAFNOSUPPORT); 6448 6449 enabled = 0; 6450 ret = setsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len); 6451 ok(!ret, "Could not disable IPV6_V6ONLY (LastError: %d).\n", WSAGetLastError()); 6452 6453 enabled = 2; 6454 ret = getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len); 6455 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6456 ok(!enabled, "expected 0, got %d\n", enabled); 6457 6458 /* 6459 Observaition: 6460 On Windows, bind on both IPv4 and IPv6 with IPV6_V6ONLY disabled succeeds by default. 6461 Application must set SO_EXCLUSIVEADDRUSE on first socket to disallow another successful bind. 6462 In general, a standard application should not use SO_REUSEADDR. 6463 Setting both SO_EXCLUSIVEADDRUSE and SO_REUSEADDR on the same socket is not possible in 6464 either order, the later setsockopt call always fails. 6465 */ 6466 enabled = 1; 6467 ret = setsockopt(v6, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&enabled, len); 6468 ok(!ret, "Could not set SO_EXCLUSIVEADDRUSE on IPv6 socket (LastError: %d)\n", WSAGetLastError()); 6469 6470 ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6)); 6471 ok(!ret, "Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError()); 6472 6473 enabled = 2; 6474 len = sizeof(enabled); 6475 getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len); 6476 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError()); 6477 ok(!enabled, "IPV6_V6ONLY is enabled after bind\n"); 6478 6479 v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 6480 ok(v4 != INVALID_SOCKET, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError()); 6481 6482 enabled = 1; 6483 ret = setsockopt(v4, SOL_SOCKET, SO_REUSEADDR, (char*)&enabled, len); 6484 ok(!ret, "Could not set SO_REUSEADDR on IPv4 socket (LastError: %d)\n", WSAGetLastError()); 6485 6486 WSASetLastError(0xdeadbeef); 6487 ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4)); 6488 ok(ret, "bind succeeded unexpectedly for the IPv4 socket\n"); 6489 ok(WSAGetLastError() == WSAEACCES, "Expected 10013, got %d\n", WSAGetLastError()); 6490 6491 end: 6492 if (v4 != INVALID_SOCKET) 6493 closesocket(v4); 6494 if (v6 != INVALID_SOCKET) 6495 closesocket(v6); 6496 } 6497 6498 static void test_WSASendMsg(void) 6499 { 6500 SOCKET sock, dst; 6501 struct sockaddr_in sendaddr, sockaddr; 6502 GUID WSASendMsg_GUID = WSAID_WSASENDMSG; 6503 LPFN_WSASENDMSG pWSASendMsg = NULL; 6504 char teststr[12] = "hello world", buffer[32]; 6505 WSABUF iovec[2]; 6506 WSAMSG msg; 6507 DWORD bytesSent, err; 6508 int ret, addrlen; 6509 6510 /* FIXME: Missing OVERLAPPED and OVERLAPPED COMPLETION ROUTINE tests */ 6511 6512 sock = socket(AF_INET, SOCK_DGRAM, 0); 6513 ok(sock != INVALID_SOCKET, "socket() failed\n"); 6514 6515 /* Obtain the WSASendMsg function */ 6516 WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &WSASendMsg_GUID, sizeof(WSASendMsg_GUID), 6517 &pWSASendMsg, sizeof(pWSASendMsg), &err, NULL, NULL); 6518 if (!pWSASendMsg) 6519 { 6520 closesocket(sock); 6521 win_skip("WSASendMsg is unsupported, some tests will be skipped.\n"); 6522 return; 6523 } 6524 6525 /* fake address for now */ 6526 sendaddr.sin_family = AF_INET; 6527 sendaddr.sin_port = htons(139); 6528 sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 6529 6530 memset(&msg, 0, sizeof(msg)); 6531 iovec[0].buf = teststr; 6532 iovec[0].len = sizeof(teststr); 6533 iovec[1].buf = teststr; 6534 iovec[1].len = sizeof(teststr) / 2; 6535 msg.name = (struct sockaddr *) &sendaddr; 6536 msg.namelen = sizeof(sendaddr); 6537 msg.lpBuffers = iovec; 6538 msg.dwBufferCount = 1; /* send only one buffer for now */ 6539 6540 WSASetLastError(0xdeadbeef); 6541 ret = pWSASendMsg(INVALID_SOCKET, &msg, 0, NULL, NULL, NULL); 6542 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n"); 6543 err = WSAGetLastError(); 6544 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err); 6545 6546 WSASetLastError(0xdeadbeef); 6547 ret = pWSASendMsg(sock, NULL, 0, NULL, NULL, NULL); 6548 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n"); 6549 err = WSAGetLastError(); 6550 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err); 6551 6552 WSASetLastError(0xdeadbeef); 6553 ret = pWSASendMsg(sock, NULL, 0, &bytesSent, NULL, NULL); 6554 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n"); 6555 err = WSAGetLastError(); 6556 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err); 6557 6558 WSASetLastError(0xdeadbeef); 6559 ret = pWSASendMsg(sock, &msg, 0, NULL, NULL, NULL); 6560 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n"); 6561 err = WSAGetLastError(); 6562 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err); 6563 6564 closesocket(sock); 6565 6566 sock = socket(AF_INET, SOCK_DGRAM, 0); 6567 ok(sock != INVALID_SOCKET, "socket() failed\n"); 6568 6569 dst = socket(AF_INET, SOCK_DGRAM, 0); 6570 ok(dst != INVALID_SOCKET, "socket() failed\n"); 6571 6572 memset(&sockaddr, 0, sizeof(sockaddr)); 6573 sockaddr.sin_family = AF_INET; 6574 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 6575 ok(!bind(dst, (struct sockaddr*)&sockaddr, sizeof(sockaddr)), 6576 "bind should have worked\n"); 6577 6578 /* read address to find out the port number to be used in send */ 6579 memset(&sendaddr, 0, sizeof(sendaddr)); 6580 addrlen = sizeof(sendaddr); 6581 ok(!getsockname(dst, (struct sockaddr *) &sendaddr, &addrlen), 6582 "getsockname should have worked\n"); 6583 ok(sendaddr.sin_port, "socket port should be != 0\n"); 6584 6585 /* ensure the sending socket is not bound */ 6586 WSASetLastError(0xdeadbeef); 6587 addrlen = sizeof(sockaddr); 6588 ret = getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen); 6589 ok(ret == SOCKET_ERROR, "getsockname should have failed\n"); 6590 err = WSAGetLastError(); 6591 ok(err == WSAEINVAL, "expected 10022, got %d instead\n", err); 6592 6593 set_blocking(sock, TRUE); 6594 6595 bytesSent = 0; 6596 SetLastError(0xdeadbeef); 6597 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL); 6598 ok(!ret, "WSASendMsg should have worked\n"); 6599 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */, 6600 "Expected 0, got %d\n", GetLastError()); 6601 ok(bytesSent == iovec[0].len, "incorret bytes sent, expected %d, sent %d\n", 6602 iovec[0].len, bytesSent); 6603 6604 /* receive data */ 6605 addrlen = sizeof(sockaddr); 6606 memset(buffer, 0, sizeof(buffer)); 6607 SetLastError(0xdeadbeef); 6608 ret = recvfrom(dst, buffer, sizeof(buffer), 0, (struct sockaddr *) &sockaddr, &addrlen); 6609 ok(ret == bytesSent, "got %d, expected %d\n", 6610 ret, bytesSent); 6611 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6612 6613 /* A successful call to WSASendMsg must have bound the socket */ 6614 addrlen = sizeof(sockaddr); 6615 sockaddr.sin_port = 0; 6616 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 6617 ret = getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen); 6618 ok(!ret, "getsockname should have worked\n"); 6619 ok(sockaddr.sin_addr.s_addr == htonl(INADDR_ANY), "expected 0.0.0.0, got %s\n", 6620 inet_ntoa(sockaddr.sin_addr)); 6621 ok(sockaddr.sin_port, "sin_port should be != 0\n"); 6622 6623 msg.dwBufferCount = 2; /* send both buffers */ 6624 6625 bytesSent = 0; 6626 SetLastError(0xdeadbeef); 6627 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL); 6628 ok(!ret, "WSASendMsg should have worked\n"); 6629 ok(bytesSent == iovec[0].len + iovec[1].len, "incorret bytes sent, expected %d, sent %d\n", 6630 iovec[0].len + iovec[1].len, bytesSent); 6631 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */, 6632 "Expected 0, got %d\n", GetLastError()); 6633 6634 /* receive data */ 6635 addrlen = sizeof(sockaddr); 6636 memset(buffer, 0, sizeof(buffer)); 6637 SetLastError(0xdeadbeef); 6638 ret = recvfrom(dst, buffer, sizeof(buffer), 0, (struct sockaddr *) &sockaddr, &addrlen); 6639 ok(ret == bytesSent, "got %d, expected %d\n", 6640 ret, bytesSent); 6641 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6642 6643 closesocket(sock); 6644 closesocket(dst); 6645 6646 /* a bad call to WSASendMsg will also bind the socket */ 6647 addrlen = sizeof(sockaddr); 6648 sockaddr.sin_port = 0; 6649 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 6650 sock = socket(AF_INET, SOCK_DGRAM, 0); 6651 ok(sock != INVALID_SOCKET, "socket() failed\n"); 6652 ok(pWSASendMsg(sock, &msg, 0, NULL, NULL, NULL) == SOCKET_ERROR, "WSASendMsg should have failed\n"); 6653 todo_wine { 6654 ok(!getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen), "getsockname should have worked\n"); 6655 ok(sockaddr.sin_addr.s_addr == htonl(INADDR_ANY), "expected 0.0.0.0, got %s\n", 6656 inet_ntoa(sockaddr.sin_addr)); 6657 ok(sockaddr.sin_port, "sin_port should be > 0\n"); 6658 } 6659 closesocket(sock); 6660 6661 /* a bad call without msg parameter will not trigger the auto-bind */ 6662 sock = socket(AF_INET, SOCK_DGRAM, 0); 6663 ok(sock != INVALID_SOCKET, "socket() failed\n"); 6664 ok(pWSASendMsg(sock, NULL, 0, NULL, NULL, NULL) == SOCKET_ERROR, "WSASendMsg should have failed\n"); 6665 ok(getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen), "getsockname should have failed\n"); 6666 err = WSAGetLastError(); 6667 ok(err == WSAEINVAL, "expected 10022, got %d instead\n", err); 6668 closesocket(sock); 6669 6670 /* SOCK_STREAM sockets are not supported */ 6671 bytesSent = 0; 6672 sock = socket(AF_INET, SOCK_STREAM, 0); 6673 ok(sock != INVALID_SOCKET, "socket() failed\n"); 6674 SetLastError(0xdeadbeef); 6675 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL); 6676 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n"); 6677 err = WSAGetLastError(); 6678 todo_wine 6679 ok(err == WSAEINVAL, "expected 10014, got %d instead\n", err); 6680 closesocket(sock); 6681 } 6682 6683 static void test_WSASendTo(void) 6684 { 6685 SOCKET s; 6686 struct sockaddr_in addr; 6687 char buf[12] = "hello world"; 6688 WSABUF data_buf; 6689 DWORD bytesSent; 6690 int ret; 6691 6692 addr.sin_family = AF_INET; 6693 addr.sin_port = htons(139); 6694 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 6695 data_buf.len = sizeof(buf); 6696 data_buf.buf = buf; 6697 6698 if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { 6699 ok(0, "socket() failed error: %d\n", WSAGetLastError()); 6700 return; 6701 } 6702 6703 WSASetLastError(12345); 6704 ret = WSASendTo(INVALID_SOCKET, &data_buf, 1, NULL, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL); 6705 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAENOTSOCK, 6706 "WSASendTo() failed: %d/%d\n", ret, WSAGetLastError()); 6707 6708 WSASetLastError(12345); 6709 ret = WSASendTo(s, &data_buf, 1, NULL, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL); 6710 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 6711 "WSASendTo() failed: %d/%d\n", ret, WSAGetLastError()); 6712 6713 WSASetLastError(12345); 6714 if(WSASendTo(s, &data_buf, 1, &bytesSent, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL)) { 6715 ok(0, "WSASendTo() failed error: %d\n", WSAGetLastError()); 6716 return; 6717 } 6718 ok(!WSAGetLastError(), "WSAGetLastError() should return zero after " 6719 "a successful call to WSASendTo()\n"); 6720 } 6721 6722 static DWORD WINAPI recv_thread(LPVOID arg) 6723 { 6724 SOCKET sock = *(SOCKET *)arg; 6725 char buffer[32]; 6726 WSABUF wsa; 6727 WSAOVERLAPPED ov; 6728 DWORD flags = 0; 6729 6730 wsa.buf = buffer; 6731 wsa.len = sizeof(buffer); 6732 ov.hEvent = WSACreateEvent(); 6733 WSARecv(sock, &wsa, 1, NULL, &flags, &ov, NULL); 6734 6735 WaitForSingleObject(ov.hEvent, 1000); 6736 WSACloseEvent(ov.hEvent); 6737 return 0; 6738 } 6739 6740 static int completion_called; 6741 6742 static void WINAPI io_completion(DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags) 6743 { 6744 completion_called++; 6745 } 6746 6747 static void test_WSARecv(void) 6748 { 6749 SOCKET src, dest, server = INVALID_SOCKET; 6750 char buf[20]; 6751 WSABUF bufs[2]; 6752 WSAOVERLAPPED ov; 6753 DWORD bytesReturned, flags, id; 6754 struct linger ling; 6755 struct sockaddr_in addr; 6756 int iret, len; 6757 DWORD dwret; 6758 BOOL bret; 6759 HANDLE thread, event = NULL, io_port; 6760 6761 tcp_socketpair(&src, &dest); 6762 if (src == INVALID_SOCKET || dest == INVALID_SOCKET) 6763 { 6764 skip("failed to create sockets\n"); 6765 goto end; 6766 } 6767 6768 memset(&ov, 0, sizeof(ov)); 6769 flags = 0; 6770 bufs[0].len = 2; 6771 bufs[0].buf = buf; 6772 6773 /* Send 4 bytes and receive in two calls of 2 */ 6774 SetLastError(0xdeadbeef); 6775 iret = send(src, "test", 4, 0); 6776 ok(iret == 4, "Expected 4, got %d\n", iret); 6777 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6778 SetLastError(0xdeadbeef); 6779 bytesReturned = 0xdeadbeef; 6780 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL); 6781 ok(!iret, "Expected 0, got %d\n", iret); 6782 ok(bytesReturned == 2, "Expected 2, got %d\n", bytesReturned); 6783 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6784 SetLastError(0xdeadbeef); 6785 bytesReturned = 0xdeadbeef; 6786 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL); 6787 ok(!iret, "Expected 0, got %d\n", iret); 6788 ok(bytesReturned == 2, "Expected 2, got %d\n", bytesReturned); 6789 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6790 6791 bufs[0].len = 4; 6792 SetLastError(0xdeadbeef); 6793 iret = send(src, "test", 4, 0); 6794 ok(iret == 4, "Expected 4, got %d\n", iret); 6795 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6796 SetLastError(0xdeadbeef); 6797 bytesReturned = 0xdeadbeef; 6798 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL); 6799 ok(!iret, "Expected 0, got %d\n", iret); 6800 ok(bytesReturned == 4, "Expected 4, got %d\n", bytesReturned); 6801 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6802 6803 /* Test 2 buffers */ 6804 bufs[0].len = 4; 6805 bufs[1].len = 5; 6806 bufs[1].buf = buf + 10; 6807 SetLastError(0xdeadbeef); 6808 iret = send(src, "deadbeefs", 9, 0); 6809 ok(iret == 9, "Expected 9, got %d\n", iret); 6810 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6811 SetLastError(0xdeadbeef); 6812 bytesReturned = 0xdeadbeef; 6813 iret = WSARecv(dest, bufs, 2, &bytesReturned, &flags, NULL, NULL); 6814 ok(!iret, "Expected 0, got %d\n", iret); 6815 ok(bytesReturned == 9, "Expected 9, got %d\n", bytesReturned); 6816 bufs[0].buf[4] = '\0'; 6817 bufs[1].buf[5] = '\0'; 6818 ok(!strcmp(bufs[0].buf, "dead"), "buf[0] doesn't match: %s != dead\n", bufs[0].buf); 6819 ok(!strcmp(bufs[1].buf, "beefs"), "buf[1] doesn't match: %s != beefs\n", bufs[1].buf); 6820 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError()); 6821 6822 bufs[0].len = sizeof(buf); 6823 ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL); 6824 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError()); 6825 if (!event) 6826 goto end; 6827 6828 ling.l_onoff = 1; 6829 ling.l_linger = 0; 6830 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling)); 6831 ok(!iret, "Failed to set linger %d\n", GetLastError()); 6832 6833 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, NULL); 6834 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError()); 6835 6836 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, &ov, NULL); 6837 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError()); 6838 6839 closesocket(src); 6840 src = INVALID_SOCKET; 6841 6842 dwret = WaitForSingleObject(ov.hEvent, 1000); 6843 ok(dwret == WAIT_OBJECT_0, "Waiting for disconnect event failed with %d + errno %d\n", dwret, GetLastError()); 6844 6845 bret = GetOverlappedResult((HANDLE)dest, &ov, &bytesReturned, FALSE); 6846 todo_wine ok(!bret && (GetLastError() == ERROR_NETNAME_DELETED || broken(GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */), 6847 "Did not get disconnect event: %d, error %d\n", bret, GetLastError()); 6848 ok(bytesReturned == 0, "Bytes received is %d\n", bytesReturned); 6849 closesocket(dest); 6850 dest = INVALID_SOCKET; 6851 6852 src = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); 6853 ok(src != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError()); 6854 if (src == INVALID_SOCKET) goto end; 6855 6856 server = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 6857 ok(server != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError()); 6858 if (server == INVALID_SOCKET) goto end; 6859 6860 memset(&addr, 0, sizeof(addr)); 6861 addr.sin_family = AF_INET; 6862 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 6863 iret = bind(server, (struct sockaddr *)&addr, sizeof(addr)); 6864 if (iret) goto end; 6865 6866 len = sizeof(addr); 6867 iret = getsockname(server, (struct sockaddr *)&addr, &len); 6868 if (iret) goto end; 6869 6870 iret = listen(server, 1); 6871 if (iret) goto end; 6872 6873 iret = connect(src, (struct sockaddr *)&addr, sizeof(addr)); 6874 if (iret) goto end; 6875 6876 len = sizeof(addr); 6877 dest = accept(server, (struct sockaddr *)&addr, &len); 6878 ok(dest != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError()); 6879 if (dest == INVALID_SOCKET) goto end; 6880 6881 send(src, "test message", sizeof("test message"), 0); 6882 thread = CreateThread(NULL, 0, recv_thread, &dest, 0, &id); 6883 WaitForSingleObject(thread, 3000); 6884 CloseHandle(thread); 6885 6886 memset(&ov, 0, sizeof(ov)); 6887 ov.hEvent = event; 6888 ResetEvent(event); 6889 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion); 6890 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError()); 6891 send(src, "test message", sizeof("test message"), 0); 6892 6893 completion_called = 0; 6894 dwret = SleepEx(1000, TRUE); 6895 ok(dwret == WAIT_IO_COMPLETION, "got %u\n", dwret); 6896 ok(completion_called == 1, "completion not called\n"); 6897 6898 dwret = WaitForSingleObject(event, 1); 6899 ok(dwret == WAIT_TIMEOUT, "got %u\n", dwret); 6900 6901 io_port = CreateIoCompletionPort( (HANDLE)dest, NULL, 0, 0 ); 6902 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 6903 6904 /* Using completion function on socket associated with completion port is not allowed. */ 6905 memset(&ov, 0, sizeof(ov)); 6906 completion_called = 0; 6907 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion); 6908 ok(iret == SOCKET_ERROR && GetLastError() == WSAEINVAL, "WSARecv failed - %d error %d\n", iret, GetLastError()); 6909 ok(!completion_called, "completion called\n"); 6910 6911 CloseHandle(io_port); 6912 6913 end: 6914 if (server != INVALID_SOCKET) 6915 closesocket(server); 6916 if (dest != INVALID_SOCKET) 6917 closesocket(dest); 6918 if (src != INVALID_SOCKET) 6919 closesocket(src); 6920 if (event) 6921 WSACloseEvent(event); 6922 } 6923 6924 struct write_watch_thread_args 6925 { 6926 int func; 6927 SOCKET dest; 6928 void *base; 6929 DWORD size; 6930 const char *expect; 6931 }; 6932 6933 static DWORD CALLBACK write_watch_thread( void *arg ) 6934 { 6935 struct write_watch_thread_args *args = arg; 6936 struct sockaddr addr; 6937 int addr_len = sizeof(addr), ret; 6938 DWORD bytes, flags = 0; 6939 WSABUF buf[1]; 6940 6941 switch (args->func) 6942 { 6943 case 0: 6944 ret = recv( args->dest, args->base, args->size, 0 ); 6945 ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret ); 6946 ok( !strcmp( args->base, args->expect ), "wrong data\n" ); 6947 break; 6948 case 1: 6949 ret = recvfrom( args->dest, args->base, args->size, 0, &addr, &addr_len ); 6950 ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret ); 6951 ok( !strcmp( args->base, args->expect ), "wrong data\n" ); 6952 break; 6953 case 2: 6954 buf[0].len = args->size; 6955 buf[0].buf = args->base; 6956 ret = WSARecv( args->dest, buf, 1, &bytes, &flags, NULL, NULL ); 6957 ok( !ret, "WSARecv failed %u\n", GetLastError() ); 6958 ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes ); 6959 ok( !strcmp( args->base, args->expect ), "wrong data\n" ); 6960 break; 6961 case 3: 6962 buf[0].len = args->size; 6963 buf[0].buf = args->base; 6964 ret = WSARecvFrom( args->dest, buf, 1, &bytes, &flags, &addr, &addr_len, NULL, NULL ); 6965 ok( !ret, "WSARecvFrom failed %u\n", GetLastError() ); 6966 ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes ); 6967 ok( !strcmp( args->base, args->expect ), "wrong data\n" ); 6968 break; 6969 } 6970 return 0; 6971 } 6972 6973 static void test_write_watch(void) 6974 { 6975 SOCKET src, dest; 6976 WSABUF bufs[2]; 6977 WSAOVERLAPPED ov; 6978 struct write_watch_thread_args args; 6979 DWORD bytesReturned, flags, size; 6980 struct sockaddr addr; 6981 int addr_len, ret; 6982 HANDLE thread, event; 6983 char *base; 6984 void *results[64]; 6985 ULONG_PTR count; 6986 ULONG pagesize; 6987 UINT (WINAPI *pGetWriteWatch)(DWORD,LPVOID,SIZE_T,LPVOID*,ULONG_PTR*,ULONG*); 6988 6989 pGetWriteWatch = (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetWriteWatch" ); 6990 if (!pGetWriteWatch) 6991 { 6992 win_skip( "write watched not supported\n" ); 6993 return; 6994 } 6995 6996 tcp_socketpair(&src, &dest); 6997 if (src == INVALID_SOCKET || dest == INVALID_SOCKET) 6998 { 6999 skip("failed to create sockets\n"); 7000 return; 7001 } 7002 7003 memset(&ov, 0, sizeof(ov)); 7004 ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL); 7005 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError()); 7006 7007 flags = 0; 7008 7009 size = 0x10000; 7010 base = VirtualAlloc( 0, size, MEM_RESERVE | MEM_COMMIT | MEM_WRITE_WATCH, PAGE_READWRITE ); 7011 ok( base != NULL, "VirtualAlloc failed %u\n", GetLastError() ); 7012 7013 memset( base, 0, size ); 7014 count = 64; 7015 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7016 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7017 ok( count == 16, "wrong count %lu\n", count ); 7018 7019 bufs[0].len = 5; 7020 bufs[0].buf = base; 7021 bufs[1].len = 0x8000; 7022 bufs[1].buf = base + 0x4000; 7023 7024 ret = WSARecv( dest, bufs, 2, NULL, &flags, &ov, NULL); 7025 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, 7026 "WSARecv failed - %d error %d\n", ret, GetLastError()); 7027 7028 count = 64; 7029 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7030 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7031 ok( count == 9, "wrong count %lu\n", count ); 7032 ok( !base[0], "data set\n" ); 7033 7034 send(src, "test message", sizeof("test message"), 0); 7035 7036 ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE ); 7037 ok( ret, "GetOverlappedResult failed %u\n", GetLastError() ); 7038 ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned ); 7039 ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base ); 7040 ok( !memcmp( base + 0x4000, "message", 8 ), "wrong data %s\n", base + 0x4000 ); 7041 7042 count = 64; 7043 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7044 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7045 ok( count == 0, "wrong count %lu\n", count ); 7046 7047 memset( base, 0, size ); 7048 count = 64; 7049 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7050 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7051 ok( count == 16, "wrong count %lu\n", count ); 7052 7053 bufs[1].len = 0x4000; 7054 bufs[1].buf = base + 0x2000; 7055 ret = WSARecvFrom( dest, bufs, 2, NULL, &flags, &addr, &addr_len, &ov, NULL); 7056 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, 7057 "WSARecv failed - %d error %d\n", ret, GetLastError()); 7058 7059 count = 64; 7060 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7061 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7062 ok( count == 5, "wrong count %lu\n", count ); 7063 ok( !base[0], "data set\n" ); 7064 7065 send(src, "test message", sizeof("test message"), 0); 7066 7067 ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE ); 7068 ok( ret, "GetOverlappedResult failed %u\n", GetLastError() ); 7069 ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned ); 7070 ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base ); 7071 ok( !memcmp( base + 0x2000, "message", 8 ), "wrong data %s\n", base + 0x2000 ); 7072 7073 count = 64; 7074 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7075 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7076 ok( count == 0, "wrong count %lu\n", count ); 7077 7078 memset( base, 0, size ); 7079 count = 64; 7080 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7081 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7082 ok( count == 16, "wrong count %lu\n", count ); 7083 7084 args.dest = dest; 7085 args.base = base; 7086 args.size = 0x7002; 7087 args.expect = "test message"; 7088 for (args.func = 0; args.func < 4; args.func++) 7089 { 7090 thread = CreateThread( NULL, 0, write_watch_thread, &args, 0, NULL ); 7091 Sleep( 200 ); 7092 7093 count = 64; 7094 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7095 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7096 ok( count == 8, "wrong count %lu\n", count ); 7097 7098 send(src, "test message", sizeof("test message"), 0); 7099 WaitForSingleObject( thread, 10000 ); 7100 CloseHandle( thread ); 7101 7102 count = 64; 7103 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); 7104 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); 7105 ok( count == 0, "wrong count %lu\n", count ); 7106 } 7107 WSACloseEvent( event ); 7108 closesocket( dest ); 7109 closesocket( src ); 7110 VirtualFree( base, 0, MEM_FREE ); 7111 } 7112 7113 #define POLL_CLEAR() ix = 0 7114 #define POLL_SET(s, ev) {fds[ix].fd = s; fds[ix++].events = ev;} 7115 #define POLL_ISSET(s, rev) poll_isset(fds, ix, s, rev) 7116 static BOOL poll_isset(WSAPOLLFD *fds, int max, SOCKET s, int rev) 7117 { 7118 int k; 7119 for (k = 0; k < max; k++) 7120 if (fds[k].fd == s && (fds[k].revents == rev)) return TRUE; 7121 return FALSE; 7122 } 7123 7124 static void test_WSAPoll(void) 7125 { 7126 int ix, ret, err, poll_timeout; 7127 SOCKET fdListen, fdRead, fdWrite; 7128 struct sockaddr_in address; 7129 socklen_t len; 7130 static char tmp_buf[1024]; 7131 WSAPOLLFD fds[16]; 7132 HANDLE thread_handle; 7133 DWORD id; 7134 7135 if (!pWSAPoll) /* >= Vista */ 7136 { 7137 skip("WSAPoll is unsupported, some tests will be skipped.\n"); 7138 return; 7139 } 7140 7141 /* Invalid parameters test */ 7142 SetLastError(0xdeadbeef); 7143 ret = pWSAPoll(NULL, 0, 0); 7144 err = GetLastError(); 7145 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 7146 ok(err == WSAEINVAL, "expected 10022, got %d\n", err); 7147 SetLastError(0xdeadbeef); 7148 ret = pWSAPoll(NULL, 1, 0); 7149 err = GetLastError(); 7150 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 7151 ok(err == WSAEFAULT, "expected 10014, got %d\n", err); 7152 SetLastError(0xdeadbeef); 7153 ret = pWSAPoll(NULL, 0, 1); 7154 err = GetLastError(); 7155 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 7156 ok(err == WSAEINVAL, "expected 10022, got %d\n", err); 7157 SetLastError(0xdeadbeef); 7158 ret = pWSAPoll(NULL, 1, 1); 7159 err = GetLastError(); 7160 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 7161 ok(err == WSAEFAULT, "expected 10014, got %d\n", err); 7162 7163 /* WSAPoll() tries to mime the unix poll() call. The following tests do: 7164 * - check if a connection attempt ended with success or error; 7165 * - check if a pending connection is waiting for acceptance; 7166 * - check for data to read, availability for write and OOB data 7167 */ 7168 memset(&address, 0, sizeof(address)); 7169 address.sin_addr.s_addr = inet_addr("127.0.0.1"); 7170 address.sin_family = AF_INET; 7171 len = sizeof(address); 7172 fdListen = setup_server_socket(&address, &len); 7173 poll_timeout = 100; 7174 7175 /* When no events are pending poll returns 0 with no error */ 7176 POLL_CLEAR(); 7177 POLL_SET(fdListen, POLLIN); 7178 ret = pWSAPoll(fds, ix, poll_timeout); 7179 ok(ret == 0, "expected 0, got %d\n", ret); 7180 7181 /* Test listening socket connection attempt notifications */ 7182 fdWrite = setup_connector_socket(&address, len, TRUE); 7183 POLL_CLEAR(); 7184 POLL_SET(fdListen, POLLIN | POLLOUT); 7185 ret = pWSAPoll(fds, ix, poll_timeout); 7186 ok(ret == 1, "expected 1, got %d\n", ret); 7187 ok(POLL_ISSET(fdListen, POLLRDNORM), "fdListen socket events incorrect\n"); 7188 len = sizeof(address); 7189 fdRead = accept(fdListen, (struct sockaddr*) &address, &len); 7190 ok(fdRead != INVALID_SOCKET, "expected a valid socket\n"); 7191 7192 /* Test client side connection attempt notifications */ 7193 POLL_CLEAR(); 7194 POLL_SET(fdListen, POLLIN | POLLOUT); 7195 POLL_SET(fdRead, POLLIN | POLLOUT); 7196 POLL_SET(fdWrite, POLLIN | POLLOUT); 7197 ret = pWSAPoll(fds, ix, poll_timeout); 7198 ok(ret == 2, "expected 2, got %d\n", ret); 7199 ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n"); 7200 ok(POLL_ISSET(fdRead, POLLWRNORM), "fdRead socket events incorrect\n"); 7201 len = sizeof(id); 7202 id = 0xdeadbeef; 7203 err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len); 7204 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 7205 ok(id == 0, "expected 0, got %d\n", id); 7206 7207 /* Test data receiving notifications */ 7208 ret = send(fdWrite, "1234", 4, 0); 7209 ok(ret == 4, "expected 4, got %d\n", ret); 7210 POLL_CLEAR(); 7211 POLL_SET(fdListen, POLLIN | POLLOUT); 7212 POLL_SET(fdRead, POLLIN); 7213 ret = pWSAPoll(fds, ix, poll_timeout); 7214 ok(ret == 1, "expected 1, got %d\n", ret); 7215 ok(POLL_ISSET(fdRead, POLLRDNORM), "fdRead socket events incorrect\n"); 7216 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0); 7217 ok(ret == 4, "expected 4, got %d\n", ret); 7218 ok(!strcmp(tmp_buf, "1234"), "data received differs from sent\n"); 7219 7220 /* Test OOB data notifications */ 7221 ret = send(fdWrite, "A", 1, MSG_OOB); 7222 ok(ret == 1, "expected 1, got %d\n", ret); 7223 POLL_CLEAR(); 7224 POLL_SET(fdListen, POLLIN | POLLOUT); 7225 POLL_SET(fdRead, POLLIN); 7226 ret = pWSAPoll(fds, ix, poll_timeout); 7227 ok(ret == 1, "expected 1, got %d\n", ret); 7228 ok(POLL_ISSET(fdRead, POLLRDBAND), "fdRead socket events incorrect\n"); 7229 tmp_buf[0] = 0xAF; 7230 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB); 7231 ok(ret == 1, "expected 1, got %d\n", ret); 7232 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]); 7233 7234 /* If the socket is OOBINLINED the notification is like normal data */ 7235 ret = 1; 7236 ret = setsockopt(fdRead, SOL_SOCKET, SO_OOBINLINE, (char*) &ret, sizeof(ret)); 7237 ok(ret == 0, "expected 0, got %d\n", ret); 7238 ret = send(fdWrite, "A", 1, MSG_OOB); 7239 ok(ret == 1, "expected 1, got %d\n", ret); 7240 POLL_CLEAR(); 7241 POLL_SET(fdListen, POLLIN | POLLOUT); 7242 POLL_SET(fdRead, POLLIN | POLLOUT); 7243 ret = pWSAPoll(fds, ix, poll_timeout); 7244 ok(ret == 1, "expected 1, got %d\n", ret); 7245 tmp_buf[0] = 0xAF; 7246 SetLastError(0xdeadbeef); 7247 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB); 7248 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret); 7249 ok(GetLastError() == WSAEINVAL, "expected 10022, got %d\n", GetLastError()); 7250 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0); 7251 ok(ret == 1, "expected 1, got %d\n", ret); 7252 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]); 7253 7254 /* Test connection closed notifications */ 7255 ret = closesocket(fdRead); 7256 ok(ret == 0, "expected 0, got %d\n", ret); 7257 POLL_CLEAR(); 7258 POLL_SET(fdListen, POLLIN | POLLOUT); 7259 POLL_SET(fdWrite, POLLIN); 7260 ret = pWSAPoll(fds, ix, poll_timeout); 7261 ok(ret == 1, "expected 1, got %d\n", ret); 7262 ok(POLL_ISSET(fdWrite, POLLHUP), "fdWrite socket events incorrect\n"); 7263 ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0); 7264 ok(ret == 0, "expected 0, got %d\n", ret); 7265 7266 /* When a connection is attempted to a non-listening socket due to a bug 7267 * in the MS code it will never be notified. This is a long standing issue 7268 * that will never be fixed for compatibility reasons so we have to deal 7269 * with it manually. */ 7270 ret = closesocket(fdWrite); 7271 ok(ret == 0, "expected 0, got %d\n", ret); 7272 ret = closesocket(fdListen); 7273 ok(ret == 0, "expected 0, got %d\n", ret); 7274 len = sizeof(address); 7275 fdWrite = setup_connector_socket(&address, len, TRUE); 7276 POLL_CLEAR(); 7277 POLL_SET(fdWrite, POLLIN | POLLOUT); 7278 poll_timeout = 2000; 7279 ret = pWSAPoll(fds, ix, poll_timeout); 7280 todo_wine 7281 ok(ret == 0, "expected 0, got %d\n", ret); 7282 len = sizeof(id); 7283 id = 0xdeadbeef; 7284 err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len); 7285 ok(!err, "getsockopt failed with %d\n", WSAGetLastError()); 7286 ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id); 7287 closesocket(fdWrite); 7288 7289 /* Try poll() on a closed socket after connection */ 7290 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n"); 7291 closesocket(fdRead); 7292 POLL_CLEAR(); 7293 POLL_SET(fdWrite, POLLIN | POLLOUT); 7294 POLL_SET(fdRead, POLLIN | POLLOUT); 7295 ret = pWSAPoll(fds, ix, poll_timeout); 7296 ok(ret == 1, "expected 1, got %d\n", ret); 7297 ok(POLL_ISSET(fdRead, POLLNVAL), "fdRead socket events incorrect\n"); 7298 POLL_CLEAR(); 7299 POLL_SET(fdWrite, POLLIN | POLLOUT); 7300 ret = pWSAPoll(fds, ix, poll_timeout); 7301 ok(ret == 1, "expected 1, got %d\n", ret); 7302 todo_wine 7303 ok(POLL_ISSET(fdWrite, POLLWRNORM | POLLHUP) || broken(POLL_ISSET(fdWrite, POLLWRNORM)) /* <= 2008 */, 7304 "fdWrite socket events incorrect\n"); 7305 closesocket(fdWrite); 7306 7307 /* Close the socket currently being polled in a thread */ 7308 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n"); 7309 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id); 7310 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError()); 7311 POLL_CLEAR(); 7312 POLL_SET(fdWrite, POLLIN | POLLOUT); 7313 ret = pWSAPoll(fds, ix, poll_timeout); 7314 ok(ret == 1, "expected 1, got %d\n", ret); 7315 ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n"); 7316 WaitForSingleObject (thread_handle, 1000); 7317 closesocket(fdRead); 7318 /* test again with less flags - behavior changes */ 7319 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n"); 7320 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id); 7321 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError()); 7322 POLL_CLEAR(); 7323 POLL_SET(fdWrite, POLLIN); 7324 ret = pWSAPoll(fds, ix, poll_timeout); 7325 ok(ret == 1, "expected 1, got %d\n", ret); 7326 ok(POLL_ISSET(fdWrite, POLLNVAL), "fdWrite socket events incorrect\n"); 7327 WaitForSingleObject (thread_handle, 1000); 7328 closesocket(fdRead); 7329 } 7330 #undef POLL_SET 7331 #undef POLL_ISSET 7332 #undef POLL_CLEAR 7333 7334 static void test_GetAddrInfoW(void) 7335 { 7336 static const WCHAR port[] = {'8','0',0}; 7337 static const WCHAR empty[] = {0}; 7338 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0}; 7339 static const WCHAR nxdomain[] = 7340 {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0}; 7341 static const WCHAR zero[] = {'0',0}; 7342 int i, ret; 7343 ADDRINFOW *result, *result2, *p, hint; 7344 WCHAR name[256]; 7345 DWORD size = sizeof(name)/sizeof(WCHAR); 7346 /* te su to.winehq.org written in katakana */ 7347 static const WCHAR idn_domain[] = 7348 {0x30C6,0x30B9,0x30C8,'.','w','i','n','e','h','q','.','o','r','g',0}; 7349 static const WCHAR idn_punycode[] = 7350 {'x','n','-','-','z','c','k','z','a','h','.','w','i','n','e','h','q','.','o','r','g',0}; 7351 7352 if (!pGetAddrInfoW || !pFreeAddrInfoW) 7353 { 7354 win_skip("GetAddrInfoW and/or FreeAddrInfoW not present\n"); 7355 return; 7356 } 7357 memset(&hint, 0, sizeof(ADDRINFOW)); 7358 name[0] = 0; 7359 GetComputerNameExW( ComputerNamePhysicalDnsHostname, name, &size ); 7360 7361 result = (ADDRINFOW *)0xdeadbeef; 7362 WSASetLastError(0xdeadbeef); 7363 ret = pGetAddrInfoW(NULL, NULL, NULL, &result); 7364 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7365 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7366 ok(result == NULL, "got %p\n", result); 7367 7368 result = NULL; 7369 WSASetLastError(0xdeadbeef); 7370 ret = pGetAddrInfoW(empty, NULL, NULL, &result); 7371 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7372 ok(result != NULL, "GetAddrInfoW failed\n"); 7373 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); 7374 pFreeAddrInfoW(result); 7375 7376 result = NULL; 7377 ret = pGetAddrInfoW(NULL, zero, NULL, &result); 7378 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7379 ok(result != NULL, "GetAddrInfoW failed\n"); 7380 7381 result2 = NULL; 7382 ret = pGetAddrInfoW(NULL, empty, NULL, &result2); 7383 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7384 ok(result2 != NULL, "GetAddrInfoW failed\n"); 7385 compare_addrinfow(result, result2); 7386 pFreeAddrInfoW(result); 7387 pFreeAddrInfoW(result2); 7388 7389 result = NULL; 7390 ret = pGetAddrInfoW(empty, zero, NULL, &result); 7391 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7392 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); 7393 ok(result != NULL, "GetAddrInfoW failed\n"); 7394 7395 result2 = NULL; 7396 ret = pGetAddrInfoW(empty, empty, NULL, &result2); 7397 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7398 ok(result2 != NULL, "GetAddrInfoW failed\n"); 7399 compare_addrinfow(result, result2); 7400 pFreeAddrInfoW(result); 7401 pFreeAddrInfoW(result2); 7402 7403 result = NULL; 7404 ret = pGetAddrInfoW(localhost, NULL, NULL, &result); 7405 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7406 pFreeAddrInfoW(result); 7407 7408 result = NULL; 7409 ret = pGetAddrInfoW(localhost, empty, NULL, &result); 7410 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7411 pFreeAddrInfoW(result); 7412 7413 result = NULL; 7414 ret = pGetAddrInfoW(localhost, zero, NULL, &result); 7415 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7416 pFreeAddrInfoW(result); 7417 7418 result = NULL; 7419 ret = pGetAddrInfoW(localhost, port, NULL, &result); 7420 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7421 pFreeAddrInfoW(result); 7422 7423 result = NULL; 7424 ret = pGetAddrInfoW(localhost, NULL, &hint, &result); 7425 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7426 pFreeAddrInfoW(result); 7427 7428 result = NULL; 7429 SetLastError(0xdeadbeef); 7430 ret = pGetAddrInfoW(localhost, port, &hint, &result); 7431 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7432 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); 7433 pFreeAddrInfoW(result); 7434 7435 /* try to get information from the computer name, result is the same 7436 * as if requesting with an empty host name. */ 7437 ret = pGetAddrInfoW(name, NULL, NULL, &result); 7438 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7439 ok(result != NULL, "GetAddrInfoW failed\n"); 7440 7441 ret = pGetAddrInfoW(empty, NULL, NULL, &result2); 7442 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7443 #ifdef __REACTOS__ 7444 ok(result2 != NULL, "GetAddrInfoW failed\n"); 7445 #else 7446 ok(result != NULL, "GetAddrInfoW failed\n"); 7447 #endif 7448 compare_addrinfow(result, result2); 7449 pFreeAddrInfoW(result); 7450 pFreeAddrInfoW(result2); 7451 7452 ret = pGetAddrInfoW(name, empty, NULL, &result); 7453 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7454 ok(result != NULL, "GetAddrInfoW failed\n"); 7455 7456 ret = pGetAddrInfoW(empty, empty, NULL, &result2); 7457 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError()); 7458 #ifdef __REACTOS__ 7459 ok(result2 != NULL, "GetAddrInfoW failed\n"); 7460 #else 7461 ok(result != NULL, "GetAddrInfoW failed\n"); 7462 #endif 7463 compare_addrinfow(result, result2); 7464 pFreeAddrInfoW(result); 7465 pFreeAddrInfoW(result2); 7466 7467 result = (ADDRINFOW *)0xdeadbeef; 7468 WSASetLastError(0xdeadbeef); 7469 ret = pGetAddrInfoW(NULL, NULL, NULL, &result); 7470 if(ret == 0) 7471 { 7472 skip("nxdomain returned success. Broken ISP redirects?\n"); 7473 return; 7474 } 7475 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7476 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7477 ok(result == NULL, "got %p\n", result); 7478 7479 result = (ADDRINFOW *)0xdeadbeef; 7480 WSASetLastError(0xdeadbeef); 7481 ret = pGetAddrInfoW(nxdomain, NULL, NULL, &result); 7482 if(ret == 0) 7483 { 7484 skip("nxdomain returned success. Broken ISP redirects?\n"); 7485 return; 7486 } 7487 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7488 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7489 ok(result == NULL, "got %p\n", result); 7490 7491 for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++) 7492 { 7493 hint.ai_family = hinttests[i].family; 7494 hint.ai_socktype = hinttests[i].socktype; 7495 hint.ai_protocol = hinttests[i].protocol; 7496 7497 result = NULL; 7498 SetLastError(0xdeadbeef); 7499 ret = pGetAddrInfoW(localhost, NULL, &hint, &result); 7500 if (!ret) 7501 { 7502 if (hinttests[i].error) 7503 ok(0, "test %d: GetAddrInfoW succeeded unexpectedly\n", i); 7504 else 7505 { 7506 p = result; 7507 do 7508 { 7509 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */ 7510 if (hinttests[i].family == AF_UNSPEC) 7511 ok(p->ai_family == AF_INET || p->ai_family == AF_INET6, 7512 "test %d: expected AF_INET or AF_INET6, got %d\n", 7513 i, p->ai_family); 7514 else 7515 ok(p->ai_family == hinttests[i].family, 7516 "test %d: expected family %d, got %d\n", 7517 i, hinttests[i].family, p->ai_family); 7518 7519 ok(p->ai_socktype == hinttests[i].socktype, 7520 "test %d: expected type %d, got %d\n", 7521 i, hinttests[i].socktype, p->ai_socktype); 7522 ok(p->ai_protocol == hinttests[i].protocol, 7523 "test %d: expected protocol %d, got %d\n", 7524 i, hinttests[i].protocol, p->ai_protocol); 7525 p = p->ai_next; 7526 } 7527 while (p); 7528 } 7529 pFreeAddrInfoW(result); 7530 } 7531 else 7532 { 7533 DWORD err = WSAGetLastError(); 7534 if (hinttests[i].error) 7535 ok(hinttests[i].error == err, "test %d: GetAddrInfoW failed with error %d, expected %d\n", 7536 i, err, hinttests[i].error); 7537 else 7538 ok(0, "test %d: GetAddrInfoW failed with %d (err %d)\n", i, ret, err); 7539 } 7540 } 7541 7542 /* Test IDN resolution (Internationalized Domain Names) present since Windows 8 */ 7543 trace("Testing punycode IDN %s\n", wine_dbgstr_w(idn_punycode)); 7544 result = NULL; 7545 ret = pGetAddrInfoW(idn_punycode, NULL, NULL, &result); 7546 ok(!ret, "got %d expected success\n", ret); 7547 ok(result != NULL, "got %p\n", result); 7548 pFreeAddrInfoW(result); 7549 7550 hint.ai_family = AF_INET; 7551 hint.ai_socktype = 0; 7552 hint.ai_protocol = 0; 7553 hint.ai_flags = 0; 7554 7555 result = NULL; 7556 ret = pGetAddrInfoW(idn_punycode, NULL, &hint, &result); 7557 ok(!ret, "got %d expected success\n", ret); 7558 ok(result != NULL, "got %p\n", result); 7559 7560 trace("Testing unicode IDN %s\n", wine_dbgstr_w(idn_domain)); 7561 result2 = NULL; 7562 ret = pGetAddrInfoW(idn_domain, NULL, NULL, &result2); 7563 if (ret == WSAHOST_NOT_FOUND && broken(1)) 7564 { 7565 pFreeAddrInfoW(result); 7566 win_skip("IDN resolution not supported in Win <= 7\n"); 7567 return; 7568 } 7569 7570 ok(!ret, "got %d expected success\n", ret); 7571 ok(result2 != NULL, "got %p\n", result2); 7572 pFreeAddrInfoW(result2); 7573 7574 hint.ai_family = AF_INET; 7575 hint.ai_socktype = 0; 7576 hint.ai_protocol = 0; 7577 hint.ai_flags = 0; 7578 7579 result2 = NULL; 7580 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2); 7581 ok(!ret, "got %d expected success\n", ret); 7582 ok(result2 != NULL, "got %p\n", result2); 7583 7584 /* ensure manually resolved punycode and unicode hosts result in same data */ 7585 compare_addrinfow(result, result2); 7586 7587 pFreeAddrInfoW(result); 7588 pFreeAddrInfoW(result2); 7589 7590 hint.ai_family = AF_INET; 7591 hint.ai_socktype = 0; 7592 hint.ai_protocol = 0; 7593 hint.ai_flags = 0; 7594 7595 result2 = NULL; 7596 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2); 7597 ok(!ret, "got %d expected success\n", ret); 7598 ok(result2 != NULL, "got %p\n", result2); 7599 pFreeAddrInfoW(result2); 7600 7601 /* Disable IDN resolution and test again*/ 7602 hint.ai_family = AF_INET; 7603 hint.ai_socktype = 0; 7604 hint.ai_protocol = 0; 7605 hint.ai_flags = AI_DISABLE_IDN_ENCODING; 7606 7607 SetLastError(0xdeadbeef); 7608 result2 = NULL; 7609 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2); 7610 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7611 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7612 ok(result2 == NULL, "got %p\n", result2); 7613 } 7614 7615 static void test_GetAddrInfoExW(void) 7616 { 7617 static const WCHAR empty[] = {0}; 7618 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0}; 7619 static const WCHAR winehq[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0}; 7620 ADDRINFOEXW *result; 7621 OVERLAPPED overlapped; 7622 HANDLE event; 7623 int ret; 7624 7625 if (!pGetAddrInfoExW || !pGetAddrInfoExOverlappedResult) 7626 { 7627 win_skip("GetAddrInfoExW and/or GetAddrInfoExOverlappedResult not present\n"); 7628 return; 7629 } 7630 7631 event = WSACreateEvent(); 7632 7633 result = (ADDRINFOEXW *)0xdeadbeef; 7634 WSASetLastError(0xdeadbeef); 7635 ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL); 7636 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7637 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7638 ok(result == NULL, "got %p\n", result); 7639 7640 result = NULL; 7641 WSASetLastError(0xdeadbeef); 7642 ret = pGetAddrInfoExW(empty, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL); 7643 ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError()); 7644 ok(result != NULL, "GetAddrInfoW failed\n"); 7645 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); 7646 pFreeAddrInfoExW(result); 7647 7648 result = NULL; 7649 ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL); 7650 ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError()); 7651 pFreeAddrInfoExW(result); 7652 7653 result = (void*)0xdeadbeef; 7654 memset(&overlapped, 0xcc, sizeof(overlapped)); 7655 overlapped.hEvent = event; 7656 ResetEvent(event); 7657 ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL); 7658 ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError()); 7659 ok(!result, "result != NULL\n"); 7660 ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n"); 7661 ret = pGetAddrInfoExOverlappedResult(&overlapped); 7662 ok(!ret, "overlapped result is %d\n", ret); 7663 pFreeAddrInfoExW(result); 7664 7665 result = (void*)0xdeadbeef; 7666 memset(&overlapped, 0xcc, sizeof(overlapped)); 7667 ResetEvent(event); 7668 overlapped.hEvent = event; 7669 WSASetLastError(0xdeadbeef); 7670 ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL); 7671 ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError()); 7672 ok(WSAGetLastError() == ERROR_IO_PENDING, "expected 11001, got %d\n", WSAGetLastError()); 7673 ret = overlapped.Internal; 7674 ok(ret == WSAEINPROGRESS || ret == ERROR_SUCCESS, "overlapped.Internal = %u\n", ret); 7675 ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n"); 7676 ret = pGetAddrInfoExOverlappedResult(&overlapped); 7677 ok(!ret, "overlapped result is %d\n", ret); 7678 ok(overlapped.hEvent == event, "hEvent changed %p\n", overlapped.hEvent); 7679 ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal); 7680 ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n"); 7681 ok(result != NULL, "result == NULL\n"); 7682 if (result != NULL) 7683 { 7684 ok(!result->ai_blob, "ai_blob != NULL\n"); 7685 ok(!result->ai_bloblen, "ai_bloblen != 0\n"); 7686 ok(!result->ai_provider, "ai_provider = %s\n", wine_dbgstr_guid(result->ai_provider)); 7687 pFreeAddrInfoExW(result); 7688 } 7689 7690 result = (void*)0xdeadbeef; 7691 memset(&overlapped, 0xcc, sizeof(overlapped)); 7692 ResetEvent(event); 7693 overlapped.hEvent = event; 7694 ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL); 7695 todo_wine 7696 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7697 todo_wine 7698 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7699 ok(result == NULL, "got %p\n", result); 7700 ret = WaitForSingleObject(event, 0); 7701 todo_wine_if(ret != WAIT_TIMEOUT) /* Remove when abowe todo_wines are fixed */ 7702 ok(ret == WAIT_TIMEOUT, "wait failed\n"); 7703 7704 WSACloseEvent(event); 7705 } 7706 7707 static void verify_ipv6_addrinfo(ADDRINFOA *result, const char *expectedIp) 7708 { 7709 SOCKADDR_IN6 *sockaddr6; 7710 char ipBuffer[256]; 7711 const char *ret; 7712 7713 ok(result->ai_family == AF_INET6, "ai_family == %d\n", result->ai_family); 7714 ok(result->ai_addrlen >= sizeof(struct sockaddr_in6), "ai_addrlen == %d\n", (int)result->ai_addrlen); 7715 ok(result->ai_addr != NULL, "ai_addr == NULL\n"); 7716 7717 if (result->ai_addr != NULL) 7718 { 7719 sockaddr6 = (SOCKADDR_IN6 *)result->ai_addr; 7720 ok(sockaddr6->sin6_family == AF_INET6, "ai_addr->sin6_family == %d\n", sockaddr6->sin6_family); 7721 ok(sockaddr6->sin6_port == 0, "ai_addr->sin6_port == %d\n", sockaddr6->sin6_port); 7722 7723 ZeroMemory(ipBuffer, sizeof(ipBuffer)); 7724 ret = pInetNtop(AF_INET6, &sockaddr6->sin6_addr, ipBuffer, sizeof(ipBuffer)); 7725 ok(ret != NULL, "inet_ntop failed (%d)\n", WSAGetLastError()); 7726 ok(strcmp(ipBuffer, expectedIp) == 0, "ai_addr->sin6_addr == '%s' (expected '%s')\n", ipBuffer, expectedIp); 7727 } 7728 } 7729 7730 static void test_getaddrinfo(void) 7731 { 7732 int i, ret; 7733 ADDRINFOA *result, *result2, *p, hint; 7734 SOCKADDR_IN *sockaddr; 7735 CHAR name[256], *ip; 7736 DWORD size = sizeof(name); 7737 7738 if (!pgetaddrinfo || !pfreeaddrinfo) 7739 { 7740 win_skip("getaddrinfo and/or freeaddrinfo not present\n"); 7741 return; 7742 } 7743 memset(&hint, 0, sizeof(ADDRINFOA)); 7744 GetComputerNameExA( ComputerNamePhysicalDnsHostname, name, &size ); 7745 7746 result = (ADDRINFOA *)0xdeadbeef; 7747 WSASetLastError(0xdeadbeef); 7748 ret = pgetaddrinfo(NULL, NULL, NULL, &result); 7749 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7750 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7751 ok(result == NULL, "got %p\n", result); 7752 7753 result = NULL; 7754 WSASetLastError(0xdeadbeef); 7755 ret = pgetaddrinfo("", NULL, NULL, &result); 7756 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7757 ok(result != NULL, "getaddrinfo failed\n"); 7758 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); 7759 pfreeaddrinfo(result); 7760 7761 result = NULL; 7762 ret = pgetaddrinfo(NULL, "0", NULL, &result); 7763 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7764 ok(result != NULL, "getaddrinfo failed\n"); 7765 7766 result2 = NULL; 7767 ret = pgetaddrinfo(NULL, "", NULL, &result2); 7768 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7769 ok(result2 != NULL, "getaddrinfo failed\n"); 7770 compare_addrinfo(result, result2); 7771 pfreeaddrinfo(result); 7772 pfreeaddrinfo(result2); 7773 7774 result = NULL; 7775 WSASetLastError(0xdeadbeef); 7776 ret = pgetaddrinfo("", "0", NULL, &result); 7777 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7778 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); 7779 ok(result != NULL, "getaddrinfo failed\n"); 7780 7781 result2 = NULL; 7782 ret = pgetaddrinfo("", "", NULL, &result2); 7783 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7784 ok(result2 != NULL, "getaddrinfo failed\n"); 7785 compare_addrinfo(result, result2); 7786 pfreeaddrinfo(result); 7787 pfreeaddrinfo(result2); 7788 7789 result = NULL; 7790 ret = pgetaddrinfo("localhost", NULL, NULL, &result); 7791 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7792 pfreeaddrinfo(result); 7793 7794 result = NULL; 7795 ret = pgetaddrinfo("localhost", "", NULL, &result); 7796 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7797 pfreeaddrinfo(result); 7798 7799 result = NULL; 7800 ret = pgetaddrinfo("localhost", "0", NULL, &result); 7801 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7802 pfreeaddrinfo(result); 7803 7804 result = NULL; 7805 ret = pgetaddrinfo("localhost", "80", NULL, &result); 7806 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7807 pfreeaddrinfo(result); 7808 7809 result = NULL; 7810 ret = pgetaddrinfo("localhost", NULL, &hint, &result); 7811 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7812 pfreeaddrinfo(result); 7813 7814 result = NULL; 7815 WSASetLastError(0xdeadbeef); 7816 ret = pgetaddrinfo("localhost", "80", &hint, &result); 7817 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7818 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError()); 7819 pfreeaddrinfo(result); 7820 7821 hint.ai_flags = AI_NUMERICHOST; 7822 result = (void*)0xdeadbeef; 7823 ret = pgetaddrinfo("localhost", "80", &hint, &result); 7824 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", WSAGetLastError()); 7825 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected WSAHOST_NOT_FOUND, got %d\n", WSAGetLastError()); 7826 ok(!result, "result = %p\n", result); 7827 hint.ai_flags = 0; 7828 7829 /* try to get information from the computer name, result is the same 7830 * as if requesting with an empty host name. */ 7831 ret = pgetaddrinfo(name, NULL, NULL, &result); 7832 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7833 #ifdef __REACTOS__ 7834 ok(result != NULL, "getaddrinfo failed\n"); 7835 #else 7836 ok(result != NULL, "GetAddrInfoW failed\n"); 7837 #endif 7838 7839 ret = pgetaddrinfo("", NULL, NULL, &result2); 7840 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7841 #ifdef __REACTOS__ 7842 ok(result2 != NULL, "getaddrinfo failed\n"); 7843 #else 7844 ok(result != NULL, "GetAddrInfoW failed\n"); 7845 #endif 7846 compare_addrinfo(result, result2); 7847 pfreeaddrinfo(result); 7848 pfreeaddrinfo(result2); 7849 7850 ret = pgetaddrinfo(name, "", NULL, &result); 7851 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7852 #ifdef __REACTOS__ 7853 ok(result != NULL, "getaddrinfo failed\n"); 7854 #else 7855 ok(result != NULL, "GetAddrInfoW failed\n"); 7856 #endif 7857 7858 ret = pgetaddrinfo("", "", NULL, &result2); 7859 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError()); 7860 #ifdef __REACTOS__ 7861 ok(result2 != NULL, "getaddrinfo failed\n"); 7862 #else 7863 ok(result != NULL, "GetAddrInfoW failed\n"); 7864 #endif 7865 compare_addrinfo(result, result2); 7866 pfreeaddrinfo(result); 7867 pfreeaddrinfo(result2); 7868 7869 result = (ADDRINFOA *)0xdeadbeef; 7870 WSASetLastError(0xdeadbeef); 7871 ret = pgetaddrinfo("nxdomain.codeweavers.com", NULL, NULL, &result); 7872 if(ret == 0) 7873 { 7874 skip("nxdomain returned success. Broken ISP redirects?\n"); 7875 return; 7876 } 7877 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret); 7878 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError()); 7879 ok(result == NULL, "got %p\n", result); 7880 7881 /* Test IPv4 address conversion */ 7882 result = NULL; 7883 ret = pgetaddrinfo("192.168.1.253", NULL, NULL, &result); 7884 ok(!ret, "getaddrinfo failed with %d\n", ret); 7885 ok(result->ai_family == AF_INET, "ai_family == %d\n", result->ai_family); 7886 ok(result->ai_addrlen >= sizeof(struct sockaddr_in), "ai_addrlen == %d\n", (int)result->ai_addrlen); 7887 ok(result->ai_addr != NULL, "ai_addr == NULL\n"); 7888 sockaddr = (SOCKADDR_IN *)result->ai_addr; 7889 ok(sockaddr->sin_family == AF_INET, "ai_addr->sin_family == %d\n", sockaddr->sin_family); 7890 ok(sockaddr->sin_port == 0, "ai_addr->sin_port == %d\n", sockaddr->sin_port); 7891 7892 ip = inet_ntoa(sockaddr->sin_addr); 7893 ok(strcmp(ip, "192.168.1.253") == 0, "sockaddr->ai_addr == '%s'\n", ip); 7894 pfreeaddrinfo(result); 7895 7896 /* Test IPv4 address conversion with port */ 7897 result = NULL; 7898 hint.ai_flags = AI_NUMERICHOST; 7899 ret = pgetaddrinfo("192.168.1.253:1024", NULL, &hint, &result); 7900 hint.ai_flags = 0; 7901 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo returned unexpected result: %d\n", ret); 7902 ok(result == NULL, "expected NULL, got %p\n", result); 7903 7904 /* Test IPv6 address conversion */ 7905 result = NULL; 7906 SetLastError(0xdeadbeef); 7907 ret = pgetaddrinfo("2a00:2039:dead:beef:cafe::6666", NULL, NULL, &result); 7908 7909 if (result != NULL) 7910 { 7911 ok(!ret, "getaddrinfo failed with %d\n", ret); 7912 verify_ipv6_addrinfo(result, "2a00:2039:dead:beef:cafe::6666"); 7913 pfreeaddrinfo(result); 7914 7915 /* Test IPv6 address conversion with brackets */ 7916 result = NULL; 7917 ret = pgetaddrinfo("[beef::cafe]", NULL, NULL, &result); 7918 ok(!ret, "getaddrinfo failed with %d\n", ret); 7919 verify_ipv6_addrinfo(result, "beef::cafe"); 7920 pfreeaddrinfo(result); 7921 7922 /* Test IPv6 address conversion with brackets and hints */ 7923 memset(&hint, 0, sizeof(ADDRINFOA)); 7924 hint.ai_flags = AI_NUMERICHOST; 7925 hint.ai_family = AF_INET6; 7926 result = NULL; 7927 ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result); 7928 ok(!ret, "getaddrinfo failed with %d\n", ret); 7929 verify_ipv6_addrinfo(result, "beef::cafe"); 7930 pfreeaddrinfo(result); 7931 7932 memset(&hint, 0, sizeof(ADDRINFOA)); 7933 hint.ai_flags = AI_NUMERICHOST; 7934 hint.ai_family = AF_INET; 7935 result = NULL; 7936 ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result); 7937 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret); 7938 7939 /* Test IPv6 address conversion with brackets and port */ 7940 result = NULL; 7941 ret = pgetaddrinfo("[beef::cafe]:10239", NULL, NULL, &result); 7942 ok(!ret, "getaddrinfo failed with %d\n", ret); 7943 verify_ipv6_addrinfo(result, "beef::cafe"); 7944 pfreeaddrinfo(result); 7945 7946 /* Test IPv6 address conversion with unmatched brackets */ 7947 result = NULL; 7948 hint.ai_flags = AI_NUMERICHOST; 7949 ret = pgetaddrinfo("[beef::cafe", NULL, &hint, &result); 7950 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret); 7951 7952 ret = pgetaddrinfo("beef::cafe]", NULL, &hint, &result); 7953 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret); 7954 } 7955 else 7956 { 7957 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret); 7958 win_skip("getaddrinfo does not support IPV6\n"); 7959 } 7960 7961 hint.ai_flags = 0; 7962 7963 for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++) 7964 { 7965 hint.ai_family = hinttests[i].family; 7966 hint.ai_socktype = hinttests[i].socktype; 7967 hint.ai_protocol = hinttests[i].protocol; 7968 7969 result = NULL; 7970 SetLastError(0xdeadbeef); 7971 ret = pgetaddrinfo("localhost", NULL, &hint, &result); 7972 if(!ret) 7973 { 7974 if (hinttests[i].error) 7975 ok(0, "test %d: getaddrinfo succeeded unexpectedly\n", i); 7976 else 7977 { 7978 p = result; 7979 do 7980 { 7981 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */ 7982 if (hinttests[i].family == AF_UNSPEC) 7983 ok(p->ai_family == AF_INET || p->ai_family == AF_INET6, 7984 "test %d: expected AF_INET or AF_INET6, got %d\n", 7985 i, p->ai_family); 7986 else 7987 ok(p->ai_family == hinttests[i].family, 7988 "test %d: expected family %d, got %d\n", 7989 i, hinttests[i].family, p->ai_family); 7990 7991 ok(p->ai_socktype == hinttests[i].socktype, 7992 "test %d: expected type %d, got %d\n", 7993 i, hinttests[i].socktype, p->ai_socktype); 7994 ok(p->ai_protocol == hinttests[i].protocol, 7995 "test %d: expected protocol %d, got %d\n", 7996 i, hinttests[i].protocol, p->ai_protocol); 7997 p = p->ai_next; 7998 } 7999 while (p); 8000 } 8001 pfreeaddrinfo(result); 8002 } 8003 else 8004 { 8005 DWORD err = WSAGetLastError(); 8006 if (hinttests[i].error) 8007 ok(hinttests[i].error == err, "test %d: getaddrinfo failed with error %d, expected %d\n", 8008 i, err, hinttests[i].error); 8009 else 8010 ok(0, "test %d: getaddrinfo failed with %d (err %d)\n", i, ret, err); 8011 } 8012 } 8013 } 8014 8015 static void test_ConnectEx(void) 8016 { 8017 SOCKET listener = INVALID_SOCKET; 8018 SOCKET acceptor = INVALID_SOCKET; 8019 SOCKET connector = INVALID_SOCKET; 8020 struct sockaddr_in address, conaddress; 8021 int addrlen; 8022 OVERLAPPED overlapped; 8023 LPFN_CONNECTEX pConnectEx; 8024 GUID connectExGuid = WSAID_CONNECTEX; 8025 DWORD bytesReturned; 8026 char buffer[1024]; 8027 BOOL bret; 8028 DWORD dwret; 8029 int iret; 8030 8031 memset(&overlapped, 0, sizeof(overlapped)); 8032 8033 listener = socket(AF_INET, SOCK_STREAM, 0); 8034 if (listener == INVALID_SOCKET) { 8035 skip("could not create listener socket, error %d\n", WSAGetLastError()); 8036 goto end; 8037 } 8038 8039 connector = socket(AF_INET, SOCK_STREAM, 0); 8040 if (connector == INVALID_SOCKET) { 8041 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8042 goto end; 8043 } 8044 8045 memset(&address, 0, sizeof(address)); 8046 address.sin_family = AF_INET; 8047 address.sin_addr.s_addr = inet_addr("127.0.0.1"); 8048 iret = bind(listener, (struct sockaddr*)&address, sizeof(address)); 8049 if (iret != 0) { 8050 skip("failed to bind, error %d\n", WSAGetLastError()); 8051 goto end; 8052 } 8053 8054 addrlen = sizeof(address); 8055 iret = getsockname(listener, (struct sockaddr*)&address, &addrlen); 8056 if (iret != 0) { 8057 skip("failed to lookup bind address, error %d\n", WSAGetLastError()); 8058 goto end; 8059 } 8060 8061 if (set_blocking(listener, TRUE)) { 8062 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError()); 8063 goto end; 8064 } 8065 8066 bytesReturned = 0xdeadbeef; 8067 iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectExGuid, sizeof(connectExGuid), 8068 &pConnectEx, sizeof(pConnectEx), &bytesReturned, NULL, NULL); 8069 if (iret) { 8070 win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", iret, WSAGetLastError()); 8071 goto end; 8072 } 8073 8074 ok(bytesReturned == sizeof(pConnectEx), "expected sizeof(pConnectEx), got %u\n", bytesReturned); 8075 8076 bret = pConnectEx(INVALID_SOCKET, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); 8077 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "ConnectEx on invalid socket " 8078 "returned %d + errno %d\n", bret, WSAGetLastError()); 8079 8080 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); 8081 ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "ConnectEx on a unbound socket " 8082 "returned %d + errno %d\n", bret, WSAGetLastError()); 8083 if (bret == TRUE || WSAGetLastError() != WSAEINVAL) 8084 { 8085 acceptor = accept(listener, NULL, NULL); 8086 if (acceptor != INVALID_SOCKET) { 8087 closesocket(acceptor); 8088 acceptor = INVALID_SOCKET; 8089 } 8090 8091 closesocket(connector); 8092 connector = socket(AF_INET, SOCK_STREAM, 0); 8093 if (connector == INVALID_SOCKET) { 8094 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8095 goto end; 8096 } 8097 } 8098 8099 /* ConnectEx needs a bound socket */ 8100 memset(&conaddress, 0, sizeof(conaddress)); 8101 conaddress.sin_family = AF_INET; 8102 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 8103 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress)); 8104 if (iret != 0) { 8105 skip("failed to bind, error %d\n", WSAGetLastError()); 8106 goto end; 8107 } 8108 8109 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, NULL); 8110 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "ConnectEx on a NULL overlapped " 8111 "returned %d + errno %d\n", bret, WSAGetLastError()); 8112 8113 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 8114 if (overlapped.hEvent == NULL) { 8115 skip("could not create event object, errno = %d\n", GetLastError()); 8116 goto end; 8117 } 8118 8119 iret = listen(listener, 1); 8120 if (iret != 0) { 8121 skip("listening failed, errno = %d\n", WSAGetLastError()); 8122 goto end; 8123 } 8124 8125 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); 8126 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: " 8127 "returned %d + errno %d\n", bret, WSAGetLastError()); 8128 dwret = WaitForSingleObject(overlapped.hEvent, 15000); 8129 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError()); 8130 8131 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE); 8132 ok(bret, "Connecting failed, error %d\n", GetLastError()); 8133 ok(bytesReturned == 0, "Bytes sent is %d\n", bytesReturned); 8134 8135 closesocket(connector); 8136 connector = socket(AF_INET, SOCK_STREAM, 0); 8137 if (connector == INVALID_SOCKET) { 8138 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8139 goto end; 8140 } 8141 /* ConnectEx needs a bound socket */ 8142 memset(&conaddress, 0, sizeof(conaddress)); 8143 conaddress.sin_family = AF_INET; 8144 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 8145 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress)); 8146 if (iret != 0) { 8147 skip("failed to bind, error %d\n", WSAGetLastError()); 8148 goto end; 8149 } 8150 8151 acceptor = accept(listener, NULL, NULL); 8152 if (acceptor != INVALID_SOCKET) { 8153 closesocket(acceptor); 8154 } 8155 8156 buffer[0] = '1'; 8157 buffer[1] = '2'; 8158 buffer[2] = '3'; 8159 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, buffer, 3, &bytesReturned, &overlapped); 8160 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: " 8161 "returned %d + errno %d\n", bret, WSAGetLastError()); 8162 dwret = WaitForSingleObject(overlapped.hEvent, 15000); 8163 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError()); 8164 8165 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE); 8166 ok(bret, "Connecting failed, error %d\n", GetLastError()); 8167 ok(bytesReturned == 3, "Bytes sent is %d\n", bytesReturned); 8168 8169 acceptor = accept(listener, NULL, NULL); 8170 ok(acceptor != INVALID_SOCKET, "could not accept socket error %d\n", WSAGetLastError()); 8171 8172 bytesReturned = recv(acceptor, buffer, 3, 0); 8173 buffer[4] = 0; 8174 ok(bytesReturned == 3, "Didn't get all sent data, got only %d\n", bytesReturned); 8175 ok(buffer[0] == '1' && buffer[1] == '2' && buffer[2] == '3', 8176 "Failed to get the right data, expected '123', got '%s'\n", buffer); 8177 8178 closesocket(connector); 8179 connector = socket(AF_INET, SOCK_STREAM, 0); 8180 if (connector == INVALID_SOCKET) { 8181 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8182 goto end; 8183 } 8184 /* ConnectEx needs a bound socket */ 8185 memset(&conaddress, 0, sizeof(conaddress)); 8186 conaddress.sin_family = AF_INET; 8187 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 8188 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress)); 8189 if (iret != 0) { 8190 skip("failed to bind, error %d\n", WSAGetLastError()); 8191 goto end; 8192 } 8193 8194 if (acceptor != INVALID_SOCKET) { 8195 closesocket(acceptor); 8196 acceptor = INVALID_SOCKET; 8197 } 8198 8199 /* Connect with error */ 8200 closesocket(listener); 8201 listener = INVALID_SOCKET; 8202 8203 address.sin_port = htons(1); 8204 8205 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); 8206 ok(bret == FALSE && GetLastError() == ERROR_IO_PENDING, "ConnectEx to bad destination failed: " 8207 "returned %d + errno %d\n", bret, GetLastError()); 8208 dwret = WaitForSingleObject(overlapped.hEvent, 15000); 8209 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError()); 8210 8211 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE); 8212 ok(bret == FALSE && GetLastError() == ERROR_CONNECTION_REFUSED, 8213 "Connecting to a disconnected host returned error %d - %d\n", bret, WSAGetLastError()); 8214 8215 end: 8216 if (overlapped.hEvent) 8217 WSACloseEvent(overlapped.hEvent); 8218 if (listener != INVALID_SOCKET) 8219 closesocket(listener); 8220 if (acceptor != INVALID_SOCKET) 8221 closesocket(acceptor); 8222 if (connector != INVALID_SOCKET) 8223 closesocket(connector); 8224 } 8225 8226 static void test_AcceptEx(void) 8227 { 8228 SOCKET listener = INVALID_SOCKET; 8229 SOCKET acceptor = INVALID_SOCKET; 8230 SOCKET connector = INVALID_SOCKET; 8231 SOCKET connector2 = INVALID_SOCKET; 8232 struct sockaddr_in bindAddress, peerAddress, *readBindAddress, *readRemoteAddress; 8233 int socklen, optlen; 8234 GUID acceptExGuid = WSAID_ACCEPTEX, getAcceptExGuid = WSAID_GETACCEPTEXSOCKADDRS; 8235 LPFN_ACCEPTEX pAcceptEx = NULL; 8236 LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs = NULL; 8237 fd_set fds_accept, fds_send; 8238 struct timeval timeout = {0,10}; /* wait for 10 milliseconds */ 8239 int got, conn1, i; 8240 DWORD bytesReturned, connect_time; 8241 char buffer[1024], ipbuffer[32]; 8242 OVERLAPPED overlapped; 8243 int iret, localSize = sizeof(struct sockaddr_in), remoteSize = localSize; 8244 BOOL bret; 8245 DWORD dwret; 8246 8247 memset(&overlapped, 0, sizeof(overlapped)); 8248 8249 listener = socket(AF_INET, SOCK_STREAM, 0); 8250 if (listener == INVALID_SOCKET) { 8251 skip("could not create listener socket, error %d\n", WSAGetLastError()); 8252 goto end; 8253 } 8254 8255 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8256 if (acceptor == INVALID_SOCKET) { 8257 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8258 goto end; 8259 } 8260 8261 connector = socket(AF_INET, SOCK_STREAM, 0); 8262 if (connector == INVALID_SOCKET) { 8263 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8264 goto end; 8265 } 8266 8267 memset(&bindAddress, 0, sizeof(bindAddress)); 8268 bindAddress.sin_family = AF_INET; 8269 bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 8270 iret = bind(listener, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8271 if (iret != 0) { 8272 skip("failed to bind, error %d\n", WSAGetLastError()); 8273 goto end; 8274 } 8275 8276 socklen = sizeof(bindAddress); 8277 iret = getsockname(listener, (struct sockaddr*)&bindAddress, &socklen); 8278 if (iret != 0) { 8279 skip("failed to lookup bind address, error %d\n", WSAGetLastError()); 8280 goto end; 8281 } 8282 8283 if (set_blocking(listener, FALSE)) { 8284 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError()); 8285 goto end; 8286 } 8287 8288 iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid), 8289 &pAcceptEx, sizeof(pAcceptEx), &bytesReturned, NULL, NULL); 8290 if (iret) { 8291 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError()); 8292 goto end; 8293 } 8294 8295 iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &getAcceptExGuid, sizeof(getAcceptExGuid), 8296 &pGetAcceptExSockaddrs, sizeof(pGetAcceptExSockaddrs), &bytesReturned, NULL, NULL); 8297 if (iret) { 8298 skip("WSAIoctl failed to get GetAcceptExSockaddrs with ret %d + errno %d\n", iret, WSAGetLastError()); 8299 goto end; 8300 } 8301 8302 bret = pAcceptEx(INVALID_SOCKET, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8303 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8304 &bytesReturned, &overlapped); 8305 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid listening socket " 8306 "returned %d + errno %d\n", bret, WSAGetLastError()); 8307 8308 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8309 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8310 &bytesReturned, &overlapped); 8311 todo_wine 8312 ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "AcceptEx on a non-listening socket " 8313 "returned %d + errno %d\n", bret, WSAGetLastError()); 8314 8315 iret = listen(listener, 5); 8316 if (iret != 0) { 8317 skip("listening failed, errno = %d\n", WSAGetLastError()); 8318 goto end; 8319 } 8320 8321 bret = pAcceptEx(listener, INVALID_SOCKET, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8322 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8323 &bytesReturned, &overlapped); 8324 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid accepting socket " 8325 "returned %d + errno %d\n", bret, WSAGetLastError()); 8326 8327 bret = pAcceptEx(listener, acceptor, NULL, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8328 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8329 &bytesReturned, &overlapped); 8330 todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEFAULT, 8331 "AcceptEx on NULL buffer returned %d + errno %d\n", bret, WSAGetLastError()); 8332 8333 bret = pAcceptEx(listener, acceptor, buffer, 0, 0, sizeof(struct sockaddr_in) + 16, 8334 &bytesReturned, &overlapped); 8335 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, 8336 "AcceptEx on too small local address size returned %d + errno %d\n", 8337 bret, WSAGetLastError()); 8338 bret = CancelIo((HANDLE) listener); 8339 ok(bret, "Failed to cancel pending accept socket\n"); 8340 8341 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 15, 8342 sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); 8343 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx on too small local address " 8344 "size returned %d + errno %d\n", 8345 bret, WSAGetLastError()); 8346 bret = CancelIo((HANDLE) listener); 8347 ok(bret, "Failed to cancel pending accept socket\n"); 8348 8349 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, 0, 8350 &bytesReturned, &overlapped); 8351 ok(bret == FALSE && WSAGetLastError() == WSAEFAULT, 8352 "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError()); 8353 8354 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, 8355 sizeof(struct sockaddr_in) + 15, &bytesReturned, &overlapped); 8356 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, 8357 "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError()); 8358 bret = CancelIo((HANDLE) listener); 8359 ok(bret, "Failed to cancel pending accept socket\n"); 8360 8361 bret = pAcceptEx(listener, acceptor, buffer, 0, 8362 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8363 &bytesReturned, NULL); 8364 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped " 8365 "returned %d + errno %d\n", bret, WSAGetLastError()); 8366 8367 bret = pAcceptEx(listener, acceptor, buffer, 0, 0, 0, &bytesReturned, NULL); 8368 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped " 8369 "returned %d + errno %d\n", bret, WSAGetLastError()); 8370 8371 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 8372 if (overlapped.hEvent == NULL) { 8373 skip("could not create event object, errno = %d\n", GetLastError()); 8374 goto end; 8375 } 8376 8377 bret = pAcceptEx(listener, acceptor, buffer, 0, 8378 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8379 &bytesReturned, &overlapped); 8380 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8381 8382 bret = pAcceptEx(listener, acceptor, buffer, 0, 8383 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8384 &bytesReturned, &overlapped); 8385 todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, 8386 "AcceptEx on already pending socket returned %d + errno %d\n", bret, WSAGetLastError()); 8387 if (bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING) { 8388 /* We need to cancel this call, otherwise things fail */ 8389 bret = CancelIo((HANDLE) listener); 8390 ok(bret, "Failed to cancel failed test. Bailing...\n"); 8391 if (!bret) return; 8392 WaitForSingleObject(overlapped.hEvent, 0); 8393 8394 bret = pAcceptEx(listener, acceptor, buffer, 0, 8395 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8396 &bytesReturned, &overlapped); 8397 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8398 } 8399 8400 iret = connect(acceptor, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8401 todo_wine ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL, 8402 "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret, WSAGetLastError()); 8403 if (!iret || (iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)) { 8404 /* We need to cancel this call, otherwise things fail */ 8405 closesocket(acceptor); 8406 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8407 if (acceptor == INVALID_SOCKET) { 8408 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8409 goto end; 8410 } 8411 8412 bret = CancelIo((HANDLE) listener); 8413 ok(bret, "Failed to cancel failed test. Bailing...\n"); 8414 if (!bret) return; 8415 8416 bret = pAcceptEx(listener, acceptor, buffer, 0, 8417 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8418 &bytesReturned, &overlapped); 8419 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8420 } 8421 8422 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8423 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError()); 8424 8425 dwret = WaitForSingleObject(overlapped.hEvent, INFINITE); 8426 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); 8427 8428 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE); 8429 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError()); 8430 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned); 8431 8432 closesocket(connector); 8433 connector = INVALID_SOCKET; 8434 closesocket(acceptor); 8435 8436 /* Test short reads */ 8437 8438 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8439 if (acceptor == INVALID_SOCKET) { 8440 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8441 goto end; 8442 } 8443 connector = socket(AF_INET, SOCK_STREAM, 0); 8444 if (connector == INVALID_SOCKET) { 8445 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8446 goto end; 8447 } 8448 bret = pAcceptEx(listener, acceptor, buffer, 2, 8449 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8450 &bytesReturned, &overlapped); 8451 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8452 8453 connect_time = 0xdeadbeef; 8454 optlen = sizeof(connect_time); 8455 iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen); 8456 ok(!iret, "getsockopt failed %d\n", WSAGetLastError()); 8457 ok(connect_time == ~0u, "unexpected connect time %u\n", connect_time); 8458 8459 /* AcceptEx() still won't complete until we send data */ 8460 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8461 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError()); 8462 8463 connect_time = 0xdeadbeef; 8464 optlen = sizeof(connect_time); 8465 iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen); 8466 ok(!iret, "getsockopt failed %d\n", WSAGetLastError()); 8467 ok(connect_time < 0xdeadbeef, "unexpected connect time %u\n", connect_time); 8468 8469 dwret = WaitForSingleObject(overlapped.hEvent, 0); 8470 ok(dwret == WAIT_TIMEOUT, "Waiting for accept event timeout failed with %d + errno %d\n", dwret, GetLastError()); 8471 8472 iret = getsockname( connector, (struct sockaddr *)&peerAddress, &remoteSize); 8473 ok( !iret, "getsockname failed.\n"); 8474 8475 /* AcceptEx() could complete any time now */ 8476 iret = send(connector, buffer, 1, 0); 8477 ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError()); 8478 8479 dwret = WaitForSingleObject(overlapped.hEvent, 1000); 8480 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); 8481 8482 /* Check if the buffer from AcceptEx is decoded correctly */ 8483 pGetAcceptExSockaddrs(buffer, 2, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8484 (struct sockaddr **)&readBindAddress, &localSize, 8485 (struct sockaddr **)&readRemoteAddress, &remoteSize); 8486 strcpy( ipbuffer, inet_ntoa(readBindAddress->sin_addr)); 8487 ok( readBindAddress->sin_addr.s_addr == bindAddress.sin_addr.s_addr, 8488 "Local socket address is different %s != %s\n", 8489 ipbuffer, inet_ntoa(bindAddress.sin_addr)); 8490 ok( readBindAddress->sin_port == bindAddress.sin_port, 8491 "Local socket port is different: %d != %d\n", 8492 readBindAddress->sin_port, bindAddress.sin_port); 8493 strcpy( ipbuffer, inet_ntoa(readRemoteAddress->sin_addr)); 8494 ok( readRemoteAddress->sin_addr.s_addr == peerAddress.sin_addr.s_addr, 8495 "Remote socket address is different %s != %s\n", 8496 ipbuffer, inet_ntoa(peerAddress.sin_addr)); 8497 ok( readRemoteAddress->sin_port == peerAddress.sin_port, 8498 "Remote socket port is different: %d != %d\n", 8499 readRemoteAddress->sin_port, peerAddress.sin_port); 8500 8501 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE); 8502 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError()); 8503 ok(bytesReturned == 1, "bytesReturned isn't supposed to be %d\n", bytesReturned); 8504 8505 closesocket(connector); 8506 connector = INVALID_SOCKET; 8507 closesocket(acceptor); 8508 8509 /* Test CF_DEFER & AcceptEx interaction */ 8510 8511 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8512 if (acceptor == INVALID_SOCKET) { 8513 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8514 goto end; 8515 } 8516 connector = socket(AF_INET, SOCK_STREAM, 0); 8517 if (connector == INVALID_SOCKET) { 8518 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8519 goto end; 8520 } 8521 connector2 = socket(AF_INET, SOCK_STREAM, 0); 8522 if (connector == INVALID_SOCKET) { 8523 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8524 goto end; 8525 } 8526 8527 if (set_blocking(connector, FALSE)) { 8528 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError()); 8529 goto end; 8530 } 8531 8532 if (set_blocking(connector2, FALSE)) { 8533 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError()); 8534 goto end; 8535 } 8536 8537 /* Connect socket #1 */ 8538 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8539 ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError()); 8540 8541 FD_ZERO ( &fds_accept ); 8542 FD_ZERO ( &fds_send ); 8543 8544 FD_SET ( listener, &fds_accept ); 8545 FD_SET ( connector, &fds_send ); 8546 8547 buffer[0] = '0'; 8548 got = 0; 8549 conn1 = 0; 8550 8551 for (i = 0; i < 4000; ++i) 8552 { 8553 fd_set fds_openaccept = fds_accept, fds_opensend = fds_send; 8554 8555 wsa_ok ( ( select ( 0, &fds_openaccept, &fds_opensend, NULL, &timeout ) ), SOCKET_ERROR !=, 8556 "acceptex test(%d): could not select on socket, errno %d\n" ); 8557 8558 /* check for incoming requests */ 8559 if ( FD_ISSET ( listener, &fds_openaccept ) ) { 8560 got++; 8561 if (got == 1) { 8562 SOCKET tmp = WSAAccept(listener, NULL, NULL, (LPCONDITIONPROC) AlwaysDeferConditionFunc, 0); 8563 ok(tmp == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError()); 8564 bret = pAcceptEx(listener, acceptor, buffer, 0, 8565 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8566 &bytesReturned, &overlapped); 8567 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8568 } 8569 else if (got == 2) { 8570 /* this should be socket #2 */ 8571 SOCKET tmp = accept(listener, NULL, NULL); 8572 ok(tmp != INVALID_SOCKET, "accept failed %d\n", WSAGetLastError()); 8573 closesocket(tmp); 8574 } 8575 else { 8576 ok(FALSE, "Got more than 2 connections?\n"); 8577 } 8578 } 8579 if ( conn1 && FD_ISSET ( connector2, &fds_opensend ) ) { 8580 /* Send data on second socket, and stop */ 8581 send(connector2, "2", 1, 0); 8582 FD_CLR ( connector2, &fds_send ); 8583 8584 break; 8585 } 8586 if ( FD_ISSET ( connector, &fds_opensend ) ) { 8587 /* Once #1 is connected, allow #2 to connect */ 8588 conn1 = 1; 8589 8590 send(connector, "1", 1, 0); 8591 FD_CLR ( connector, &fds_send ); 8592 8593 iret = connect(connector2, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8594 ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError()); 8595 FD_SET ( connector2, &fds_send ); 8596 } 8597 } 8598 8599 ok (got == 2 || broken(got == 1) /* NT4 */, 8600 "Did not get both connections, got %d\n", got); 8601 8602 dwret = WaitForSingleObject(overlapped.hEvent, 0); 8603 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); 8604 8605 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE); 8606 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError()); 8607 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned); 8608 8609 set_blocking(acceptor, TRUE); 8610 iret = recv( acceptor, buffer, 2, 0); 8611 ok(iret == 1, "Failed to get data, %d, errno: %d\n", iret, WSAGetLastError()); 8612 8613 ok(buffer[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer[0]); 8614 8615 closesocket(connector); 8616 connector = INVALID_SOCKET; 8617 closesocket(acceptor); 8618 8619 /* clean up in case of failures */ 8620 while ((acceptor = accept(listener, NULL, NULL)) != INVALID_SOCKET) 8621 closesocket(acceptor); 8622 8623 /* Disconnect during receive? */ 8624 8625 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8626 if (acceptor == INVALID_SOCKET) { 8627 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8628 goto end; 8629 } 8630 connector = socket(AF_INET, SOCK_STREAM, 0); 8631 if (connector == INVALID_SOCKET) { 8632 skip("could not create connector socket, error %d\n", WSAGetLastError()); 8633 goto end; 8634 } 8635 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8636 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8637 &bytesReturned, &overlapped); 8638 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8639 8640 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8641 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError()); 8642 8643 closesocket(connector); 8644 connector = INVALID_SOCKET; 8645 8646 dwret = WaitForSingleObject(overlapped.hEvent, 1000); 8647 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); 8648 8649 bytesReturned = 123456; 8650 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE); 8651 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError()); 8652 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned); 8653 8654 closesocket(acceptor); 8655 8656 /* Test closing with pending requests */ 8657 8658 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8659 if (acceptor == INVALID_SOCKET) { 8660 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8661 goto end; 8662 } 8663 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8664 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8665 &bytesReturned, &overlapped); 8666 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8667 8668 closesocket(acceptor); 8669 8670 dwret = WaitForSingleObject(overlapped.hEvent, 1000); 8671 todo_wine ok(dwret == WAIT_OBJECT_0, 8672 "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); 8673 8674 if (dwret != WAIT_TIMEOUT) { 8675 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE); 8676 ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError()); 8677 } 8678 else { 8679 bret = CancelIo((HANDLE) listener); 8680 ok(bret, "Failed to cancel failed test. Bailing...\n"); 8681 if (!bret) return; 8682 WaitForSingleObject(overlapped.hEvent, 0); 8683 } 8684 8685 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8686 if (acceptor == INVALID_SOCKET) { 8687 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8688 goto end; 8689 } 8690 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8691 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8692 &bytesReturned, &overlapped); 8693 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8694 8695 CancelIo((HANDLE) acceptor); 8696 8697 dwret = WaitForSingleObject(overlapped.hEvent, 1000); 8698 ok(dwret == WAIT_TIMEOUT, "Waiting for timeout failed with %d + errno %d\n", dwret, GetLastError()); 8699 8700 closesocket(acceptor); 8701 8702 acceptor = socket(AF_INET, SOCK_STREAM, 0); 8703 if (acceptor == INVALID_SOCKET) { 8704 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8705 goto end; 8706 } 8707 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), 8708 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 8709 &bytesReturned, &overlapped); 8710 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); 8711 8712 closesocket(listener); 8713 listener = INVALID_SOCKET; 8714 8715 dwret = WaitForSingleObject(overlapped.hEvent, 1000); 8716 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); 8717 8718 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE); 8719 ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError()); 8720 8721 end: 8722 if (overlapped.hEvent) 8723 WSACloseEvent(overlapped.hEvent); 8724 if (listener != INVALID_SOCKET) 8725 closesocket(listener); 8726 if (acceptor != INVALID_SOCKET) 8727 closesocket(acceptor); 8728 if (connector != INVALID_SOCKET) 8729 closesocket(connector); 8730 if (connector2 != INVALID_SOCKET) 8731 closesocket(connector2); 8732 } 8733 8734 static void test_DisconnectEx(void) 8735 { 8736 SOCKET listener, acceptor, connector; 8737 LPFN_DISCONNECTEX pDisconnectEx; 8738 GUID disconnectExGuid = WSAID_DISCONNECTEX; 8739 struct sockaddr_in address; 8740 DWORD num_bytes, flags; 8741 OVERLAPPED overlapped; 8742 int addrlen, iret; 8743 BOOL bret; 8744 8745 connector = socket(AF_INET, SOCK_STREAM, 0); 8746 ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError()); 8747 8748 iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &disconnectExGuid, sizeof(disconnectExGuid), 8749 &pDisconnectEx, sizeof(pDisconnectEx), &num_bytes, NULL, NULL); 8750 if (iret) 8751 { 8752 win_skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError()); 8753 closesocket(connector); 8754 return; 8755 } 8756 8757 listener = socket(AF_INET, SOCK_STREAM, 0); 8758 ok(listener != INVALID_SOCKET, "failed to create listener socket, error %d\n", WSAGetLastError()); 8759 8760 memset(&address, 0, sizeof(address)); 8761 address.sin_family = AF_INET; 8762 address.sin_addr.s_addr = inet_addr("127.0.0.1"); 8763 iret = bind(listener, (struct sockaddr *)&address, sizeof(address)); 8764 ok(iret == 0, "failed to bind, error %d\n", WSAGetLastError()); 8765 8766 addrlen = sizeof(address); 8767 iret = getsockname(listener, (struct sockaddr *)&address, &addrlen); 8768 ok(iret == 0, "failed to lookup bind address, error %d\n", WSAGetLastError()); 8769 8770 iret = listen(listener, 1); 8771 ok(iret == 0, "failed to listen, error %d\n", WSAGetLastError()); 8772 8773 set_blocking(listener, TRUE); 8774 8775 memset(&overlapped, 0, sizeof(overlapped)); 8776 bret = pDisconnectEx(INVALID_SOCKET, &overlapped, 0, 0); 8777 ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n"); 8778 ok(WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %d\n", WSAGetLastError()); 8779 8780 memset(&overlapped, 0, sizeof(overlapped)); 8781 bret = pDisconnectEx(connector, &overlapped, 0, 0); 8782 ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n"); 8783 todo_wine ok(WSAGetLastError() == WSAENOTCONN, "expected WSAENOTCONN, got %d\n", WSAGetLastError()); 8784 8785 iret = connect(connector, (struct sockaddr *)&address, addrlen); 8786 ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError()); 8787 8788 acceptor = accept(listener, NULL, NULL); 8789 ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError()); 8790 8791 memset(&overlapped, 0, sizeof(overlapped)); 8792 overlapped.hEvent = WSACreateEvent(); 8793 ok(overlapped.hEvent != WSA_INVALID_EVENT, "WSACreateEvent failed, error %d\n", WSAGetLastError()); 8794 bret = pDisconnectEx(connector, &overlapped, 0, 0); 8795 if (bret) 8796 ok(overlapped.Internal == STATUS_PENDING, "expected STATUS_PENDING, got %08lx\n", overlapped.Internal); 8797 else if (WSAGetLastError() == ERROR_IO_PENDING) 8798 bret = WSAGetOverlappedResult(connector, &overlapped, &num_bytes, TRUE, &flags); 8799 ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError()); 8800 WSACloseEvent(overlapped.hEvent); 8801 8802 iret = connect(connector, (struct sockaddr *)&address, sizeof(address)); 8803 ok(iret != 0, "connect unexpectedly succeeded\n"); 8804 ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError()); 8805 8806 closesocket(acceptor); 8807 closesocket(connector); 8808 8809 connector = socket(AF_INET, SOCK_STREAM, 0); 8810 ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError()); 8811 8812 iret = connect(connector, (struct sockaddr *)&address, addrlen); 8813 ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError()); 8814 8815 acceptor = accept(listener, NULL, NULL); 8816 ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError()); 8817 8818 bret = pDisconnectEx(connector, NULL, 0, 0); 8819 ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError()); 8820 8821 iret = connect(connector, (struct sockaddr *)&address, sizeof(address)); 8822 ok(iret != 0, "connect unexpectedly succeeded\n"); 8823 ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError()); 8824 8825 closesocket(acceptor); 8826 closesocket(connector); 8827 closesocket(listener); 8828 } 8829 8830 #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__) 8831 8832 static void compare_file2(HANDLE handle, SOCKET sock, int offset, const char *file, int line) 8833 { 8834 char buf1[256], buf2[256]; 8835 BOOL success; 8836 int i = 0; 8837 8838 SetFilePointer(handle, offset, NULL, FILE_BEGIN); 8839 while (1) 8840 { 8841 DWORD n1 = 0, n2 = 0; 8842 8843 success = ReadFile(handle, buf1, sizeof(buf1), &n1, NULL); 8844 ok_(file,line)(success, "Failed to read from file.\n"); 8845 if (success && n1 == 0) 8846 break; 8847 else if(!success) 8848 return; 8849 n2 = recv(sock, buf2, n1, 0); 8850 ok_(file,line)(n1 == n2, "Block %d size mismatch (%d != %d)\n", i, n1, n2); 8851 ok_(file,line)(memcmp(buf1, buf2, n2) == 0, "Block %d failed\n", i); 8852 i++; 8853 } 8854 } 8855 8856 static void test_TransmitFile(void) 8857 { 8858 DWORD num_bytes, err, file_size, total_sent; 8859 GUID transmitFileGuid = WSAID_TRANSMITFILE; 8860 LPFN_TRANSMITFILE pTransmitFile = NULL; 8861 HANDLE file = INVALID_HANDLE_VALUE; 8862 char header_msg[] = "hello world"; 8863 char footer_msg[] = "goodbye!!!"; 8864 char system_ini_path[MAX_PATH]; 8865 struct sockaddr_in bindAddress; 8866 TRANSMIT_FILE_BUFFERS buffers; 8867 SOCKET client, server, dest; 8868 WSAOVERLAPPED ov; 8869 char buf[256]; 8870 int iret, len; 8871 BOOL bret; 8872 8873 memset( &ov, 0, sizeof(ov) ); 8874 8875 /* Setup sockets for testing TransmitFile */ 8876 client = socket(AF_INET, SOCK_STREAM, 0); 8877 server = socket(AF_INET, SOCK_STREAM, 0); 8878 if (client == INVALID_SOCKET || server == INVALID_SOCKET) 8879 { 8880 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 8881 goto cleanup; 8882 } 8883 iret = WSAIoctl(client, SIO_GET_EXTENSION_FUNCTION_POINTER, &transmitFileGuid, sizeof(transmitFileGuid), 8884 &pTransmitFile, sizeof(pTransmitFile), &num_bytes, NULL, NULL); 8885 if (iret) 8886 { 8887 skip("WSAIoctl failed to get TransmitFile with ret %d + errno %d\n", iret, WSAGetLastError()); 8888 goto cleanup; 8889 } 8890 GetSystemWindowsDirectoryA(system_ini_path, MAX_PATH ); 8891 strcat(system_ini_path, "\\system.ini"); 8892 file = CreateFileA(system_ini_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0x0, NULL); 8893 if (file == INVALID_HANDLE_VALUE) 8894 { 8895 skip("Unable to open a file to transmit.\n"); 8896 goto cleanup; 8897 } 8898 file_size = GetFileSize(file, NULL); 8899 8900 /* Test TransmitFile with an invalid socket */ 8901 bret = pTransmitFile(INVALID_SOCKET, file, 0, 0, NULL, NULL, 0); 8902 err = WSAGetLastError(); 8903 ok(!bret, "TransmitFile succeeded unexpectedly.\n"); 8904 ok(err == WSAENOTSOCK, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTSOCK); 8905 8906 /* Test a bogus TransmitFile without a connected socket */ 8907 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, TF_REUSE_SOCKET); 8908 err = WSAGetLastError(); 8909 ok(!bret, "TransmitFile succeeded unexpectedly.\n"); 8910 ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN); 8911 8912 /* Setup a properly connected socket for transfers */ 8913 memset(&bindAddress, 0, sizeof(bindAddress)); 8914 bindAddress.sin_family = AF_INET; 8915 bindAddress.sin_port = htons(SERVERPORT+1); 8916 bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 8917 iret = bind(server, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8918 if (iret != 0) 8919 { 8920 skip("failed to bind(), error %d\n", WSAGetLastError()); 8921 goto cleanup; 8922 } 8923 iret = listen(server, 1); 8924 if (iret != 0) 8925 { 8926 skip("failed to listen(), error %d\n", WSAGetLastError()); 8927 goto cleanup; 8928 } 8929 iret = connect(client, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 8930 if (iret != 0) 8931 { 8932 skip("failed to connect(), error %d\n", WSAGetLastError()); 8933 goto cleanup; 8934 } 8935 len = sizeof(bindAddress); 8936 dest = accept(server, (struct sockaddr*)&bindAddress, &len); 8937 if (dest == INVALID_SOCKET) 8938 { 8939 skip("failed to accept(), error %d\n", WSAGetLastError()); 8940 goto cleanup; 8941 } 8942 if (set_blocking(dest, FALSE)) 8943 { 8944 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError()); 8945 goto cleanup; 8946 } 8947 8948 /* Test TransmitFile with no possible buffer */ 8949 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0); 8950 ok(bret, "TransmitFile failed unexpectedly.\n"); 8951 iret = recv(dest, buf, sizeof(buf), 0); 8952 ok(iret == -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret); 8953 8954 /* Test TransmitFile with only buffer data */ 8955 buffers.Head = &header_msg[0]; 8956 buffers.HeadLength = sizeof(header_msg); 8957 buffers.Tail = &footer_msg[0]; 8958 buffers.TailLength = sizeof(footer_msg); 8959 bret = pTransmitFile(client, NULL, 0, 0, NULL, &buffers, 0); 8960 ok(bret, "TransmitFile failed unexpectedly.\n"); 8961 iret = recv(dest, buf, sizeof(buf), 0); 8962 ok(iret == sizeof(header_msg)+sizeof(footer_msg), 8963 "Returned an unexpected buffer from TransmitFile: %d\n", iret ); 8964 ok(memcmp(&buf[0], &header_msg[0], sizeof(header_msg)) == 0, 8965 "TransmitFile header buffer did not match!\n"); 8966 ok(memcmp(&buf[sizeof(header_msg)], &footer_msg[0], sizeof(footer_msg)) == 0, 8967 "TransmitFile footer buffer did not match!\n"); 8968 8969 /* Test TransmitFile with only file data */ 8970 bret = pTransmitFile(client, file, 0, 0, NULL, NULL, 0); 8971 ok(bret, "TransmitFile failed unexpectedly.\n"); 8972 compare_file(file, dest, 0); 8973 8974 /* Test TransmitFile with both file and buffer data */ 8975 buffers.Head = &header_msg[0]; 8976 buffers.HeadLength = sizeof(header_msg); 8977 buffers.Tail = &footer_msg[0]; 8978 buffers.TailLength = sizeof(footer_msg); 8979 SetFilePointer(file, 0, NULL, FILE_BEGIN); 8980 bret = pTransmitFile(client, file, 0, 0, NULL, &buffers, 0); 8981 ok(bret, "TransmitFile failed unexpectedly.\n"); 8982 iret = recv(dest, buf, sizeof(header_msg), 0); 8983 ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0, 8984 "TransmitFile header buffer did not match!\n"); 8985 compare_file(file, dest, 0); 8986 iret = recv(dest, buf, sizeof(footer_msg), 0); 8987 ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0, 8988 "TransmitFile footer buffer did not match!\n"); 8989 8990 /* Test overlapped TransmitFile */ 8991 ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); 8992 if (ov.hEvent == INVALID_HANDLE_VALUE) 8993 { 8994 skip("Could not create event object, some tests will be skipped. errno = %d\n", 8995 GetLastError()); 8996 goto cleanup; 8997 } 8998 SetFilePointer(file, 0, NULL, FILE_BEGIN); 8999 bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0); 9000 err = WSAGetLastError(); 9001 ok(!bret, "TransmitFile succeeded unexpectedly.\n"); 9002 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", 9003 err, ERROR_IO_PENDING); 9004 iret = WaitForSingleObject(ov.hEvent, 2000); 9005 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n"); 9006 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL); 9007 ok(total_sent == file_size, 9008 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n", 9009 total_sent, file_size); 9010 compare_file(file, dest, 0); 9011 9012 /* Test overlapped TransmitFile w/ start offset */ 9013 ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); 9014 if (ov.hEvent == INVALID_HANDLE_VALUE) 9015 { 9016 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError()); 9017 goto cleanup; 9018 } 9019 SetFilePointer(file, 0, NULL, FILE_BEGIN); 9020 ov.Offset = 10; 9021 bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0); 9022 err = WSAGetLastError(); 9023 ok(!bret, "TransmitFile succeeded unexpectedly.\n"); 9024 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING); 9025 iret = WaitForSingleObject(ov.hEvent, 2000); 9026 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n"); 9027 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL); 9028 ok(total_sent == (file_size - ov.Offset), 9029 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n", 9030 total_sent, file_size - ov.Offset); 9031 compare_file(file, dest, ov.Offset); 9032 9033 /* Test overlapped TransmitFile w/ file and buffer data */ 9034 ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); 9035 if (ov.hEvent == INVALID_HANDLE_VALUE) 9036 { 9037 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError()); 9038 goto cleanup; 9039 } 9040 buffers.Head = &header_msg[0]; 9041 buffers.HeadLength = sizeof(header_msg); 9042 buffers.Tail = &footer_msg[0]; 9043 buffers.TailLength = sizeof(footer_msg); 9044 SetFilePointer(file, 0, NULL, FILE_BEGIN); 9045 ov.Offset = 0; 9046 bret = pTransmitFile(client, file, 0, 0, &ov, &buffers, 0); 9047 err = WSAGetLastError(); 9048 ok(!bret, "TransmitFile succeeded unexpectedly.\n"); 9049 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING); 9050 iret = WaitForSingleObject(ov.hEvent, 2000); 9051 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n"); 9052 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL); 9053 ok(total_sent == (file_size + buffers.HeadLength + buffers.TailLength), 9054 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n", 9055 total_sent, file_size + buffers.HeadLength + buffers.TailLength); 9056 iret = recv(dest, buf, sizeof(header_msg), 0); 9057 ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0, 9058 "TransmitFile header buffer did not match!\n"); 9059 compare_file(file, dest, 0); 9060 iret = recv(dest, buf, sizeof(footer_msg), 0); 9061 ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0, 9062 "TransmitFile footer buffer did not match!\n"); 9063 9064 /* Test TransmitFile w/ TF_DISCONNECT */ 9065 SetFilePointer(file, 0, NULL, FILE_BEGIN); 9066 bret = pTransmitFile(client, file, 0, 0, NULL, NULL, TF_DISCONNECT); 9067 ok(bret, "TransmitFile failed unexpectedly.\n"); 9068 compare_file(file, dest, 0); 9069 closesocket(client); 9070 ok(send(client, "test", 4, 0) == -1, "send() after TF_DISCONNECT succeeded unexpectedly.\n"); 9071 err = WSAGetLastError(); 9072 todo_wine ok(err == WSAENOTSOCK, "send() after TF_DISCONNECT triggered unexpected errno (%d != %d)\n", 9073 err, WSAENOTSOCK); 9074 9075 /* Test TransmitFile with a UDP datagram socket */ 9076 client = socket(AF_INET, SOCK_DGRAM, 0); 9077 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0); 9078 err = WSAGetLastError(); 9079 ok(!bret, "TransmitFile succeeded unexpectedly.\n"); 9080 ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN); 9081 9082 cleanup: 9083 CloseHandle(file); 9084 CloseHandle(ov.hEvent); 9085 closesocket(client); 9086 closesocket(server); 9087 } 9088 9089 static void test_getpeername(void) 9090 { 9091 SOCKET sock; 9092 struct sockaddr_in sa, sa_out; 9093 SOCKADDR_STORAGE ss; 9094 int sa_len; 9095 const char buf[] = "hello world"; 9096 int ret; 9097 9098 /* Test the parameter validation order. */ 9099 ret = getpeername(INVALID_SOCKET, NULL, NULL); 9100 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret); 9101 ok(WSAGetLastError() == WSAENOTSOCK, 9102 "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError()); 9103 9104 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 9105 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n"); 9106 if (sock == INVALID_SOCKET) 9107 { 9108 skip("Socket creation failed with %d\n", WSAGetLastError()); 9109 return; 9110 } 9111 9112 ret = getpeername(sock, NULL, NULL); 9113 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret); 9114 ok(WSAGetLastError() == WSAENOTCONN, 9115 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError()); 9116 9117 memset(&sa, 0, sizeof(sa)); 9118 sa.sin_family = AF_INET; 9119 sa.sin_port = htons(139); 9120 sa.sin_addr.s_addr = inet_addr("127.0.0.1"); 9121 9122 /* sendto does not change a socket's connection state. */ 9123 ret = sendto(sock, buf, sizeof(buf), 0, (struct sockaddr*)&sa, sizeof(sa)); 9124 ok(ret != SOCKET_ERROR, 9125 "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError()); 9126 9127 ret = getpeername(sock, NULL, NULL); 9128 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret); 9129 ok(WSAGetLastError() == WSAENOTCONN, 9130 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError()); 9131 9132 ret = connect(sock, (struct sockaddr*)&sa, sizeof(sa)); 9133 ok(ret == 0, 9134 "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError()); 9135 9136 ret = getpeername(sock, NULL, NULL); 9137 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret); 9138 ok(WSAGetLastError() == WSAEFAULT, 9139 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError()); 9140 9141 /* Test crashes on Wine. */ 9142 if (0) 9143 { 9144 ret = getpeername(sock, (void*)0xdeadbeef, (void*)0xcafebabe); 9145 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret); 9146 ok(WSAGetLastError() == WSAEFAULT, 9147 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError()); 9148 } 9149 9150 ret = getpeername(sock, (struct sockaddr*)&sa_out, NULL); 9151 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret); 9152 ok(WSAGetLastError() == WSAEFAULT, 9153 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError()); 9154 9155 sa_len = 0; 9156 ret = getpeername(sock, NULL, &sa_len); 9157 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret); 9158 ok(WSAGetLastError() == WSAEFAULT, 9159 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError()); 9160 ok(!sa_len, "got %d\n", sa_len); 9161 9162 sa_len = 0; 9163 ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len); 9164 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret); 9165 ok(WSAGetLastError() == WSAEFAULT, 9166 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError()); 9167 ok(!sa_len, "got %d\n", sa_len); 9168 9169 sa_len = sizeof(ss); 9170 ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len); 9171 ok(ret == 0, "Expected getpeername to return 0, got %d\n", ret); 9172 ok(!memcmp(&sa, &ss, sizeof(sa)), 9173 "Expected the returned structure to be identical to the connect structure\n"); 9174 ok(sa_len == sizeof(sa), "got %d\n", sa_len); 9175 9176 closesocket(sock); 9177 } 9178 9179 static void test_sioRoutingInterfaceQuery(void) 9180 { 9181 int ret; 9182 SOCKET sock; 9183 SOCKADDR_IN sin = { 0 }, sout = { 0 }; 9184 DWORD bytesReturned; 9185 9186 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 9187 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n"); 9188 if (sock == INVALID_SOCKET) 9189 { 9190 skip("Socket creation failed with %d\n", WSAGetLastError()); 9191 return; 9192 } 9193 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, NULL, 0, NULL, 0, NULL, 9194 NULL, NULL); 9195 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 9196 "expected WSAEFAULT, got %d\n", WSAGetLastError()); 9197 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin), 9198 NULL, 0, NULL, NULL, NULL); 9199 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 9200 "expected WSAEFAULT, got %d\n", WSAGetLastError()); 9201 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin), 9202 NULL, 0, &bytesReturned, NULL, NULL); 9203 todo_wine ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEAFNOSUPPORT, 9204 "expected WSAEAFNOSUPPORT, got %d\n", WSAGetLastError()); 9205 sin.sin_family = AF_INET; 9206 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin), 9207 NULL, 0, &bytesReturned, NULL, NULL); 9208 todo_wine ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL, 9209 "expected WSAEINVAL, got %d\n", WSAGetLastError()); 9210 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 9211 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin), 9212 NULL, 0, &bytesReturned, NULL, NULL); 9213 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, 9214 "expected WSAEFAULT, got %d\n", WSAGetLastError()); 9215 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin), 9216 &sout, sizeof(sout), &bytesReturned, NULL, NULL); 9217 ok(!ret, "WSAIoctl failed: %d\n", WSAGetLastError()); 9218 ok(sout.sin_family == AF_INET, "expected AF_INET, got %d\n", sout.sin_family); 9219 /* We expect the source address to be INADDR_LOOPBACK as well, but 9220 * there's no guarantee that a route to the loopback address exists, 9221 * so rather than introduce spurious test failures we do not test the 9222 * source address. 9223 */ 9224 closesocket(sock); 9225 } 9226 9227 static void test_sioAddressListChange(void) 9228 { 9229 struct sockaddr_in bindAddress; 9230 struct in_addr net_address; 9231 WSAOVERLAPPED overlapped, *olp; 9232 struct hostent *h; 9233 DWORD num_bytes, error, tick; 9234 SOCKET sock, sock2, sock3; 9235 WSAEVENT event2, event3; 9236 HANDLE io_port; 9237 ULONG_PTR key; 9238 int acount; 9239 BOOL bret; 9240 int ret; 9241 9242 /* Use gethostbyname to find the list of local network interfaces */ 9243 h = gethostbyname(""); 9244 if (!h) 9245 { 9246 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, gethostbyname failed with %u\n", 9247 WSAGetLastError()); 9248 return; 9249 } 9250 for (acount = 0; h->h_addr_list[acount]; acount++); 9251 if (acount == 0) 9252 { 9253 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n"); 9254 return; 9255 } 9256 9257 net_address.s_addr = *(ULONG *) h->h_addr_list[0]; 9258 9259 sock = socket(AF_INET, 0, IPPROTO_TCP); 9260 ok(sock != INVALID_SOCKET, "socket() failed\n"); 9261 9262 memset(&bindAddress, 0, sizeof(bindAddress)); 9263 bindAddress.sin_family = AF_INET; 9264 bindAddress.sin_addr.s_addr = net_address.s_addr; 9265 SetLastError(0xdeadbeef); 9266 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9267 ok (!ret, "bind() failed with error %d\n", GetLastError()); 9268 set_blocking(sock, FALSE); 9269 9270 memset(&overlapped, 0, sizeof(overlapped)); 9271 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 9272 SetLastError(0xdeadbeef); 9273 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL); 9274 error = GetLastError(); 9275 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error); 9276 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error); 9277 9278 CloseHandle(overlapped.hEvent); 9279 closesocket(sock); 9280 9281 sock = socket(AF_INET, 0, IPPROTO_TCP); 9282 ok(sock != INVALID_SOCKET, "socket() failed\n"); 9283 9284 SetLastError(0xdeadbeef); 9285 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9286 ok (!ret, "bind() failed with error %d\n", GetLastError()); 9287 set_blocking(sock, TRUE); 9288 9289 memset(&overlapped, 0, sizeof(overlapped)); 9290 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 9291 SetLastError(0xdeadbeef); 9292 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL); 9293 error = GetLastError(); 9294 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error); 9295 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error); 9296 9297 CloseHandle(overlapped.hEvent); 9298 closesocket(sock); 9299 9300 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 9301 ok(sock != INVALID_SOCKET, "socket() failed\n"); 9302 9303 SetLastError(0xdeadbeef); 9304 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9305 ok (!ret, "bind() failed with error %d\n", GetLastError()); 9306 set_blocking(sock, FALSE); 9307 9308 memset(&overlapped, 0, sizeof(overlapped)); 9309 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 9310 SetLastError(0xdeadbeef); 9311 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL); 9312 error = GetLastError(); 9313 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error); 9314 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error); 9315 9316 CloseHandle(overlapped.hEvent); 9317 closesocket(sock); 9318 9319 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 9320 ok(sock != INVALID_SOCKET, "socket() failed\n"); 9321 9322 SetLastError(0xdeadbeef); 9323 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9324 ok (!ret, "bind() failed with error %d\n", GetLastError()); 9325 set_blocking(sock, TRUE); 9326 9327 memset(&overlapped, 0, sizeof(overlapped)); 9328 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 9329 SetLastError(0xdeadbeef); 9330 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL); 9331 error = GetLastError(); 9332 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error); 9333 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error); 9334 9335 CloseHandle(overlapped.hEvent); 9336 closesocket(sock); 9337 9338 /* When the socket is overlapped non-blocking and the list change is requested without 9339 * an overlapped structure the error will be different. */ 9340 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 9341 ok(sock != INVALID_SOCKET, "socket() failed\n"); 9342 9343 SetLastError(0xdeadbeef); 9344 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9345 ok (!ret, "bind() failed with error %d\n", GetLastError()); 9346 set_blocking(sock, FALSE); 9347 9348 SetLastError(0xdeadbeef); 9349 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL); 9350 error = GetLastError(); 9351 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error); 9352 ok (error == WSAEWOULDBLOCK, "expected 10035, got %d\n", error); 9353 9354 io_port = CreateIoCompletionPort( (HANDLE)sock, NULL, 0, 0 ); 9355 ok (io_port != NULL, "failed to create completion port %u\n", GetLastError()); 9356 9357 set_blocking(sock, FALSE); 9358 memset(&overlapped, 0, sizeof(overlapped)); 9359 SetLastError(0xdeadbeef); 9360 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL); 9361 error = GetLastError(); 9362 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %u\n", error); 9363 ok (error == ERROR_IO_PENDING, "expected ERROR_IO_PENDING got %u\n", error); 9364 9365 olp = (WSAOVERLAPPED *)0xdeadbeef; 9366 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 ); 9367 ok(!bret, "failed to get completion status %u\n", bret); 9368 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 9369 ok(!olp, "Overlapped structure is at %p\n", olp); 9370 9371 closesocket(sock); 9372 9373 olp = (WSAOVERLAPPED *)0xdeadbeef; 9374 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 ); 9375 ok(!bret, "failed to get completion status %u\n", bret); 9376 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %u\n", GetLastError()); 9377 ok(olp == &overlapped, "Overlapped structure is at %p\n", olp); 9378 9379 CloseHandle(io_port); 9380 9381 /* Misuse of the API by using a blocking socket and not using an overlapped structure, 9382 * this leads to a hang forever. */ 9383 if (0) 9384 { 9385 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 9386 9387 SetLastError(0xdeadbeef); 9388 bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9389 9390 set_blocking(sock, TRUE); 9391 WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL); 9392 /* hang */ 9393 9394 closesocket(sock); 9395 } 9396 9397 if (!winetest_interactive) 9398 { 9399 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n"); 9400 return; 9401 } 9402 9403 /* Bind an overlapped socket to the first found network interface */ 9404 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 9405 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n"); 9406 sock2 = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 9407 ok(sock2 != INVALID_SOCKET, "Expected socket to return a valid socket\n"); 9408 sock3 = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 9409 ok(sock3 != INVALID_SOCKET, "Expected socket to return a valid socket\n"); 9410 9411 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9412 ok(!ret, "bind failed unexpectedly\n"); 9413 ret = bind(sock2, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9414 ok(!ret, "bind failed unexpectedly\n"); 9415 ret = bind(sock3, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 9416 ok(!ret, "bind failed unexpectedly\n"); 9417 9418 set_blocking(sock2, FALSE); 9419 set_blocking(sock3, FALSE); 9420 9421 /* Wait for address changes, request that the user connects/disconnects an interface */ 9422 memset(&overlapped, 0, sizeof(overlapped)); 9423 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); 9424 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL); 9425 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n"); 9426 ok(WSAGetLastError() == WSA_IO_PENDING, "Expected pending last error, got %d\n", WSAGetLastError()); 9427 9428 ret = WSAIoctl(sock2, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL); 9429 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n"); 9430 ok(WSAGetLastError() == WSAEWOULDBLOCK, "Expected would block last error, got %d\n", WSAGetLastError()); 9431 9432 event2 = WSACreateEvent(); 9433 event3 = WSACreateEvent(); 9434 ret = WSAEventSelect (sock2, event2, FD_ADDRESS_LIST_CHANGE); 9435 ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError()); 9436 /* sock3 did not request SIO_ADDRESS_LIST_CHANGE but it is trying to wait anyway */ 9437 ret = WSAEventSelect (sock3, event3, FD_ADDRESS_LIST_CHANGE); 9438 ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError()); 9439 9440 trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or" 9441 " change the ipv4 address of any of the local network interfaces (15 second timeout).\n"); 9442 tick = GetTickCount(); 9443 ret = WaitForSingleObject(overlapped.hEvent, 15000); 9444 ok(ret == WAIT_OBJECT_0, "failed to get overlapped event %u\n", ret); 9445 9446 ret = WaitForSingleObject(event2, 500); 9447 todo_wine 9448 ok(ret == WAIT_OBJECT_0, "failed to get change event %u\n", ret); 9449 9450 ret = WaitForSingleObject(event3, 500); 9451 ok(ret == WAIT_TIMEOUT, "unexpected change event\n"); 9452 9453 trace("Spent %d ms waiting.\n", GetTickCount() - tick); 9454 9455 WSACloseEvent(event2); 9456 WSACloseEvent(event3); 9457 9458 closesocket(sock); 9459 closesocket(sock2); 9460 closesocket(sock3); 9461 } 9462 9463 static void test_synchronous_WSAIoctl(void) 9464 { 9465 HANDLE previous_port, io_port; 9466 WSAOVERLAPPED overlapped, *olp; 9467 SOCKET socket; 9468 ULONG on; 9469 ULONG_PTR key; 9470 DWORD num_bytes; 9471 BOOL ret; 9472 int res; 9473 9474 previous_port = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 ); 9475 ok( previous_port != NULL, "failed to create completion port %u\n", GetLastError() ); 9476 9477 socket = WSASocketW( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED ); 9478 ok( socket != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError() ); 9479 9480 io_port = CreateIoCompletionPort( (HANDLE)socket, previous_port, 0, 0 ); 9481 ok( io_port != NULL, "failed to create completion port %u\n", GetLastError() ); 9482 9483 on = 1; 9484 memset( &overlapped, 0, sizeof(overlapped) ); 9485 res = WSAIoctl( socket, FIONBIO, &on, sizeof(on), NULL, 0, &num_bytes, &overlapped, NULL ); 9486 ok( !res, "WSAIoctl failed %d\n", WSAGetLastError() ); 9487 9488 ret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 10000 ); 9489 ok( ret, "failed to get completion status %u\n", GetLastError() ); 9490 9491 CloseHandle( io_port ); 9492 closesocket( socket ); 9493 CloseHandle( previous_port ); 9494 } 9495 9496 #define WM_ASYNCCOMPLETE (WM_USER + 100) 9497 static HWND create_async_message_window(void) 9498 { 9499 static const char class_name[] = "ws2_32 async message window class"; 9500 9501 WNDCLASSEXA wndclass; 9502 HWND hWnd; 9503 9504 wndclass.cbSize = sizeof(wndclass); 9505 wndclass.style = CS_HREDRAW | CS_VREDRAW; 9506 wndclass.lpfnWndProc = DefWindowProcA; 9507 wndclass.cbClsExtra = 0; 9508 wndclass.cbWndExtra = 0; 9509 wndclass.hInstance = GetModuleHandleA(NULL); 9510 wndclass.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); 9511 wndclass.hIconSm = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); 9512 wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW); 9513 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 9514 wndclass.lpszClassName = class_name; 9515 wndclass.lpszMenuName = NULL; 9516 9517 RegisterClassExA(&wndclass); 9518 9519 hWnd = CreateWindowA(class_name, "ws2_32 async message window", WS_OVERLAPPEDWINDOW, 9520 0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL); 9521 if (!hWnd) 9522 { 9523 ok(0, "failed to create window: %u\n", GetLastError()); 9524 return NULL; 9525 } 9526 9527 return hWnd; 9528 } 9529 9530 static void wait_for_async_message(HWND hwnd, HANDLE handle) 9531 { 9532 BOOL ret; 9533 MSG msg; 9534 9535 while ((ret = GetMessageA(&msg, 0, 0, 0)) && 9536 !(msg.hwnd == hwnd && msg.message == WM_ASYNCCOMPLETE)) 9537 { 9538 TranslateMessage(&msg); 9539 DispatchMessageA(&msg); 9540 } 9541 9542 ok(ret, "did not expect WM_QUIT message\n"); 9543 ok(msg.wParam == (WPARAM)handle, "expected wParam = %p, got %lx\n", handle, msg.wParam); 9544 } 9545 9546 static void test_WSAAsyncGetServByPort(void) 9547 { 9548 HWND hwnd = create_async_message_window(); 9549 HANDLE ret; 9550 char buffer[MAXGETHOSTSTRUCT]; 9551 9552 if (!hwnd) 9553 return; 9554 9555 /* FIXME: The asynchronous window messages should be tested. */ 9556 9557 /* Parameters are not checked when initiating the asynchronous operation. */ 9558 ret = WSAAsyncGetServByPort(NULL, 0, 0, NULL, NULL, 0); 9559 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n"); 9560 9561 ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, 0, NULL, NULL, 0); 9562 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n"); 9563 wait_for_async_message(hwnd, ret); 9564 9565 ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, NULL, 0); 9566 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n"); 9567 wait_for_async_message(hwnd, ret); 9568 9569 ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, buffer, MAXGETHOSTSTRUCT); 9570 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n"); 9571 wait_for_async_message(hwnd, ret); 9572 9573 DestroyWindow(hwnd); 9574 } 9575 9576 static void test_WSAAsyncGetServByName(void) 9577 { 9578 HWND hwnd = create_async_message_window(); 9579 HANDLE ret; 9580 char buffer[MAXGETHOSTSTRUCT]; 9581 9582 if (!hwnd) 9583 return; 9584 9585 /* FIXME: The asynchronous window messages should be tested. */ 9586 9587 /* Parameters are not checked when initiating the asynchronous operation. */ 9588 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", NULL, NULL, 0); 9589 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); 9590 wait_for_async_message(hwnd, ret); 9591 9592 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", "", buffer, MAXGETHOSTSTRUCT); 9593 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); 9594 wait_for_async_message(hwnd, ret); 9595 9596 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", NULL, NULL, 0); 9597 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); 9598 wait_for_async_message(hwnd, ret); 9599 9600 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", "tcp", buffer, MAXGETHOSTSTRUCT); 9601 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n"); 9602 wait_for_async_message(hwnd, ret); 9603 9604 DestroyWindow(hwnd); 9605 } 9606 9607 /* 9608 * Provide consistent initialization for the AcceptEx IOCP tests. 9609 */ 9610 static SOCKET setup_iocp_src(struct sockaddr_in *bindAddress) 9611 { 9612 SOCKET src, ret = INVALID_SOCKET; 9613 int iret, socklen; 9614 9615 src = socket(AF_INET, SOCK_STREAM, 0); 9616 if (src == INVALID_SOCKET) 9617 { 9618 skip("could not create listener socket, error %d\n", WSAGetLastError()); 9619 goto end; 9620 } 9621 9622 memset(bindAddress, 0, sizeof(*bindAddress)); 9623 bindAddress->sin_family = AF_INET; 9624 bindAddress->sin_addr.s_addr = inet_addr("127.0.0.1"); 9625 iret = bind(src, (struct sockaddr*)bindAddress, sizeof(*bindAddress)); 9626 if (iret != 0) 9627 { 9628 skip("failed to bind, error %d\n", WSAGetLastError()); 9629 goto end; 9630 } 9631 9632 socklen = sizeof(*bindAddress); 9633 iret = getsockname(src, (struct sockaddr*)bindAddress, &socklen); 9634 if (iret != 0) { 9635 skip("failed to lookup bind address, error %d\n", WSAGetLastError()); 9636 goto end; 9637 } 9638 9639 if (set_blocking(src, FALSE)) 9640 { 9641 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError()); 9642 goto end; 9643 } 9644 9645 iret = listen(src, 5); 9646 if (iret != 0) 9647 { 9648 skip("listening failed, errno = %d\n", WSAGetLastError()); 9649 goto end; 9650 } 9651 9652 ret = src; 9653 end: 9654 if (src != ret && ret == INVALID_SOCKET) 9655 closesocket(src); 9656 return ret; 9657 } 9658 9659 static void test_completion_port(void) 9660 { 9661 FILE_IO_COMPLETION_NOTIFICATION_INFORMATION io_info; 9662 HANDLE previous_port, io_port; 9663 WSAOVERLAPPED ov, *olp; 9664 SOCKET src, dest, dup, connector = INVALID_SOCKET; 9665 WSAPROTOCOL_INFOA info; 9666 IO_STATUS_BLOCK io; 9667 NTSTATUS status; 9668 char buf[1024]; 9669 WSABUF bufs; 9670 DWORD num_bytes, flags; 9671 struct linger ling; 9672 int iret; 9673 BOOL bret; 9674 ULONG_PTR key; 9675 struct sockaddr_in bindAddress; 9676 GUID acceptExGuid = WSAID_ACCEPTEX; 9677 LPFN_ACCEPTEX pAcceptEx = NULL; 9678 fd_set fds_recv; 9679 9680 memset(buf, 0, sizeof(buf)); 9681 previous_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); 9682 ok( previous_port != NULL, "Failed to create completion port %u\n", GetLastError()); 9683 9684 memset(&ov, 0, sizeof(ov)); 9685 9686 tcp_socketpair(&src, &dest); 9687 if (src == INVALID_SOCKET || dest == INVALID_SOCKET) 9688 { 9689 skip("failed to create sockets\n"); 9690 goto end; 9691 } 9692 9693 bufs.len = sizeof(buf); 9694 bufs.buf = buf; 9695 flags = 0; 9696 9697 ling.l_onoff = 1; 9698 ling.l_linger = 0; 9699 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling)); 9700 ok(!iret, "Failed to set linger %d\n", GetLastError()); 9701 9702 io_port = CreateIoCompletionPort( (HANDLE)dest, previous_port, 125, 0 ); 9703 ok(io_port != NULL, "Failed to create completion port %u\n", GetLastError()); 9704 9705 SetLastError(0xdeadbeef); 9706 9707 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL); 9708 ok(iret == SOCKET_ERROR, "WSARecv returned %d\n", iret); 9709 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 9710 9711 Sleep(100); 9712 9713 closesocket(src); 9714 src = INVALID_SOCKET; 9715 9716 SetLastError(0xdeadbeef); 9717 key = 0xdeadbeef; 9718 num_bytes = 0xdeadbeef; 9719 olp = (WSAOVERLAPPED *)0xdeadbeef; 9720 9721 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 9722 todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret); 9723 todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "Last error was %d\n", GetLastError()); 9724 ok(key == 125, "Key is %lu\n", key); 9725 ok(num_bytes == 0, "Number of bytes received is %u\n", num_bytes); 9726 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 9727 9728 SetLastError(0xdeadbeef); 9729 key = 0xdeadbeef; 9730 num_bytes = 0xdeadbeef; 9731 olp = (WSAOVERLAPPED *)0xdeadbeef; 9732 9733 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 9734 ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret ); 9735 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 9736 ok(key == 0xdeadbeef, "Key is %lu\n", key); 9737 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 9738 ok(!olp, "Overlapped structure is at %p\n", olp); 9739 9740 if (dest != INVALID_SOCKET) 9741 closesocket(dest); 9742 9743 memset(&ov, 0, sizeof(ov)); 9744 9745 tcp_socketpair(&src, &dest); 9746 if (src == INVALID_SOCKET || dest == INVALID_SOCKET) 9747 { 9748 skip("failed to create sockets\n"); 9749 goto end; 9750 } 9751 9752 bufs.len = sizeof(buf); 9753 bufs.buf = buf; 9754 flags = 0; 9755 9756 ling.l_onoff = 1; 9757 ling.l_linger = 0; 9758 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling)); 9759 ok(!iret, "Failed to set linger %d\n", GetLastError()); 9760 9761 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0); 9762 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 9763 9764 set_blocking(dest, FALSE); 9765 9766 closesocket(src); 9767 src = INVALID_SOCKET; 9768 9769 Sleep(100); 9770 9771 num_bytes = 0xdeadbeef; 9772 SetLastError(0xdeadbeef); 9773 9774 iret = WSASend(dest, &bufs, 1, &num_bytes, 0, &ov, NULL); 9775 ok(iret == SOCKET_ERROR, "WSASend failed - %d\n", iret); 9776 ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError()); 9777 ok(num_bytes == 0xdeadbeef, "Managed to send %d\n", num_bytes); 9778 9779 SetLastError(0xdeadbeef); 9780 key = 0xdeadbeef; 9781 num_bytes = 0xdeadbeef; 9782 olp = (WSAOVERLAPPED *)0xdeadbeef; 9783 9784 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 9785 ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret ); 9786 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 9787 ok(key == 0xdeadbeef, "Key is %lu\n", key); 9788 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 9789 ok(!olp, "Overlapped structure is at %p\n", olp); 9790 9791 if (dest != INVALID_SOCKET) 9792 closesocket(dest); 9793 9794 /* Test IOCP response on successful immediate read. */ 9795 tcp_socketpair(&src, &dest); 9796 if (src == INVALID_SOCKET || dest == INVALID_SOCKET) 9797 { 9798 skip("failed to create sockets\n"); 9799 goto end; 9800 } 9801 9802 bufs.len = sizeof(buf); 9803 bufs.buf = buf; 9804 flags = 0; 9805 SetLastError(0xdeadbeef); 9806 9807 iret = WSASend(src, &bufs, 1, &num_bytes, 0, &ov, NULL); 9808 ok(!iret, "WSASend failed - %d, last error %u\n", iret, GetLastError()); 9809 ok(num_bytes == sizeof(buf), "Managed to send %d\n", num_bytes); 9810 9811 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0); 9812 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 9813 set_blocking(dest, FALSE); 9814 9815 FD_ZERO(&fds_recv); 9816 FD_SET(dest, &fds_recv); 9817 select(dest + 1, &fds_recv, NULL, NULL, NULL); 9818 9819 num_bytes = 0xdeadbeef; 9820 flags = 0; 9821 9822 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL); 9823 ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError()); 9824 ok(num_bytes == sizeof(buf), "Managed to read %d\n", num_bytes); 9825 9826 SetLastError(0xdeadbeef); 9827 key = 0xdeadbeef; 9828 num_bytes = 0xdeadbeef; 9829 olp = (WSAOVERLAPPED *)0xdeadbeef; 9830 9831 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 9832 ok(bret == TRUE, "failed to get completion status %u\n", bret); 9833 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError()); 9834 ok(key == 125, "Key is %lu\n", key); 9835 ok(num_bytes == sizeof(buf), "Number of bytes transferred is %u\n", num_bytes); 9836 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 9837 9838 /* Test IOCP response on graceful shutdown. */ 9839 closesocket(src); 9840 9841 FD_ZERO(&fds_recv); 9842 FD_SET(dest, &fds_recv); 9843 select(dest + 1, &fds_recv, NULL, NULL, NULL); 9844 9845 num_bytes = 0xdeadbeef; 9846 flags = 0; 9847 memset(&ov, 0, sizeof(ov)); 9848 9849 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL); 9850 ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError()); 9851 ok(!num_bytes, "Managed to read %d\n", num_bytes); 9852 9853 SetLastError(0xdeadbeef); 9854 key = 0xdeadbeef; 9855 num_bytes = 0xdeadbeef; 9856 olp = (WSAOVERLAPPED *)0xdeadbeef; 9857 9858 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 9859 ok(bret == TRUE, "failed to get completion status %u\n", bret); 9860 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError()); 9861 ok(key == 125, "Key is %lu\n", key); 9862 ok(!num_bytes, "Number of bytes transferred is %u\n", num_bytes); 9863 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 9864 9865 closesocket(src); 9866 src = INVALID_SOCKET; 9867 closesocket(dest); 9868 dest = INVALID_SOCKET; 9869 9870 /* Test IOCP response on hard shutdown. This was the condition that triggered 9871 * a crash in an actual app (bug 38980). */ 9872 tcp_socketpair(&src, &dest); 9873 if (src == INVALID_SOCKET || dest == INVALID_SOCKET) 9874 { 9875 skip("failed to create sockets\n"); 9876 goto end; 9877 } 9878 9879 bufs.len = sizeof(buf); 9880 bufs.buf = buf; 9881 flags = 0; 9882 memset(&ov, 0, sizeof(ov)); 9883 9884 ling.l_onoff = 1; 9885 ling.l_linger = 0; 9886 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling)); 9887 ok(!iret, "Failed to set linger %d\n", GetLastError()); 9888 9889 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0); 9890 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 9891 set_blocking(dest, FALSE); 9892 9893 closesocket(src); 9894 src = INVALID_SOCKET; 9895 9896 FD_ZERO(&fds_recv); 9897 FD_SET(dest, &fds_recv); 9898 select(dest + 1, &fds_recv, NULL, NULL, NULL); 9899 9900 num_bytes = 0xdeadbeef; 9901 SetLastError(0xdeadbeef); 9902 9903 /* Somehow a hard shutdown doesn't work on my Linux box. It seems SO_LINGER is ignored. */ 9904 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL); 9905 todo_wine ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret); 9906 todo_wine ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError()); 9907 todo_wine ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes); 9908 9909 SetLastError(0xdeadbeef); 9910 key = 0xdeadbeef; 9911 num_bytes = 0xdeadbeef; 9912 olp = (WSAOVERLAPPED *)0xdeadbeef; 9913 9914 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 9915 todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret ); 9916 todo_wine ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 9917 todo_wine ok(key == 0xdeadbeef, "Key is %lu\n", key); 9918 todo_wine ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 9919 todo_wine ok(!olp, "Overlapped structure is at %p\n", olp); 9920 9921 closesocket(dest); 9922 9923 /* Test reading from a non-connected socket, mostly because the above test is marked todo. */ 9924 dest = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 9925 ok(dest != INVALID_SOCKET, "socket() failed\n"); 9926 9927 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0); 9928 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 9929 set_blocking(dest, FALSE); 9930 9931 num_bytes = 0xdeadbeef; 9932 SetLastError(0xdeadbeef); 9933 memset(&ov, 0, sizeof(ov)); 9934 9935 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL); 9936 ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret); 9937 ok(GetLastError() == WSAENOTCONN, "Last error was %d\n", GetLastError()); 9938 ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes); 9939 9940 SetLastError(0xdeadbeef); 9941 key = 0xdeadbeef; 9942 num_bytes = 0xdeadbeef; 9943 olp = (WSAOVERLAPPED *)0xdeadbeef; 9944 9945 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 9946 ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret ); 9947 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 9948 ok(key == 0xdeadbeef, "Key is %lu\n", key); 9949 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 9950 ok(!olp, "Overlapped structure is at %p\n", olp); 9951 9952 num_bytes = 0xdeadbeef; 9953 closesocket(dest); 9954 9955 dest = socket(AF_INET, SOCK_STREAM, 0); 9956 if (dest == INVALID_SOCKET) 9957 { 9958 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 9959 goto end; 9960 } 9961 9962 iret = WSAIoctl(dest, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid), 9963 &pAcceptEx, sizeof(pAcceptEx), &num_bytes, NULL, NULL); 9964 if (iret) 9965 { 9966 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError()); 9967 goto end; 9968 } 9969 9970 /* Test IOCP response on socket close (IOCP created after AcceptEx) */ 9971 9972 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 9973 goto end; 9974 9975 SetLastError(0xdeadbeef); 9976 9977 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 9978 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 9979 &num_bytes, &ov); 9980 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 9981 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 9982 9983 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 9984 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 9985 9986 closesocket(src); 9987 src = INVALID_SOCKET; 9988 9989 SetLastError(0xdeadbeef); 9990 key = 0xdeadbeef; 9991 num_bytes = 0xdeadbeef; 9992 olp = (WSAOVERLAPPED *)0xdeadbeef; 9993 9994 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 9995 ok(bret == FALSE, "failed to get completion status %u\n", bret); 9996 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError()); 9997 ok(key == 125, "Key is %lu\n", key); 9998 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes); 9999 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10000 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0); 10001 10002 SetLastError(0xdeadbeef); 10003 key = 0xdeadbeef; 10004 num_bytes = 0xdeadbeef; 10005 olp = (WSAOVERLAPPED *)0xdeadbeef; 10006 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10007 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10008 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10009 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10010 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10011 ok(!olp, "Overlapped structure is at %p\n", olp); 10012 10013 /* Test IOCP response on socket close (IOCP created before AcceptEx) */ 10014 10015 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10016 goto end; 10017 10018 SetLastError(0xdeadbeef); 10019 10020 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10021 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10022 10023 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 10024 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 10025 &num_bytes, &ov); 10026 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 10027 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 10028 10029 closesocket(src); 10030 src = INVALID_SOCKET; 10031 10032 SetLastError(0xdeadbeef); 10033 key = 0xdeadbeef; 10034 num_bytes = 0xdeadbeef; 10035 olp = (WSAOVERLAPPED *)0xdeadbeef; 10036 10037 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 10038 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10039 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError()); 10040 ok(key == 125, "Key is %lu\n", key); 10041 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes); 10042 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10043 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0); 10044 10045 SetLastError(0xdeadbeef); 10046 key = 0xdeadbeef; 10047 num_bytes = 0xdeadbeef; 10048 olp = (WSAOVERLAPPED *)0xdeadbeef; 10049 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10050 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10051 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10052 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10053 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10054 ok(!olp, "Overlapped structure is at %p\n", olp); 10055 10056 /* Test IOCP with duplicated handle */ 10057 10058 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10059 goto end; 10060 10061 SetLastError(0xdeadbeef); 10062 10063 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10064 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10065 10066 WSADuplicateSocketA( src, GetCurrentProcessId(), &info ); 10067 dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED); 10068 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n"); 10069 10070 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 10071 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 10072 &num_bytes, &ov); 10073 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 10074 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 10075 10076 SetLastError(0xdeadbeef); 10077 key = 0xdeadbeef; 10078 num_bytes = 0xdeadbeef; 10079 olp = (WSAOVERLAPPED *)0xdeadbeef; 10080 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10081 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10082 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10083 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10084 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10085 ok(!olp, "Overlapped structure is at %p\n", olp); 10086 10087 closesocket(src); 10088 src = INVALID_SOCKET; 10089 closesocket(dup); 10090 dup = INVALID_SOCKET; 10091 10092 SetLastError(0xdeadbeef); 10093 key = 0xdeadbeef; 10094 num_bytes = 0xdeadbeef; 10095 olp = (WSAOVERLAPPED *)0xdeadbeef; 10096 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 10097 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10098 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError()); 10099 ok(key == 125, "Key is %lu\n", key); 10100 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes); 10101 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10102 ok(olp && olp->Internal == (ULONG)STATUS_CANCELLED, "Internal status is %lx\n", olp ? olp->Internal : 0); 10103 10104 SetLastError(0xdeadbeef); 10105 key = 0xdeadbeef; 10106 num_bytes = 0xdeadbeef; 10107 olp = (WSAOVERLAPPED *)0xdeadbeef; 10108 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10109 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10110 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10111 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10112 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10113 ok(!olp, "Overlapped structure is at %p\n", olp); 10114 10115 /* Test IOCP with duplicated handle (closing duplicated handle) */ 10116 10117 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10118 goto end; 10119 10120 SetLastError(0xdeadbeef); 10121 10122 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10123 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10124 10125 WSADuplicateSocketA( src, GetCurrentProcessId(), &info ); 10126 dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED); 10127 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n"); 10128 10129 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 10130 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 10131 &num_bytes, &ov); 10132 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 10133 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 10134 10135 closesocket(dup); 10136 dup = INVALID_SOCKET; 10137 10138 SetLastError(0xdeadbeef); 10139 key = 0xdeadbeef; 10140 num_bytes = 0xdeadbeef; 10141 olp = (WSAOVERLAPPED *)0xdeadbeef; 10142 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10143 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10144 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10145 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10146 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10147 ok(!olp, "Overlapped structure is at %p\n", olp); 10148 10149 SetLastError(0xdeadbeef); 10150 key = 0xdeadbeef; 10151 num_bytes = 0xdeadbeef; 10152 olp = (WSAOVERLAPPED *)0xdeadbeef; 10153 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10154 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10155 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10156 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10157 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10158 ok(!olp, "Overlapped structure is at %p\n", olp); 10159 10160 closesocket(src); 10161 src = INVALID_SOCKET; 10162 10163 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 10164 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10165 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError()); 10166 ok(key == 125, "Key is %lu\n", key); 10167 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes); 10168 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10169 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0); 10170 10171 SetLastError(0xdeadbeef); 10172 key = 0xdeadbeef; 10173 num_bytes = 0xdeadbeef; 10174 olp = (WSAOVERLAPPED *)0xdeadbeef; 10175 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10176 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10177 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10178 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10179 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10180 ok(!olp, "Overlapped structure is at %p\n", olp); 10181 10182 /* Test IOCP with duplicated handle (closing original handle) */ 10183 10184 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10185 goto end; 10186 10187 SetLastError(0xdeadbeef); 10188 10189 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10190 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10191 10192 WSADuplicateSocketA( src, GetCurrentProcessId(), &info ); 10193 dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED); 10194 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n"); 10195 10196 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 10197 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 10198 &num_bytes, &ov); 10199 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 10200 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 10201 10202 closesocket(src); 10203 src = INVALID_SOCKET; 10204 10205 SetLastError(0xdeadbeef); 10206 key = 0xdeadbeef; 10207 num_bytes = 0xdeadbeef; 10208 olp = (WSAOVERLAPPED *)0xdeadbeef; 10209 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10210 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10211 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10212 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10213 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10214 ok(!olp, "Overlapped structure is at %p\n", olp); 10215 10216 closesocket(dup); 10217 dup = INVALID_SOCKET; 10218 10219 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 10220 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10221 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError()); 10222 ok(key == 125, "Key is %lu\n", key); 10223 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes); 10224 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10225 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0); 10226 10227 SetLastError(0xdeadbeef); 10228 key = 0xdeadbeef; 10229 num_bytes = 0xdeadbeef; 10230 olp = (WSAOVERLAPPED *)0xdeadbeef; 10231 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10232 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10233 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10234 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10235 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10236 ok(!olp, "Overlapped structure is at %p\n", olp); 10237 10238 /* Test IOCP without AcceptEx */ 10239 10240 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10241 goto end; 10242 10243 SetLastError(0xdeadbeef); 10244 10245 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10246 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10247 10248 closesocket(src); 10249 src = INVALID_SOCKET; 10250 10251 SetLastError(0xdeadbeef); 10252 key = 0xdeadbeef; 10253 num_bytes = 0xdeadbeef; 10254 olp = (WSAOVERLAPPED *)0xdeadbeef; 10255 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10256 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10257 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10258 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10259 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10260 ok(!olp, "Overlapped structure is at %p\n", olp); 10261 10262 /* */ 10263 10264 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10265 goto end; 10266 10267 connector = socket(AF_INET, SOCK_STREAM, 0); 10268 if (connector == INVALID_SOCKET) { 10269 skip("could not create connector socket, error %d\n", WSAGetLastError()); 10270 goto end; 10271 } 10272 10273 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10274 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10275 10276 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0); 10277 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10278 10279 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 10280 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 10281 &num_bytes, &ov); 10282 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 10283 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 10284 10285 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 10286 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError()); 10287 10288 closesocket(connector); 10289 connector = INVALID_SOCKET; 10290 10291 SetLastError(0xdeadbeef); 10292 key = 0xdeadbeef; 10293 num_bytes = 0xdeadbeef; 10294 olp = (WSAOVERLAPPED *)0xdeadbeef; 10295 10296 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 10297 ok(bret == TRUE, "failed to get completion status %u\n", bret); 10298 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError()); 10299 ok(key == 125, "Key is %lu\n", key); 10300 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes); 10301 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10302 ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0); 10303 10304 SetLastError(0xdeadbeef); 10305 key = 0xdeadbeef; 10306 num_bytes = 0xdeadbeef; 10307 olp = (WSAOVERLAPPED *)0xdeadbeef; 10308 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10309 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10310 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10311 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10312 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10313 ok(!olp, "Overlapped structure is at %p\n", olp); 10314 10315 if (dest != INVALID_SOCKET) 10316 closesocket(dest); 10317 if (src != INVALID_SOCKET) 10318 closesocket(dest); 10319 10320 /* */ 10321 10322 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10323 goto end; 10324 10325 dest = socket(AF_INET, SOCK_STREAM, 0); 10326 if (dest == INVALID_SOCKET) 10327 { 10328 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 10329 goto end; 10330 } 10331 10332 connector = socket(AF_INET, SOCK_STREAM, 0); 10333 if (connector == INVALID_SOCKET) { 10334 skip("could not create connector socket, error %d\n", WSAGetLastError()); 10335 goto end; 10336 } 10337 10338 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10339 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10340 10341 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0); 10342 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10343 10344 io_info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS; 10345 status = pNtSetInformationFile((HANDLE)src, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation); 10346 ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) /* XP */, 10347 "expected STATUS_SUCCESS, got %08x\n", status); 10348 10349 io_info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS; 10350 status = pNtSetInformationFile((HANDLE)dest, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation); 10351 ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) /* XP */, 10352 "expected STATUS_SUCCESS, got %08x\n", status); 10353 10354 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 10355 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 10356 &num_bytes, &ov); 10357 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 10358 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 10359 10360 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 10361 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError()); 10362 10363 iret = send(connector, buf, 1, 0); 10364 ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError()); 10365 10366 Sleep(100); 10367 10368 closesocket(dest); 10369 dest = INVALID_SOCKET; 10370 10371 SetLastError(0xdeadbeef); 10372 key = 0xdeadbeef; 10373 num_bytes = 0xdeadbeef; 10374 olp = (WSAOVERLAPPED *)0xdeadbeef; 10375 10376 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 10377 ok(bret == TRUE, "failed to get completion status %u\n", bret); 10378 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError()); 10379 ok(key == 125, "Key is %lu\n", key); 10380 ok(num_bytes == 1, "Number of bytes transferred is %u\n", num_bytes); 10381 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10382 ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0); 10383 10384 io_info.Flags = 0; 10385 status = pNtQueryInformationFile((HANDLE)dest, &io, &io_info, sizeof(io_info), FileIoCompletionNotificationInformation); 10386 ok(status == STATUS_SUCCESS || broken(status == STATUS_INVALID_INFO_CLASS) /* XP */, 10387 "expected STATUS_SUCCESS, got %08x\n", status); 10388 if (status == STATUS_SUCCESS) 10389 ok((io_info.Flags & FILE_SKIP_COMPLETION_PORT_ON_SUCCESS) != 0, "got %08x\n", io_info.Flags); 10390 10391 SetLastError(0xdeadbeef); 10392 key = 0xdeadbeef; 10393 num_bytes = 0xdeadbeef; 10394 olp = (WSAOVERLAPPED *)0xdeadbeef; 10395 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10396 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10397 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10398 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10399 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10400 ok(!olp, "Overlapped structure is at %p\n", olp); 10401 10402 if (src != INVALID_SOCKET) 10403 closesocket(src); 10404 if (connector != INVALID_SOCKET) 10405 closesocket(connector); 10406 10407 /* */ 10408 10409 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET) 10410 goto end; 10411 10412 dest = socket(AF_INET, SOCK_STREAM, 0); 10413 if (dest == INVALID_SOCKET) 10414 { 10415 skip("could not create acceptor socket, error %d\n", WSAGetLastError()); 10416 goto end; 10417 } 10418 10419 connector = socket(AF_INET, SOCK_STREAM, 0); 10420 if (connector == INVALID_SOCKET) { 10421 skip("could not create connector socket, error %d\n", WSAGetLastError()); 10422 goto end; 10423 } 10424 10425 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0); 10426 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10427 10428 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0); 10429 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError()); 10430 10431 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16), 10432 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, 10433 &num_bytes, &ov); 10434 ok(bret == FALSE, "AcceptEx returned %d\n", bret); 10435 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError()); 10436 10437 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); 10438 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError()); 10439 10440 closesocket(dest); 10441 dest = INVALID_SOCKET; 10442 10443 SetLastError(0xdeadbeef); 10444 key = 0xdeadbeef; 10445 num_bytes = 0xdeadbeef; 10446 olp = (WSAOVERLAPPED *)0xdeadbeef; 10447 10448 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100); 10449 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10450 todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED || 10451 GetLastError() == ERROR_OPERATION_ABORTED || 10452 GetLastError() == ERROR_CONNECTION_ABORTED || 10453 GetLastError() == ERROR_PIPE_NOT_CONNECTED /* win 2000 */, 10454 "Last error was %d\n", GetLastError()); 10455 ok(key == 125, "Key is %lu\n", key); 10456 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes); 10457 ok(olp == &ov, "Overlapped structure is at %p\n", olp); 10458 todo_wine ok(olp && (olp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT || 10459 olp->Internal == (ULONG)STATUS_CANCELLED || 10460 olp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || 10461 olp->Internal == (ULONG)STATUS_PIPE_DISCONNECTED /* win 2000 */), 10462 "Internal status is %lx\n", olp ? olp->Internal : 0); 10463 10464 SetLastError(0xdeadbeef); 10465 key = 0xdeadbeef; 10466 num_bytes = 0xdeadbeef; 10467 olp = (WSAOVERLAPPED *)0xdeadbeef; 10468 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 ); 10469 ok(bret == FALSE, "failed to get completion status %u\n", bret); 10470 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError()); 10471 ok(key == 0xdeadbeef, "Key is %lu\n", key); 10472 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes); 10473 ok(!olp, "Overlapped structure is at %p\n", olp); 10474 10475 10476 end: 10477 if (dest != INVALID_SOCKET) 10478 closesocket(dest); 10479 if (src != INVALID_SOCKET) 10480 closesocket(src); 10481 if (connector != INVALID_SOCKET) 10482 closesocket(connector); 10483 CloseHandle(previous_port); 10484 } 10485 10486 static void test_address_list_query(void) 10487 { 10488 SOCKET_ADDRESS_LIST *address_list; 10489 DWORD bytes_returned, size; 10490 unsigned int i; 10491 SOCKET s; 10492 int ret; 10493 10494 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 10495 ok(s != INVALID_SOCKET, "Failed to create socket, error %d.\n", WSAGetLastError()); 10496 10497 bytes_returned = 0; 10498 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, 0, &bytes_returned, NULL, NULL); 10499 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret); 10500 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError()); 10501 ok(bytes_returned >= FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]), 10502 "Got unexpected bytes_returned %u.\n", bytes_returned); 10503 10504 size = bytes_returned; 10505 bytes_returned = 0; 10506 address_list = HeapAlloc(GetProcessHeap(), 0, size * 2); 10507 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size * 2, &bytes_returned, NULL, NULL); 10508 ok(!ret, "Got unexpected ret %d, error %d.\n", ret, WSAGetLastError()); 10509 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size); 10510 10511 bytes_returned = FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[address_list->iAddressCount]); 10512 for (i = 0; i < address_list->iAddressCount; ++i) 10513 { 10514 bytes_returned += address_list->Address[i].iSockaddrLength; 10515 } 10516 ok(size == bytes_returned, "Got unexpected size %u, expected %u.\n", size, bytes_returned); 10517 10518 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size, NULL, NULL, NULL); 10519 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret); 10520 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError()); 10521 10522 bytes_returned = 0xdeadbeef; 10523 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, size, &bytes_returned, NULL, NULL); 10524 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret); 10525 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError()); 10526 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size); 10527 10528 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, 1, &bytes_returned, NULL, NULL); 10529 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret); 10530 ok(WSAGetLastError() == WSAEINVAL, "Got unexpected error %d.\n", WSAGetLastError()); 10531 ok(bytes_returned == 0, "Got unexpected bytes_returned %u.\n", bytes_returned); 10532 10533 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, 10534 FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]), &bytes_returned, NULL, NULL); 10535 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret); 10536 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError()); 10537 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size); 10538 10539 HeapFree(GetProcessHeap(), 0, address_list); 10540 closesocket(s); 10541 } 10542 10543 static DWORD WINAPI inet_ntoa_thread_proc(void *param) 10544 { 10545 ULONG addr; 10546 const char *str; 10547 HANDLE *event = param; 10548 10549 addr = inet_addr("4.3.2.1"); 10550 ok(addr == htonl(0x04030201), "expected 0x04030201, got %08x\n", addr); 10551 str = inet_ntoa(*(struct in_addr *)&addr); 10552 ok(!strcmp(str, "4.3.2.1"), "expected 4.3.2.1, got %s\n", str); 10553 10554 SetEvent(event[0]); 10555 WaitForSingleObject(event[1], 3000); 10556 10557 return 0; 10558 } 10559 10560 static void test_inet_ntoa(void) 10561 { 10562 ULONG addr; 10563 const char *str; 10564 HANDLE thread, event[2]; 10565 DWORD tid; 10566 10567 addr = inet_addr("1.2.3.4"); 10568 ok(addr == htonl(0x01020304), "expected 0x01020304, got %08x\n", addr); 10569 str = inet_ntoa(*(struct in_addr *)&addr); 10570 ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str); 10571 10572 event[0] = CreateEventW(NULL, TRUE, FALSE, NULL); 10573 event[1] = CreateEventW(NULL, TRUE, FALSE, NULL); 10574 10575 thread = CreateThread(NULL, 0, inet_ntoa_thread_proc, event, 0, &tid); 10576 WaitForSingleObject(event[0], 3000); 10577 10578 ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str); 10579 10580 SetEvent(event[1]); 10581 WaitForSingleObject(thread, 3000); 10582 10583 CloseHandle(event[0]); 10584 CloseHandle(event[1]); 10585 CloseHandle(thread); 10586 } 10587 10588 static void test_WSALookupService(void) 10589 { 10590 char buffer[4096], strbuff[128]; 10591 WSAQUERYSETW *qs = NULL; 10592 HANDLE hnd; 10593 PNLA_BLOB netdata; 10594 int ret; 10595 DWORD error, offset, bsize; 10596 10597 if (!pWSALookupServiceBeginW || !pWSALookupServiceEnd || !pWSALookupServiceNextW) 10598 { 10599 win_skip("WSALookupServiceBeginW or WSALookupServiceEnd or WSALookupServiceNextW not found\n"); 10600 return; 10601 } 10602 10603 qs = (WSAQUERYSETW *)buffer; 10604 memset(qs, 0, sizeof(*qs)); 10605 10606 /* invalid parameter tests */ 10607 ret = pWSALookupServiceBeginW(NULL, 0, &hnd); 10608 error = WSAGetLastError(); 10609 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n"); 10610 todo_wine 10611 ok(error == WSAEFAULT, "expected 10014, got %d\n", error); 10612 10613 ret = pWSALookupServiceBeginW(qs, 0, NULL); 10614 error = WSAGetLastError(); 10615 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n"); 10616 todo_wine 10617 ok(error == WSAEFAULT, "expected 10014, got %d\n", error); 10618 10619 ret = pWSALookupServiceBeginW(qs, 0, &hnd); 10620 error = WSAGetLastError(); 10621 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n"); 10622 todo_wine 10623 ok(error == WSAEINVAL 10624 || broken(error == ERROR_INVALID_PARAMETER) /* == XP */ 10625 || broken(error == WSAEFAULT) /* == NT */ 10626 || broken(error == WSASERVICE_NOT_FOUND) /* == 2000 */, 10627 "expected 10022, got %d\n", error); 10628 10629 ret = pWSALookupServiceEnd(NULL); 10630 error = WSAGetLastError(); 10631 todo_wine 10632 ok(ret == SOCKET_ERROR, "WSALookupServiceEnd should have failed\n"); 10633 todo_wine 10634 ok(error == ERROR_INVALID_HANDLE, "expected 6, got %d\n", error); 10635 10636 /* standard network list query */ 10637 qs->dwSize = sizeof(*qs); 10638 hnd = (HANDLE)0xdeadbeef; 10639 ret = pWSALookupServiceBeginW(qs, LUP_RETURN_ALL | LUP_DEEP, &hnd); 10640 error = WSAGetLastError(); 10641 if(ret && error == ERROR_INVALID_PARAMETER) 10642 { 10643 win_skip("the current WSALookupServiceBeginW test is not supported in win <= 2000\n"); 10644 return; 10645 } 10646 10647 todo_wine 10648 ok(!ret, "WSALookupServiceBeginW failed unexpectedly with error %d\n", error); 10649 todo_wine 10650 ok(hnd != (HANDLE)0xdeadbeef, "Handle was not filled\n"); 10651 10652 offset = 0; 10653 do 10654 { 10655 memset(qs, 0, sizeof(*qs)); 10656 bsize = sizeof(buffer); 10657 10658 if (pWSALookupServiceNextW(hnd, 0, &bsize, qs) == SOCKET_ERROR) 10659 { 10660 error = WSAGetLastError(); 10661 if (error == WSA_E_NO_MORE) break; 10662 ok(0, "Error %d happened while listing services\n", error); 10663 break; 10664 } 10665 10666 WideCharToMultiByte(CP_ACP, 0, qs->lpszServiceInstanceName, -1, 10667 strbuff, sizeof(strbuff), NULL, NULL); 10668 trace("Network Name: %s\n", strbuff); 10669 10670 /* network data is written in the blob field */ 10671 if (qs->lpBlob) 10672 { 10673 /* each network may have multiple NLA_BLOB information structures */ 10674 do 10675 { 10676 netdata = (PNLA_BLOB) &qs->lpBlob->pBlobData[offset]; 10677 switch (netdata->header.type) 10678 { 10679 case NLA_RAW_DATA: 10680 trace("\tNLA Data Type: NLA_RAW_DATA\n"); 10681 break; 10682 case NLA_INTERFACE: 10683 trace("\tNLA Data Type: NLA_INTERFACE\n"); 10684 trace("\t\tType: %d\n", netdata->data.interfaceData.dwType); 10685 trace("\t\tSpeed: %d\n", netdata->data.interfaceData.dwSpeed); 10686 trace("\t\tAdapter Name: %s\n", netdata->data.interfaceData.adapterName); 10687 break; 10688 case NLA_802_1X_LOCATION: 10689 trace("\tNLA Data Type: NLA_802_1X_LOCATION\n"); 10690 trace("\t\tInformation: %s\n", netdata->data.locationData.information); 10691 break; 10692 case NLA_CONNECTIVITY: 10693 switch (netdata->data.connectivity.type) 10694 { 10695 case NLA_NETWORK_AD_HOC: 10696 trace("\t\tNetwork Type: AD HOC\n"); 10697 break; 10698 case NLA_NETWORK_MANAGED: 10699 trace("\t\tNetwork Type: Managed\n"); 10700 break; 10701 case NLA_NETWORK_UNMANAGED: 10702 trace("\t\tNetwork Type: Unmanaged\n"); 10703 break; 10704 case NLA_NETWORK_UNKNOWN: 10705 trace("\t\tNetwork Type: Unknown\n"); 10706 } 10707 switch (netdata->data.connectivity.internet) 10708 { 10709 case NLA_INTERNET_NO: 10710 trace("\t\tInternet connectivity: No\n"); 10711 break; 10712 case NLA_INTERNET_YES: 10713 trace("\t\tInternet connectivity: Yes\n"); 10714 break; 10715 case NLA_INTERNET_UNKNOWN: 10716 trace("\t\tInternet connectivity: Unknown\n"); 10717 break; 10718 } 10719 break; 10720 case NLA_ICS: 10721 trace("\tNLA Data Type: NLA_ICS\n"); 10722 trace("\t\tSpeed: %d\n", 10723 netdata->data.ICS.remote.speed); 10724 trace("\t\tType: %d\n", 10725 netdata->data.ICS.remote.type); 10726 trace("\t\tState: %d\n", 10727 netdata->data.ICS.remote.state); 10728 WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.machineName, -1, 10729 strbuff, sizeof(strbuff), NULL, NULL); 10730 trace("\t\tMachine Name: %s\n", strbuff); 10731 WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.sharedAdapterName, -1, 10732 strbuff, sizeof(strbuff), NULL, NULL); 10733 trace("\t\tShared Adapter Name: %s\n", strbuff); 10734 break; 10735 default: 10736 trace("\tNLA Data Type: Unknown\n"); 10737 break; 10738 } 10739 } 10740 while (offset); 10741 } 10742 } 10743 while (1); 10744 10745 ret = pWSALookupServiceEnd(hnd); 10746 ok(!ret, "WSALookupServiceEnd failed unexpectedly\n"); 10747 } 10748 10749 static void test_WSAEnumNameSpaceProvidersA(void) 10750 { 10751 LPWSANAMESPACE_INFOA name = NULL; 10752 DWORD ret, error, blen = 0, i; 10753 if (!pWSAEnumNameSpaceProvidersA) 10754 { 10755 win_skip("WSAEnumNameSpaceProvidersA not found\n"); 10756 return; 10757 } 10758 10759 SetLastError(0xdeadbeef); 10760 ret = pWSAEnumNameSpaceProvidersA(&blen, name); 10761 error = WSAGetLastError(); 10762 todo_wine 10763 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10764 todo_wine 10765 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10766 10767 /* Invalid parameter tests */ 10768 SetLastError(0xdeadbeef); 10769 ret = pWSAEnumNameSpaceProvidersA(NULL, name); 10770 error = WSAGetLastError(); 10771 todo_wine 10772 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10773 todo_wine 10774 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10775 10776 SetLastError(0xdeadbeef); 10777 ret = pWSAEnumNameSpaceProvidersA(NULL, NULL); 10778 error = WSAGetLastError(); 10779 todo_wine 10780 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10781 todo_wine 10782 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10783 10784 SetLastError(0xdeadbeef); 10785 ret = pWSAEnumNameSpaceProvidersA(&blen, NULL); 10786 error = WSAGetLastError(); 10787 todo_wine 10788 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10789 todo_wine 10790 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10791 10792 #ifdef __REACTOS__ /* ROSTESTS-233 */ 10793 if (!blen) 10794 { 10795 skip("Failed to get length needed for name space providers.\n"); 10796 return; 10797 } 10798 #endif 10799 10800 name = HeapAlloc(GetProcessHeap(), 0, blen); 10801 if (!name) 10802 { 10803 skip("Failed to alloc memory\n"); 10804 return; 10805 } 10806 10807 ret = pWSAEnumNameSpaceProvidersA(&blen, name); 10808 todo_wine 10809 ok(ret > 0, "Expected more than zero name space providers\n"); 10810 10811 for (i = 0;i < ret; i++) 10812 { 10813 trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier, 10814 name[i].lpszIdentifier); 10815 switch (name[i].dwNameSpace) 10816 { 10817 case NS_DNS: 10818 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace); 10819 break; 10820 case NS_NLA: 10821 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace); 10822 break; 10823 default: 10824 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace); 10825 break; 10826 } 10827 trace("\tActive: %d\n", name[i].fActive); 10828 trace("\tVersion: %d\n", name[i].dwVersion); 10829 } 10830 10831 HeapFree(GetProcessHeap(), 0, name); 10832 } 10833 10834 static void test_WSAEnumNameSpaceProvidersW(void) 10835 { 10836 LPWSANAMESPACE_INFOW name = NULL; 10837 DWORD ret, error, blen = 0, i; 10838 if (!pWSAEnumNameSpaceProvidersW) 10839 { 10840 win_skip("WSAEnumNameSpaceProvidersW not found\n"); 10841 return; 10842 } 10843 10844 SetLastError(0xdeadbeef); 10845 ret = pWSAEnumNameSpaceProvidersW(&blen, name); 10846 error = WSAGetLastError(); 10847 todo_wine 10848 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10849 todo_wine 10850 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10851 10852 /* Invalid parameter tests */ 10853 SetLastError(0xdeadbeef); 10854 ret = pWSAEnumNameSpaceProvidersW(NULL, name); 10855 error = WSAGetLastError(); 10856 todo_wine 10857 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10858 todo_wine 10859 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10860 10861 SetLastError(0xdeadbeef); 10862 ret = pWSAEnumNameSpaceProvidersW(NULL, NULL); 10863 error = WSAGetLastError(); 10864 todo_wine 10865 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10866 todo_wine 10867 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10868 10869 SetLastError(0xdeadbeef); 10870 ret = pWSAEnumNameSpaceProvidersW(&blen, NULL); 10871 error = WSAGetLastError(); 10872 todo_wine 10873 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret); 10874 todo_wine 10875 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error); 10876 10877 #ifdef __REACTOS__ /* ROSTESTS-233 */ 10878 if (!blen) 10879 { 10880 skip("Failed to get length needed for name space providers.\n"); 10881 return; 10882 } 10883 #endif 10884 10885 name = HeapAlloc(GetProcessHeap(), 0, blen); 10886 if (!name) 10887 { 10888 skip("Failed to alloc memory\n"); 10889 return; 10890 } 10891 10892 ret = pWSAEnumNameSpaceProvidersW(&blen, name); 10893 todo_wine 10894 ok(ret > 0, "Expected more than zero name space providers\n"); 10895 10896 for (i = 0;i < ret; i++) 10897 { 10898 trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier, 10899 wine_dbgstr_w(name[i].lpszIdentifier)); 10900 switch (name[i].dwNameSpace) 10901 { 10902 case NS_DNS: 10903 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace); 10904 break; 10905 case NS_NLA: 10906 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace); 10907 break; 10908 default: 10909 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace); 10910 break; 10911 } 10912 trace("\tActive: %d\n", name[i].fActive); 10913 trace("\tVersion: %d\n", name[i].dwVersion); 10914 } 10915 10916 HeapFree(GetProcessHeap(), 0, name); 10917 } 10918 10919 static void sync_read(SOCKET src, SOCKET dst) 10920 { 10921 int ret; 10922 char data[512]; 10923 10924 ret = send(dst, "Hello World!", 12, 0); 10925 ok(ret == 12, "send returned %d\n", ret); 10926 10927 memset(data, 0, sizeof(data)); 10928 ret = recv(src, data, sizeof(data), 0); 10929 ok(ret == 12, "expected 12, got %d\n", ret); 10930 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", ret, ret, data); 10931 } 10932 10933 static void iocp_async_read(SOCKET src, SOCKET dst) 10934 { 10935 HANDLE port; 10936 WSAOVERLAPPED ovl, *ovl_iocp; 10937 WSABUF buf; 10938 int ret; 10939 char data[512]; 10940 DWORD flags, bytes; 10941 ULONG_PTR key; 10942 10943 memset(data, 0, sizeof(data)); 10944 memset(&ovl, 0, sizeof(ovl)); 10945 10946 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0); 10947 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError()); 10948 10949 buf.len = sizeof(data); 10950 buf.buf = data; 10951 bytes = 0xdeadbeef; 10952 flags = 0; 10953 SetLastError(0xdeadbeef); 10954 ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL); 10955 ok(ret == SOCKET_ERROR, "got %d\n", ret); 10956 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError()); 10957 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 10958 10959 bytes = 0xdeadbeef; 10960 key = 0xdeadbeef; 10961 ovl_iocp = (void *)0xdeadbeef; 10962 SetLastError(0xdeadbeef); 10963 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 10964 ok(!ret, "got %d\n", ret); 10965 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError()); 10966 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 10967 ok(key == 0xdeadbeef, "got key %#lx\n", key); 10968 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 10969 10970 ret = send(dst, "Hello World!", 12, 0); 10971 ok(ret == 12, "send returned %d\n", ret); 10972 10973 bytes = 0xdeadbeef; 10974 key = 0xdeadbeef; 10975 ovl_iocp = NULL; 10976 SetLastError(0xdeadbeef); 10977 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 10978 ok(ret, "got %d\n", ret); 10979 ok(bytes == 12, "got bytes %u\n", bytes); 10980 ok(key == 0x12345678, "got key %#lx\n", key); 10981 ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp); 10982 if (ovl_iocp) 10983 { 10984 ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh); 10985 ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal); 10986 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data); 10987 } 10988 10989 bytes = 0xdeadbeef; 10990 key = 0xdeadbeef; 10991 ovl_iocp = (void *)0xdeadbeef; 10992 SetLastError(0xdeadbeef); 10993 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 10994 ok(!ret, "got %d\n", ret); 10995 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError()); 10996 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 10997 ok(key == 0xdeadbeef, "got key %#lx\n", key); 10998 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 10999 11000 CloseHandle(port); 11001 } 11002 11003 static void iocp_async_read_closesocket(SOCKET src, int how_to_close) 11004 { 11005 HANDLE port; 11006 WSAOVERLAPPED ovl, *ovl_iocp; 11007 WSABUF buf; 11008 int ret; 11009 char data[512]; 11010 DWORD flags, bytes; 11011 ULONG_PTR key; 11012 HWND hwnd; 11013 MSG msg; 11014 11015 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 11016 0, 0, 0, 0, NULL, NULL, 0, NULL); 11017 ok(hwnd != 0, "CreateWindowEx failed\n"); 11018 11019 ret = WSAAsyncSelect(src, hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE); 11020 ok(!ret, "got %d\n", ret); 11021 11022 Sleep(100); 11023 memset(&msg, 0, sizeof(msg)); 11024 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11025 ok(ret, "got %d\n", ret); 11026 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd); 11027 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message); 11028 ok(msg.wParam == src, "got %08lx\n", msg.wParam); 11029 ok(msg.lParam == 2, "got %08lx\n", msg.lParam); 11030 11031 memset(data, 0, sizeof(data)); 11032 memset(&ovl, 0, sizeof(ovl)); 11033 11034 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0); 11035 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError()); 11036 11037 Sleep(100); 11038 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11039 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11040 11041 buf.len = sizeof(data); 11042 buf.buf = data; 11043 bytes = 0xdeadbeef; 11044 flags = 0; 11045 SetLastError(0xdeadbeef); 11046 ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL); 11047 ok(ret == SOCKET_ERROR, "got %d\n", ret); 11048 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError()); 11049 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11050 11051 Sleep(100); 11052 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11053 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11054 11055 bytes = 0xdeadbeef; 11056 key = 0xdeadbeef; 11057 ovl_iocp = (void *)0xdeadbeef; 11058 SetLastError(0xdeadbeef); 11059 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11060 ok(!ret, "got %d\n", ret); 11061 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError()); 11062 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11063 ok(key == 0xdeadbeef, "got key %#lx\n", key); 11064 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11065 11066 Sleep(100); 11067 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11068 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11069 11070 switch (how_to_close) 11071 { 11072 case 0: 11073 closesocket(src); 11074 break; 11075 case 1: 11076 CloseHandle((HANDLE)src); 11077 break; 11078 case 2: 11079 pNtClose((HANDLE)src); 11080 break; 11081 default: 11082 ok(0, "wrong value %d\n", how_to_close); 11083 break; 11084 } 11085 11086 Sleep(200); 11087 memset(&msg, 0, sizeof(msg)); 11088 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11089 switch (how_to_close) 11090 { 11091 case 0: 11092 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11093 break; 11094 case 1: 11095 case 2: 11096 todo_wine 11097 { 11098 ok(ret, "got %d\n", ret); 11099 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd); 11100 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message); 11101 ok(msg.wParam == src, "got %08lx\n", msg.wParam); 11102 ok(msg.lParam == 0x20, "got %08lx\n", msg.lParam); 11103 } 11104 break; 11105 default: 11106 ok(0, "wrong value %d\n", how_to_close); 11107 break; 11108 } 11109 11110 bytes = 0xdeadbeef; 11111 key = 0xdeadbeef; 11112 ovl_iocp = NULL; 11113 SetLastError(0xdeadbeef); 11114 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11115 ok(!ret, "got %d\n", ret); 11116 todo_wine 11117 ok(GetLastError() == ERROR_CONNECTION_ABORTED || GetLastError() == ERROR_NETNAME_DELETED /* XP */, "got %u\n", GetLastError()); 11118 ok(!bytes, "got bytes %u\n", bytes); 11119 ok(key == 0x12345678, "got key %#lx\n", key); 11120 ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp); 11121 if (ovl_iocp) 11122 { 11123 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh); 11124 todo_wine 11125 ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal); 11126 } 11127 11128 bytes = 0xdeadbeef; 11129 key = 0xdeadbeef; 11130 ovl_iocp = (void *)0xdeadbeef; 11131 SetLastError(0xdeadbeef); 11132 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11133 ok(!ret, "got %d\n", ret); 11134 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError()); 11135 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11136 ok(key == 0xdeadbeef, "got key %#lx\n", key); 11137 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11138 11139 CloseHandle(port); 11140 11141 DestroyWindow(hwnd); 11142 } 11143 11144 static void iocp_async_closesocket(SOCKET src) 11145 { 11146 HANDLE port; 11147 WSAOVERLAPPED *ovl_iocp; 11148 int ret; 11149 DWORD bytes; 11150 ULONG_PTR key; 11151 HWND hwnd; 11152 MSG msg; 11153 11154 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 11155 0, 0, 0, 0, NULL, NULL, 0, NULL); 11156 ok(hwnd != 0, "CreateWindowEx failed\n"); 11157 11158 ret = WSAAsyncSelect(src, hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE); 11159 ok(!ret, "got %d\n", ret); 11160 11161 Sleep(100); 11162 memset(&msg, 0, sizeof(msg)); 11163 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11164 ok(ret, "got %d\n", ret); 11165 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd); 11166 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message); 11167 ok(msg.wParam == src, "got %08lx\n", msg.wParam); 11168 ok(msg.lParam == 2, "got %08lx\n", msg.lParam); 11169 11170 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0); 11171 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError()); 11172 11173 Sleep(100); 11174 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11175 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11176 11177 bytes = 0xdeadbeef; 11178 key = 0xdeadbeef; 11179 ovl_iocp = (void *)0xdeadbeef; 11180 SetLastError(0xdeadbeef); 11181 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11182 ok(!ret, "got %d\n", ret); 11183 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError()); 11184 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11185 ok(key == 0xdeadbeef, "got key %lu\n", key); 11186 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11187 11188 Sleep(100); 11189 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11190 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11191 11192 closesocket(src); 11193 11194 Sleep(100); 11195 memset(&msg, 0, sizeof(msg)); 11196 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11197 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11198 11199 bytes = 0xdeadbeef; 11200 key = 0xdeadbeef; 11201 ovl_iocp = (void *)0xdeadbeef; 11202 SetLastError(0xdeadbeef); 11203 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11204 ok(!ret, "got %d\n", ret); 11205 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError()); 11206 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11207 ok(key == 0xdeadbeef, "got key %lu\n", key); 11208 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11209 11210 CloseHandle(port); 11211 11212 DestroyWindow(hwnd); 11213 } 11214 11215 struct wsa_async_select_info 11216 { 11217 SOCKET sock; 11218 HWND hwnd; 11219 }; 11220 11221 static DWORD WINAPI wsa_async_select_thread(void *param) 11222 { 11223 struct wsa_async_select_info *info = param; 11224 int ret; 11225 11226 ret = WSAAsyncSelect(info->sock, info->hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE); 11227 ok(!ret, "got %d\n", ret); 11228 11229 return 0; 11230 } 11231 11232 struct wsa_recv_info 11233 { 11234 SOCKET sock; 11235 WSABUF wsa_buf; 11236 WSAOVERLAPPED ovl; 11237 }; 11238 11239 static DWORD WINAPI wsa_recv_thread(void *param) 11240 { 11241 struct wsa_recv_info *info = param; 11242 int ret; 11243 DWORD flags, bytes; 11244 11245 bytes = 0xdeadbeef; 11246 flags = 0; 11247 SetLastError(0xdeadbeef); 11248 ret = WSARecv(info->sock, &info->wsa_buf, 1, &bytes, &flags, &info->ovl, NULL); 11249 ok(ret == SOCKET_ERROR, "got %d\n", ret); 11250 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError()); 11251 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11252 11253 return 0; 11254 } 11255 11256 static void iocp_async_read_thread_closesocket(SOCKET src) 11257 { 11258 struct wsa_async_select_info select_info; 11259 struct wsa_recv_info recv_info; 11260 HANDLE port, thread; 11261 WSAOVERLAPPED *ovl_iocp; 11262 int ret; 11263 char data[512]; 11264 DWORD bytes, tid; 11265 ULONG_PTR key; 11266 HWND hwnd; 11267 MSG msg; 11268 11269 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 11270 0, 0, 0, 0, NULL, NULL, 0, NULL); 11271 ok(hwnd != 0, "CreateWindowEx failed\n"); 11272 11273 select_info.sock = src; 11274 select_info.hwnd = hwnd; 11275 thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid); 11276 ok(thread != 0, "CreateThread error %u\n", GetLastError()); 11277 ret = WaitForSingleObject(thread, 10000); 11278 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n"); 11279 11280 Sleep(100); 11281 memset(&msg, 0, sizeof(msg)); 11282 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11283 ok(ret, "got %d\n", ret); 11284 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd); 11285 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message); 11286 ok(msg.wParam == src, "got %08lx\n", msg.wParam); 11287 ok(msg.lParam == 2, "got %08lx\n", msg.lParam); 11288 11289 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0); 11290 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError()); 11291 11292 Sleep(100); 11293 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11294 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11295 11296 memset(data, 0, sizeof(data)); 11297 memset(&recv_info.ovl, 0, sizeof(recv_info.ovl)); 11298 recv_info.sock = src; 11299 recv_info.wsa_buf.len = sizeof(data); 11300 recv_info.wsa_buf.buf = data; 11301 thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid); 11302 ok(thread != 0, "CreateThread error %u\n", GetLastError()); 11303 ret = WaitForSingleObject(thread, 10000); 11304 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n"); 11305 11306 Sleep(100); 11307 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11308 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11309 11310 bytes = 0xdeadbeef; 11311 key = 0xdeadbeef; 11312 ovl_iocp = (void *)0xdeadbeef; 11313 SetLastError(0xdeadbeef); 11314 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11315 ok(!ret, "got %d\n", ret); 11316 ok(GetLastError() == WAIT_TIMEOUT || broken(GetLastError() == ERROR_OPERATION_ABORTED) /* XP */, 11317 "got %u\n", GetLastError()); 11318 if (GetLastError() == WAIT_TIMEOUT) 11319 { 11320 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11321 ok(key == 0xdeadbeef, "got key %lx\n", key); 11322 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11323 } 11324 else /* document XP behaviour */ 11325 { 11326 ok(!bytes, "got bytes %u\n", bytes); 11327 ok(key == 0x12345678, "got key %#lx\n", key); 11328 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp); 11329 if (ovl_iocp) 11330 { 11331 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh); 11332 ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal); 11333 } 11334 11335 closesocket(src); 11336 goto xp_is_broken; 11337 } 11338 11339 Sleep(100); 11340 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11341 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11342 11343 closesocket(src); 11344 11345 Sleep(100); 11346 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11347 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11348 11349 bytes = 0xdeadbeef; 11350 key = 0xdeadbeef; 11351 ovl_iocp = NULL; 11352 SetLastError(0xdeadbeef); 11353 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11354 ok(!ret, "got %d\n", ret); 11355 todo_wine 11356 ok(GetLastError() == ERROR_CONNECTION_ABORTED || GetLastError() == ERROR_NETNAME_DELETED /* XP */, "got %u\n", GetLastError()); 11357 ok(!bytes, "got bytes %u\n", bytes); 11358 ok(key == 0x12345678, "got key %#lx\n", key); 11359 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp); 11360 if (ovl_iocp) 11361 { 11362 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh); 11363 todo_wine 11364 ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal); 11365 } 11366 11367 xp_is_broken: 11368 bytes = 0xdeadbeef; 11369 key = 0xdeadbeef; 11370 ovl_iocp = (void *)0xdeadbeef; 11371 SetLastError(0xdeadbeef); 11372 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11373 ok(!ret, "got %d\n", ret); 11374 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError()); 11375 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11376 ok(key == 0xdeadbeef, "got key %lu\n", key); 11377 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11378 11379 CloseHandle(port); 11380 11381 DestroyWindow(hwnd); 11382 } 11383 11384 static void iocp_async_read_thread(SOCKET src, SOCKET dst) 11385 { 11386 struct wsa_async_select_info select_info; 11387 struct wsa_recv_info recv_info; 11388 HANDLE port, thread; 11389 WSAOVERLAPPED *ovl_iocp; 11390 int ret; 11391 char data[512]; 11392 DWORD bytes, tid; 11393 ULONG_PTR key; 11394 HWND hwnd; 11395 MSG msg; 11396 11397 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 11398 0, 0, 0, 0, NULL, NULL, 0, NULL); 11399 ok(hwnd != 0, "CreateWindowEx failed\n"); 11400 11401 select_info.sock = src; 11402 select_info.hwnd = hwnd; 11403 thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid); 11404 ok(thread != 0, "CreateThread error %u\n", GetLastError()); 11405 ret = WaitForSingleObject(thread, 10000); 11406 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n"); 11407 11408 Sleep(100); 11409 memset(&msg, 0, sizeof(msg)); 11410 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11411 ok(ret, "got %d\n", ret); 11412 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd); 11413 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message); 11414 ok(msg.wParam == src, "got %08lx\n", msg.wParam); 11415 ok(msg.lParam == 2, "got %08lx\n", msg.lParam); 11416 11417 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0); 11418 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError()); 11419 11420 Sleep(100); 11421 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11422 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11423 11424 memset(data, 0, sizeof(data)); 11425 memset(&recv_info.ovl, 0, sizeof(recv_info.ovl)); 11426 recv_info.sock = src; 11427 recv_info.wsa_buf.len = sizeof(data); 11428 recv_info.wsa_buf.buf = data; 11429 thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid); 11430 ok(thread != 0, "CreateThread error %u\n", GetLastError()); 11431 ret = WaitForSingleObject(thread, 10000); 11432 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n"); 11433 11434 Sleep(100); 11435 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11436 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11437 11438 bytes = 0xdeadbeef; 11439 key = 0xdeadbeef; 11440 ovl_iocp = (void *)0xdeadbeef; 11441 SetLastError(0xdeadbeef); 11442 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11443 ok(!ret, "got %d\n", ret); 11444 ok(GetLastError() == WAIT_TIMEOUT || broken(GetLastError() == ERROR_OPERATION_ABORTED) /* XP */, "got %u\n", GetLastError()); 11445 if (GetLastError() == WAIT_TIMEOUT) 11446 { 11447 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11448 ok(key == 0xdeadbeef, "got key %lu\n", key); 11449 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11450 } 11451 else /* document XP behaviour */ 11452 { 11453 ok(bytes == 0, "got bytes %u\n", bytes); 11454 ok(key == 0x12345678, "got key %#lx\n", key); 11455 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp); 11456 if (ovl_iocp) 11457 { 11458 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh); 11459 ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal); 11460 } 11461 } 11462 11463 Sleep(100); 11464 memset(&msg, 0, sizeof(msg)); 11465 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11466 ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11467 if (ret) /* document XP behaviour */ 11468 { 11469 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message); 11470 ok(msg.wParam == src, "got %08lx\n", msg.wParam); 11471 ok(msg.lParam == 1, "got %08lx\n", msg.lParam); 11472 } 11473 11474 ret = send(dst, "Hello World!", 12, 0); 11475 ok(ret == 12, "send returned %d\n", ret); 11476 11477 Sleep(100); 11478 memset(&msg, 0, sizeof(msg)); 11479 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE); 11480 ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam); 11481 if (ret) /* document XP behaviour */ 11482 { 11483 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd); 11484 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message); 11485 ok(msg.wParam == src, "got %08lx\n", msg.wParam); 11486 ok(msg.lParam == 1, "got %08lx\n", msg.lParam); 11487 } 11488 11489 bytes = 0xdeadbeef; 11490 key = 0xdeadbeef; 11491 ovl_iocp = (void *)0xdeadbeef; 11492 SetLastError(0xdeadbeef); 11493 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100); 11494 ok(ret || broken(GetLastError() == WAIT_TIMEOUT) /* XP */, "got %u\n", GetLastError()); 11495 if (ret) 11496 { 11497 ok(bytes == 12, "got bytes %u\n", bytes); 11498 ok(key == 0x12345678, "got key %#lx\n", key); 11499 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp); 11500 if (ovl_iocp) 11501 { 11502 ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh); 11503 ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal); 11504 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data); 11505 } 11506 } 11507 else /* document XP behaviour */ 11508 { 11509 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes); 11510 ok(key == 0xdeadbeef, "got key %lu\n", key); 11511 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp); 11512 } 11513 11514 CloseHandle(port); 11515 11516 DestroyWindow(hwnd); 11517 } 11518 11519 static void test_iocp(void) 11520 { 11521 SOCKET src, dst; 11522 int i, ret; 11523 11524 ret = tcp_socketpair_ovl(&src, &dst); 11525 ok(!ret, "creating socket pair failed\n"); 11526 sync_read(src, dst); 11527 iocp_async_read(src, dst); 11528 closesocket(src); 11529 closesocket(dst); 11530 11531 ret = tcp_socketpair_ovl(&src, &dst); 11532 ok(!ret, "creating socket pair failed\n"); 11533 iocp_async_read_thread(src, dst); 11534 closesocket(src); 11535 closesocket(dst); 11536 11537 for (i = 0; i <= 2; i++) 11538 { 11539 ret = tcp_socketpair_ovl(&src, &dst); 11540 ok(!ret, "creating socket pair failed\n"); 11541 iocp_async_read_closesocket(src, i); 11542 closesocket(dst); 11543 } 11544 11545 ret = tcp_socketpair_ovl(&src, &dst); 11546 ok(!ret, "creating socket pair failed\n"); 11547 iocp_async_closesocket(src); 11548 closesocket(dst); 11549 11550 ret = tcp_socketpair_ovl(&src, &dst); 11551 ok(!ret, "creating socket pair failed\n"); 11552 iocp_async_read_thread_closesocket(src); 11553 closesocket(dst); 11554 } 11555 11556 START_TEST( sock ) 11557 { 11558 int i; 11559 11560 /* Leave these tests at the beginning. They depend on WSAStartup not having been 11561 * called, which is done by Init() below. */ 11562 test_WithoutWSAStartup(); 11563 test_WithWSAStartup(); 11564 11565 Init(); 11566 11567 test_inet_ntoa(); 11568 test_inet_pton(); 11569 test_set_getsockopt(); 11570 test_so_reuseaddr(); 11571 test_ip_pktinfo(); 11572 test_extendedSocketOptions(); 11573 11574 for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) 11575 { 11576 trace ( " **** STARTING TEST %d ****\n", i ); 11577 do_test ( &tests[i] ); 11578 trace ( " **** TEST %d COMPLETE ****\n", i ); 11579 } 11580 11581 test_UDP(); 11582 11583 test_getservbyname(); 11584 test_WSASocket(); 11585 test_WSADuplicateSocket(); 11586 test_WSAEnumNetworkEvents(); 11587 11588 test_WSAAddressToStringA(); 11589 test_WSAAddressToStringW(); 11590 11591 test_WSAStringToAddressA(); 11592 test_WSAStringToAddressW(); 11593 11594 test_errors(); 11595 test_listen(); 11596 test_select(); 11597 test_accept(); 11598 test_getpeername(); 11599 test_getsockname(); 11600 test_inet_addr(); 11601 test_addr_to_print(); 11602 test_ioctlsocket(); 11603 test_dns(); 11604 test_gethostbyname(); 11605 test_gethostbyname_hack(); 11606 test_gethostname(); 11607 11608 test_WSASendMsg(); 11609 test_WSASendTo(); 11610 test_WSARecv(); 11611 test_WSAPoll(); 11612 test_write_watch(); 11613 test_iocp(); 11614 11615 test_events(0); 11616 test_events(1); 11617 11618 test_ipv6only(); 11619 test_TransmitFile(); 11620 test_GetAddrInfoW(); 11621 test_GetAddrInfoExW(); 11622 test_getaddrinfo(); 11623 test_AcceptEx(); 11624 test_ConnectEx(); 11625 test_DisconnectEx(); 11626 11627 test_sioRoutingInterfaceQuery(); 11628 test_sioAddressListChange(); 11629 11630 test_WSALookupService(); 11631 test_WSAEnumNameSpaceProvidersA(); 11632 test_WSAEnumNameSpaceProvidersW(); 11633 11634 test_WSAAsyncGetServByPort(); 11635 test_WSAAsyncGetServByName(); 11636 11637 test_completion_port(); 11638 test_address_list_query(); 11639 11640 /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */ 11641 test_send(); 11642 test_synchronous_WSAIoctl(); 11643 11644 Exit(); 11645 } 11646