From cf3301f024dea088612d72a0946273adf4aae902 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Tue, 26 May 2009 18:00:14 +0000 Subject: [PATCH] Make ares_init(), ares_dup() and ares_init_options() return ARES_ENOTINITIALIZED if library initialization has not been performed calling ares_library_init(). --- TODO | 10 ++++++++++ ares.h | 7 +++++-- ares_dup.3 | 7 ++++--- ares_init.3 | 12 +++++++++--- ares_init.c | 3 +++ ares_library_cleanup.3 | 2 +- ares_library_init.c | 11 +++++++++++ ares_private.h | 2 ++ ares_strerror.c | 1 + 9 files changed, 46 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index ade10c7..a042ef7 100644 --- a/TODO +++ b/TODO @@ -6,3 +6,13 @@ ares_gethostbyname - When built to support IPv6, it needs to also support PF_UNSPEC or similar, so that an application can ask for any protocol and then c-ares would return all known resolves and not just explicitly IPv4 _or_ IPv6 resolves. + +ares_process + +- Upon next ABI brakage ares_process() could/should be changed to return 'int' + and return ARES_ENOTINITIALIZED if ares_library_init() has not been called. + +ares_process_fd + +- Upon next ABI brakage ares_process_fd() could/should be changed to return + 'int' and return ARES_ENOTINITIALIZED if library has not been initialized. diff --git a/ares.h b/ares.h index de52a0b..386c0ca 100644 --- a/ares.h +++ b/ares.h @@ -94,9 +94,12 @@ extern "C" { #define ARES_ENONAME 19 #define ARES_EBADHINTS 20 +/* Uninitialized library error code */ +#define ARES_ENOTINITIALIZED 21 + /* ares_library_init error codes */ -#define ARES_ELOADIPHLPAPI 21 -#define ARES_EADDRGETNETWORKPARAMS 22 +#define ARES_ELOADIPHLPAPI 22 +#define ARES_EADDRGETNETWORKPARAMS 23 /* Flag values */ #define ARES_FLAG_USEVC (1 << 0) diff --git a/ares_dup.3 b/ares_dup.3 index cdf5a42..4c866f9 100644 --- a/ares_dup.3 +++ b/ares_dup.3 @@ -1,6 +1,6 @@ .\" $Id$ .\" -.\" Copyright (C) 2007-2008 by Daniel Stenberg +.\" Copyright (C) 2004-2009 by Daniel Stenberg .\" .\" Permission to use, copy, modify, and distribute this .\" software and its documentation for any purpose and without @@ -14,7 +14,7 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" -.TH ARES_DUP 3 "2 Dec 2008" +.TH ARES_DUP 3 "26 May 2009" .SH NAME ares_dup \- Duplicate a resolver channel .SH SYNOPSIS @@ -35,7 +35,8 @@ with additional options set exactly as the \fIsource\fP channel has them configured. .SH SEE ALSO .BR ares_destroy(3), -.BR ares_init(3) +.BR ares_init(3), +.BR ares_library_init(3) .SH AVAILABILITY ares_dup(3) was added in c-ares 1.6.0 .SH AUTHOR diff --git a/ares_init.3 b/ares_init.3 index f7a7b4a..360d639 100644 --- a/ares_init.3 +++ b/ares_init.3 @@ -1,7 +1,7 @@ .\" $Id$ .\" .\" Copyright 1998 by the Massachusetts Institute of Technology. -.\" Copyright (C) 2007-2008 by Daniel Stenberg +.\" Copyright (C) 2004-2009 by Daniel Stenberg .\" .\" Permission to use, copy, modify, and distribute this .\" software and its documentation for any purpose and without @@ -15,7 +15,7 @@ .\" this software for any purpose. It is provided "as is" .\" without express or implied warranty. .\" -.TH ARES_INIT 3 "13 May 2008" +.TH ARES_INIT 3 "26 May 2009" .SH NAME ares_init, ares_init_options \- Initialize a resolver channel .SH SYNOPSIS @@ -184,10 +184,16 @@ A configuration file could not be read. .TP 14 .B ARES_ENOMEM The process's available memory was exhausted. +.TP 14 +.B ARES_ENOTINITIALIZED +c-ares library initialization not yet performed. .SH SEE ALSO .BR ares_destroy(3), -.BR ares_dup(3) +.BR ares_dup(3), +.BR ares_library_init(3) .SH AUTHOR Greg Hudson, MIT Information Systems .br Copyright 1998 by the Massachusetts Institute of Technology. +.br +Copyright (C) 2004-2009 by Daniel Stenberg. diff --git a/ares_init.c b/ares_init.c index 68aae2d..bd29fe9 100644 --- a/ares_init.c +++ b/ares_init.c @@ -129,6 +129,9 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, curl_memlimit(atoi(env)); #endif + if (ares_library_initialized() != ARES_SUCCESS) + return ARES_ENOTINITIALIZED; + channel = malloc(sizeof(struct ares_channeldata)); if (!channel) { *channelptr = NULL; diff --git a/ares_library_cleanup.3 b/ares_library_cleanup.3 index 5665c57..09a1dcc 100644 --- a/ares_library_cleanup.3 +++ b/ares_library_cleanup.3 @@ -52,7 +52,7 @@ conflict with any other thread that is already using these other libraries. .PP Win32/64 application DLLs shall not call \fIares_library_cleanup(3)\fP from the DllMain function. Doing so will produce deadlocks and other problems. -.SH NOTES +.SH AVAILABILITY This function was first introduced in c-ares version 1.6.1 along with the definition of preprocessor symbol \fICARES_HAVE_ARES_LIBRARY_CLEANUP\fP as an indication of the availability of this function. diff --git a/ares_library_init.c b/ares_library_init.c index afae7e2..f7286ad 100644 --- a/ares_library_init.c +++ b/ares_library_init.c @@ -120,3 +120,14 @@ void ares_library_cleanup(void) ares_init_flags = ARES_LIB_INIT_NONE; } + +int ares_library_initialized(void) +{ +#ifdef WIN32 + if (!ares_initialized) + return ARES_ENOTINITIALIZED; +#endif + return ARES_SUCCESS; +} + + diff --git a/ares_private.h b/ares_private.h index f8afd4d..c84a1d0 100644 --- a/ares_private.h +++ b/ares_private.h @@ -310,6 +310,8 @@ int ares__timeadd(struct timeval *now, /* return time offset between now and (future) check, in milliseconds */ long ares__timeoffset(struct timeval *now, struct timeval *check); +/* returns ARES_SUCCESS if library has been initialized */ +int ares_library_initialized(void); void ares__rc4(rc4_key* key,unsigned char *buffer_ptr, int buffer_len); void ares__send_query(ares_channel channel, struct query *query, struct timeval *now); diff --git a/ares_strerror.c b/ares_strerror.c index 6d291ee..597ec64 100644 --- a/ares_strerror.c +++ b/ares_strerror.c @@ -44,6 +44,7 @@ const char *ares_strerror(int code) "Illegal flags specified", "Given hostname is not numeric", "Illegal hints flags specified", + "c-ares library initialization not yet performed", "Error loading iphlpapi.dll", "Could not find GetNetworkParams function" }; -- 2.7.4