/* * 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 #include #include #include #include #include #include #include #include #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); }