cURL / Mailing Lists / curl-library / Single Mail

curl-library

RFC: Add some c-ares integration for binding to IP/Iface.

From: Ben Greear <greearb_at_candelatech.com>
Date: Mon, 03 Dec 2012 15:06:20 -0800

These patches have been in my tree for a long time...I'm hoping to
get them cleaned up properly and pushed upstream.

I know that the numbers need to change to be consecutive with the
current upstream code.

Aside from that, what sorts of changes are needed? I'll send
as a real git patch when it is closer to right.

Thanks,
Ben

diff --git a/include/curl/curl.h b/include/curl/curl.h
index 5b39a24..bdcc745 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -1536,7 +1536,23 @@ typedef enum {
    /* set the SMTP auth originator */
    CINIT(MAIL_AUTH, OBJECTPOINT, 217),

+ /* Set the interface string for c-ares (DNS)
+ * to use as outgoing network interface */
+ CINIT(DNS_INTERFACE, OBJECTPOINT, 2011),
+
+ /* Set the local IPv4 address for c-ares (DNS)
+ * to use for outgoing connections.
+ * Host-byte-order.
+ */
+ CINIT(DNS_LOCAL_IP4, LONG, 2012),
+
+ /* Set the local IPv6 address for c-ares (DNS)
+ * to use for outgoing connections.
+ * 16-byte unsigned char*
+ */
+ CINIT(DNS_LOCAL_IP6, OBJECTPOINT, 2013),
+
    CURLOPT_LASTENTRY /* the last unused */
  } CURLoption;

diff --git a/lib/url.c b/lib/url.c
index a781798..0fa965f 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -80,6 +80,10 @@ void idn_free (void *ptr);
  int curl_win32_idn_to_ascii(const char *in, char **out);
  #endif /* USE_LIBIDN */

+#ifdef USE_ARES
+#include "ares.h"
+#endif
+
  #include "urldata.h"
  #include "netrc.h"

@@ -854,6 +858,39 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
      arg = va_arg(param, long);
      data->set.global_dns_cache = (0 != arg)?TRUE:FALSE;
      break;
+
+#ifdef USE_ARES
+ case CURLOPT_DNS_INTERFACE:
+ /*
+ * Set what interface or address/hostname to bind the socket to when
+ * performing DNS operations.
+ */
+ ares_set_local_dev((ares_channel)data->state.resolver,
+ va_arg(param, char *));
+ break;
+ case CURLOPT_DNS_LOCAL_IP4:
+ /*
+ * Set the IPv4 source address for DNS operations.
+ */
+ ares_set_local_ip4((ares_channel)data->state.resolver,
+ va_arg(param, uint32_t));
+ break;
+ case CURLOPT_DNS_LOCAL_IP6:
+ /*
+ * Set the IPv6 source address for DNS operations.
+ */
+ ares_set_local_ip6((ares_channel)data->state.resolver,
+ va_arg(param, unsigned char*));
+ break;
+#else
+ case CURLOPT_DNS_INTERFACE:
+ case CURLOPT_DNS_LOCAL_IP4:
+ case CURLOPT_DNS_LOCAL_IP6:
+ /* TODO: Should we return an error here, or just silently do nothing? */
+ result = CURLE_FAILED_INIT;
+ break;
+#endif
+
    case CURLOPT_SSL_CIPHER_LIST:
      /* set a list of cipher we want to use in the SSL connection */
      result = setstropt(&data->set.str[STRING_SSL_CIPHER_LIST],

-- 
Ben Greear <greearb_at_candelatech.com>
Candela Technologies Inc  http://www.candelatech.com
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html
Received on 2012-12-04