home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1986, 1988 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
- * are met:
- * 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
- * SUCH DAMAGE.
- */
-
- #ifndef lint
- static char sccsid[] = "@(#)db_glue.c 4.4 (Berkeley) 6/1/90";
- #endif /* not lint */
-
- #include <sys/param.h>
- #include <sys/time.h>
- #include <sys/stat.h>
- #include <netinet/in.h>
- #include <stdio.h>
- #include <syslog.h>
- #include <ctype.h>
- #include <netdb.h>
- #include <arpa/nameser.h>
- #include "ns.h"
- #include "db.h"
-
- struct valuelist {
- struct valuelist *next, *prev;
- char *name;
- char *proto;
- short port;
- } *servicelist, *protolist;
-
- buildservicelist()
- {
- struct servent *sp;
- struct valuelist *slp;
-
- setservent(1);
- 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_short)sp->s_port);
- slp->next = servicelist;
- slp->prev = NULL;
- if (servicelist)
- servicelist->prev = slp;
- servicelist = slp;
- }
- endservent();
- }
-
- buildprotolist()
- {
- struct protoent *pp;
- struct valuelist *slp;
-
- setprotoent(1);
- while (pp = getprotoent()) {
- slp = (struct valuelist *)malloc(sizeof(struct valuelist));
- slp->name = savestr(pp->p_name);
- slp->port = pp->p_proto;
- slp->next = protolist;
- slp->prev = NULL;
- if (protolist)
- protolist->prev = slp;
- protolist = slp;
- }
- endprotoent();
- }
-
- /*
- * Convert service name or (ascii) number to int.
- */
- servicenumber(p)
- char *p;
- {
-
- return (findservice(p, &servicelist));
- }
-
- /*
- * Convert protocol name or (ascii) number to int.
- */
- protocolnumber(p)
- char *p;
- {
-
- return (findservice(p, &protolist));
- }
-
- findservice(s, list)
- register char *s;
- register struct valuelist **list;
- {
- register struct valuelist *lp = *list;
- int n;
-
- for (; lp != NULL; lp = lp->next)
- if (strcasecmp(lp->name, s) == 0) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- return(lp->port);
- }
- if (sscanf(s, "%d", &n) != 1 || n <= 0)
- n = -1;
- return(n);
- }
-
- struct servent *
- cgetservbyport(port, proto)
- u_short port;
- char *proto;
- {
- register struct valuelist **list = &servicelist;
- register struct valuelist *lp = *list;
- static struct servent serv;
-
- port = htons(port);
- for (; lp != NULL; lp = lp->next) {
- if (port != lp->port)
- continue;
- if (strcasecmp(lp->proto, proto) == 0) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- serv.s_name = lp->name;
- serv.s_port = htons((u_short)lp->port);
- serv.s_proto = lp->proto;
- return(&serv);
- }
- }
- return(0);
- }
-
- struct protoent *
- cgetprotobynumber(proto)
- register int proto;
- {
-
- register struct valuelist **list = &protolist;
- register struct valuelist *lp = *list;
- static struct protoent prot;
-
- for (; lp != NULL; lp = lp->next)
- if (lp->port == proto) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- prot.p_name = lp->name;
- prot.p_proto = lp->port;
- return(&prot);
- }
- return(0);
- }
-
- char *
- protocolname(num)
- int num;
- {
- static char number[8];
- struct protoent *pp;
-
- pp = cgetprotobynumber(num);
- if(pp == 0) {
- (void) sprintf(number, "%d", num);
- return(number);
- }
- return(pp->p_name);
- }
-
- char *
- servicename(port, proto)
- u_short port;
- char *proto;
- {
- static char number[8];
- struct servent *ss;
-
- ss = cgetservbyport(htons(port), proto);
- if(ss == 0) {
- (void) sprintf(number, "%d", port);
- return(number);
- }
- return(ss->s_name);
- }
-