Home | History | Annotate | Download | only in BsdSocketLib
      1 /*-
      2  * Copyright (c) 1994, Garrett Wollman
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND
     14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     23  * SUCH DAMAGE.
     24  */
     25 
     26 #if defined(LIBC_SCCS) && !defined(lint)
     27 static char sccsid[] = "@(#)$Id: getnetbynis.c,v 1.1.1.1 2003/11/19 01:51:28 kyu3 Exp $";
     28 static char rcsid[] = "$Id: getnetbynis.c,v 1.1.1.1 2003/11/19 01:51:28 kyu3 Exp $";
     29 #endif /* LIBC_SCCS and not lint */
     30 
     31 #include <sys/param.h>
     32 #include <sys/socket.h>
     33 #include <netinet/in.h>
     34 #include <arpa/inet.h>
     35 #include <netdb.h>
     36 #include <stdio.h>
     37 #include <stdlib.h>
     38 #include <ctype.h>
     39 #include <errno.h>
     40 #include <string.h>
     41 #include <arpa/nameser.h>
     42 #ifdef YP
     43 #include <rpc/rpc.h>
     44 #include <rpcsvc/yp_prot.h>
     45 #include <rpcsvc/ypclnt.h>
     46 #endif
     47 
     48 #define	MAXALIASES	35
     49 #define	MAXADDRS	35
     50 
     51 #ifdef YP
     52 static char *host_aliases[MAXALIASES];
     53 #endif /* YP */
     54 
     55 static struct netent *
     56 _getnetbynis(const char *name, char *map, int af)
     57 {
     58 #ifdef YP
     59 	register char *cp, **q;
     60 	static char *result;
     61 	int resultlen;
     62 	static struct netent h;
     63 	static char *domain = (char *)NULL;
     64 	static char ypbuf[YPMAXRECORD + 2];
     65 
     66 	switch(af) {
     67 	case AF_INET:
     68 		break;
     69 	default:
     70 	case AF_INET6:
     71 		errno = EAFNOSUPPORT;
     72 		return NULL;
     73 	}
     74 
     75 	if (domain == (char *)NULL)
     76 		if (yp_get_default_domain (&domain))
     77 			return (NULL);
     78 
     79 	if (yp_match(domain, map, name, strlen(name), &result, &resultlen))
     80 		return (NULL);
     81 
     82 	bcopy((char *)result, (char *)&ypbuf, resultlen);
     83 	ypbuf[resultlen] = '\0';
     84 	free(result);
     85 	result = (char *)&ypbuf;
     86 
     87 	if ((cp = index(result, '\n')))
     88 		*cp = '\0';
     89 
     90 	cp = strpbrk(result, " \t");
     91 	*cp++ = '\0';
     92 	h.n_name = result;
     93 
     94 	while (*cp == ' ' || *cp == '\t')
     95 		cp++;
     96 
     97 	h.n_net = inet_network(cp);
     98 	h.n_addrtype = AF_INET;
     99 
    100 	q = h.n_aliases = host_aliases;
    101 	cp = strpbrk(cp, " \t");
    102 	if (cp != NULL)
    103 		*cp++ = '\0';
    104 	while (cp && *cp) {
    105 		if (*cp == ' ' || *cp == '\t') {
    106 			cp++;
    107 			continue;
    108 		}
    109 		if (q < &host_aliases[MAXALIASES - 1])
    110 			*q++ = cp;
    111 		cp = strpbrk(cp, " \t");
    112 		if (cp != NULL)
    113 			*cp++ = '\0';
    114 	}
    115 	*q = NULL;
    116 	return (&h);
    117 #else
    118 	return (NULL);
    119 #endif
    120 }
    121 
    122 struct netent *
    123 _getnetbynisname(const char *name)
    124 {
    125 	return _getnetbynis(name, "networks.byname", AF_INET);
    126 }
    127 
    128 struct netent *
    129 _getnetbynisaddr(unsigned long addr, int af)
    130 {
    131 	char *str, *cp;
    132 	unsigned long net2;
    133 	int nn;
    134 	unsigned int netbr[4];
    135 	char buf[MAXDNAME];
    136 
    137 	if (af != AF_INET) {
    138 		errno = EAFNOSUPPORT;
    139 		return (NULL);
    140 	}
    141 
    142         for (nn = 4, net2 = addr; net2; net2 >>= 8) {
    143                 netbr[--nn] = net2 & 0xff;
    144 	}
    145 
    146 	switch (nn) {
    147 	case 3:		/* Class A */
    148 		sprintf(buf, "%u", netbr[3]);
    149 		break;
    150         case 2:		/* Class B */
    151 		sprintf(buf, "%u.%u", netbr[2], netbr[3]);
    152 		break;
    153         case 1:		/* Class C */
    154 		sprintf(buf, "%u.%u.%u", netbr[1], netbr[2], netbr[3]);
    155                 break;
    156         case 0:		/* Class D - E */
    157 		sprintf(buf, "%u.%u.%u.%u", netbr[0], netbr[1],
    158 			netbr[2], netbr[3]);
    159 		break;
    160 	}
    161 
    162 	str = (char *)&buf;
    163 	cp = str + (strlen(str) - 2);
    164 
    165 	while(!strcmp(cp, ".0")) {
    166 		*cp = '\0';
    167 		cp = str + (strlen(str) - 2);
    168 	}
    169 
    170 	return _getnetbynis(str, "networks.byaddr", af);
    171 }
    172