home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / NETWORK / ISP / bind.4.8.3.lzh / BIND483 / NAMED / db_glue.c < prev    next >
Text File  |  1993-08-24  |  5KB  |  213 lines

  1. /*
  2.  * Copyright (c) 1986, 1988 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted provided
  6.  * that: (1) source distributions retain this entire copyright notice and
  7.  * comment, and (2) distributions including binaries display the following
  8.  * acknowledgement:  ``This product includes software developed by the
  9.  * University of California, Berkeley and its contributors'' in the
  10.  * documentation or other materials provided with the distribution and in
  11.  * all advertising materials mentioning features or use of this software.
  12.  * Neither the name of the University nor the names of its contributors may
  13.  * be used to endorse or promote products derived from this software without
  14.  * specific prior written permission.
  15.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  16.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  17.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  */
  19.  
  20. #ifndef lint
  21. static char sccsid[] = "@(#)db_glue.c    4.4 (Berkeley) 6/1/90";
  22. #endif /* not lint */
  23.  
  24. #include <sys/param.h>
  25. #include <sys/time.h>
  26. #include <sys/stat.h>
  27. #include <netinet/in.h>
  28. #include <stdio.h>
  29. #include <syslog.h>
  30. #include <ctype.h>
  31. #include <netdb.h>
  32. #include <arpa/nameser.h>
  33. #include "ns.h"
  34. #include "db.h"
  35.  
  36. struct valuelist {
  37.     struct valuelist *next, *prev;
  38.     char    *name;
  39.     char    *proto;
  40.     short    port;
  41. } *servicelist, *protolist;
  42.  
  43. buildservicelist()
  44. {
  45.     struct servent *sp;
  46.     struct valuelist *slp;
  47.  
  48.     setservent(1);
  49.     while (sp = getservent()) {
  50.         slp = (struct valuelist *)malloc(sizeof(struct valuelist));
  51.         slp->name = savestr(sp->s_name);
  52.         slp->proto = savestr(sp->s_proto);
  53.         slp->port = ntohs((u_short)sp->s_port);
  54.         slp->next = servicelist;
  55.         slp->prev = NULL;
  56.         if (servicelist)
  57.             servicelist->prev = slp;
  58.         servicelist = slp;
  59.     }
  60.     endservent();
  61. }
  62.  
  63. buildprotolist()
  64. {
  65.     struct protoent *pp;
  66.     struct valuelist *slp;
  67.  
  68.     setprotoent(1);
  69.     while (pp = getprotoent()) {
  70.         slp = (struct valuelist *)malloc(sizeof(struct valuelist));
  71.         slp->name = savestr(pp->p_name);
  72.         slp->port = pp->p_proto;
  73.         slp->next = protolist;
  74.         slp->prev = NULL;
  75.         if (protolist)
  76.             protolist->prev = slp;
  77.         protolist = slp;
  78.     }
  79.     endprotoent();
  80. }
  81.  
  82. /*
  83.  * Convert service name or (ascii) number to int.
  84.  */
  85. servicenumber(p)
  86.     char *p;
  87. {
  88.  
  89.     return (findservice(p, &servicelist));
  90. }
  91.  
  92. /*
  93.  * Convert protocol name or (ascii) number to int.
  94.  */
  95. protocolnumber(p)
  96.     char *p;
  97. {
  98.  
  99.     return (findservice(p, &protolist));
  100. }
  101.  
  102. findservice(s, list)
  103.     register char *s;
  104.     register struct valuelist **list;
  105. {
  106.     register struct valuelist *lp = *list;
  107.     int n;
  108.  
  109.     for (; lp != NULL; lp = lp->next)
  110.         if (strcasecmp(lp->name, s) == 0) {
  111.             if (lp != *list) {
  112.                 lp->prev->next = lp->next;
  113.                 if (lp->next)
  114.                     lp->next->prev = lp->prev;
  115.                 (*list)->prev = lp;
  116.                 lp->next = *list;
  117.                 *list = lp;
  118.             }
  119.             return(lp->port);
  120.         }
  121.     if (sscanf(s, "%d", &n) != 1 || n <= 0)
  122.         n = -1;
  123.     return(n);
  124. }
  125.  
  126. struct servent *
  127. cgetservbyport(port, proto)
  128.     u_short port;
  129.     char *proto;
  130. {
  131.     register struct valuelist **list = &servicelist;
  132.     register struct valuelist *lp = *list;
  133.     static struct servent serv;
  134.  
  135.     port = htons(port);
  136.     for (; lp != NULL; lp = lp->next) {
  137.         if (port != lp->port)
  138.             continue;
  139.         if (strcasecmp(lp->proto, proto) == 0) {
  140.             if (lp != *list) {
  141.                 lp->prev->next = lp->next;
  142.                 if (lp->next)
  143.                     lp->next->prev = lp->prev;
  144.                 (*list)->prev = lp;
  145.                 lp->next = *list;
  146.                 *list = lp;
  147.             }
  148.             serv.s_name = lp->name;
  149.             serv.s_port = htons((u_short)lp->port);
  150.             serv.s_proto = lp->proto;
  151.             return(&serv);
  152.         }
  153.     }
  154.     return(0);
  155. }
  156.  
  157. struct protoent *
  158. cgetprotobynumber(proto)
  159.     register int proto;
  160. {
  161.  
  162.     register struct valuelist **list = &protolist;
  163.     register struct valuelist *lp = *list;
  164.     static struct protoent prot;
  165.  
  166.     for (; lp != NULL; lp = lp->next)
  167.         if (lp->port == proto) {
  168.             if (lp != *list) {
  169.                 lp->prev->next = lp->next;
  170.                 if (lp->next)
  171.                     lp->next->prev = lp->prev;
  172.                 (*list)->prev = lp;
  173.                 lp->next = *list;
  174.                 *list = lp;
  175.             }
  176.             prot.p_name = lp->name;
  177.             prot.p_proto = lp->port;
  178.             return(&prot);
  179.         }
  180.     return(0);
  181. }
  182.  
  183. char *
  184. protocolname(num)
  185.     int num;
  186. {
  187.     static    char number[8];
  188.     struct protoent *pp;
  189.  
  190.     pp = cgetprotobynumber(num);
  191.     if(pp == 0)  {
  192.         (void) sprintf(number, "%d", num);
  193.         return(number);
  194.     }
  195.     return(pp->p_name);
  196. }
  197.  
  198. char *
  199. servicename(port, proto)
  200.     u_short port;
  201.     char *proto;
  202. {
  203.     static    char number[8];
  204.     struct servent *ss;
  205.  
  206.     ss = cgetservbyport(htons(port), proto);
  207.     if(ss == 0)  {
  208.         (void) sprintf(number, "%d", port);
  209.         return(number);
  210.     }
  211.     return(ss->s_name);
  212. }
  213.