home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1996 May / PCOnline_05_1996.bin / linux / source / n / bind / bind-4.001 / bind-4~ / bind-4.9.3-BETA9 / named / ns_ncache.c < prev    next >
C/C++ Source or Header  |  1994-07-21  |  4KB  |  153 lines

  1. /**************************************************************************
  2.  * ns_ncache.c
  3.  * author: anant kumar
  4.  * last modification: March 17, 1993
  5.  *
  6.  * implements negative caching
  7.  */
  8.  
  9. #include <sys/param.h>
  10. #include <sys/socket.h>
  11. #include <sys/file.h>
  12. #include <netinet/in.h>
  13. #include <arpa/nameser.h>
  14. #include <syslog.h>
  15. #include <errno.h>
  16. #include <stdio.h>
  17. #include <resolv.h>
  18.  
  19. #include "named.h"
  20.  
  21. #ifdef NCACHE
  22.  
  23. void
  24. cache_n_resp(msg, msglen)
  25.     u_char *msg;
  26.     int msglen;
  27. {
  28.     register struct databuf *dp;
  29.     HEADER *hp;
  30.     u_char *cp;
  31.     char dname[MAXDNAME];
  32.     int n;
  33.     int type, class;
  34.     int Vcode;
  35.     int flags;
  36.  
  37.     nameserIncr(from_addr.sin_addr, nssRcvdNXD);
  38.  
  39.     hp = (HEADER *)msg;
  40.     cp = msg+HFIXEDSZ;
  41.   
  42.     n = dn_expand(msg, msg + msglen, cp, dname, sizeof dname);
  43.     if (n < 0) {
  44.         dprintf(1, (ddt, "Query expand name failed:cache_n_resp\n"));
  45.         hp->rcode = FORMERR;
  46.         return;
  47.     }
  48.     cp += n;
  49.     GETSHORT(type, cp);
  50.     GETSHORT(class, cp);
  51.     dprintf(1, (ddt,
  52.             "ncache: dname %s, type %d, class %d\n",
  53.             dname, type, class));
  54.  
  55. #ifdef VALIDATE
  56.     Vcode = validate(dname, &from_addr, type, class, NULL, 0,
  57.              hp->rcode == NXDOMAIN ? NXDOMAIN : NOERROR_NODATA);
  58.     if (Vcode == INVALID || Vcode == VALID_NO_CACHE) {
  59.         /*Valid_no_cache should never occur but doesn't hurt to check*/
  60.         return;
  61.     }
  62. #endif
  63. #ifdef RETURNSOA
  64.     if (hp->rcode==NXDOMAIN) {
  65.         u_int32_t ttl;
  66.         u_int16_t atype;
  67.         u_char * tp = cp;
  68.         u_char * cp1;
  69.         u_char data[BUFSIZ+MAXDNAME];
  70.         int len = sizeof(data);
  71.  
  72.         /* store ther SOA record */
  73.         if (!hp->nscount) {
  74.         dprintf(3, (ddt, "ncache: nscount == 0\n"));
  75.         return;
  76.         }
  77.         n = dn_skipname(tp, msg + msglen);
  78.         if (n < 0) {
  79.         dprintf(3, (ddt, "ncache: form error\n"));
  80.         return;
  81.         }
  82.         tp += n;
  83.         GETSHORT(atype,tp);        /* type */
  84.         if (atype != T_SOA) {
  85.         dprintf(3, (ddt, "ncache: type (%d) != T_SOA\n",atype));
  86.         return;
  87.         }
  88.         tp += sizeof(u_int16_t);    /* class */
  89.         GETLONG(ttl,tp);        /* ttl */
  90.         tp += sizeof(u_int16_t);    /* dlen */
  91.  
  92.         if ((n = dn_expand(msg, msg + msglen, tp, data, len))
  93.             < 0 ) {
  94.         dprintf(3, (ddt, "ncache: form error 2\n"));
  95.         return;
  96.         }    /* origin */
  97.         tp += n;
  98.         cp1 = data + (n = strlen(data) + 1);
  99.         len -= n;
  100.         if ((n = dn_expand(msg, msg + msglen, tp, cp1, len)) < 0 ) {
  101.         dprintf(3, (ddt, "ncache: form error 2\n"));
  102.         return;
  103.         }    /* mail */
  104.         tp += n;
  105.         n = strlen(cp1) + 1;
  106.         cp1 +=  n;
  107.         len -= n;
  108.         bcopy(tp, cp1, n = 5 * sizeof(u_int32_t));
  109.         /* serial, refresh, retry, expire, min */
  110.         cp1 += n;
  111.         len -= n;
  112.         /* store the zone of the soa record */
  113.         if ((n = dn_expand(msg, msg + msglen, cp, cp1, len)) < 0 ) {
  114.         dprintf(3, (ddt, "ncache: form error 2\n"));
  115.         return;
  116.         }
  117.         n = strlen(cp1) + 1;
  118.         cp1 += n;
  119.  
  120.         dp = savedata(class, T_SOA, MIN(ttl,NTTL)+tt.tv_sec, data,
  121.               cp1 - data);
  122.     } else {
  123. #endif
  124.     dp = savedata(class, type, NTTL+tt.tv_sec, NULL, 0);
  125. #ifdef RETURNSOA
  126.     }
  127. #endif
  128.     dp->d_zone = DB_Z_CACHE;
  129.     dp->d_cred = hp->aa ? DB_C_AUTH : DB_C_ANSWER;
  130.     dp->d_clev = 0;
  131.     if(hp->rcode == NXDOMAIN) {
  132.         dp->d_rcode = NXDOMAIN;
  133.         flags = DB_NODATA|DB_NOTAUTH|DB_NOHINTS;
  134.     } else {
  135.         dp->d_rcode = NOERROR_NODATA;
  136.         flags = DB_NOTAUTH|DB_NOHINTS;
  137.     }
  138.  
  139.     if ((n = db_update(dname,dp,dp,flags,hashtab)) != OK) {
  140.         dprintf(1, (ddt,
  141.               "db_update failed return value:%d, cache_n_resp()\n",
  142.                 n));
  143.         free((char *)dp);
  144.         return;
  145.     }
  146.     dprintf(4, (ddt,
  147.             "ncache succeeded: d:%s, t:%d, c:%d rcode:%d ttl:%d\n",
  148.             dname,type,class,dp->d_rcode, dp->d_ttl-tt.tv_sec));
  149.     return;
  150. }
  151.  
  152. #endif /*NCACHE*/
  153.