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