From ccdaa0b51f8f2343dd038b59dc054b086a72f345 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 16 Feb 2004 15:24:22 +0000 Subject: [PATCH] Make the 'areschannel' get created in the curl_easy_init() and re-use that same channel during the whole curl handle's life until curl_easy_cleanup(). --- lib/hostip.c | 36 ++++++++++++------------------------ lib/url.c | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/lib/hostip.c b/lib/hostip.c index f1583eaed..2e9d530dd 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -469,7 +469,6 @@ CURLcode Curl_is_resolved(struct connectdata *conn, if(conn->async.done) { /* we're done, kill the ares handle */ - ares_destroy(data->state.areschannel); if(!conn->async.dns) return CURLE_COULDNT_RESOLVE_HOST; *dns = conn->async.dns; @@ -536,9 +535,6 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn, /* Operation complete, if the lookup was successful we now have the entry in the cache. */ - /* this destroys the channel and we cannot use it anymore after this */ - ares_destroy(data->state.areschannel); - if(entry) *entry = conn->async.dns; @@ -613,35 +609,27 @@ static Curl_addrinfo *my_getaddrinfo(struct connectdata *conn, int port, int *waitp) { - int rc; char *bufp; struct SessionHandle *data = conn->data; - rc = ares_init(&data->state.areschannel); - *waitp = FALSE; - if(!rc) { - /* only if success */ + bufp = strdup(hostname); - bufp = strdup(hostname); + if(bufp) { + Curl_safefree(conn->async.hostname); + conn->async.hostname = bufp; + conn->async.port = port; + conn->async.done = FALSE; /* not done */ + conn->async.status = 0; /* clear */ + conn->async.dns = NULL; /* clear */ - if(bufp) { - Curl_safefree(conn->async.hostname); - conn->async.hostname = bufp; - conn->async.port = port; - conn->async.done = FALSE; /* not done */ - conn->async.status = 0; /* clear */ - conn->async.dns = NULL; /* clear */ - - ares_gethostbyname(data->state.areschannel, hostname, PF_INET, - host_callback, conn); + /* areschannel is already setup in the Curl_open() function */ + ares_gethostbyname(data->state.areschannel, hostname, PF_INET, + host_callback, conn); - *waitp = TRUE; /* please wait for the response */ - } - else - ares_destroy(data->state.areschannel); + *waitp = TRUE; /* please wait for the response */ } return NULL; /* no struct yet */ diff --git a/lib/url.c b/lib/url.c index aa15ec009..f9181fe60 100644 --- a/lib/url.c +++ b/lib/url.c @@ -233,6 +233,11 @@ CURLcode Curl_close(struct SessionHandle *data) Curl_digest_cleanup(data); +#ifdef USE_ARES + /* this destroys the channel and we cannot use it anymore after this */ + ares_destroy(data->state.areschannel); +#endif + /* No longer a dirty share, if it exists */ if (data->share) data->share->dirty--; @@ -253,6 +258,15 @@ CURLcode Curl_open(struct SessionHandle **curl) memset(data, 0, sizeof(struct SessionHandle)); +#ifdef USE_ARES + if(ARES_SUCCESS != ares_init(&data->state.areschannel)) { + free(data); + return CURLE_FAILED_INIT; + } + /* make sure that all other returns from this function should destroy the + ares channel before returning error! */ +#endif + /* We do some initial setup here, all those fields that can't be just 0 */ data->state.headerbuff=(char*)malloc(HEADERSIZE); @@ -319,7 +333,6 @@ CURLcode Curl_open(struct SessionHandle **curl) data->set.ssl.CAfile = (char *)CURL_CA_BUNDLE; #endif - memset(data->state.connects, 0, sizeof(struct connectdata *)*data->state.numconnects);