diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-06-30 20:19:10 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-07-03 21:03:21 +0200 |
commit | a1c4eb8794e789b5055d7ceb13b2b3231abf5e26 (patch) | |
tree | 33fddb61bf0cb074a486dbe6155d0e36dd08ecaf /resolv/nss_dns | |
parent | 3f853f22c87f0b671c0366eb290919719fa56c0e (diff) | |
download | glibc-a1c4eb8794e789b5055d7ceb13b2b3231abf5e26.tar.gz glibc-a1c4eb8794e789b5055d7ceb13b2b3231abf5e26.tar.xz glibc-a1c4eb8794e789b5055d7ceb13b2b3231abf5e26.zip |
resolv: Mirror the entire resolver configuration in struct resolv_conf
This commit adds the remaining unchanging members (which are loaded from /etc/resolv.conf) to struct resolv_conf. The extended name server list is currently not used by the stub resolver. The switch depends on a cleanup: The _u._ext.nssocks array stores just a single socket, and needs to be replaced with a single socket value. (The compatibility gethostname implementation does not use the extended addres sort list, either. Updating the compat code is not worthwhile.)
Diffstat (limited to 'resolv/nss_dns')
-rw-r--r-- | resolv/nss_dns/dns-host.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 9d7ceb1691..7cd54ab504 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -108,7 +108,8 @@ typedef union querybuf u_char buf[MAXPACKET]; } querybuf; -static enum nss_status getanswer_r (const querybuf *answer, int anslen, +static enum nss_status getanswer_r (struct resolv_context *ctx, + const querybuf *answer, int anslen, const char *qname, int qtype, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop, @@ -264,8 +265,9 @@ gethostbyname3_context (struct resolv_context *ctx, result->h_length = INADDRSZ; } - status = getanswer_r (host_buffer.buf, n, name, type, result, buffer, buflen, - errnop, h_errnop, map, ttlp, canonp); + status = getanswer_r + (ctx, host_buffer.buf, n, name, type, result, buffer, buflen, + errnop, h_errnop, map, ttlp, canonp); if (host_buffer.buf != orig_host_buffer) free (host_buffer.buf); return status; @@ -522,8 +524,9 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; } - status = getanswer_r (host_buffer.buf, n, qbuf, T_PTR, result, buffer, buflen, - errnop, h_errnop, 0 /* XXX */, ttlp, NULL); + status = getanswer_r + (ctx, host_buffer.buf, n, qbuf, T_PTR, result, buffer, buflen, + errnop, h_errnop, 0 /* XXX */, ttlp, NULL); if (host_buffer.buf != orig_host_buffer) free (host_buffer.buf); if (status != NSS_STATUS_SUCCESS) @@ -553,25 +556,27 @@ _nss_dns_gethostbyaddr_r (const void *addr, socklen_t len, int af, errnop, h_errnop, NULL); } -static void addrsort (char **ap, int num); - static void -addrsort (char **ap, int num) +addrsort (struct resolv_context *ctx, char **ap, int num) { int i, j; char **p; short aval[MAX_NR_ADDRS]; int needsort = 0; + size_t nsort = __resolv_context_sort_count (ctx); p = ap; if (num > MAX_NR_ADDRS) num = MAX_NR_ADDRS; for (i = 0; i < num; i++, p++) { - for (j = 0 ; (unsigned)j < _res.nsort; j++) - if (_res.sort_list[j].addr.s_addr == - (((struct in_addr *)(*p))->s_addr & _res.sort_list[j].mask)) - break; + for (j = 0 ; (unsigned)j < nsort; j++) + { + struct resolv_sortlist_entry e + = __resolv_context_sort_entry (ctx, j); + if (e.addr.s_addr == (((struct in_addr *)(*p))->s_addr & e.mask)) + break; + } aval[i] = j; if (needsort == 0 && i > 0 && j < aval[i-1]) needsort = i; @@ -598,7 +603,8 @@ addrsort (char **ap, int num) } static enum nss_status -getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, +getanswer_r (struct resolv_context *ctx, + const querybuf *answer, int anslen, const char *qname, int qtype, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop, int map, int32_t *ttlp, char **canonp) { @@ -961,8 +967,9 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, * in its return structures - should give it the "best" * address in that case, not some random one */ - if (_res.nsort && haveanswer > 1 && qtype == T_A) - addrsort (host_data->h_addr_ptrs, haveanswer); + if (haveanswer > 1 && qtype == T_A + && __resolv_context_sort_count (ctx) > 0) + addrsort (ctx, host_data->h_addr_ptrs, haveanswer); if (result->h_name == NULL) { |