summaryrefslogtreecommitdiff
path: root/libc/netbsd/resolv/res_init.c
diff options
context:
space:
mode:
authorMattias Falk <mattias.falk@sonyericsson.com>2011-08-23 14:34:14 +0200
committerRobert Greenwalt <rgreenwalt@google.com>2013-02-07 09:40:16 -0800
commitc63e59039d28c352e3053bb81319e960c392dbd4 (patch)
treef19b68ec83b6e17201473b1ff197d9525e75a664 /libc/netbsd/resolv/res_init.c
parent8db7a4cb20a7e90feb981736c1618f91a27bfff8 (diff)
dns cache per interface iteration 2
name server addresses are read from the dns cache associated wih the interface on which the request shall be done. processes which has requested to issue dns request using specific interface are now proxied to netd. added methods to attach/detach a process to a specific dns cache/interface. added getaddrinfoforinface method which takes an interface as an argument. bug:4815099 bug:5465296 Change-Id: I7a8fe1980cdf99d4d296ddc5c6411f0c72162263
Diffstat (limited to 'libc/netbsd/resolv/res_init.c')
-rw-r--r--libc/netbsd/resolv/res_init.c149
1 files changed, 10 insertions, 139 deletions
diff --git a/libc/netbsd/resolv/res_init.c b/libc/netbsd/resolv/res_init.c
index 56a25afb8..ff6529944 100644
--- a/libc/netbsd/resolv/res_init.c
+++ b/libc/netbsd/resolv/res_init.c
@@ -111,13 +111,6 @@ __RCSID("$NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $");
/* ensure that sockaddr_in6 and IN6ADDR_ANY_INIT are declared / defined */
#ifdef ANDROID_CHANGES
#include "resolv_private.h"
-#define MAX_DNS_PROPERTIES 8
-#define DNS_PROP_NAME_PREFIX "net.dns"
-#define DNS_CHANGE_PROP_NAME "net.dnschange"
-#define DNS_SEARCH_PROP_NAME "net.dns.search"
-static const prop_info *dns_change_prop;
-static int dns_last_change_counter;
-static int _get_dns_change_count();
#else
#include <resolv.h>
#endif
@@ -171,41 +164,6 @@ res_ninit(res_state statp) {
return (__res_vinit(statp, 0));
}
-#ifdef ANDROID_CHANGES
-static int load_domain_search_list(res_state statp) {
- char propvalue[PROP_VALUE_MAX];
- register char *cp, **pp;
-
- if(__system_property_get(DNS_SEARCH_PROP_NAME, propvalue) >= 1) {
- strlcpy(statp->defdname, propvalue, sizeof(statp->defdname));
- if ((cp = strchr(statp->defdname, '\n')) != NULL)
- *cp = '\0';
- cp = statp->defdname;
- pp = statp->dnsrch;
- while ( pp < statp->dnsrch + MAXDNSRCH ) {
- while (*cp == ' ' || *cp == '\t') /* skip leading white space */
- cp++;
- if (*cp == '\0') /* stop if nothing more */
- break;
- *pp++ = cp; /* record this search domain */
- while (*cp) { /* zero-terminate it */
- if (*cp == ' ' || *cp == '\t') {
- *cp++ = '\0';
- break;
- }
- cp++;
- }
- }
- *pp = NULL; /* statp->dnsrch has MAXDNSRCH+1 items */
- if (pp > statp->dnsrch)
- return 1;
- }
- statp->defdname[0] = '\0'; /* no default domain name on Android */
- statp->dnsrch[0] = NULL;
- return 0;
-}
-#endif
-
/* This function has to be reachable by res_data.c but not publicly. */
int
__res_vinit(res_state statp, int preinit) {
@@ -220,12 +178,6 @@ __res_vinit(res_state statp, int preinit) {
char *net;
int dots;
union res_sockaddr_union u[2];
-#ifdef ANDROID_CHANGES
- pid_t mypid = getpid();
- int use_proc_props = 0;
- int found_prop;
- char dnsProperty[PROP_VALUE_MAX];
-#endif
if ((statp->options & RES_INIT) != 0U)
res_ndestroy(statp);
@@ -318,74 +270,8 @@ __res_vinit(res_state statp, int preinit) {
if (nserv > 0)
statp->nscount = nserv;
#endif
-#ifdef ANDROID_CHANGES /* READ FROM SYSTEM PROPERTIES */
- dns_last_change_counter = _get_dns_change_count();
- nserv = 0;
- for(n = 1; n <= MAX_DNS_PROPERTIES && nserv < MAXNS; n++) {
- char propname[PROP_NAME_MAX];
- char propvalue[PROP_VALUE_MAX];
-
- struct addrinfo hints, *ai;
- char sbuf[NI_MAXSERV];
- const size_t minsiz = sizeof(statp->_u._ext.ext->nsaddrs[0]);
-
- /*
- * Check first for process-specific properties, and if those don't
- * exist, try the generic properties.
- */
- found_prop = 0;
- if (n == 1 || use_proc_props) {
- snprintf(propname, sizeof(propname), "%s%d.%d", DNS_PROP_NAME_PREFIX, n, mypid);
- if(__system_property_get(propname, propvalue) < 1) {
- if (use_proc_props) {
- break;
- }
- } else {
- found_prop = 1;
- use_proc_props = 1;
- }
- }
- if (!found_prop) {
- snprintf(propname, sizeof(propname), "%s%d", DNS_PROP_NAME_PREFIX, n);
- if(__system_property_get(propname, propvalue) < 1) {
- break;
- }
- }
-
- cp = propvalue;
-
- while (*cp == ' ' || *cp == '\t')
- cp++;
- cp[strcspn(cp, ";# \t\n")] = '\0';
- if ((*cp != '\0') && (*cp != '\n')) {
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM; /*dummy*/
- hints.ai_flags = AI_NUMERICHOST;
- sprintf(sbuf, "%u", NAMESERVER_PORT);
- if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 &&
- (size_t)ai->ai_addrlen <= minsiz) {
- if (statp->_u._ext.ext != NULL) {
- memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
- ai->ai_addr, ai->ai_addrlen);
- }
- if ((size_t)ai->ai_addrlen <=
- sizeof(statp->nsaddr_list[nserv])) {
- memcpy(&statp->nsaddr_list[nserv],
- ai->ai_addr, ai->ai_addrlen);
- } else {
- statp->nsaddr_list[nserv].sin_family = 0;
- }
- freeaddrinfo(ai);
- nserv++;
- }
- }
- }
-
- /* Add the domain search list */
- havesearch = load_domain_search_list(statp);
-#else /* !ANDROID_CHANGES - IGNORE resolv.conf in Android */
+#ifndef ANDROID_CHANGES /* !ANDROID_CHANGES - IGNORE resolv.conf in Android */
#define MATCH(line, name) \
(!strncmp(line, name, sizeof(name) - 1) && \
(line[sizeof(name) - 1] == ' ' || \
@@ -907,32 +793,17 @@ res_getservers(res_state statp, union res_sockaddr_union *set, int cnt) {
}
#ifdef ANDROID_CHANGES
-static int _get_dns_change_count()
+void res_setiface(res_state statp, const char* iface)
{
- if (dns_change_prop == NULL) {
- dns_change_prop = __system_property_find(DNS_CHANGE_PROP_NAME);
- }
- if (dns_change_prop != NULL) {
- char propvalue[PROP_VALUE_MAX];
- if (__system_property_read(dns_change_prop, NULL, propvalue) >= 1) {
- return atoi(propvalue);
- }
- }
- return -1;
-}
-
-int res_get_dns_changed()
-{
- int change_count;
-
- change_count = _get_dns_change_count();
- if (change_count != dns_last_change_counter) {
- if (change_count != -1) {
- dns_last_change_counter = change_count;
+ if (statp != NULL) {
+ // set interface
+ if (iface && iface[0] != '\0') {
+ int len = sizeof(statp->iface);
+ strncpy(statp->iface, iface, len - 1);
+ statp->iface[len - 1] = '\0';
+ } else {
+ statp->iface[0] = '\0';
}
- return 1;
- } else {
- return 0;
}
}
#endif /* ANDROID_CHANGES */