resolver: preserve binary compatibility; reduce header pollution

In r289315, I added new fields to res_state.  This broke binary
backward compatibility.  It also broke some ports (and possibly
other code) by requiring the definition of time_t and struct timespec.

Fix these problems by moving the new fields into __res_state_ext.

Suggested by:	ume
Reviewed by:	ume
MFC after:	3 days
Sponsored by:	Dell Inc.
Differential Revision:	https://reviews.freebsd.org/D4472
This commit is contained in:
Eric van Gyzen 2015-12-14 17:21:06 +00:00
parent c6b23b0a46
commit c70540ec67
4 changed files with 30 additions and 25 deletions

View File

@ -57,7 +57,6 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/cdefs.h> #include <sys/cdefs.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/timespec.h>
#include <stdio.h> #include <stdio.h>
#include <arpa/nameser.h> #include <arpa/nameser.h>
@ -177,8 +176,7 @@ struct __res_state {
int res_h_errno; /*%< last one set for this context */ int res_h_errno; /*%< last one set for this context */
int _vcsock; /*%< PRIVATE: for res_send VC i/o */ int _vcsock; /*%< PRIVATE: for res_send VC i/o */
u_int _flags; /*%< PRIVATE: see below */ u_int _flags; /*%< PRIVATE: see below */
u_short reload_period; /*%< seconds between stat(resolv.conf)*/ u_int _pad; /*%< make _u 64 bit aligned */
u_short _pad; /*%< make _u 64 bit aligned */
union { union {
/* On an 32-bit arch this means 512b total. */ /* On an 32-bit arch this means 512b total. */
char pad[72 - 4*sizeof (int) - 3*sizeof (void *)]; char pad[72 - 4*sizeof (int) - 3*sizeof (void *)];
@ -190,8 +188,6 @@ struct __res_state {
} _ext; } _ext;
} _u; } _u;
u_char *_rnd; /*%< PRIVATE: random state */ u_char *_rnd; /*%< PRIVATE: random state */
struct timespec conf_mtim; /*%< mod time of loaded resolv.conf */
time_t conf_stat; /*%< time of last stat(resolv.conf) */
}; };
typedef struct __res_state *res_state; typedef struct __res_state *res_state;

View File

@ -228,7 +228,6 @@ __res_vinit(res_state statp, int preinit) {
statp->pfcode = 0; statp->pfcode = 0;
statp->_vcsock = -1; statp->_vcsock = -1;
statp->_flags = 0; statp->_flags = 0;
statp->reload_period = 2;
statp->qhook = NULL; statp->qhook = NULL;
statp->rhook = NULL; statp->rhook = NULL;
statp->_u._ext.nscount = 0; statp->_u._ext.nscount = 0;
@ -238,6 +237,7 @@ __res_vinit(res_state statp, int preinit) {
statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr; statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr;
strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa"); strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa");
strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int"); strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int");
statp->_u._ext.ext->reload_period = 2;
} else { } else {
/* /*
* Historically res_init() rarely, if at all, failed. * Historically res_init() rarely, if at all, failed.
@ -326,17 +326,13 @@ __res_vinit(res_state statp, int preinit) {
struct stat sb; struct stat sb;
struct timespec now; struct timespec now;
if (_fstat(fileno(fp), &sb) == 0) { if (statp->_u._ext.ext != NULL) {
statp->conf_mtim = sb.st_mtim; if (_fstat(fileno(fp), &sb) == 0) {
if (clock_gettime(CLOCK_MONOTONIC_FAST, &now) == 0) { statp->_u._ext.ext->conf_mtim = sb.st_mtim;
statp->conf_stat = now.tv_sec; if (clock_gettime(CLOCK_MONOTONIC_FAST, &now) == 0) {
} else { statp->_u._ext.ext->conf_stat = now.tv_sec;
statp->conf_stat = 0; }
} }
} else {
statp->conf_mtim.tv_sec = 0;
statp->conf_mtim.tv_nsec = 0;
statp->conf_stat = 0;
} }
/* read the config file */ /* read the config file */
@ -599,9 +595,7 @@ res_setoptions(res_state statp, const char *options, const char *source)
{ {
const char *cp = options; const char *cp = options;
int i; int i;
#ifndef _LIBC
struct __res_state_ext *ext = statp->_u._ext.ext; struct __res_state_ext *ext = statp->_u._ext.ext;
#endif
#ifdef DEBUG #ifdef DEBUG
if (statp->options & RES_DEBUG) if (statp->options & RES_DEBUG)
@ -686,8 +680,10 @@ res_setoptions(res_state statp, const char *options, const char *source)
statp->options |= RES_NOCHECKNAME; statp->options |= RES_NOCHECKNAME;
} else if (!strncmp(cp, "reload-period:", } else if (!strncmp(cp, "reload-period:",
sizeof("reload-period:") - 1)) { sizeof("reload-period:") - 1)) {
statp->reload_period = (u_short) if (ext != NULL) {
atoi(cp + sizeof("reload-period:") - 1); ext->reload_period = (u_short)
atoi(cp + sizeof("reload-period:") - 1);
}
} }
#ifdef RES_USE_EDNS0 #ifdef RES_USE_EDNS0
else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) { else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) {

View File

@ -1,3 +1,5 @@
/* $FreeBSD$ */
#ifndef res_private_h #ifndef res_private_h
#define res_private_h #define res_private_h
@ -12,6 +14,9 @@ struct __res_state_ext {
} sort_list[MAXRESOLVSORT]; } sort_list[MAXRESOLVSORT];
char nsuffix[64]; char nsuffix[64];
char nsuffix2[64]; char nsuffix2[64];
struct timespec conf_mtim; /* mod time of loaded resolv.conf */
time_t conf_stat; /* time of last stat(resolv.conf) */
u_short reload_period; /* seconds between stat(resolv.conf) */
}; };
extern int extern int

View File

@ -37,6 +37,8 @@
#include "reentrant.h" #include "reentrant.h"
#include "un-namespace.h" #include "un-namespace.h"
#include "res_private.h"
#undef _res #undef _res
struct __res_state _res; struct __res_state _res;
@ -66,20 +68,26 @@ res_check_reload(res_state statp)
{ {
struct timespec now; struct timespec now;
struct stat sb; struct stat sb;
struct __res_state_ext *ext;
if ((statp->options & RES_INIT) == 0 || statp->reload_period == 0) { if ((statp->options & RES_INIT) == 0) {
return (statp);
}
ext = statp->_u._ext.ext;
if (ext == NULL || ext->reload_period == 0) {
return (statp); return (statp);
} }
if (clock_gettime(CLOCK_MONOTONIC_FAST, &now) != 0 || if (clock_gettime(CLOCK_MONOTONIC_FAST, &now) != 0 ||
(now.tv_sec - statp->conf_stat) < statp->reload_period) { (now.tv_sec - ext->conf_stat) < ext->reload_period) {
return (statp); return (statp);
} }
statp->conf_stat = now.tv_sec; ext->conf_stat = now.tv_sec;
if (stat(_PATH_RESCONF, &sb) == 0 && if (stat(_PATH_RESCONF, &sb) == 0 &&
(sb.st_mtim.tv_sec != statp->conf_mtim.tv_sec || (sb.st_mtim.tv_sec != ext->conf_mtim.tv_sec ||
sb.st_mtim.tv_nsec != statp->conf_mtim.tv_nsec)) { sb.st_mtim.tv_nsec != ext->conf_mtim.tv_nsec)) {
statp->options &= ~RES_INIT; statp->options &= ~RES_INIT;
} }