aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2004-02-16 15:24:22 +0000
committerDaniel Stenberg <daniel@haxx.se>2004-02-16 15:24:22 +0000
commitccdaa0b51f8f2343dd038b59dc054b086a72f345 (patch)
tree7bcf58ecaa0e0f3ed3d87d765403e42c7cf81584
parentf5167349412920376b3404a5e0692348c1c01a53 (diff)
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().
-rw-r--r--lib/hostip.c36
-rw-r--r--lib/url.c15
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);