]> granicus.if.org Git - curl/commitdiff
Make the 'areschannel' get created in the curl_easy_init() and re-use that
authorDaniel Stenberg <daniel@haxx.se>
Mon, 16 Feb 2004 15:24:22 +0000 (15:24 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 16 Feb 2004 15:24:22 +0000 (15:24 +0000)
same channel during the whole curl handle's life until curl_easy_cleanup().

lib/hostip.c
lib/url.c

index f1583eaed7b54ed627d594e9d46048a5a2970c8f..2e9d530ddbb5b68ff7ba2f8bf838d0b5bf418d66 100644 (file)
@@ -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 */
index aa15ec0090c425f2815a808fd21fd9333654a60c..f9181fe60fcfd3d60bde6be15b4e673b44690204 100644 (file)
--- 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);