home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / NETWORK / ISP / bind.4.8.3.lzh / BIND483 / NAMED / db_lookup.c < prev    next >
Text File  |  1993-08-24  |  4KB  |  159 lines

  1. /*
  2.  * Copyright (c) 1986 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted provided
  6.  * that: (1) source distributions retain this entire copyright notice and
  7.  * comment, and (2) distributions including binaries display the following
  8.  * acknowledgement:  ``This product includes software developed by the
  9.  * University of California, Berkeley and its contributors'' in the
  10.  * documentation or other materials provided with the distribution and in
  11.  * all advertising materials mentioning features or use of this software.
  12.  * Neither the name of the University nor the names of its contributors may
  13.  * be used to endorse or promote products derived from this software without
  14.  * specific prior written permission.
  15.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  16.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  17.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  */
  19.  
  20. #ifndef lint
  21. static char sccsid[] = "@(#)db_lookup.c    4.17 (Berkeley) 6/1/90";
  22. #endif /* not lint */
  23.  
  24. /*
  25.  * Table lookup routines.
  26.  */
  27.  
  28. #include <sys/types.h>
  29. #include <stdio.h>
  30. #include <arpa/nameser.h>
  31. #include "db.h"
  32.  
  33. struct hashbuf *hashtab;    /* root hash table */
  34. struct hashbuf *fcachetab;    /* hash table of cache read from file */
  35.  
  36. #ifdef DEBUG
  37. extern int debug;
  38. extern FILE *ddt;
  39. #endif
  40.  
  41. /* 
  42.  * Lookup 'name' and return a pointer to the namebuf;
  43.  * NULL otherwise. If 'insert', insert name into tables.
  44.  * Wildcard lookups are handled.
  45.  */
  46. struct namebuf *
  47. nlookup(name, htpp, fname, insert)
  48.     char *name;
  49.     struct hashbuf **htpp;
  50.     char **fname;
  51.     int insert;
  52. {
  53.     register struct namebuf *np;
  54.     register char *cp;
  55.     register int c;
  56.     register unsigned hval;
  57.     register struct hashbuf *htp;
  58.     struct namebuf *parent = NULL;
  59.  
  60.     htp = *htpp;
  61.     hval = 0;
  62.     *fname = "???";
  63.     for (cp = name; c = *cp++; ) {
  64.         if (c == '.') {
  65.             parent = np = nlookup(cp, htpp, fname, insert);
  66.             if (np == NULL)
  67.                 return (NULL);
  68.             if (*fname != cp)
  69.                 return (np);
  70.             if ((htp = np->n_hash) == NULL) {
  71.                 if (!insert) {
  72.                     if (np->n_dname[0] == '*' && 
  73.                         np->n_dname[1] == '\0')
  74.                         *fname = name;
  75.                     return (np);
  76.                 }
  77.                 htp = savehash((struct hashbuf *)NULL);
  78.                 np->n_hash = htp;
  79.             }
  80.             *htpp = htp;
  81.             break;
  82.         }
  83.         hval <<= HASHSHIFT;
  84.         hval += c & HASHMASK;
  85.     }
  86.     c = *--cp;
  87.     *cp = '\0';
  88.     /*
  89.      * Lookup this label in current hash table.
  90.      */
  91.     for (np = htp->h_tab[hval % htp->h_size]; np != NULL; np = np->n_next) {
  92.         if (np->n_hashval == hval &&
  93.             strcasecmp(name, np->n_dname) == 0) {
  94.             *cp = c;
  95.             *fname = name;
  96.             return (np);
  97.         }
  98.     }
  99.     if (!insert) {
  100.         /*
  101.          * Look for wildcard in this hash table.
  102.          * Don't use a cached "*" name as a wildcard,
  103.          * only authoritative.
  104.          */
  105.         hval = ('*' & HASHMASK)  % htp->h_size;
  106.         for (np = htp->h_tab[hval]; np != NULL; np = np->n_next) {
  107.             if (np->n_dname[0] == '*'  && np->n_dname[1] == '\0' &&
  108.                 np->n_data && np->n_data->d_zone != 0) {
  109.                 *cp = c;
  110.                 *fname = name;
  111.                 return (np);
  112.             }
  113.         }
  114.         *cp = c;
  115.         return (parent);
  116.     }
  117.     np = savename(name);
  118.     np->n_parent = parent;
  119.     np->n_hashval = hval;
  120.     hval %= htp->h_size;
  121.     np->n_next = htp->h_tab[hval];
  122.     htp->h_tab[hval] = np;
  123.     /* increase hash table size */
  124.     if (++htp->h_cnt > htp->h_size * 2) {
  125.         *htpp = savehash(htp);
  126.         if (parent == NULL) {
  127.             if (htp == hashtab)
  128.                 hashtab = *htpp;
  129.             else
  130.                 fcachetab = *htpp;
  131.         }
  132.         else
  133.             parent->n_hash = *htpp;
  134.         htp = *htpp;
  135.     }
  136.     *cp = c;
  137.     *fname = name;
  138.     return (np);
  139. }
  140.  
  141. /*
  142.  * Does the data record match the class and type?
  143.  */
  144. match(dp, class, type)
  145.     register struct databuf *dp;
  146.     register int class, type;
  147. {
  148. #ifdef DEBUG
  149.     if (debug >= 5)
  150.         fprintf(ddt,"match(0x%x, %d, %d) %d, %d\n", dp, class, type,
  151.             dp->d_class, dp->d_type);
  152. #endif
  153.     if (dp->d_class != class && class != C_ANY)
  154.         return (0);
  155.     if (dp->d_type != type && type != T_ANY)
  156.         return (0);
  157.     return (1);
  158. }
  159.