CURLOPT_DNS_SERVERS: set name servers if possible

This commit is contained in:
Jason Glasgow 2011-04-12 11:34:28 -04:00 committed by Daniel Stenberg
parent 967b2f87a8
commit 8d0a504f0d
7 changed files with 72 additions and 0 deletions

View File

@ -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. and port number must exactly match what was already added previously.
(Added in 7.21.3) (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 .SH SSL and SECURITY OPTIONS
.IP CURLOPT_SSLCERT .IP CURLOPT_SSLCERT
Pass a pointer to a zero terminated string as parameter. The string should be Pass a pointer to a zero terminated string as parameter. The string should be

View File

@ -1486,6 +1486,9 @@ typedef enum {
/* allow GSSAPI credential delegation */ /* allow GSSAPI credential delegation */
CINIT(GSSAPI_DELEGATION, LONG, 210), CINIT(GSSAPI_DELEGATION, LONG, 210),
/* Set the name servers to use for DNS resolution */
CINIT(DNS_SERVERS, OBJECTPOINT, 211),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;

View File

@ -600,4 +600,30 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
} }
return NULL; /* no struct yet */ 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 */ #endif /* CURLRES_ARES */

View File

@ -696,4 +696,13 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
#endif /* !HAVE_GETADDRINFO */ #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 */ #endif /* CURLRES_THREADED */

View File

@ -195,4 +195,9 @@ Curl_cache_addr(struct SessionHandle *data, Curl_addrinfo *addr,
extern sigjmp_buf curl_jmpenv; extern sigjmp_buf curl_jmpenv;
#endif #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 */ #endif /* HEADER_CURL_HOSTIP_H */

View File

@ -66,5 +66,16 @@
**********************************************************************/ **********************************************************************/
#ifdef CURLRES_SYNCH #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 */ #endif /* truly sync */

View File

@ -2531,6 +2531,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
data->set.ssl.authtype = CURL_TLSAUTH_NONE; data->set.ssl.authtype = CURL_TLSAUTH_NONE;
break; break;
#endif #endif
case CURLOPT_DNS_SERVERS:
result = Curl_set_dns_servers(data, va_arg(param, char *));
break;
default: default:
/* unknown tag and its companion, just ignore: */ /* unknown tag and its companion, just ignore: */
result = CURLE_UNKNOWN_OPTION; result = CURLE_UNKNOWN_OPTION;