Skip to content

Commit

Permalink
CURLOPT_DNS_SERVERS: set name servers if possible
Browse files Browse the repository at this point in the history
  • Loading branch information
Jason Glasgow authored and bagder committed Nov 17, 2011
1 parent 967b2f8 commit 8d0a504
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 0 deletions.
14 changes: 14 additions & 0 deletions docs/libcurl/curl_easy_setopt.3
Expand Up @@ -2045,6 +2045,20 @@ resolves, by including a string in the linked list that uses the format
and port number must exactly match what was already added previously.

(Added in 7.21.3)
.IP CURLOPT_DNS_SERVERS
Set the list of DNS servers to be used instead of the system default.
The format of the dns servers option is:

host[:port][,host[:port]]...

For example:

192.168.1.100,192.168.1.101,3.4.5.6

This option requires that libcurl was built with a resolver backend that
supports this operation. The c-ares backend is the only such one.

(Added in 7.24.0)
.SH SSL and SECURITY OPTIONS
.IP CURLOPT_SSLCERT
Pass a pointer to a zero terminated string as parameter. The string should be
Expand Down
3 changes: 3 additions & 0 deletions include/curl/curl.h
Expand Up @@ -1486,6 +1486,9 @@ typedef enum {
/* allow GSSAPI credential delegation */
CINIT(GSSAPI_DELEGATION, LONG, 210),

/* Set the name servers to use for DNS resolution */
CINIT(DNS_SERVERS, OBJECTPOINT, 211),

CURLOPT_LASTENTRY /* the last unused */
} CURLoption;

Expand Down
26 changes: 26 additions & 0 deletions lib/asyn-ares.c
Expand Up @@ -600,4 +600,30 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
}
return NULL; /* no struct yet */
}

CURLcode Curl_set_dns_servers(struct SessionHandle *data,
char *servers)
{
CURLcode result = CURLE_NOT_BUILT_IN;
#if (ARES_VERSION >= 0x010704)
int ares_result = ares_set_servers_csv(data->state.resolver, servers);
switch(ares_result) {
case ARES_SUCCESS:
break;
case ARES_ENOMEM:
result = CURLE_OUT_OF_MEMORY;
break;
case ARES_ENOTINITIALIZED:
case ARES_ENODATA:
case ARES_EBADSTR:
default:
result = CURLE_BAD_FUNCTION_ARGUMENT;
break;
}
#else /* too old c-ares version! */
(void)data;
(void)servers;
#endif
return result;
}
#endif /* CURLRES_ARES */
9 changes: 9 additions & 0 deletions lib/asyn-thread.c
Expand Up @@ -696,4 +696,13 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,

#endif /* !HAVE_GETADDRINFO */

CURLcode Curl_set_dns_servers(struct SessionHandle *data,
char *servers)
{
(void)data;
(void)servers;
return CURLE_NOT_BUILT_IN;

}

#endif /* CURLRES_THREADED */
5 changes: 5 additions & 0 deletions lib/hostip.h
Expand Up @@ -195,4 +195,9 @@ Curl_cache_addr(struct SessionHandle *data, Curl_addrinfo *addr,
extern sigjmp_buf curl_jmpenv;
#endif

/*
* Function provided by the resolver backend to set DNS servers to use.
*/
CURLcode Curl_set_dns_servers(struct SessionHandle *data, char *servers);

#endif /* HEADER_CURL_HOSTIP_H */
11 changes: 11 additions & 0 deletions lib/hostsyn.c
Expand Up @@ -66,5 +66,16 @@
**********************************************************************/
#ifdef CURLRES_SYNCH

/*
* Function provided by the resolver backend to set DNS servers to use.
*/
CURLcode Curl_set_dns_servers(struct SessionHandle *data,
char *servers)
{
(void)data;
(void)servers;
return CURLE_NOT_BUILT_IN;

}

#endif /* truly sync */
4 changes: 4 additions & 0 deletions lib/url.c
Expand Up @@ -2531,6 +2531,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
data->set.ssl.authtype = CURL_TLSAUTH_NONE;
break;
#endif
case CURLOPT_DNS_SERVERS:
result = Curl_set_dns_servers(data, va_arg(param, char *));
break;

default:
/* unknown tag and its companion, just ignore: */
result = CURLE_UNKNOWN_OPTION;
Expand Down

0 comments on commit 8d0a504

Please sign in to comment.