#if !defined(lint) && !defined(SABER)
static char sccsid
[] = "@(#)db_glue.c 4.4 (Berkeley) 6/1/90";
static char rcsid
[] = "$Id: db_glue.c,v 4.9.1.5 1993/11/03 12:26:04 vixie Exp $";
* ++Copyright++ 1986, 1988
* Copyright (c) 1986, 1988
* The Regents of the University of California. All rights reserved.
* 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
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
#include <arpa/nameser.h>
struct valuelist
*next
, *prev
;
} *servicelist
, *protolist
;
while (sp
= getservent()) {
slp
= (struct valuelist
*)malloc(sizeof(struct valuelist
));
slp
->name
= savestr(sp
->s_name
);
slp
->proto
= savestr(sp
->s_proto
);
slp
->port
= ntohs((u_int16_t
)sp
->s_port
);
while (pp
= getprotoent()) {
slp
= (struct valuelist
*)malloc(sizeof(struct valuelist
));
slp
->name
= savestr(pp
->p_name
);
register struct valuelist
**list
;
register struct valuelist
*lp
= *list
;
for (; lp
!= NULL
; lp
= lp
->next
)
if (strcasecmp(lp
->name
, s
) == 0) {
lp
->prev
->next
= lp
->next
;
lp
->next
->prev
= lp
->prev
;
if (sscanf(s
, "%d", &n
) != 1 || n
<= 0)
* Convert service name or (ascii) number to int.
return (findservice(p
, &servicelist
));
* Convert protocol name or (ascii) number to int.
return (findservice(p
, &protolist
));
#if defined(__STDC__) || defined(__GNUC__)
cgetservbyport(u_int16_t port
,
cgetservbyport(port
, proto
)
register struct valuelist
**list
= &servicelist
;
register struct valuelist
*lp
= *list
;
static struct servent serv
;
for (; lp
!= NULL
; lp
= lp
->next
) {
if (port
!= (u_int16_t
)lp
->port
)
if (strcasecmp(lp
->proto
, proto
) == 0) {
lp
->prev
->next
= lp
->next
;
lp
->next
->prev
= lp
->prev
;
serv
.s_port
= htons((u_int16_t
)lp
->port
);
serv
.s_proto
= lp
->proto
;
register struct valuelist
**list
= &protolist
;
register struct valuelist
*lp
= *list
;
static struct protoent prot
;
for (; lp
!= NULL
; lp
= lp
->next
)
lp
->prev
->next
= lp
->next
;
lp
->next
->prev
= lp
->prev
;
pp
= cgetprotobynumber(num
);
(void) sprintf(number
, "%d", num
);
#if defined(__STDC__) || defined(__GNUC__)
servicename(u_int16_t port
, char *proto
)
ss
= cgetservbyport(htons(port
), proto
);
(void) sprintf(number
, "%d", port
);
dprintf(1, (ddt
, "db_getclev of \"%s\"",origin
));
while (origin
&& (origin
= strchr(origin
,'.'))) {
dprintf(1, (ddt
, " = %d\n",lev
));
if (gettimeofday(ttp
, (struct timezone
*)0) < 0)
syslog(LOG_ERR
, "gettimeofday failed: %m");
if ((j
= (int) sysconf(_SC_OPEN_MAX
)) < 0)
syslog(LOG_ERR
, "close(%d) failed: %m", fd
);
dprintf(3, (ddt
, "close(%d) failed: %s\n",
dprintf(3, (ddt
, "close(%d) succeeded\n", fd
));
* Map class names to number
static struct map map_class
[] = {
for (mp
= map_class
; mp
->token
!= NULL
; mp
++)
if (strcasecmp(class, mp
->token
) == 0)
syslog(LOG_ERR
, "fclose(%d) failed: %m", fd
);
dprintf(3, (ddt
, "fclose(%d) failed: %s\n",
dprintf(3, (ddt
, "fclose(%d) succeeded\n", fd
));
* Make a copy of a string and return a pointer to it.
cp
= malloc(strlen(str
) + 1);
syslog(LOG_ERR
, "savestr: %m");
writemsg(rfd
, msg
, msglen
)
u_int16_t len
= htons((u_int16_t
)msglen
);
iov
[0].iov_base
= (caddr_t
)&len
;
iov
[0].iov_len
= sizeof(len
);
iov
[1].iov_base
= (caddr_t
)msg
;
if (writev(rfd
, iov
, 2) != sizeof(len
) + msglen
) {
dprintf(1, (ddt
, "write failed %d\n", errno
));
* remove datum 'dp' from name 'np'. pdp is previous data pointer.
* "next" field from removed datum, suitable for relinking
register struct databuf
*dp
;
register struct namebuf
*np
;
register struct databuf
*pdp
;
register struct databuf
*ndp
= dp
->d_next
;
dprintf(3, (ddt
, "rm_datum(%x, %x, %x) -> %x\n",
dp
, np
->n_data
, pdp
, ndp
));
dprintf(1, (ddt
, "rm_datum: %s rcnt = %d\n",
dp
->d_data
, dp
->d_rcnt
));
dprintf(1, (ddt
, "rm_datum: %08.8X rcnt = %d\n",
*(int32_t*)(dp
->d_data
), dp
->d_rcnt
));
dprintf(1, (ddt
, "rm_datum: rcnt = %d\n", dp
->d_rcnt
));
* remove name 'np' from parent 'pp'. pnp is previous name pointer.
* "next" field from removed name, suitable for relinking
struct namebuf
*np
, **pp
, *pnp
;
struct namebuf
*nnp
= np
->n_next
;
if ( (np
->n_data
&& (msg
= "data"))
|| (np
->n_hash
&& (msg
= "hash"))
"rm_name(%x(%s)): non-nil %s pointer\n",
np
, np
->n_dname
?np
->n_dname
:"Nil", msg
);
"rm_name(%x(%s)): non-nil %s pointer\n",
np
, np
->n_dname
?np
->n_dname
:"Nil", msg
);
* Get the domain name of 'np' and put in 'buf'. Bounds checking is done.
if ((i
= strlen(np
->n_dname
))+1 >= buflen
) {
syslog(LOG_ERR
, "domain name too long: %s...\n", buf
);
strcpy(buf
, "Name_Too_Long");
(void) strcpy(cp
, np
->n_dname
);
* Add data 'dp' to inverse query tables for name 'np'.
register struct invbuf
*ip
;
hval
= dhash(dp
->d_data
, dp
->d_size
);
for (ip
= invtab
[hval
]; ip
!= NULL
; ip
= ip
->i_next
)
for (i
= 0; i
< INVBLKSZ
; i
++)
if (ip
->i_dname
[i
] == NULL
) {
ip
->i_next
= invtab
[hval
];
* Remove data 'odp' from inverse query table.
register struct invbuf
*ip
;
register struct databuf
*dp
;
for (ip
= invtab
[dhash(odp
->d_data
, odp
->d_size
)]; ip
!= NULL
;
for (i
= 0; i
< INVBLKSZ
; i
++) {
if ((np
= ip
->i_dname
[i
]) == NULL
)
for (dp
= np
->n_data
; dp
!= NULL
; dp
= dp
->d_next
) {
ip
->i_dname
[i
] = ip
->i_dname
[i
+1];
* Allocate an inverse query buffer.
register struct invbuf
*ip
;
ip
= (struct invbuf
*) malloc(sizeof(struct invbuf
));
syslog(LOG_ERR
, "saveinv: %m");
bzero((char *)ip
->i_dname
, sizeof(ip
->i_dname
));
* Compute hash value from data.
for (cp
= dp
; --n
>= 0; ) {
return (hval
% INVHASHSZ
);