[BACK]Return to res_init.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / resolv

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/resolv/res_init.c between version 1.15.12.1 and 1.16

version 1.15.12.1, 2011/01/09 20:43:29 version 1.16, 2009/01/11 02:46:29
Line 74 
Line 74 
 #if defined(LIBC_SCCS) && !defined(lint)  #if defined(LIBC_SCCS) && !defined(lint)
 #ifdef notdef  #ifdef notdef
 static const char sccsid[] = "@(#)res_init.c    8.1 (Berkeley) 6/7/93";  static const char sccsid[] = "@(#)res_init.c    8.1 (Berkeley) 6/7/93";
 static const char rcsid[] = "Id: res_init.c,v 1.26 2008/12/11 09:59:00 marka Exp";  static const char rcsid[] = "Id: res_init.c,v 1.23 2007/07/09 01:43:23 marka Exp";
 #else  #else
 __RCSID("$NetBSD$");  __RCSID("$NetBSD$");
 #endif  #endif
Line 86  __RCSID("$NetBSD$");
Line 86  __RCSID("$NetBSD$");
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/param.h>  #include <sys/param.h>
 #include <sys/socket.h>  #include <sys/socket.h>
 #include <sys/stat.h>  
 #include <sys/time.h>  #include <sys/time.h>
 #include <sys/event.h>  
   
 #include <netinet/in.h>  #include <netinet/in.h>
 #include <arpa/inet.h>  #include <arpa/inet.h>
Line 99  __RCSID("$NetBSD$");
Line 97  __RCSID("$NetBSD$");
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
 #include <fcntl.h>  
 #include <netdb.h>  #include <netdb.h>
   
 #define HAVE_MD5  
 #include <md5.h>  
   
 #ifndef HAVE_MD5  
 # include "../dst/md5.h"  
 #else  
 # ifdef SOLARIS2  
 #  include <sys/md5.h>  
 # endif  
 #endif  
 #ifndef _MD5_H_  
 # define _MD5_H_ 1      /*%< make sure we do not include rsaref md5.h file */  
 #endif  
   
 #include "port_after.h"  #include "port_after.h"
   
 #if 0  #if 0
