Author: vangyzen
Date: Mon Dec 14 17:21:06 2015
New Revision: 292216
URL: https://svnweb.freebsd.org/changeset/base/292216

Log:
  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

Modified:
  head/include/resolv.h
  head/lib/libc/resolv/res_init.c
  head/lib/libc/resolv/res_private.h
  head/lib/libc/resolv/res_state.c

Modified: head/include/resolv.h
==============================================================================
--- head/include/resolv.h       Mon Dec 14 17:08:40 2015        (r292215)
+++ head/include/resolv.h       Mon Dec 14 17:21:06 2015        (r292216)
@@ -57,7 +57,6 @@
 #include <sys/types.h>
 #include <sys/cdefs.h>
 #include <sys/socket.h>
-#include <sys/timespec.h>
 #include <stdio.h>
 #include <arpa/nameser.h>
 
@@ -177,8 +176,7 @@ struct __res_state {
        int     res_h_errno;            /*%< last one set for this context */
        int     _vcsock;                /*%< PRIVATE: for res_send VC i/o */
        u_int   _flags;                 /*%< PRIVATE: see below */
-       u_short reload_period;          /*%< seconds between stat(resolv.conf)*/
-       u_short _pad;                   /*%< make _u 64 bit aligned */
+       u_int   _pad;                   /*%< make _u 64 bit aligned */
        union {
                /* On an 32-bit arch this means 512b total. */
                char    pad[72 - 4*sizeof (int) - 3*sizeof (void *)];
@@ -190,8 +188,6 @@ struct __res_state {
                } _ext;
        } _u;
        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;

Modified: head/lib/libc/resolv/res_init.c
==============================================================================
--- head/lib/libc/resolv/res_init.c     Mon Dec 14 17:08:40 2015        
(r292215)
+++ head/lib/libc/resolv/res_init.c     Mon Dec 14 17:21:06 2015        
(r292216)
@@ -228,7 +228,6 @@ __res_vinit(res_state statp, int preinit
        statp->pfcode = 0;
        statp->_vcsock = -1;
        statp->_flags = 0;
-       statp->reload_period = 2;
        statp->qhook = NULL;
        statp->rhook = NULL;
        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;
                strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa");
                strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int");
+               statp->_u._ext.ext->reload_period = 2;
        } else {
                /*
                 * Historically res_init() rarely, if at all, failed.
@@ -326,17 +326,13 @@ __res_vinit(res_state statp, int preinit
            struct stat sb;
            struct timespec now;
 
-           if (_fstat(fileno(fp), &sb) == 0) {
-               statp->conf_mtim = sb.st_mtim;
-               if (clock_gettime(CLOCK_MONOTONIC_FAST, &now) == 0) {
-                   statp->conf_stat = now.tv_sec;
-               } else {
-                   statp->conf_stat = 0;
-               }
-           } else {
-               statp->conf_mtim.tv_sec = 0;
-               statp->conf_mtim.tv_nsec = 0;
-               statp->conf_stat = 0;
+           if (statp->_u._ext.ext != NULL) {
+               if (_fstat(fileno(fp), &sb) == 0) {
+                   statp->_u._ext.ext->conf_mtim = sb.st_mtim;
+                   if (clock_gettime(CLOCK_MONOTONIC_FAST, &now) == 0) {
+                       statp->_u._ext.ext->conf_stat = now.tv_sec;
+                   }
+               }
            }
 
            /* read the config file */
@@ -599,9 +595,7 @@ res_setoptions(res_state statp, const ch
 {
        const char *cp = options;
        int i;
-#ifndef _LIBC
        struct __res_state_ext *ext = statp->_u._ext.ext;
-#endif
 
 #ifdef DEBUG
        if (statp->options & RES_DEBUG)
@@ -686,8 +680,10 @@ res_setoptions(res_state statp, const ch
                        statp->options |= RES_NOCHECKNAME;
                } else if (!strncmp(cp, "reload-period:",
                                    sizeof("reload-period:") - 1)) {
-                       statp->reload_period = (u_short)
-                               atoi(cp + sizeof("reload-period:") - 1);
+                       if (ext != NULL) {
+                               ext->reload_period = (u_short)
+                                   atoi(cp + sizeof("reload-period:") - 1);
+                       }
                }
 #ifdef RES_USE_EDNS0
                else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) {

Modified: head/lib/libc/resolv/res_private.h
==============================================================================
--- head/lib/libc/resolv/res_private.h  Mon Dec 14 17:08:40 2015        
(r292215)
+++ head/lib/libc/resolv/res_private.h  Mon Dec 14 17:21:06 2015        
(r292216)
@@ -1,3 +1,5 @@
+/* $FreeBSD$ */
+
 #ifndef res_private_h
 #define res_private_h
 
@@ -12,6 +14,9 @@ struct __res_state_ext {
        } sort_list[MAXRESOLVSORT];
        char nsuffix[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

Modified: head/lib/libc/resolv/res_state.c
==============================================================================
--- head/lib/libc/resolv/res_state.c    Mon Dec 14 17:08:40 2015        
(r292215)
+++ head/lib/libc/resolv/res_state.c    Mon Dec 14 17:21:06 2015        
(r292216)
@@ -37,6 +37,8 @@
 #include "reentrant.h"
 #include "un-namespace.h"
 
+#include "res_private.h"
+
 #undef _res
 
 struct __res_state _res;
@@ -66,20 +68,26 @@ res_check_reload(res_state statp)
 {
        struct timespec now;
        struct stat sb;
+       struct __res_state_ext *ext;
+
+       if ((statp->options & RES_INIT) == 0) {
+               return (statp);
+       }
 
-       if ((statp->options & RES_INIT) == 0 || statp->reload_period == 0) {
+       ext = statp->_u._ext.ext;
+       if (ext == NULL || ext->reload_period == 0) {
                return (statp);
        }
 
        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);
        }
 
-       statp->conf_stat = now.tv_sec;
+       ext->conf_stat = now.tv_sec;
        if (stat(_PATH_RESCONF, &sb) == 0 &&
-           (sb.st_mtim.tv_sec  != statp->conf_mtim.tv_sec ||
-            sb.st_mtim.tv_nsec != statp->conf_mtim.tv_nsec)) {
+           (sb.st_mtim.tv_sec  != ext->conf_mtim.tv_sec ||
+            sb.st_mtim.tv_nsec != ext->conf_mtim.tv_nsec)) {
                statp->options &= ~RES_INIT;
        }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to