diff --git a/Changes b/Changes index c279d8030..830cb35d6 100644 --- a/Changes +++ b/Changes @@ -1677,6 +1677,6 @@ If you get a "undefined reference to `clock_gettime'" error, then you might consider installing 'pkg-config' on your system, and then simply re-run ./Config and make, should fix things. + TODO: testing! testing! i'd like to be sure this c-ares is stable! - Win32 compile fixes. -__TODO__: win32 c-ares upgrade to 1.6.0 (and copy & fix header files). -__TODO__: testing! testing! i'd like to be sure this c-ares is stable! +- Upgraded c-ares on windows to 1.6.0 as well. diff --git a/include/win32/ares/ares.h b/include/win32/ares/ares.h index 63384b34e..bbd862833 100644 --- a/include/win32/ares/ares.h +++ b/include/win32/ares/ares.h @@ -1,6 +1,7 @@ /* $Id$ */ /* Copyright 1998 by the Massachusetts Institute of Technology. + * Copyright (C) 2007-2008 by Daniel Stenberg * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without @@ -18,25 +19,44 @@ #ifndef ARES__H #define ARES__H +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +#define WIN32 +#endif + #include -#if defined(_AIX) || defined(NETWARE) +#include +#include + /* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish libc5-based Linux systems. Only include it on system that are known to require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) #include #endif +#if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) +#include +#endif #if defined(WATT32) #include #include #include #elif defined(WIN32) - #include - #include +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +//# include #else - #include #include + #include #endif #ifdef __cplusplus @@ -95,6 +115,10 @@ extern "C" { #define ARES_OPT_LOOKUPS (1 << 8) #define ARES_OPT_SOCK_STATE_CB (1 << 9) #define ARES_OPT_SORTLIST (1 << 10) +#define ARES_OPT_SOCK_SNDBUF (1 << 11) +#define ARES_OPT_SOCK_RCVBUF (1 << 12) +#define ARES_OPT_TIMEOUTMS (1 << 13) +#define ARES_OPT_ROTATE (1 << 14) /* Nameinfo flag values */ #define ARES_NI_NOFQDN (1 << 0) @@ -153,27 +177,39 @@ typedef int ares_socket_t; #define ares_socket_typedef #endif /* ares_socket_typedef */ -#ifdef WIN32 typedef void (*ares_sock_state_cb)(void *data, - SOCKET socket, + ares_socket_t socket_fd, int readable, int writable); -#else -typedef void (*ares_sock_state_cb)(void *data, - int socket, - int readable, - int writable); -#endif struct apattern; +/* NOTE about the ares_options struct to users and developers. + + This struct will remain looking like this. It will not be extended nor + shrunk in future releases, but all new options will be set by ares_set_*() + options instead of with the ares_init_options() function. + + Eventually (in a galaxy far far away), all options will be settable by + ares_set_*() options and the ares_init_options() function will become + deprecated. + + When new options are added to c-ares, they are not added to this + struct. And they are not "saved" with the ares_save_options() function but + instead we encourage the use of the ares_dup() function. Needless to say, + if you add config options to c-ares you need to make sure ares_dup() + duplicates this new option. + + */ struct ares_options { int flags; - int timeout; + int timeout; /* in seconds or milliseconds, depending on options */ int tries; int ndots; unsigned short udp_port; unsigned short tcp_port; + int socket_send_buffer_size; + int socket_receive_buffer_size; struct in_addr *servers; int nservers; char **domains; @@ -197,20 +233,27 @@ struct timeval; struct sockaddr; struct ares_channeldata; typedef struct ares_channeldata *ares_channel; -typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf, - int alen); -typedef void (*ares_host_callback)(void *arg, int status, +typedef void (*ares_callback)(void *arg, int status, int timeouts, + unsigned char *abuf, int alen); +typedef void (*ares_host_callback)(void *arg, int status, int timeouts, struct hostent *hostent); -typedef void (*ares_nameinfo_callback)(void *arg, int status, +typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts, char *node, char *service); +typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, + int type, void *data); int ares_init(ares_channel *channelptr); int ares_init_options(ares_channel *channelptr, struct ares_options *options, int optmask); -int ares_save_options(ares_channel channel, struct ares_options *options, int *optmask); +int ares_save_options(ares_channel channel, struct ares_options *options, + int *optmask); void ares_destroy_options(struct ares_options *options); +int ares_dup(ares_channel *dest, ares_channel src); void ares_destroy(ares_channel channel); void ares_cancel(ares_channel channel); +void ares_set_socket_callback(ares_channel channel, + ares_sock_create_callback callback, + void *user_data); void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, ares_callback callback, void *arg); void ares_query(ares_channel channel, const char *name, int dnsclass, @@ -219,6 +262,8 @@ void ares_search(ares_channel channel, const char *name, int dnsclass, int type, ares_callback callback, void *arg); void ares_gethostbyname(ares_channel channel, const char *name, int family, ares_host_callback callback, void *arg); +int ares_gethostbyname_file(ares_channel channel, const char *name, + int family, struct hostent **host); void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, int family, ares_host_callback callback, void *arg); void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, @@ -239,10 +284,38 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, int alen, char **s, long *enclen); int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf, int alen, unsigned char **s, long *enclen); + +#if !defined(HAVE_STRUCT_IN6_ADDR) && !defined(s6_addr) +struct in6_addr { + union { + unsigned char _S6_u8[16]; + } _S6_un; +}; +#define s6_addr _S6_un._S6_u8 +#endif + +struct addrttl { + struct in_addr ipaddr; + int ttl; +}; +struct addr6ttl { + struct in6_addr ip6addr; + int ttl; +}; + +/* +** Parse the buffer, starting at *abuf and of length alen bytes, previously +** obtained from an ares_search call. Put the results in *host, if nonnull. +** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with +** their TTLs in that array, and set *naddrttls to the number of addresses +** so written. +*/ int ares_parse_a_reply(const unsigned char *abuf, int alen, - struct hostent **host); + struct hostent **host, + struct addrttl *addrttls, int *naddrttls); int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, - struct hostent **host); + struct hostent **host, + struct addr6ttl *addrttls, int *naddrttls); int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, int addrlen, int family, struct hostent **host); int ares_parse_ns_reply(const unsigned char *abuf, int alen, @@ -250,7 +323,9 @@ int ares_parse_ns_reply(const unsigned char *abuf, int alen, void ares_free_string(void *str); void ares_free_hostent(struct hostent *host); const char *ares_strerror(int code); + int ares_get_config(struct ares_config_info *d, ares_channel c); + #ifdef __cplusplus } #endif diff --git a/include/win32/ares/ares_version.h b/include/win32/ares/ares_version.h index e7167f7a8..7b70de772 100644 --- a/include/win32/ares/ares_version.h +++ b/include/win32/ares/ares_version.h @@ -4,12 +4,12 @@ #define ARES__VERSION_H #define ARES_VERSION_MAJOR 1 -#define ARES_VERSION_MINOR 4 +#define ARES_VERSION_MINOR 6 #define ARES_VERSION_PATCH 0 #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ (ARES_VERSION_MINOR<<8)|\ (ARES_VERSION_PATCH)) -#define ARES_VERSION_STR "1.4.0" +#define ARES_VERSION_STR "1.6.0" #ifdef __cplusplus extern "C" { diff --git a/include/win32/ares/config-win32.h b/include/win32/ares/config-win32.h index 271d5c34c..b7a0cd4be 100755 --- a/include/win32/ares/config-win32.h +++ b/include/win32/ares/config-win32.h @@ -1,187 +1,284 @@ -#ifndef __ARES_CONFIG_WIN32_H -#define __ARES_CONFIG_WIN32_H - -/* $Id$ */ - -/* Copyright (C) 2004 - 2006 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 header file. */ -#if defined(__MINGW32__) -#define HAVE_GETOPT_H 1 -#endif - -/* Define if you have the header file. */ -#define HAVE_SIGNAL_H 1 - -/* Define if you have the header file */ -/* #define HAVE_SYS_TIME_H 1 */ - -/* Define if you have the header file. */ -#define HAVE_TIME_H 1 - -/* Define if you have the header file. */ -#define HAVE_PROCESS_H 1 - -/* Define if you have the header file. */ -#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ - defined(__POCC__) -#define HAVE_UNISTD_H 1 -#endif - -/* Define if you have the header file. */ -#define HAVE_WINDOWS_H 1 - -/* Define if you have the header file. */ -#define HAVE_WINSOCK_H 1 - -/* Define if you have the header file. */ -// #define HAVE_WINSOCK2_H 1 - -/* Define if you have the header file. */ -// #define HAVE_WS2TCPIP_H 1 - -/* ---------------------------------------------------------------- */ -/* 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 and . */ -/* #define TIME_WITH_SYS_TIME 1 */ - -/* ---------------------------------------------------------------- */ -/* FUNCTIONS */ -/* ---------------------------------------------------------------- */ - -/* Define if you have the ioctlsocket function. */ -#define HAVE_IOCTLSOCKET 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 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 - #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 */ -#if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || defined(__POCC__) -#elif defined(_WIN64) -#define ssize_t __int64 -#else -#define ssize_t int -#endif - -/* Define to 'int' if socklen_t is not an available 'typedefed' type */ -#ifndef HAVE_WS2TCPIP_H -#define socklen_t int -#endif - -/* ---------------------------------------------------------------- */ -/* STRUCT RELATED */ -/* ---------------------------------------------------------------- */ - -/* Define this if you have struct addrinfo */ -#define HAVE_STRUCT_ADDRINFO 1 - -/* Define this if you have struct sockaddr_storage */ -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 - -/* Define this if you have struct timeval */ -#define HAVE_STRUCT_TIMEVAL 1 - -/* ---------------------------------------------------------------- */ -/* IPV6 COMPATIBILITY */ -/* ---------------------------------------------------------------- */ - -/* Define this if you have address family AF_INET6 */ -#define HAVE_AF_INET6 1 - -/* Define this if you have protocol family PF_INET6 */ -#define HAVE_PF_INET6 1 - -/* Define this if you have struct in6_addr */ -#define HAVE_STRUCT_IN6_ADDR 1 - -/* Define this if you have struct sockaddr_in6 */ -#define HAVE_STRUCT_SOCKADDR_IN6 1 - -/* Define this if you have sockaddr_in6 with scopeid */ -#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 - - -#endif /* __ARES_CONFIG_WIN32_H */ +#ifndef __ARES_CONFIG_WIN32_H +#define __ARES_CONFIG_WIN32_H + +/* $Id$ */ + +/* 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 header file. */ +#if defined(__MINGW32__) +#define HAVE_GETOPT_H 1 +#endif + +/* Define if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define if you have the header file */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_PROCESS_H 1 + +/* Define if you have the header file. */ +#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ + defined(__POCC__) +#define HAVE_UNISTD_H 1 +#endif + +/* Define if you have the header file. */ +#define HAVE_WINDOWS_H 1 + +/* Define if you have the header file. */ +#define HAVE_WINSOCK_H 1 + +/* Define if you have the header file. */ +//#define HAVE_WINSOCK2_H 1 + +/* Define if you have the header file. */ +//#define HAVE_WS2TCPIP_H 1 + +/* ---------------------------------------------------------------- */ +/* 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 and . */ +/* #define TIME_WITH_SYS_TIME 1 */ + +/* ---------------------------------------------------------------- */ +/* FUNCTIONS */ +/* ---------------------------------------------------------------- */ + +/* 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 gethostname function. */ +#define HAVE_GETHOSTNAME 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 */ +#if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || defined(__POCC__) +#elif defined(_WIN64) +#define ssize_t __int64 +#else +#define ssize_t int +#endif + +/* ---------------------------------------------------------------- */ +/* STRUCT RELATED */ +/* ---------------------------------------------------------------- */ + +/* Define this if you have struct addrinfo */ +#define HAVE_STRUCT_ADDRINFO 1 + +/* Define this if you have struct sockaddr_storage */ +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 + +/* 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 + +/* VS2008 does not support Windows build targets prior to WinXP, */ +/* so, if no build target has been defined we will target WinXP. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1500) +# ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0501 +# endif +# ifndef WINVER +# define WINVER 0x0501 +# endif +# if (_WIN32_WINNT < 0x0501) || (WINVER < 0x0501) +# error VS2008 does not support Windows build targets prior to WinXP +# endif +#endif + +/* Availability of freeaddrinfo, getaddrinfo and getnameinfo functions is quite */ +/* convoluted, compiler dependant and in some cases even build target dependat. */ +#if defined(HAVE_WS2TCPIP_H) +# if 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 + +/* ---------------------------------------------------------------- */ +/* 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 */ diff --git a/include/win32/ares/setup.h b/include/win32/ares/setup.h index 0d678f81b..585d504f6 100644 --- a/include/win32/ares/setup.h +++ b/include/win32/ares/setup.h @@ -3,7 +3,7 @@ /* $Id$ */ -/* Copyright (C) 2004 - 2007 by Daniel Stenberg et al +/* 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 @@ -16,13 +16,11 @@ * without express or implied warranty. */ -#if !defined(WIN32) && defined(__WIN32__) -/* Borland fix */ -#define WIN32 -#endif +/* + * Define WIN32 when build target is Win32 API + */ -#if !defined(WIN32) && defined(_WIN32) -/* VS2005 on x64 fix */ +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) #define WIN32 #endif @@ -41,6 +39,18 @@ #endif /* HAVE_CONFIG_H */ +/* + * Tru64 needs _REENTRANT set for a few function prototypes and + * things to appear in the system header files. Unixware needs it + * to build proper reentrant code. Others may also need it. + */ + +#ifdef NEED_REENTRANT +# ifndef _REENTRANT +# define _REENTRANT +# endif +#endif + /* * Include header files for windows builds before redefining anything. * Use this preproessor block only to include or exclude windows.h, @@ -97,8 +107,16 @@ #define ssize_t int #endif -#ifndef HAVE_WS2TCPIP_H -#define socklen_t int +#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__) +#define HAVE_SYS_TIME_H +#endif + +#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) +#define HAVE_UNISTD_H 1 +#endif + +#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) +#define HAVE_SYS_UIO_H #endif #endif /* HAVE_CONFIG_H */ @@ -117,40 +135,6 @@ #undef VERSION #undef PACKAGE -/* - * Assume a few thing unless they're set by configure - */ - -#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__) -#define HAVE_SYS_TIME_H -#endif - -#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) -#define HAVE_UNISTD_H 1 -#endif - -#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) -#define HAVE_SYS_UIO_H -#endif - -#if (defined(WIN32) || defined(WATT32)) && \ - !(defined(__MINGW32__) || defined(NETWARE) || defined(__DJGPP__)) -/* protos for the functions we provide in windows_port.c */ -int ares_strncasecmp(const char *s1, const char *s2, int n); -int ares_strcasecmp(const char *s1, const char *s2); - -/* use this define magic to prevent us from adding symbol names to the library - that is a high-risk to collide with another libraries' attempts to do the - same */ -#define strncasecmp(a,b,c) ares_strncasecmp(a,b,c) -#define strcasecmp(a,b) ares_strcasecmp(a,b) -#ifdef _MSC_VER -# if _MSC_VER >= 1400 -# define strdup(a) _strdup(a) -# endif -#endif -#endif - /* IPv6 compatibility */ #if !defined(HAVE_AF_INET6) #if defined(HAVE_PF_INET6) @@ -168,6 +152,4 @@ int ares_strcasecmp(const char *s1, const char *s2); #include "setup_once.h" #endif -#include - #endif /* __ARES_SETUP_H */ diff --git a/include/win32/ares/setup_once.h b/include/win32/ares/setup_once.h index 4f7ed59bb..965761336 100755 --- a/include/win32/ares/setup_once.h +++ b/include/win32/ares/setup_once.h @@ -3,7 +3,7 @@ /* $Id$ */ -/* Copyright (C) 2004 - 2007 by Daniel Stenberg et al +/* 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 @@ -88,9 +88,33 @@ struct timeval { #define SEND_4TH_ARG MSG_NOSIGNAL #else #define SEND_4TH_ARG 0 -#endif +#endif +/* + * Windows build targets have socklen_t definition in + * ws2tcpip.h but some versions of ws2tcpip.h do not + * have the definition. It seems that when the socklen_t + * definition is missing from ws2tcpip.h the definition + * for INET_ADDRSTRLEN is also missing, and that when one + * definition is present the other one also is available. + */ + +#if defined(WIN32) && !defined(HAVE_CONFIG_H) +# if ( defined(_MSC_VER) && !defined(INET_ADDRSTRLEN) ) || \ + (!defined(_MSC_VER) && !defined(HAVE_WS2TCPIP_H) ) +# define socklen_t int +# endif +#endif + + +#if defined(__minix) +/* Minix doesn't support recv on TCP sockets */ +#define sread(x,y,z) (ssize_t)read((RECV_TYPE_ARG1)(x), \ + (RECV_TYPE_ARG2)(y), \ + (RECV_TYPE_ARG3)(z)) + +#elif defined(HAVE_RECV) /* * The definitions for the return type and arguments types * of functions recv() and send() belong and come from the @@ -113,7 +137,6 @@ struct timeval { * SEND_TYPE_RETV must also be defined. */ -#ifdef HAVE_RECV #if !defined(RECV_TYPE_ARG1) || \ !defined(RECV_TYPE_ARG2) || \ !defined(RECV_TYPE_ARG3) || \ @@ -136,7 +159,14 @@ struct timeval { #endif #endif /* HAVE_RECV */ -#ifdef HAVE_SEND + +#if defined(__minix) +/* Minix doesn't support send on TCP sockets */ +#define swrite(x,y,z) (ssize_t)write((SEND_TYPE_ARG1)(x), \ + (SEND_TYPE_ARG2)(y), \ + (SEND_TYPE_ARG3)(z)) + +#elif defined(HAVE_SEND) #if !defined(SEND_TYPE_ARG1) || \ !defined(SEND_QUAL_ARG2) || \ !defined(SEND_TYPE_ARG2) || \ @@ -161,8 +191,48 @@ struct timeval { #endif /* HAVE_SEND */ +#if 0 +#if defined(HAVE_RECVFROM) /* - * Uppercase macro versions of ANSI/ISO is*() functions/macros which + * Currently recvfrom is only used on udp sockets. + */ +#if !defined(RECVFROM_TYPE_ARG1) || \ + !defined(RECVFROM_TYPE_ARG2) || \ + !defined(RECVFROM_TYPE_ARG3) || \ + !defined(RECVFROM_TYPE_ARG4) || \ + !defined(RECVFROM_TYPE_ARG5) || \ + !defined(RECVFROM_TYPE_ARG6) || \ + !defined(RECVFROM_TYPE_RETV) + /* */ + Error Missing_definition_of_return_and_arguments_types_of_recvfrom + /* */ +#else +#define sreadfrom(s,b,bl,f,fl) (ssize_t)recvfrom((RECVFROM_TYPE_ARG1) (s), \ + (RECVFROM_TYPE_ARG2 *)(b), \ + (RECVFROM_TYPE_ARG3) (bl), \ + (RECVFROM_TYPE_ARG4) (0), \ + (RECVFROM_TYPE_ARG5 *)(f), \ + (RECVFROM_TYPE_ARG6 *)(fl)) +#endif +#else /* HAVE_RECVFROM */ +#ifndef sreadfrom + /* */ + Error Missing_definition_of_macro_sreadfrom + /* */ +#endif +#endif /* HAVE_RECVFROM */ + + +#ifdef RECVFROM_TYPE_ARG6_IS_VOID +# define RECVFROM_ARG6_T int +#else +# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6 +#endif +#endif /* if 0 */ + + +/* + * Uppercase macro versions of ANSI/ISO is*() functions/macros which * avoid negative number inputs with argument byte codes > 127. */ @@ -273,13 +343,13 @@ typedef int sig_atomic_t; * (or equivalent) on this platform to hide platform details to code using it. */ -#ifdef WIN32 +/*UNREALUNREALUNREALEDIT#ifdef WIN32 #define ERRNO ((int)GetLastError()) #define SET_ERRNO(x) (SetLastError((DWORD)(x))) #else #define ERRNO (errno) #define SET_ERRNO(x) (errno = (x)) -#endif +#endif*/ /* @@ -358,5 +428,96 @@ typedef int sig_atomic_t; #endif +/* + * We use this ZERO_NULL to avoid picky compiler warnings, + * when assigning a NULL pointer to a function pointer var. + */ + +#define ZERO_NULL 0 + + +#if defined (__LP64__) && defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED) +#include +/* HP-UX has this oddity where it features a few functions that don't work + with socklen_t so we need to convert to ints + + This is due to socklen_t being a 64bit int under 64bit ABI, but the + pre-xopen (default) interfaces require an int, which is 32bits. + + Therefore, Anytime socklen_t is passed by pointer, the libc function + truncates the 64bit socklen_t value by treating it as a 32bit value. + + + Note that some socket calls are allowed to have a NULL pointer for + the socklen arg. +*/ + +inline static int Curl_hp_getsockname(int s, struct sockaddr *name, + socklen_t *namelen) +{ + int rc; + if(namelen) { + int len = *namelen; + rc = getsockname(s, name, &len); + *namelen = len; + } + else + rc = getsockname(s, name, 0); + return rc; +} + +inline static int Curl_hp_getsockopt(int s, int level, int optname, + void *optval, socklen_t *optlen) +{ + int rc; + if(optlen) { + int len = *optlen; + rc = getsockopt(s, level, optname, optval, &len); + *optlen = len; + } + else + rc = getsockopt(s, level, optname, optval, 0); + return rc; +} + +inline static int Curl_hp_accept(int sockfd, struct sockaddr *addr, + socklen_t *addrlen) +{ + int rc; + if(addrlen) { + int len = *addrlen; + rc = accept(sockfd, addr, &len); + *addrlen = len; + } + else + rc = accept(sockfd, addr, 0); + return rc; +} + + +inline static ssize_t Curl_hp_recvfrom(int s, void *buf, size_t len, int flags, + struct sockaddr *from, + socklen_t *fromlen) +{ + ssize_t rc; + if(fromlen) { + int fromlen32 = *fromlen; + rc = recvfrom(s, buf, len, flags, from, &fromlen32); + *fromlen = fromlen32; + } + else { + rc = recvfrom(s, buf, len, flags, from, 0); + } + return rc; +} + +#define getsockname(a,b,c) Curl_hp_getsockname((a),(b),(c)) +#define getsockopt(a,b,c,d,e) Curl_hp_getsockopt((a),(b),(c),(d),(e)) +#define accept(a,b,c) Curl_hp_accept((a),(b),(c)) +#define recvfrom(a,b,c,d,e,f) Curl_hp_recvfrom((a),(b),(c),(d),(e),(f)) + +#endif /* HPUX work-around */ + + #endif /* __SETUP_ONCE_H */ diff --git a/src/win32/areslib.lib b/src/win32/areslib.lib index d4e673e5b..6e7c8a390 100644 Binary files a/src/win32/areslib.lib and b/src/win32/areslib.lib differ