From cf9b6116860f2dcb1ee41b49babdd29deb4854d9 Mon Sep 17 00:00:00 2001 From: Scott Lindeneau Date: Mon, 1 Sep 2008 05:55:04 +0900 Subject: [PATCH] Implements AcceptEx and GetAcceptExSockaddrs To: wine-patches AcceptEx is implemented using the new wineserver call implemented in patch 4. register_socket_listener. The callback function for this call is ws2_async_accept which posts the correct information into the buffer and returns. This version of acceptex does not implement dest_len(data_len). GetAcceptExSockaddrs is implemented according to the specification on msdn. --- dlls/mswsock/mswsock.spec | 4 +- dlls/ws2_32/socket.c | 519 ++++++++++++++++++++++++++++++++------------- dlls/ws2_32/ws2_32.spec | 4 +- 3 files changed, 379 insertions(+), 148 deletions(-) diff --git a/dlls/mswsock/mswsock.spec b/dlls/mswsock/mswsock.spec index 521b3a4..d49f8b2 100644 --- a/dlls/mswsock/mswsock.spec +++ b/dlls/mswsock/mswsock.spec @@ -1,7 +1,7 @@ -@ stdcall AcceptEx(long long ptr long long long ptr ptr) +@ stdcall AcceptEx(long long ptr long long long ptr ptr) ws2_32.AcceptEx @ stdcall EnumProtocolsA(ptr ptr ptr) ws2_32.WSAEnumProtocolsA @ stdcall EnumProtocolsW(ptr ptr ptr) ws2_32.WSAEnumProtocolsW -@ stdcall GetAcceptExSockaddrs(ptr long long long ptr ptr ptr ptr) +@ stdcall GetAcceptExSockaddrs(ptr long long long ptr ptr ptr ptr) ws2_32.GetAcceptExSockaddrs @ stub GetAddressByNameA @ stub GetAddressByNameW @ stub GetNameByTypeA diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 451de49..b0725e0 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -194,6 +194,15 @@ typedef struct ws2_async { int val; /* for send operations */ int *ptr; /* for recv operations */ + struct /* for accept operation */ + { + SOCKET s_accept; /* socket to use as connection socket */ + PVOID buf; /* buffer to write data to */ + int data_len; + int local_len; + int remote_len; + DWORD *recvd; + } acpt; } addrlen; DWORD flags; } ws2_async; @@ -236,6 +245,8 @@ static FARPROC blocking_hook = (FARPROC)WSA_DefaultBlockingHook; static struct WS_hostent *WS_dup_he(const struct hostent* p_he); static struct WS_protoent *WS_dup_pe(const struct protoent* p_pe); static struct WS_servent *WS_dup_se(const struct servent* p_se); +static void WS_AddCompletion( SOCKET sock, ULONG_PTR CompletionValue, NTSTATUS CompletionStatus, ULONG_PTR Information ); + int WSAIOCTL_GetInterfaceCount(void); int WSAIOCTL_GetInterfaceName(int intNumber, char *intName); @@ -345,7 +356,7 @@ static const int ws_eai_map[][2] = MAP_OPTION( EAI_FAIL ), MAP_OPTION( EAI_FAMILY ), MAP_OPTION( EAI_MEMORY ), -/* Note: EAI_NODATA is deprecated, but still +/* Note: EAI_NODATA is deprecated, but still * used by Windows and Linux... We map the newer * EAI_NONAME to EAI_NODATA for now until Windows * changes too. @@ -514,7 +525,7 @@ static void free_per_thread_data(void) } /*********************************************************************** - * DllMain (WS2_32.init) + * DllMain (WS2_32.init) */ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad) { @@ -565,7 +576,7 @@ static int convert_sockopt(INT *level, INT *optname) } } FIXME("Unknown IPPROTO_TCP optname 0x%x\n", *optname); - break; + break; case WS_IPPROTO_IP: *level = IPPROTO_IP; for(i=0; iflags ); HeapFree( GetProcessHeap(), 0, wsa ); } +/*********************************************************************** + * WS2_acceptex_data (INTERNAL) + * + * This function is used to place the ipaddresses in the buffer. + */ +static void WS2_acceptex_data( char* buf, int local_len, int remote_len, int data_len, SOCKET s ) +{ + int len; + buf = buf+data_len; + len = local_len - sizeof(int); + WS_getpeername(s,(struct WS_sockaddr*)(buf+sizeof(int)),&len); + *(int*)buf = len; + buf += local_len; + len = remote_len - sizeof(int); + WS_getsockname(s,(struct WS_sockaddr*)(buf+sizeof(int)),&len); + *(int*)buf = len; +} +/*********************************************************************** + * WS2_async_accept (INTERNAL) + * + * This is the function called to satisfy the AcceptEx callback + */ +static NTSTATUS WINAPI WS2_async_accept( void *arg, IO_STATUS_BLOCK *iosb, NTSTATUS status ) +{ + ws2_async *wsa = arg; + char *buf; + if(status != STATUS_ALERTED){ + if(status != STATUS_HANDLES_CLOSED) + { + FIXME("Unexpected/Unhandeled status Message= %x \n",status); + wsa->user_overlapped->Internal = status; + wsa->user_overlapped->InternalHigh = 0; + iosb->u.Status = status; + iosb->Information = 0; + return status; + } + } + TRACE("status Message= %x listen: %lx, accept: %lx\n",status, HANDLE2SOCKET(wsa->hSocket),wsa->addrlen.acpt.s_accept); + if(status == STATUS_HANDLES_CLOSED){ + wsa->user_overlapped->Internal = status; + wsa->user_overlapped->InternalHigh = 0; + iosb->u.Status = status; + iosb->Information = 0; + return status; + } + status = STATUS_SUCCESS; /* We are here, we have success */ + /*We now have a connected socket. pull data in/write info to buffer*/ + buf = (char*)wsa->addrlen.acpt.buf; + WS2_acceptex_data( buf, wsa->addrlen.acpt.local_len, wsa->addrlen.acpt.remote_len,wsa->addrlen.acpt.data_len, wsa->addrlen.acpt.s_accept ); + /*socket address information is written. next pull in data.*/ + /*we don't pull in data yet... */ + wsa->addrlen.acpt.recvd = 0; + wsa->user_overlapped->Internal = status; + wsa->user_overlapped->InternalHigh = 0; + iosb->u.Status = status; + iosb->Information = 0; + + HeapFree( GetProcessHeap(), 0, wsa ); + return status; + +} + +/*********************************************************************** + * AcceptEx (ws2_32.@) + * + * Accept a new connection, retrieving the connected addresses and initial data. + * + * listener [I] Listening socket + * acceptor [I] Socket to accept on + * dest [O] Destination for inital data + * dest_len [I] Size of dest in bytes + * local_addr_len [I] Number of bytes reserved in dest for local addrress + * rem_addr_len [I] Number of bytes reserved in dest for remote addrress + * received [O] Destination for number of bytes of initial data + * overlapped [I] For asynchronous execution + * + * RETURNS + * Success: TRUE (We always return false because its simple) + * Failure: FALSE. Use WSAGetLastError() for details of the error. + */ +BOOL WINAPI AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DWORD dest_len, + DWORD local_addr_len, DWORD rem_addr_len, LPDWORD received, + LPOVERLAPPED overlapped) +{ + DWORD status; + struct ws2_async *wsa; + IO_STATUS_BLOCK *iosb; + char *buf = (char*) dest; + TRACE("listen: %lx, accept: %lx\n",listener,acceptor); + if(overlapped == NULL){ + set_error(STATUS_INVALID_PARAMETER); + return FALSE; + } + if(dest_len !=0){ + FIXME("AcceptEx does not support reciving data yet\n"); + dest_len = 0; + } + + SERVER_START_REQ( accept_socket ) + { + req->lhandle = SOCKET2HANDLE(listener); + req->ahandle = SOCKET2HANDLE(acceptor); + req->access = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE; + req->attributes = OBJ_INHERIT; + status = wine_server_call( req ); + } + SERVER_END_REQ; + + if (STATUS_SUCCESS == status) + { + buf = buf+dest_len; + WS2_acceptex_data( buf, local_addr_len, rem_addr_len, dest_len, acceptor ); + *received = 0; + overlapped->Internal = status; + overlapped->InternalHigh = 0; + WS_AddCompletion( listener , (ULONG_PTR)overlapped, STATUS_SUCCESS, 0); + set_error(STATUS_PENDING); + return FALSE; + } + + wsa = HeapAlloc( GetProcessHeap(), 0, sizeof(*wsa) ); + iosb = HeapAlloc( GetProcessHeap(), 0, sizeof(*iosb) ); + if(!wsa || !iosb){ + set_error(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + + /*Setup the internal data structures!*/ + overlapped->Internal = STATUS_PENDING; + overlapped->InternalHigh = 0; + /*Do we need the following? Maybe...*/ + iosb = &wsa->local_iosb; + iosb->u.Status = STATUS_PENDING; + iosb->Information = 0; + + + wsa->hSocket = SOCKET2HANDLE(listener); + wsa->flags = 0; + wsa->user_overlapped = overlapped; + wsa->addrlen.acpt.s_accept = acceptor; + wsa->addrlen.acpt.buf = dest; + wsa->addrlen.acpt.data_len = dest_len; + wsa->addrlen.acpt.local_len = local_addr_len; + wsa->addrlen.acpt.remote_len = rem_addr_len; + wsa->addrlen.acpt.recvd = received; + + SERVER_START_REQ( register_socket_listener ) + { + req->lhandle = SOCKET2HANDLE(listener); + req->ahandle = SOCKET2HANDLE(acceptor); + req->async.callback = WS2_async_accept; + req->async.iosb = iosb; + req->async.arg = wsa; + req->async.apc = NULL; + req->async.event = overlapped->hEvent; + req->async.cvalue = (ULONG_PTR)overlapped; + status = wine_server_call( req ); + } + SERVER_END_REQ; + + if(status != STATUS_PENDING){ + HeapFree( GetProcessHeap(), 0, wsa ); + HeapFree( GetProcessHeap(), 0, iosb ); + set_error(status); + return FALSE; + } + set_error(STATUS_PENDING); + return FALSE; +} + +/*********************************************************************** + * GetAcceptExSockaddrs (WS2_32.@) + * + * Get infomation about an accepted socket. + * + * _buf [O] Destination for the first block of data from AcceptEx() + * data_size [I] length of data in bytes + * local_size [I] Bytes reserved for local addrinfo + * remote_size [I] Bytes reserved for remote addrinfo + * local_addr [O] Destination for local sockaddr + * local_addr_len [I] Size of local_addr + * remote_addr [O] Destination for remote sockaddr + * remote_addr_len [I] Size of rem_addr + * + * RETURNS + * Nothing. + */ +VOID WINAPI GetAcceptExSockaddrs( PVOID _buf, DWORD data_size, DWORD local_size, DWORD remote_size, + struct sockaddr ** local_addr, LPINT local_addr_len, struct sockaddr ** remote_addr, LPINT remote_addr_len) +{ + int len; + char *buf = _buf; + + TRACE("buf=%p, data_size=%d, local_size=%d, remote_size=%d, local_addr=%p (%p), remote_addr=%p (%p)\n", buf, data_size, local_size, remote_size, + local_addr, local_addr_len, remote_addr, remote_addr_len ); + + buf += data_size; + if (local_size) + { + len = *(int*)buf; + *local_addr_len = len; + *local_addr = (struct sockaddr*)(buf+sizeof(int)); + buf += local_size; + TRACE("local %d bytes to %p\n", len, local_addr); + } + else + *local_addr_len = 0; + if (remote_size) + { + len = *(int*)buf; + *remote_addr_len = len; + *remote_addr = (struct sockaddr*)(buf+sizeof(int)); + TRACE("remote %d bytes to %p\n", len, remote_addr); + } + else + *remote_addr_len = 0; +} /*********************************************************************** * WS2_recv (INTERNAL) @@ -1349,7 +1578,7 @@ static int WS2_register_async_shutdown( SOCKET s, int type ) } /*********************************************************************** - * accept (WS2_32.1) + * accept (WS2_32.1) */ SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr, int *addrlen32) @@ -1392,7 +1621,7 @@ SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr, } /*********************************************************************** - * bind (WS2_32.2) + * bind (WS2_32.2) */ int WINAPI WS_bind(SOCKET s, const struct WS_sockaddr* name, int namelen) { @@ -1473,7 +1702,7 @@ int WINAPI WS_bind(SOCKET s, const struct WS_sockaddr* name, int namelen) } /*********************************************************************** - * closesocket (WS2_32.3) + * closesocket (WS2_32.3) */ int WINAPI WS_closesocket(SOCKET s) { @@ -1483,7 +1712,7 @@ int WINAPI WS_closesocket(SOCKET s) } /*********************************************************************** - * connect (WS2_32.4) + * connect (WS2_32.4) */ int WINAPI WS_connect(SOCKET s, const struct WS_sockaddr* name, int namelen) { @@ -1575,7 +1804,7 @@ int WINAPI WSAConnect( SOCKET s, const struct WS_sockaddr* name, int namelen, /*********************************************************************** - * getpeername (WS2_32.5) + * getpeername (WS2_32.5) */ int WINAPI WS_getpeername(SOCKET s, struct WS_sockaddr *name, int *namelen) { @@ -1618,7 +1847,7 @@ int WINAPI WS_getpeername(SOCKET s, struct WS_sockaddr *name, int *namelen) } /*********************************************************************** - * getsockname (WS2_32.6) + * getsockname (WS2_32.6) */ int WINAPI WS_getsockname(SOCKET s, struct WS_sockaddr *name, int *namelen) { @@ -1665,7 +1894,7 @@ int WINAPI WS_getsockname(SOCKET s, struct WS_sockaddr *name, int *namelen) } /*********************************************************************** - * getsockopt (WS2_32.7) + * getsockopt (WS2_32.7) */ INT WINAPI WS_getsockopt(SOCKET s, INT level, INT optname, char *optval, INT *optlen) @@ -1962,8 +2191,8 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level, } /*********************************************************************** - * htonl (WINSOCK.8) - * htonl (WS2_32.8) + * htonl (WINSOCK.8) + * htonl (WS2_32.8) */ WS_u_long WINAPI WS_htonl(WS_u_long hostlong) { @@ -1972,8 +2201,8 @@ WS_u_long WINAPI WS_htonl(WS_u_long hostlong) /*********************************************************************** - * htons (WINSOCK.9) - * htons (WS2_32.9) + * htons (WINSOCK.9) + * htons (WS2_32.9) */ WS_u_short WINAPI WS_htons(WS_u_short hostshort) { @@ -1981,7 +2210,7 @@ WS_u_short WINAPI WS_htons(WS_u_short hostshort) } /*********************************************************************** - * WSAHtonl (WS2_32.46) + * WSAHtonl (WS2_32.46) * From MSDN description of error codes, this function should also * check if WinSock has been initialized and the socket is a valid * socket. But why? This function only translates a host byte order @@ -1999,7 +2228,7 @@ int WINAPI WSAHtonl(SOCKET s, WS_u_long hostlong, WS_u_long *lpnetlong) } /*********************************************************************** - * WSAHtons (WS2_32.47) + * WSAHtons (WS2_32.47) * From MSDN description of error codes, this function should also * check if WinSock has been initialized and the socket is a valid * socket. But why? This function only translates a host byte order @@ -2019,8 +2248,8 @@ int WINAPI WSAHtons(SOCKET s, WS_u_short hostshort, WS_u_short *lpnetshort) /*********************************************************************** - * inet_addr (WINSOCK.10) - * inet_addr (WS2_32.11) + * inet_addr (WINSOCK.10) + * inet_addr (WS2_32.11) */ WS_u_long WINAPI WS_inet_addr(const char *cp) { @@ -2030,8 +2259,8 @@ WS_u_long WINAPI WS_inet_addr(const char *cp) /*********************************************************************** - * ntohl (WINSOCK.14) - * ntohl (WS2_32.14) + * ntohl (WINSOCK.14) + * ntohl (WS2_32.14) */ WS_u_long WINAPI WS_ntohl(WS_u_long netlong) { @@ -2040,8 +2269,8 @@ WS_u_long WINAPI WS_ntohl(WS_u_long netlong) /*********************************************************************** - * ntohs (WINSOCK.15) - * ntohs (WS2_32.15) + * ntohs (WINSOCK.15) + * ntohs (WS2_32.15) */ WS_u_short WINAPI WS_ntohs(WS_u_short netshort) { @@ -2050,7 +2279,7 @@ WS_u_short WINAPI WS_ntohs(WS_u_short netshort) /*********************************************************************** - * inet_ntoa (WS2_32.12) + * inet_ntoa (WS2_32.12) */ char* WINAPI WS_inet_ntoa(struct WS_in_addr in) { @@ -2313,8 +2542,8 @@ INT WINAPI WSAIoctl(SOCKET s, } } case WS_SIO_FLUSH: - FIXME("SIO_FLUSH: stub.\n"); - break; + FIXME("SIO_FLUSH: stub.\n"); + break; case WS_SIO_GET_EXTENSION_FUNCTION_POINTER: FIXME("SIO_GET_EXTENSION_FUNCTION_POINTER %s: stub\n", debugstr_guid(lpvInBuffer)); @@ -2332,7 +2561,7 @@ INT WINAPI WSAIoctl(SOCKET s, /*********************************************************************** - * ioctlsocket (WS2_32.10) + * ioctlsocket (WS2_32.10) */ int WINAPI WS_ioctlsocket(SOCKET s, LONG cmd, WS_u_long *argp) { @@ -2415,7 +2644,7 @@ int WINAPI WS_ioctlsocket(SOCKET s, LONG cmd, WS_u_long *argp) } /*********************************************************************** - * listen (WS2_32.13) + * listen (WS2_32.13) */ int WINAPI WS_listen(SOCKET s, int backlog) { @@ -2424,22 +2653,22 @@ int WINAPI WS_listen(SOCKET s, int backlog) TRACE("socket %04lx, backlog %d\n", s, backlog); if (fd != -1) { - if (listen(fd, backlog) == 0) - { + if (listen(fd, backlog) == 0) + { release_sock_fd( s, fd ); - _enable_event(SOCKET2HANDLE(s), FD_ACCEPT, - FD_WINE_LISTENING, - FD_CONNECT|FD_WINE_CONNECTED); - return 0; - } - SetLastError(wsaErrno()); + _enable_event(SOCKET2HANDLE(s), FD_ACCEPT, + FD_WINE_LISTENING, + FD_CONNECT|FD_WINE_CONNECTED); + return 0; + } + SetLastError(wsaErrno()); release_sock_fd( s, fd ); } return SOCKET_ERROR; } /*********************************************************************** - * recv (WS2_32.16) + * recv (WS2_32.16) */ int WINAPI WS_recv(SOCKET s, char *buf, int len, int flags) { @@ -2456,7 +2685,7 @@ int WINAPI WS_recv(SOCKET s, char *buf, int len, int flags) } /*********************************************************************** - * recvfrom (WS2_32.17) + * recvfrom (WS2_32.17) */ int WINAPI WS_recvfrom(SOCKET s, char *buf, INT len, int flags, struct WS_sockaddr *from, int *fromlen) @@ -2571,7 +2800,7 @@ static int get_poll_results( WS_fd_set *readfds, WS_fd_set *writefds, WS_fd_set /*********************************************************************** - * select (WS2_32.18) + * select (WS2_32.18) */ int WINAPI WS_select(int nfds, WS_fd_set *ws_readfds, WS_fd_set *ws_writefds, WS_fd_set *ws_exceptfds, @@ -2618,7 +2847,7 @@ static void WS_AddCompletion( SOCKET sock, ULONG_PTR CompletionValue, NTSTATUS C /*********************************************************************** - * send (WS2_32.19) + * send (WS2_32.19) */ int WINAPI WS_send(SOCKET s, const char *buf, int len, int flags) { @@ -2635,7 +2864,7 @@ int WINAPI WS_send(SOCKET s, const char *buf, int len, int flags) } /*********************************************************************** - * WSASend (WS2_32.72) + * WSASend (WS2_32.72) */ INT WINAPI WSASend( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, @@ -2656,7 +2885,7 @@ INT WINAPI WSASendDisconnect( SOCKET s, LPWSABUF lpBuffers ) /*********************************************************************** - * WSASendTo (WS2_32.74) + * WSASendTo (WS2_32.74) */ INT WINAPI WSASendTo( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, @@ -2842,7 +3071,7 @@ error: } /*********************************************************************** - * sendto (WS2_32.20) + * sendto (WS2_32.20) */ int WINAPI WS_sendto(SOCKET s, const char *buf, int len, int flags, const struct WS_sockaddr *to, int tolen) @@ -2860,7 +3089,7 @@ int WINAPI WS_sendto(SOCKET s, const char *buf, int len, int flags, } /*********************************************************************** - * setsockopt (WS2_32.21) + * setsockopt (WS2_32.21) */ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen) @@ -3103,7 +3332,7 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, } /*********************************************************************** - * shutdown (WS2_32.22) + * shutdown (WS2_32.22) */ int WINAPI WS_shutdown(SOCKET s, int how) { @@ -3170,7 +3399,7 @@ error: } /*********************************************************************** - * socket (WS2_32.23) + * socket (WS2_32.23) */ SOCKET WINAPI WS_socket(int af, int type, int protocol) { @@ -3182,7 +3411,7 @@ SOCKET WINAPI WS_socket(int af, int type, int protocol) /*********************************************************************** - * gethostbyaddr (WS2_32.51) + * gethostbyaddr (WS2_32.51) */ struct WS_hostent* WINAPI WS_gethostbyaddr(const char *addr, int len, int type) { @@ -3220,7 +3449,7 @@ struct WS_hostent* WINAPI WS_gethostbyaddr(const char *addr, int len, int type) } /*********************************************************************** - * gethostbyname (WS2_32.52) + * gethostbyname (WS2_32.52) */ struct WS_hostent* WINAPI WS_gethostbyname(const char* name) { @@ -3274,7 +3503,7 @@ struct WS_hostent* WINAPI WS_gethostbyname(const char* name) /*********************************************************************** - * getprotobyname (WS2_32.53) + * getprotobyname (WS2_32.53) */ struct WS_protoent* WINAPI WS_getprotobyname(const char* name) { @@ -3299,7 +3528,7 @@ struct WS_protoent* WINAPI WS_getprotobyname(const char* name) /*********************************************************************** - * getprotobynumber (WS2_32.54) + * getprotobynumber (WS2_32.54) */ struct WS_protoent* WINAPI WS_getprotobynumber(int number) { @@ -3324,7 +3553,7 @@ struct WS_protoent* WINAPI WS_getprotobynumber(int number) /*********************************************************************** - * getservbyname (WS2_32.55) + * getservbyname (WS2_32.55) */ struct WS_servent* WINAPI WS_getservbyname(const char *name, const char *proto) { @@ -3359,7 +3588,7 @@ struct WS_servent* WINAPI WS_getservbyname(const char *name, const char *proto) } /*********************************************************************** - * freeaddrinfo (WS2_32.@) + * freeaddrinfo (WS2_32.@) */ void WINAPI WS_freeaddrinfo(struct WS_addrinfo *res) { @@ -3424,7 +3653,7 @@ static int convert_eai_u2w(int unixret) { } /*********************************************************************** - * getaddrinfo (WS2_32.@) + * getaddrinfo (WS2_32.@) */ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addrinfo *hints, struct WS_addrinfo **res) { @@ -3534,7 +3763,7 @@ outofmem: } /*********************************************************************** - * GetAddrInfoW (WS2_32.@) + * GetAddrInfoW (WS2_32.@) */ int WINAPI GetAddrInfoW(LPCWSTR nodename, LPCWSTR servname, const ADDRINFOW *hints, PADDRINFOW *res) { @@ -3568,7 +3797,7 @@ int WINAPI WS_getnameinfo(const SOCKADDR *sa, WS_socklen_t salen, PCHAR host, } /*********************************************************************** - * getservbyport (WS2_32.56) + * getservbyport (WS2_32.56) */ struct WS_servent* WINAPI WS_getservbyport(int port, const char *proto) { @@ -3613,11 +3842,11 @@ int WINAPI WS_gethostname(char *name, int namelen) /* ------------------------------------- Windows sockets extensions -- * - * * + * * * ------------------------------------------------------------------- */ /*********************************************************************** - * WSAEnumNetworkEvents (WS2_32.36) + * WSAEnumNetworkEvents (WS2_32.36) */ int WINAPI WSAEnumNetworkEvents(SOCKET s, WSAEVENT hEvent, LPWSANETWORKEVENTS lpEvent) { @@ -3640,7 +3869,7 @@ int WINAPI WSAEnumNetworkEvents(SOCKET s, WSAEVENT hEvent, LPWSANETWORKEVENTS lp } /*********************************************************************** - * WSAEventSelect (WS2_32.39) + * WSAEventSelect (WS2_32.39) */ int WINAPI WSAEventSelect(SOCKET s, WSAEVENT hEvent, LONG lEvent) { @@ -3709,7 +3938,7 @@ BOOL WINAPI WSAGetOverlappedResult( SOCKET s, LPWSAOVERLAPPED lpOverlapped, /*********************************************************************** - * WSAAsyncSelect (WS2_32.101) + * WSAAsyncSelect (WS2_32.101) */ INT WINAPI WSAAsyncSelect(SOCKET s, HWND hWnd, UINT uMsg, LONG lEvent) { @@ -3825,7 +4054,7 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol, if ( af == AF_UNSPEC) /* did they not specify the address family? */ switch(protocol) - { + { case IPPROTO_TCP: if (type == SOCK_STREAM) { af = AF_INET; break; } case IPPROTO_UDP: @@ -3885,7 +4114,7 @@ SOCKET WINAPI WSAJoinLeaf( } /*********************************************************************** - * __WSAFDIsSet (WS2_32.151) + * __WSAFDIsSet (WS2_32.151) */ int WINAPI __WSAFDIsSet(SOCKET s, WS_fd_set *set) { @@ -3899,8 +4128,8 @@ int WINAPI __WSAFDIsSet(SOCKET s, WS_fd_set *set) } /*********************************************************************** - * WSAIsBlocking (WINSOCK.114) - * WSAIsBlocking (WS2_32.114) + * WSAIsBlocking (WINSOCK.114) + * WSAIsBlocking (WS2_32.114) */ BOOL WINAPI WSAIsBlocking(void) { @@ -3917,8 +4146,8 @@ BOOL WINAPI WSAIsBlocking(void) } /*********************************************************************** - * WSACancelBlockingCall (WINSOCK.113) - * WSACancelBlockingCall (WS2_32.113) + * WSACancelBlockingCall (WINSOCK.113) + * WSACancelBlockingCall (WS2_32.113) */ INT WINAPI WSACancelBlockingCall(void) { @@ -3969,7 +4198,7 @@ static int list_size(char** l, int item_size) int i,j = 0; if(l) { for(i=0;l[i];i++) - j += (item_size) ? item_size : strlen(l[i]) + 1; + j += (item_size) ? item_size : strlen(l[i]) + 1; j += (i + 1) * sizeof(char*); } return j; } @@ -4082,72 +4311,72 @@ static struct WS_servent *WS_dup_se(const struct servent* p_se) UINT wsaErrno(void) { - int loc_errno = errno; + int loc_errno = errno; WARN("errno %d, (%s).\n", loc_errno, strerror(loc_errno)); switch(loc_errno) { - case EINTR: return WSAEINTR; - case EBADF: return WSAEBADF; - case EPERM: - case EACCES: return WSAEACCES; - case EFAULT: return WSAEFAULT; - case EINVAL: return WSAEINVAL; - case EMFILE: return WSAEMFILE; - case EWOULDBLOCK: return WSAEWOULDBLOCK; - case EINPROGRESS: return WSAEINPROGRESS; - case EALREADY: return WSAEALREADY; - case ENOTSOCK: return WSAENOTSOCK; - case EDESTADDRREQ: return WSAEDESTADDRREQ; - case EMSGSIZE: return WSAEMSGSIZE; - case EPROTOTYPE: return WSAEPROTOTYPE; - case ENOPROTOOPT: return WSAENOPROTOOPT; - case EPROTONOSUPPORT: return WSAEPROTONOSUPPORT; - case ESOCKTNOSUPPORT: return WSAESOCKTNOSUPPORT; - case EOPNOTSUPP: return WSAEOPNOTSUPP; - case EPFNOSUPPORT: return WSAEPFNOSUPPORT; - case EAFNOSUPPORT: return WSAEAFNOSUPPORT; - case EADDRINUSE: return WSAEADDRINUSE; - case EADDRNOTAVAIL: return WSAEADDRNOTAVAIL; - case ENETDOWN: return WSAENETDOWN; - case ENETUNREACH: return WSAENETUNREACH; - case ENETRESET: return WSAENETRESET; - case ECONNABORTED: return WSAECONNABORTED; - case EPIPE: - case ECONNRESET: return WSAECONNRESET; - case ENOBUFS: return WSAENOBUFS; - case EISCONN: return WSAEISCONN; - case ENOTCONN: return WSAENOTCONN; - case ESHUTDOWN: return WSAESHUTDOWN; - case ETOOMANYREFS: return WSAETOOMANYREFS; - case ETIMEDOUT: return WSAETIMEDOUT; - case ECONNREFUSED: return WSAECONNREFUSED; - case ELOOP: return WSAELOOP; - case ENAMETOOLONG: return WSAENAMETOOLONG; - case EHOSTDOWN: return WSAEHOSTDOWN; - case EHOSTUNREACH: return WSAEHOSTUNREACH; - case ENOTEMPTY: return WSAENOTEMPTY; + case EINTR: return WSAEINTR; + case EBADF: return WSAEBADF; + case EPERM: + case EACCES: return WSAEACCES; + case EFAULT: return WSAEFAULT; + case EINVAL: return WSAEINVAL; + case EMFILE: return WSAEMFILE; + case EWOULDBLOCK: return WSAEWOULDBLOCK; + case EINPROGRESS: return WSAEINPROGRESS; + case EALREADY: return WSAEALREADY; + case ENOTSOCK: return WSAENOTSOCK; + case EDESTADDRREQ: return WSAEDESTADDRREQ; + case EMSGSIZE: return WSAEMSGSIZE; + case EPROTOTYPE: return WSAEPROTOTYPE; + case ENOPROTOOPT: return WSAENOPROTOOPT; + case EPROTONOSUPPORT: return WSAEPROTONOSUPPORT; + case ESOCKTNOSUPPORT: return WSAESOCKTNOSUPPORT; + case EOPNOTSUPP: return WSAEOPNOTSUPP; + case EPFNOSUPPORT: return WSAEPFNOSUPPORT; + case EAFNOSUPPORT: return WSAEAFNOSUPPORT; + case EADDRINUSE: return WSAEADDRINUSE; + case EADDRNOTAVAIL: return WSAEADDRNOTAVAIL; + case ENETDOWN: return WSAENETDOWN; + case ENETUNREACH: return WSAENETUNREACH; + case ENETRESET: return WSAENETRESET; + case ECONNABORTED: return WSAECONNABORTED; + case EPIPE: + case ECONNRESET: return WSAECONNRESET; + case ENOBUFS: return WSAENOBUFS; + case EISCONN: return WSAEISCONN; + case ENOTCONN: return WSAENOTCONN; + case ESHUTDOWN: return WSAESHUTDOWN; + case ETOOMANYREFS: return WSAETOOMANYREFS; + case ETIMEDOUT: return WSAETIMEDOUT; + case ECONNREFUSED: return WSAECONNREFUSED; + case ELOOP: return WSAELOOP; + case ENAMETOOLONG: return WSAENAMETOOLONG; + case EHOSTDOWN: return WSAEHOSTDOWN; + case EHOSTUNREACH: return WSAEHOSTUNREACH; + case ENOTEMPTY: return WSAENOTEMPTY; #ifdef EPROCLIM - case EPROCLIM: return WSAEPROCLIM; + case EPROCLIM: return WSAEPROCLIM; #endif #ifdef EUSERS - case EUSERS: return WSAEUSERS; + case EUSERS: return WSAEUSERS; #endif #ifdef EDQUOT - case EDQUOT: return WSAEDQUOT; + case EDQUOT: return WSAEDQUOT; #endif #ifdef ESTALE - case ESTALE: return WSAESTALE; + case ESTALE: return WSAESTALE; #endif #ifdef EREMOTE - case EREMOTE: return WSAEREMOTE; + case EREMOTE: return WSAEREMOTE; #endif /* just in case we ever get here and there are no problems */ - case 0: return 0; + case 0: return 0; default: - WARN("Unknown errno %d!\n", loc_errno); - return WSAEOPNOTSUPP; + WARN("Unknown errno %d!\n", loc_errno); + return WSAEOPNOTSUPP; } } @@ -4158,22 +4387,22 @@ UINT wsaHerrno(int loc_errno) switch(loc_errno) { - case HOST_NOT_FOUND: return WSAHOST_NOT_FOUND; - case TRY_AGAIN: return WSATRY_AGAIN; - case NO_RECOVERY: return WSANO_RECOVERY; - case NO_DATA: return WSANO_DATA; - case ENOBUFS: return WSAENOBUFS; + case HOST_NOT_FOUND: return WSAHOST_NOT_FOUND; + case TRY_AGAIN: return WSATRY_AGAIN; + case NO_RECOVERY: return WSANO_RECOVERY; + case NO_DATA: return WSANO_DATA; + case ENOBUFS: return WSAENOBUFS; - case 0: return 0; + case 0: return 0; default: - WARN("Unknown h_errno %d!\n", loc_errno); - return WSAEOPNOTSUPP; + WARN("Unknown h_errno %d!\n", loc_errno); + return WSAEOPNOTSUPP; } } /*********************************************************************** - * WSARecv (WS2_32.67) + * WSARecv (WS2_32.67) */ int WINAPI WSARecv(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD NumberOfBytesReceived, LPDWORD lpFlags, @@ -4753,7 +4982,7 @@ INT WINAPI WSAAddressToStringA( LPSOCKADDR sockaddr, DWORD len, /*********************************************************************** * WSAAddressToStringW (WS2_32.28) * - * Convert a sockaddr address into a readable address string. + * Convert a sockaddr address into a readable address string. * * PARAMS * sockaddr [I] Pointer to a sockaddr structure. @@ -4847,7 +5076,7 @@ INT WINAPI WSAGetServiceClassInfoA( LPGUID provider, LPGUID service, LPDWORD len FIXME( "(%s %s %p %p) Stub!\n", debugstr_guid(provider), debugstr_guid(service), len, info ); WSASetLastError(WSA_NOT_ENOUGH_MEMORY); - return SOCKET_ERROR; + return SOCKET_ERROR; } /*********************************************************************** diff --git a/dlls/ws2_32/ws2_32.spec b/dlls/ws2_32/ws2_32.spec index bbcafc0..c6b2c2f 100644 --- a/dlls/ws2_32/ws2_32.spec +++ b/dlls/ws2_32/ws2_32.spec @@ -90,7 +90,7 @@ @ stdcall WSAProviderConfigChange(ptr ptr ptr) @ stdcall WSARecv(long ptr long ptr ptr ptr ptr) @ stdcall WSARecvDisconnect(long ptr) -@ stdcall WSARecvFrom(long ptr long ptr ptr ptr ptr ptr ptr ) +@ stdcall WSARecvFrom(long ptr long ptr ptr ptr ptr ptr ptr ) @ stdcall WSARemoveServiceClass(ptr) @ stdcall WSAResetEvent(long) kernel32.ResetEvent @ stdcall WSASend(long ptr long ptr long ptr ptr) @@ -117,3 +117,5 @@ @ stdcall freeaddrinfo(ptr) WS_freeaddrinfo @ stdcall getaddrinfo(str str ptr ptr) WS_getaddrinfo @ stdcall getnameinfo(ptr long ptr long ptr long long) WS_getnameinfo +@ stdcall AcceptEx(long long ptr long long long ptr ptr) +@ stdcall GetAcceptExSockaddrs(ptr long long long ptr ptr ptr ptr) -- 1.5.4.3