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:
parent
c6b23b0a46
commit
c70540ec67
@ -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;
|
||||||
|
@ -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)) {
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user