From 02429730d4efafbfaf798e3f616524edfa1d8b79 Mon Sep 17 00:00:00 2001 From: Scott Lindeneau Date: Fri, 22 Aug 2008 02:11:50 +0900 Subject: [PATCH] AcceptEx and GetAcceptExSockaddrs To: wine-patches Forwards and implements AcceptEx and GetAcceptExaddrs. AcceptEx is only 'partially' implemented to simplify its implementation. It never returns true, but it doesn't need to return true, so we don't have to impelment that functionality. AcceptEx does not impelement dest_length yet. This only affects programs that expect AcceptEx to recieve data. socket.c: implements WS2_async_accept as the callback function for acceptex. This function calls the accept once a connection can be established. --- dlls/mswsock/mswsock.spec | 4 +- dlls/ws2_32/socket.c | 534 +++++++++++++++++++++++++++++++++------------ dlls/ws2_32/ws2_32.spec | 2 + 3 files changed, 396 insertions(+), 144 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..11448ac 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); @@ -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); + } + 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; + } + SERVER_START_REQ( accept_socket ) + { + req->lhandle = wsa->hSocket; + req->ahandle = SOCKET2HANDLE(wsa->addrlen.acpt.s_accept); + req->access = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE; + req->attributes = OBJ_INHERIT; + status = wine_server_call( req ); + } + SERVER_END_REQ; + if(status != STATUS_SUCCESS){ + FIXME("error in getting socket. socket: %lx, status: %x\n",wsa->addrlen.acpt.s_accept,status); + wsa->user_overlapped->Internal = status; + wsa->user_overlapped->InternalHigh = 0; + iosb->u.Status = status; + iosb->Information = 0; + return status; + } + /*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( set_socket_listener ) + { + req->handle = SOCKET2HANDLE(acceptor); + req->hListen = SOCKET2HANDLE(listener); + status = wine_server_call( req ); + } + SERVER_END_REQ; + if(status != STATUS_SUCCESS){ + FIXME("error setting socket listener\n"); + } + + SERVER_START_REQ( register_async_l ) + { + req->handle = wsa->hSocket; + req->type = ASYNC_TYPE_READ; + req->locator = 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 +1599,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 +1642,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 +1723,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 +1733,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 +1825,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 +1868,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 +1915,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 +2212,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 +2222,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 +2231,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 +2249,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 +2269,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 +2280,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 +2290,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 +2300,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 +2563,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 +2582,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 +2665,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 +2674,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 +2706,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 +2821,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 +2868,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 +2885,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 +2906,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 +3092,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 +3110,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 +3353,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 +3420,7 @@ error: } /*********************************************************************** - * socket (WS2_32.23) + * socket (WS2_32.23) */ SOCKET WINAPI WS_socket(int af, int type, int protocol) { @@ -3182,7 +3432,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 +3470,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 +3524,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 +3549,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 +3574,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 +3609,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 +3674,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 +3784,7 @@ outofmem: } /*********************************************************************** - * GetAddrInfoW (WS2_32.@) + * GetAddrInfoW (WS2_32.@) */ int WINAPI GetAddrInfoW(LPCWSTR nodename, LPCWSTR servname, const ADDRINFOW *hints, PADDRINFOW *res) { @@ -3568,7 +3818,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 +3863,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 +3890,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 +3959,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 +4075,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 +4135,7 @@ SOCKET WINAPI WSAJoinLeaf( } /*********************************************************************** - * __WSAFDIsSet (WS2_32.151) + * __WSAFDIsSet (WS2_32.151) */ int WINAPI __WSAFDIsSet(SOCKET s, WS_fd_set *set) { @@ -3899,8 +4149,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 +4167,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 +4219,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 +4332,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 +4408,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, diff --git a/dlls/ws2_32/ws2_32.spec b/dlls/ws2_32/ws2_32.spec index bbcafc0..5a0a3cf 100644 --- a/dlls/ws2_32/ws2_32.spec +++ b/dlls/ws2_32/ws2_32.spec @@ -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