diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-09-15 10:10:05 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-09-15 10:10:05 +0000 |
commit | d1fe1f22192f27425accde26c562f456d835e74a (patch) | |
tree | 71f5e13d2d55c9d44a2dda0e73abfb4d2875fc70 /resolv | |
parent | dc4f1624fce3d89df08923600837cace1329a88d (diff) | |
download | glibc-d1fe1f22192f27425accde26c562f456d835e74a.tar glibc-d1fe1f22192f27425accde26c562f456d835e74a.tar.gz glibc-d1fe1f22192f27425accde26c562f456d835e74a.tar.bz2 glibc-d1fe1f22192f27425accde26c562f456d835e74a.zip |
Update.
* nscd/aicache.c: Prefer using gethostbyname3_r NSS callback to also
get ttl and canonical name. Use these two values.
* resolv/Versions: Export _nss_dns_gethostbyname3_r from libnss_dns.
* resolv/nss_dns/dns-host.c (getanswer_r): Take two new parameters.
If nonnull fill with TTL and pointer to canonical name respectively.
(_nss_dns_gethostbyaddr_r): Pass NULL in new parameters of getanswer_r.
(_nss_dns_gethostbyname2_r): Just wrapper around
_nss_dns_gethostbyname3_r.
(_nss_dns_gethostbyname3_r): Renamed from _nss_dns_gethostbyname2_r.
Take two new parameters which as passed to getanswer_r.
Diffstat (limited to 'resolv')
-rw-r--r-- | resolv/Versions | 3 | ||||
-rw-r--r-- | resolv/nss_dns/dns-host.c | 31 |
2 files changed, 26 insertions, 8 deletions
diff --git a/resolv/Versions b/resolv/Versions index 0e4fea5e19..2a67677d8e 100644 --- a/resolv/Versions +++ b/resolv/Versions @@ -77,7 +77,7 @@ libresolv { GLIBC_PRIVATE { # Needed in libnss_dns. __ns_name_unpack; __ns_name_ntop; - __ns_get16; + __ns_get16; __ns_get32; __libc_res_nquery; __libc_res_nsearch; } } @@ -85,6 +85,7 @@ libresolv { libnss_dns { GLIBC_PRIVATE { _nss_dns_gethostbyaddr_r; _nss_dns_gethostbyname2_r; + _nss_dns_gethostbyname3_r; _nss_dns_gethostbyname_r; _nss_dns_getnetbyaddr_r; _nss_dns_getnetbyname_r; _nss_dns_getcanonname_r; } diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 91699cc50d..f6a2fa65d6 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -125,12 +125,12 @@ static enum nss_status getanswer_r (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); + int map, int32_t *ttlp, char **canonp); enum nss_status -_nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, +_nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result, char *buffer, size_t buflen, int *errnop, - int *h_errnop) + int *h_errnop, int32_t *ttlp, char **canonp) { union { @@ -211,7 +211,7 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, } status = getanswer_r (host_buffer.buf, n, name, type, result, buffer, buflen, - errnop, h_errnop, map); + errnop, h_errnop, map, ttlp, canonp); if (host_buffer.buf != orig_host_buffer) free (host_buffer.buf); return status; @@ -219,6 +219,16 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, enum nss_status +_nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, + char *buffer, size_t buflen, int *errnop, + int *h_errnop) +{ + return _nss_dns_gethostbyname3_r (name, af, result, buffer, buflen, errnop, + h_errnop, NULL, NULL); +} + + +enum nss_status _nss_dns_gethostbyname_r (const char *name, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop) @@ -355,7 +365,7 @@ _nss_dns_gethostbyaddr_r (const void *addr, socklen_t len, int af, got_it_already: status = getanswer_r (host_buffer.buf, n, qbuf, T_PTR, result, buffer, buflen, - errnop, h_errnop, 0 /* XXX */); + errnop, h_errnop, 0 /* XXX */, NULL, NULL); if (host_buffer.buf != orig_host_buffer) free (host_buffer.buf); if (status != NSS_STATUS_SUCCESS) @@ -439,7 +449,7 @@ addrsort (char **ap, int num) static enum nss_status getanswer_r (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) + int *errnop, int *h_errnop, int map, int32_t *ttlp, char **canonp) { struct host_data { @@ -458,6 +468,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, int (*name_ok) (const char *); u_char packtmp[NS_MAXCDNAME]; int have_to_map = 0; + int32_t ttl = 0; if (__builtin_expect (linebuflen, 0) < 0) { @@ -577,7 +588,9 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, type = ns_get16 (cp); cp += INT16SZ; /* type */ class = ns_get16 (cp); - cp += INT16SZ + INT32SZ; /* class, TTL */ + cp += INT16SZ; /* class */ + ttl = ns_get32 (cp); + cp += INT32SZ; /* TTL */ n = ns_get16 (cp); cp += INT16SZ; /* len */ if (class != C_IN) @@ -749,6 +762,10 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, { register int nn; + if (ttlp != NULL && ttl != 0) + *ttlp = ttl; + if (canonp != NULL) + *canonp = bp; result->h_name = bp; nn = strlen (bp) + 1; /* for the \0 */ bp += nn; |