db_lookup.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 194 行
C
194 行
#ifndef lintstatic char *sccsid = "@(#)db_lookup.c 4.1 (ULTRIX) 7/2/90";#endif lint/************************************************************************ * * * Copyright (c) 1984-1988 by * * Digital Equipment Corporation, Maynard, MA * * All rights reserved. * * * * This software is furnished under a license and may be used and * * copied only in accordance with the terms of such license and * * with the inclusion of the above copyright notice. This * * software or any other copies thereof may not be provided or * * otherwise made available to any other person. No title to and * * ownership of the software is hereby transferred. * * * * This software is derived from software received from the * * University of California, Berkeley, and from Bell * * Laboratories. Use, duplication, or disclosure is subject to * * restrictions under license agreements with University of * * California and with AT&T. * * * * The information in this software is subject to change without * * notice and should not be construed as a commitment by Digital * * Equipment Corporation. * * * * Digital assumes no responsibility for the use or reliability * * of its software on equipment which is not supplied by Digital. * * * ************************************************************************//* * Copyright (c) 1986 Regents of the University of California * All Rights Reserved *//* * Modification History: * * 18-Jan-88 logcher * Added BIND 4.7.3. * *//* * Table lookup routines. */#include <sys/types.h>#include <stdio.h>#include <arpa/nameser.h>#include "db.h"struct hashbuf *hashtab; /* root hash table */struct hashbuf *fcachetab; /* hash table of cache read from file */#ifdef DEBUGextern int debug;extern FILE *ddt;#endif/* * Lookup 'name' and return a pointer to the namebuf; * NULL otherwise. If 'insert', insert name into tables. * Wildcard lookups are handled. */struct namebuf *nlookup(name, htpp, fname, insert) char *name; struct hashbuf **htpp; char **fname; int insert;{ register struct namebuf *np; register char *cp; register int c; register unsigned hval; register struct hashbuf *htp; struct namebuf *parent = NULL; htp = *htpp; hval = 0; *fname = "???"; for (cp = name; c = *cp++; ) { if (c == '.') { parent = np = nlookup(cp, htpp, fname, insert); if (np == NULL) return (NULL); if (*fname != cp) return (np); if ((htp = np->n_hash) == NULL) { if (!insert) { if (np->n_dname[0] == '*' && np->n_dname[1] == '\0') *fname = name; return (np); } htp = savehash((struct hashbuf *)NULL); np->n_hash = htp; } *htpp = htp; break; } hval <<= HASHSHIFT; hval += c & HASHMASK; } c = *--cp; *cp = '\0'; /* * Lookup this label in current hash table. */ for (np = htp->h_tab[hval % htp->h_size]; np != NULL; np = np->n_next) {#ifdef ALLOW_UPDATES /* Note: at this point, if np->n_data is NULL, we could be in one of two situations: Either we have come across a name for which all the RRs have been (dynamically) deleted, or else we have come across a name which has no RRs associated with it because it is just a place holder (e.g., EDU). In the former case, we would like to delete the namebuf, since it is no longer of use, but in the latter case we need to hold on to it, so future lookups that depend on it don't fail. The only way I can see of doing this is to always leave the namebufs around (although then the memory usage continues to grow whenever names are added, and can never shrink back down completely when all their associated RRs are deleted). */#endif ALLOW_UPDATES if (np->n_hashval == hval && strcasecmp(name, np->n_dname) == 0) { *cp = c; *fname = name; return (np); } } if (!insert) { /* * look for wildcard in this hash table */ hval = ('*' & HASHMASK) % htp->h_size; for (np = htp->h_tab[hval]; np != NULL; np = np->n_next) { if (np->n_dname[0] == '*' && np->n_dname[1] == '\0') { *cp = c; *fname = name; return (np); } } *cp = c; return (parent); } np = savename(name); np->n_parent = parent; np->n_hashval = hval; hval %= htp->h_size; np->n_next = htp->h_tab[hval]; htp->h_tab[hval] = np; /* increase hash table size */ if (++htp->h_cnt > htp->h_size * 2) { *htpp = savehash(htp); if (parent == NULL) { if (htp == hashtab) hashtab = *htpp; else fcachetab = *htpp; } else parent->n_hash = *htpp; htp = *htpp; } *cp = c; *fname = name; return (np);}/* * Does the data record match the class and type? */match(dp, class, type) register struct databuf *dp; register int class, type;{#ifdef DEBUG if (debug >= 5) fprintf(ddt,"match(0x%x, %d, %d) %d, %d\n", dp, class, type, dp->d_class, dp->d_type);#endif if (dp->d_class != class && class != C_ANY) return (0); if (dp->d_type != type && type != T_ANY) return (0); return (1);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?