summaryrefslogtreecommitdiffstats
path: root/libc
diff options
context:
space:
mode:
authorChung-yih Wang <cywang@google.com>2009-04-09 18:09:50 +0800
committerChung-yih Wang <cywang@google.com>2009-04-13 10:41:17 +0800
commitaeae1f5b6c6cf22c2854e07f11555591c5430607 (patch)
treee11d62b5e4a567c87357bfc952653c5c52658be2 /libc
parent00a18f62a7c97299cea017578ec7ec179215492b (diff)
downloadbionic-aeae1f5b6c6cf22c2854e07f11555591c5430607.zip
bionic-aeae1f5b6c6cf22c2854e07f11555591c5430607.tar.gz
bionic-aeae1f5b6c6cf22c2854e07f11555591c5430607.tar.bz2
Add the domain search list for VPN connection.
The current solution is to read the net.dns.search property, and expand the list during the resolve initialization. In the future, we could implement search list per process. Update: refine the code accordingly. Update: remove unnecessary code. Update: remove the unused variable.
Diffstat (limited to 'libc')
-rw-r--r--libc/netbsd/resolv/res_init.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/libc/netbsd/resolv/res_init.c b/libc/netbsd/resolv/res_init.c
index fc0272c..751603d 100644
--- a/libc/netbsd/resolv/res_init.c
+++ b/libc/netbsd/resolv/res_init.c
@@ -112,6 +112,7 @@ __RCSID("$NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $");
#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"
const prop_info *dns_change_prop;
int dns_last_change_counter;
static int _get_dns_change_count();
@@ -168,6 +169,39 @@ res_ninit(res_state statp) {
return (__res_vinit(statp, 0));
}
+#ifdef ANDROID_CHANGES
+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;
+ }
+ return 0;
+}
+#endif
+
/* This function has to be reachable by res_data.c but not publicly. */
int
__res_vinit(res_state statp, int preinit) {
@@ -344,6 +378,9 @@ __res_vinit(res_state statp, int preinit) {
}
}
}
+
+ /* Add the domain search list */
+ havesearch = load_domain_search_list(statp);
#else /* IGNORE resolv.conf */
#define MATCH(line, name) \
(!strncmp(line, name, sizeof(name) - 1) && \