mirror of https://github.com/lukechilds/node.git
Ryan Dahl
14 years ago
47 changed files with 2269 additions and 1441 deletions
@ -1,357 +0,0 @@ |
|||||
#ifndef __ARES_CONFIG_WIN32_H |
|
||||
#define __ARES_CONFIG_WIN32_H |
|
||||
|
|
||||
|
|
||||
/* Copyright (C) 2004 - 2008 by Daniel Stenberg et al
|
|
||||
* |
|
||||
* Permission to use, copy, modify, and distribute this software and its |
|
||||
* documentation for any purpose and without fee is hereby granted, provided |
|
||||
* that the above copyright notice appear in all copies and that both that |
|
||||
* copyright notice and this permission notice appear in supporting |
|
||||
* documentation, and that the name of M.I.T. not be used in advertising or |
|
||||
* publicity pertaining to distribution of the software without specific, |
|
||||
* written prior permission. M.I.T. makes no representations about the |
|
||||
* suitability of this software for any purpose. It is provided "as is" |
|
||||
* without express or implied warranty. |
|
||||
*/ |
|
||||
|
|
||||
/* ================================================================ */ |
|
||||
/* ares/config-win32.h - Hand crafted config file for Windows */ |
|
||||
/* ================================================================ */ |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* HEADER FILES */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* Define if you have the <getopt.h> header file. */ |
|
||||
#if defined(__MINGW32__) || defined(__POCC__) |
|
||||
#define HAVE_GETOPT_H 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define if you have the <limits.h> header file. */ |
|
||||
#define HAVE_LIMITS_H 1 |
|
||||
|
|
||||
/* Define if you have the <process.h> header file. */ |
|
||||
#ifndef __SALFORDC__ |
|
||||
#define HAVE_PROCESS_H 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define if you have the <signal.h> header file. */ |
|
||||
#define HAVE_SIGNAL_H 1 |
|
||||
|
|
||||
/* Define if you have the <sys/time.h> header file */ |
|
||||
/* #define HAVE_SYS_TIME_H 1 */ |
|
||||
|
|
||||
/* Define if you have the <time.h> header file. */ |
|
||||
#define HAVE_TIME_H 1 |
|
||||
|
|
||||
/* Define if you have the <unistd.h> header file. */ |
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ |
|
||||
defined(__POCC__) |
|
||||
#define HAVE_UNISTD_H 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define if you have the <winsock.h> header file. */ |
|
||||
#define HAVE_WINSOCK_H 1 |
|
||||
|
|
||||
/* Define if you have the <winsock2.h> header file. */ |
|
||||
#ifndef __SALFORDC__ |
|
||||
#define HAVE_WINSOCK2_H 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define if you have the <ws2tcpip.h> header file. */ |
|
||||
#ifndef __SALFORDC__ |
|
||||
#define HAVE_WS2TCPIP_H 1 |
|
||||
#endif |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* OTHER HEADER INFO */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* Define if sig_atomic_t is an available typedef. */ |
|
||||
#define HAVE_SIG_ATOMIC_T 1 |
|
||||
|
|
||||
/* Define if you have the ANSI C header files. */ |
|
||||
#define STDC_HEADERS 1 |
|
||||
|
|
||||
/* Define if you can safely include both <sys/time.h> and <time.h>. */ |
|
||||
/* #define TIME_WITH_SYS_TIME 1 */ |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* FUNCTIONS */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* Define if you have the closesocket function. */ |
|
||||
#define HAVE_CLOSESOCKET 1 |
|
||||
|
|
||||
/* Define if you have the gethostname function. */ |
|
||||
#define HAVE_GETHOSTNAME 1 |
|
||||
|
|
||||
/* Define if you have the ioctlsocket function. */ |
|
||||
#define HAVE_IOCTLSOCKET 1 |
|
||||
|
|
||||
/* Define if you have a working ioctlsocket FIONBIO function. */ |
|
||||
#define HAVE_IOCTLSOCKET_FIONBIO 1 |
|
||||
|
|
||||
/* Define if you have the strcasecmp function. */ |
|
||||
/* #define HAVE_STRCASECMP 1 */ |
|
||||
|
|
||||
/* Define if you have the strdup function. */ |
|
||||
#define HAVE_STRDUP 1 |
|
||||
|
|
||||
/* Define if you have the stricmp function. */ |
|
||||
#define HAVE_STRICMP 1 |
|
||||
|
|
||||
/* Define if you have the strncasecmp function. */ |
|
||||
/* #define HAVE_STRNCASECMP 1 */ |
|
||||
|
|
||||
/* Define if you have the strnicmp function. */ |
|
||||
#define HAVE_STRNICMP 1 |
|
||||
|
|
||||
/* Define if you have the recv function. */ |
|
||||
#define HAVE_RECV 1 |
|
||||
|
|
||||
/* Define to the type of arg 1 for recv. */ |
|
||||
#define RECV_TYPE_ARG1 SOCKET |
|
||||
|
|
||||
/* Define to the type of arg 2 for recv. */ |
|
||||
#define RECV_TYPE_ARG2 char * |
|
||||
|
|
||||
/* Define to the type of arg 3 for recv. */ |
|
||||
#define RECV_TYPE_ARG3 int |
|
||||
|
|
||||
/* Define to the type of arg 4 for recv. */ |
|
||||
#define RECV_TYPE_ARG4 int |
|
||||
|
|
||||
/* Define to the function return type for recv. */ |
|
||||
#define RECV_TYPE_RETV int |
|
||||
|
|
||||
/* Define if you have the recvfrom function. */ |
|
||||
#define HAVE_RECVFROM 1 |
|
||||
|
|
||||
/* Define to the type of arg 1 for recvfrom. */ |
|
||||
#define RECVFROM_TYPE_ARG1 SOCKET |
|
||||
|
|
||||
/* Define to the type pointed by arg 2 for recvfrom. */ |
|
||||
#define RECVFROM_TYPE_ARG2 char |
|
||||
|
|
||||
/* Define to the type of arg 3 for recvfrom. */ |
|
||||
#define RECVFROM_TYPE_ARG3 int |
|
||||
|
|
||||
/* Define to the type of arg 4 for recvfrom. */ |
|
||||
#define RECVFROM_TYPE_ARG4 int |
|
||||
|
|
||||
/* Define to the type pointed by arg 5 for recvfrom. */ |
|
||||
#define RECVFROM_TYPE_ARG5 struct sockaddr |
|
||||
|
|
||||
/* Define to the type pointed by arg 6 for recvfrom. */ |
|
||||
#define RECVFROM_TYPE_ARG6 int |
|
||||
|
|
||||
/* Define to the function return type for recvfrom. */ |
|
||||
#define RECVFROM_TYPE_RETV int |
|
||||
|
|
||||
/* Define if you have the send function. */ |
|
||||
#define HAVE_SEND 1 |
|
||||
|
|
||||
/* Define to the type of arg 1 for send. */ |
|
||||
#define SEND_TYPE_ARG1 SOCKET |
|
||||
|
|
||||
/* Define to the type qualifier of arg 2 for send. */ |
|
||||
#define SEND_QUAL_ARG2 const |
|
||||
|
|
||||
/* Define to the type of arg 2 for send. */ |
|
||||
#define SEND_TYPE_ARG2 char * |
|
||||
|
|
||||
/* Define to the type of arg 3 for send. */ |
|
||||
#define SEND_TYPE_ARG3 int |
|
||||
|
|
||||
/* Define to the type of arg 4 for send. */ |
|
||||
#define SEND_TYPE_ARG4 int |
|
||||
|
|
||||
/* Define to the function return type for send. */ |
|
||||
#define SEND_TYPE_RETV int |
|
||||
|
|
||||
/* Specifics for the Watt-32 tcp/ip stack */ |
|
||||
#ifdef WATT32 |
|
||||
#define SOCKET int |
|
||||
#define NS_INADDRSZ 4 |
|
||||
#define HAVE_ARPA_NAMESER_H 1 |
|
||||
#define HAVE_ARPA_INET_H 1 |
|
||||
#define HAVE_NETDB_H 1 |
|
||||
#define HAVE_NETINET_IN_H 1 |
|
||||
#define HAVE_SYS_SOCKET_H 1 |
|
||||
#define HAVE_NETINET_TCP_H 1 |
|
||||
#define HAVE_AF_INET6 1 |
|
||||
#define HAVE_PF_INET6 1 |
|
||||
#define HAVE_STRUCT_IN6_ADDR 1 |
|
||||
#define HAVE_STRUCT_SOCKADDR_IN6 1 |
|
||||
#undef HAVE_WINSOCK_H |
|
||||
#undef HAVE_WINSOCK2_H |
|
||||
#undef HAVE_WS2TCPIP_H |
|
||||
#endif |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* TYPEDEF REPLACEMENTS */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* Define this if in_addr_t is not an available 'typedefed' type */ |
|
||||
#define in_addr_t unsigned long |
|
||||
|
|
||||
/* Define as the return type of signal handlers (int or void). */ |
|
||||
#define RETSIGTYPE void |
|
||||
|
|
||||
/* Define ssize_t if it is not an available 'typedefed' type */ |
|
||||
#ifndef _SSIZE_T_DEFINED |
|
||||
# if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || \ |
|
||||
defined(__POCC__) || \ |
|
||||
defined(__MINGW32__) |
|
||||
# elif defined(_WIN64) |
|
||||
# define _SSIZE_T_DEFINED |
|
||||
# define ssize_t __int64 |
|
||||
# else |
|
||||
# define _SSIZE_T_DEFINED |
|
||||
# define ssize_t int |
|
||||
# endif |
|
||||
#endif |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* TYPE SIZES */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* The size of `int', as computed by sizeof. */ |
|
||||
#define SIZEOF_INT 4 |
|
||||
|
|
||||
/* The size of `short', as computed by sizeof. */ |
|
||||
#define SIZEOF_SHORT 2 |
|
||||
|
|
||||
/* The size of `size_t', as computed by sizeof. */ |
|
||||
#if defined(_WIN64) |
|
||||
# define SIZEOF_SIZE_T 8 |
|
||||
#else |
|
||||
# define SIZEOF_SIZE_T 4 |
|
||||
#endif |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* STRUCT RELATED */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* Define this if you have struct addrinfo */ |
|
||||
#define HAVE_STRUCT_ADDRINFO 1 |
|
||||
|
|
||||
/* Define this if you have struct sockaddr_storage */ |
|
||||
#ifndef __SALFORDC__ |
|
||||
#define HAVE_STRUCT_SOCKADDR_STORAGE 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define this if you have struct timeval */ |
|
||||
#define HAVE_STRUCT_TIMEVAL 1 |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* COMPILER SPECIFIC */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* Define to avoid VS2005 complaining about portable C functions */ |
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400) |
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1 |
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Officially, Microsoft's Windows SDK versions 6.X do not support Windows
|
|
||||
2000 as a supported build target. VS2008 default installations provide an |
|
||||
embedded Windows SDK v6.0A along with the claim that Windows 2000 is a |
|
||||
valid build target for VS2008. Popular belief is that binaries built using |
|
||||
Windows SDK versions 6.X and Windows 2000 as a build target are functional */ |
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1500) |
|
||||
# define VS2008_MINIMUM_TARGET 0x0500 |
|
||||
#endif |
|
||||
|
|
||||
/* When no build target is specified VS2008 default build target is Windows
|
|
||||
Vista, which leaves out even Winsows XP. If no build target has been given |
|
||||
for VS2008 we will target the minimum Officially supported build target, |
|
||||
which happens to be Windows XP. */ |
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1500) |
|
||||
# define VS2008_DEFAULT_TARGET 0x0501 |
|
||||
#endif |
|
||||
|
|
||||
/* VS2008 default target settings and minimum build target check */ |
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1500) |
|
||||
# ifndef _WIN32_WINNT |
|
||||
# define _WIN32_WINNT VS2008_DEFAULT_TARGET |
|
||||
# endif |
|
||||
# ifndef WINVER |
|
||||
# define WINVER VS2008_DEFAULT_TARGET |
|
||||
# endif |
|
||||
# if (_WIN32_WINNT < VS2008_MINIMUM_TARGET) || (WINVER < VS2008_MINIMUM_TARGET) |
|
||||
# error VS2008 does not support Windows build targets prior to Windows 2000 |
|
||||
# endif |
|
||||
#endif |
|
||||
|
|
||||
/* When no build target is specified Pelles C 5.00 and later default build
|
|
||||
target is Windows Vista. We override default target to be Windows 2000. */ |
|
||||
#if defined(__POCC__) && (__POCC__ >= 500) |
|
||||
# ifndef _WIN32_WINNT |
|
||||
# define _WIN32_WINNT 0x0500 |
|
||||
# endif |
|
||||
# ifndef WINVER |
|
||||
# define WINVER 0x0500 |
|
||||
# endif |
|
||||
#endif |
|
||||
|
|
||||
/* Availability of freeaddrinfo, getaddrinfo and getnameinfo functions is
|
|
||||
quite convoluted, compiler dependent and even build target dependent. */ |
|
||||
#if defined(HAVE_WS2TCPIP_H) |
|
||||
# if defined(__POCC__) |
|
||||
# define HAVE_FREEADDRINFO 1 |
|
||||
# define HAVE_GETADDRINFO 1 |
|
||||
# define HAVE_GETNAMEINFO 1 |
|
||||
# elif defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) |
|
||||
# define HAVE_FREEADDRINFO 1 |
|
||||
# define HAVE_GETADDRINFO 1 |
|
||||
# define HAVE_GETNAMEINFO 1 |
|
||||
# elif defined(_MSC_VER) && (_MSC_VER >= 1200) |
|
||||
# define HAVE_FREEADDRINFO 1 |
|
||||
# define HAVE_GETADDRINFO 1 |
|
||||
# define HAVE_GETNAMEINFO 1 |
|
||||
# endif |
|
||||
#endif |
|
||||
|
|
||||
#if defined(__POCC__) |
|
||||
# ifndef _MSC_VER |
|
||||
# error Microsoft extensions /Ze compiler option is required |
|
||||
# endif |
|
||||
# ifndef __POCC__OLDNAMES |
|
||||
# error Compatibility names /Go compiler option is required |
|
||||
# endif |
|
||||
#endif |
|
||||
|
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
/* IPV6 COMPATIBILITY */ |
|
||||
/* ---------------------------------------------------------------- */ |
|
||||
|
|
||||
/* Define this if you have address family AF_INET6 */ |
|
||||
#ifdef HAVE_WINSOCK2_H |
|
||||
#define HAVE_AF_INET6 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define this if you have protocol family PF_INET6 */ |
|
||||
#ifdef HAVE_WINSOCK2_H |
|
||||
#define HAVE_PF_INET6 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define this if you have struct in6_addr */ |
|
||||
#ifdef HAVE_WS2TCPIP_H |
|
||||
#define HAVE_STRUCT_IN6_ADDR 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define this if you have struct sockaddr_in6 */ |
|
||||
#ifdef HAVE_WS2TCPIP_H |
|
||||
#define HAVE_STRUCT_SOCKADDR_IN6 1 |
|
||||
#endif |
|
||||
|
|
||||
/* Define this if you have sockaddr_in6 with scopeid */ |
|
||||
#ifdef HAVE_WS2TCPIP_H |
|
||||
#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 |
|
||||
#endif |
|
||||
|
|
||||
|
|
||||
#endif /* __ARES_CONFIG_WIN32_H */ |
|
File diff suppressed because it is too large
@ -0,0 +1,186 @@ |
|||||
|
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
* |
||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
* of this software and associated documentation files (the "Software"), to |
||||
|
* deal in the Software without restriction, including without limitation the |
||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
||||
|
* sell copies of the Software, and to permit persons to whom the Software is |
||||
|
* furnished to do so, subject to the following conditions: |
||||
|
* |
||||
|
* The above copyright notice and this permission notice shall be included in |
||||
|
* all copies or substantial portions of the Software. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
||||
|
* IN THE SOFTWARE. |
||||
|
*/ |
||||
|
|
||||
|
#include "uv.h" |
||||
|
#include "task.h" |
||||
|
|
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
|
||||
|
static int getsocknamecount = 0; |
||||
|
|
||||
|
|
||||
|
static uv_tcp_t tcp; |
||||
|
static uv_req_t connect_req; |
||||
|
static uv_tcp_t tcpServer; |
||||
|
|
||||
|
|
||||
|
static uv_buf_t alloc(uv_stream_t* handle, size_t suggested_size) { |
||||
|
uv_buf_t buf; |
||||
|
buf.base = (char*) malloc(suggested_size); |
||||
|
buf.len = suggested_size; |
||||
|
return buf; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void on_close(uv_handle_t* peer) { |
||||
|
free(peer); |
||||
|
uv_close((uv_handle_t*)&tcpServer, NULL); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void after_shutdown(uv_req_t* req, int status) { |
||||
|
uv_close(req->handle, on_close); |
||||
|
free(req); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void after_read(uv_stream_t* handle, ssize_t nread, uv_buf_t buf) { |
||||
|
uv_req_t* req; |
||||
|
|
||||
|
if (buf.base) { |
||||
|
free(buf.base); |
||||
|
} |
||||
|
|
||||
|
req = (uv_req_t*) malloc(sizeof *req); |
||||
|
uv_req_init(req, (uv_handle_t*)handle, (void *(*)(void *))after_shutdown); |
||||
|
uv_shutdown(req); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void on_connection(uv_handle_t* server, int status) { |
||||
|
struct sockaddr sockname; |
||||
|
int namelen = sizeof(sockname); |
||||
|
uv_handle_t* handle; |
||||
|
int r; |
||||
|
|
||||
|
if (status != 0) { |
||||
|
fprintf(stderr, "Connect error %d\n", uv_last_error().code); |
||||
|
} |
||||
|
ASSERT(status == 0); |
||||
|
|
||||
|
handle = (uv_handle_t*) malloc(sizeof(uv_tcp_t)); |
||||
|
ASSERT(handle != NULL); |
||||
|
|
||||
|
uv_tcp_init((uv_tcp_t*)handle); |
||||
|
|
||||
|
/* associate server with stream */ |
||||
|
handle->data = server; |
||||
|
|
||||
|
r = uv_accept(server, (uv_stream_t*)handle); |
||||
|
ASSERT(r == 0); |
||||
|
|
||||
|
status = uv_getsockname((uv_tcp_t*)handle, &sockname, &namelen); |
||||
|
if (status != 0) { |
||||
|
fprintf(stderr, "uv_getsockname error (accepted) %d\n", uv_last_error().code); |
||||
|
} |
||||
|
ASSERT(status == 0); |
||||
|
|
||||
|
getsocknamecount++; |
||||
|
|
||||
|
r = uv_read_start((uv_stream_t*)handle, alloc, after_read); |
||||
|
ASSERT(r == 0); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void on_connect(void* req) { |
||||
|
struct sockaddr sockname; |
||||
|
int namelen = sizeof(sockname); |
||||
|
int status; |
||||
|
|
||||
|
status = uv_getsockname(&tcp, &sockname, &namelen); |
||||
|
if (status != 0) { |
||||
|
fprintf(stderr, "uv_getsockname error (connector) %d\n", uv_last_error().code); |
||||
|
} |
||||
|
ASSERT(status == 0); |
||||
|
|
||||
|
getsocknamecount++; |
||||
|
|
||||
|
uv_close((uv_handle_t*)&tcp, NULL); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static int tcp_listener(int port) { |
||||
|
struct sockaddr_in addr = uv_ip4_addr("0.0.0.0", port); |
||||
|
struct sockaddr sockname; |
||||
|
int namelen = sizeof(sockname); |
||||
|
int r; |
||||
|
|
||||
|
r = uv_tcp_init(&tcpServer); |
||||
|
if (r) { |
||||
|
fprintf(stderr, "Socket creation error\n"); |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
r = uv_tcp_bind(&tcpServer, addr); |
||||
|
if (r) { |
||||
|
fprintf(stderr, "Bind error\n"); |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
r = uv_tcp_listen(&tcpServer, 128, on_connection); |
||||
|
if (r) { |
||||
|
fprintf(stderr, "Listen error\n"); |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
r = uv_getsockname(&tcpServer, &sockname, &namelen); |
||||
|
if (r != 0) { |
||||
|
fprintf(stderr, "uv_getsockname error (listening) %d\n", uv_last_error().code); |
||||
|
} |
||||
|
ASSERT(r == 0); |
||||
|
getsocknamecount++; |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void tcp_connector() { |
||||
|
int r; |
||||
|
struct sockaddr_in server_addr = uv_ip4_addr("127.0.0.1", TEST_PORT); |
||||
|
|
||||
|
r = uv_tcp_init(&tcp); |
||||
|
tcp.data = &connect_req; |
||||
|
ASSERT(!r); |
||||
|
|
||||
|
uv_req_init(&connect_req, (uv_handle_t*)(&tcp), (void *(*)(void *))on_connect); |
||||
|
|
||||
|
r = uv_tcp_connect(&connect_req, server_addr); |
||||
|
ASSERT(!r); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
TEST_IMPL(getsockname) { |
||||
|
uv_init(); |
||||
|
|
||||
|
if (tcp_listener(TEST_PORT)) |
||||
|
return 1; |
||||
|
|
||||
|
tcp_connector(); |
||||
|
|
||||
|
uv_run(); |
||||
|
|
||||
|
ASSERT(getsocknamecount == 3); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
Loading…
Reference in new issue