* Copyright (c) 1986 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)db_lookup.c 4.18 (Berkeley) 3/21/91";
#include <arpa/nameser.h>
struct hashbuf
*hashtab
; /* root hash table */
struct hashbuf
*fcachetab
; /* hash table of cache read from file */
* Lookup 'name' and return a pointer to the namebuf;
* NULL otherwise. If 'insert', insert name into tables.
* Wildcard lookups are handled.
nlookup(name
, htpp
, fname
, insert
)
register struct namebuf
*np
;
register struct hashbuf
*htp
;
struct namebuf
*parent
= NULL
;
for (cp
= name
; c
= *cp
++; ) {
parent
= np
= nlookup(cp
, htpp
, fname
, insert
);
if ((htp
= np
->n_hash
) == NULL
) {
if (np
->n_dname
[0] == '*' &&
htp
= savehash((struct hashbuf
*)NULL
);
* Lookup this label in current hash table.
for (np
= htp
->h_tab
[hval
% htp
->h_size
]; np
!= NULL
; np
= np
->n_next
) {
if (np
->n_hashval
== hval
&&
strcasecmp(name
, np
->n_dname
) == 0) {
* Look for wildcard in this hash table.
* Don't use a cached "*" name as a wildcard,
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' &&
np
->n_data
&& np
->n_data
->d_zone
!= 0) {
np
->n_next
= htp
->h_tab
[hval
];
/* increase hash table size */
if (++htp
->h_cnt
> htp
->h_size
* 2) {
* Does the data record match the class and type?
register struct databuf
*dp
;
register int class, type
;
fprintf(ddt
,"match(0x%x, %d, %d) %d, %d\n", dp
, class, type
,
dp
->d_class
, dp
->d_type
);
if (dp
->d_class
!= class && class != C_ANY
)
if (dp
->d_type
!= type
&& type
!= T_ANY
)