Line 159  static u_int32_t net_mask __P((struct in
Line 142  static u_int32_t net_mask __P((struct in
 # define isascii(c) (!(c & 0200))  # define isascii(c) (!(c & 0200))
 #endif  #endif
   
 static struct timespec __res_conf_time;  
 static const struct timespec ts = { 0, 0 };  
   
 /*  /*
  * Resolver state default settings.   * Resolver state default settings.
  */   */
Line 189  static const struct timespec ts = { 0, 0
Line 169  static const struct timespec ts = { 0, 0
  */   */
 int  int
 res_ninit(res_state statp) {  res_ninit(res_state statp) {
           extern int __res_vinit(res_state, int);
   
         return (__res_vinit(statp, 0));          return (__res_vinit(statp, 0));
 }  }
   
Line 208  __res_vinit(res_state statp, int preinit
Line 190  __res_vinit(res_state statp, int preinit
 #endif  #endif
         int dots;          int dots;
         union res_sockaddr_union u[2];          union res_sockaddr_union u[2];
   
         int maxns = MAXNS;          int maxns = MAXNS;
   
         RES_SET_H_ERRNO(statp, 0);          RES_SET_H_ERRNO(statp, 0);
   
         if ((statp->options & RES_INIT) != 0U)  
                 res_ndestroy(statp);  
   
         if (!preinit) {          if (!preinit) {
                 statp->retrans = RES_TIMEOUT;                  statp->retrans = RES_TIMEOUT;
                 statp->retry = RES_DFLRETRY;                  statp->retry = RES_DFLRETRY;
                 statp->options = RES_DEFAULT;                  statp->options = RES_DEFAULT;
                   statp->id = res_randomid();
         }          }
         statp->_rnd = malloc(16);  
         res_rndinit(statp);          if ((statp->options & RES_INIT) != 0U)
         statp->id = res_nrandomid(statp);                  res_ndestroy(statp);
   
         memset(u, 0, sizeof(u));          memset(u, 0, sizeof(u));
 #ifdef USELOOPBACK  #ifdef USELOOPBACK
Line 347  __res_vinit(res_state statp, int preinit
Line 328  __res_vinit(res_state statp, int preinit
   
         nserv = 0;          nserv = 0;
         if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {          if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
             struct stat st;  
             struct kevent kc;  
   
             /* read the config file */              /* read the config file */
             while (fgets(buf, sizeof(buf), fp) != NULL) {              while (fgets(buf, sizeof(buf), fp) != NULL) {
                 /* skip comments */                  /* skip comments */
Line 497  __res_vinit(res_state statp, int preinit
Line 475  __res_vinit(res_state statp, int preinit
 #ifdef RESOLVSORT  #ifdef RESOLVSORT
             statp->nsort = nsort;              statp->nsort = nsort;
 #endif  #endif
             statp->_u._ext.ext->resfd = dup(fileno(fp));  
             (void) fclose(fp);              (void) fclose(fp);
             if (fstat(statp->_u._ext.ext->resfd, &st) != -1)  
                     __res_conf_time = statp->_u._ext.ext->res_conf_time =  
                         st.st_mtimespec;  
             statp->_u._ext.ext->kq = kqueue();  
             (void)fcntl(statp->_u._ext.ext->kq, F_SETFD, FD_CLOEXEC);  
             (void)fcntl(statp->_u._ext.ext->resfd, F_SETFD, FD_CLOEXEC);  
             EV_SET(&kc, statp->_u._ext.ext->resfd, EVFILT_VNODE,  
                 EV_ADD|EV_ENABLE|EV_CLEAR, NOTE_DELETE|NOTE_WRITE| NOTE_EXTEND|  
                 NOTE_ATTRIB|NOTE_LINK|NOTE_RENAME|NOTE_REVOKE, 0, 0);  
             (void)kevent(statp->_u._ext.ext->kq, &kc, 1, NULL, 0, &ts);  
         } else {  
             statp->_u._ext.ext->kq = -1;  
             statp->_u._ext.ext->resfd = -1;  
         }          }
 /*  /*
  * Last chance to get a nameserver.  This should not normally   * Last chance to get a nameserver.  This should not normally
Line 559  __res_vinit(res_state statp, int preinit
Line 523  __res_vinit(res_state statp, int preinit
         if ((cp = getenv("RES_OPTIONS")) != NULL)          if ((cp = getenv("RES_OPTIONS")) != NULL)
                 res_setoptions(statp, cp, "env");                  res_setoptions(statp, cp, "env");
         statp->options |= RES_INIT;          statp->options |= RES_INIT;
         return (statp->res_h_errno);  
 }  
   
 int          return (statp->res_h_errno);
 res_check(res_state statp, struct timespec *mtime)  
 {  
         /*  
          * If the times are equal, then we check if there  
          * was a kevent related to resolv.conf and reload.  
          * If the times are not equal, then we don't bother  
          * to check the kevent, because another thread already  
          * did, loaded and changed the time.  
          */  
         if (timespeccmp(&statp->_u._ext.ext->res_conf_time,  
             &__res_conf_time, ==)) {  
                 struct kevent ke;  
                 if (statp->_u._ext.ext->kq == -1)  
                         goto out;  
   
                 switch (kevent(statp->_u._ext.ext->kq, NULL, 0, &ke, 1, &ts)) {  
                 case 0:  
                 case -1:  
 out:  
                         if (mtime)  
                                 *mtime = __res_conf_time;  
                         return 0;  
                 default:  
                         break;  
                 }  
         }  
         (void)__res_vinit(statp, 0);  
         if (mtime)  
                 *mtime = __res_conf_time;  
         return 1;  
 }  }
   
 static void  static void
Line 740  net_mask(in)  /*!< XXX - should really u
Line 672  net_mask(in)  /*!< XXX - should really u
 }  }
 #endif  #endif
   
 static u_char srnd[16];  
   
 void  
 res_rndinit(res_state statp)  
 {  
         struct timeval now;  
         u_int32_t u32;  
         u_int16_t u16;  
         u_char *rnd = statp->_rnd == NULL ? srnd : statp->_rnd;  
   
         gettimeofday(&now, NULL);  
         u32 = (u_int32_t)now.tv_sec;  
         memcpy(rnd, &u32, 4);  
         u32 = now.tv_usec;  
         memcpy(rnd + 4, &u32, 4);  
         u32 += (u_int32_t)now.tv_sec;  
         memcpy(rnd + 8, &u32, 4);  
         u16 = getpid();  
         memcpy(rnd + 12, &u16, 2);  
 }  
   
 u_int  u_int
 res_nrandomid(res_state statp) {  res_randomid(void) {
         struct timeval now;          struct timeval now;
         u_int16_t u16;  
         MD5_CTX ctx;  
         u_char *rnd = statp->_rnd == NULL ? srnd : statp->_rnd;  
   
         gettimeofday(&now, NULL);          gettimeofday(&now, NULL);
         u16 = (u_int16_t) (now.tv_sec ^ now.tv_usec);          return (0xffff &
         memcpy(rnd + 14, &u16, 2);              ((u_int)now.tv_sec ^ (u_int)now.tv_usec ^ (u_int)getpid()));
 #ifndef HAVE_MD5  
         MD5_Init(&ctx);  
         MD5_Update(&ctx, rnd, 16);  
         MD5_Final(rnd, &ctx);  
 #else  
         MD5Init(&ctx);  
         MD5Update(&ctx, rnd, 16);  
         MD5Final(rnd, &ctx);  
 #endif  
         memcpy(&u16, rnd + 14, 2);  
         return ((u_int) u16);  
 }  }
   
 /*%  /*%
Line 811  res_nclose(res_state statp) {
Line 708  res_nclose(res_state statp) {
 void  void
 res_ndestroy(res_state statp) {  res_ndestroy(res_state statp) {
         res_nclose(statp);          res_nclose(statp);
         if (statp->_u._ext.ext != NULL) {          if (statp->_u._ext.ext != NULL)
                 if (statp->_u._ext.ext->kq != -1)  
                         (void)close(statp->_u._ext.ext->kq);  
                 if (statp->_u._ext.ext->resfd != -1)  
                         (void)close(statp->_u._ext.ext->resfd);  
                 free(statp->_u._ext.ext);                  free(statp->_u._ext.ext);
                 statp->_u._ext.ext = NULL;  
         }  
         if (statp->_rnd != NULL) {  
                 free(statp->_rnd);  
                 statp->_rnd = NULL;  
         }  
         statp->options &= ~RES_INIT;          statp->options &= ~RES_INIT;
           statp->_u._ext.ext = NULL;
 }  }
   
 const char *  const char *

Legend:
Removed from v.1.15.12.1  
changed lines
  Added in v.1.16

CVSweb <webmaster@jp.NetBSD.org>