xref: /freebsd/lib/libc/net/getnetnamadr.c (revision 1363f04ce1b83359b8e4f3fbde56a6ebcee57209)
11363f04cSPaul Traina /*-
21363f04cSPaul Traina  * Copyright (c) 1994, Garrett Wollman
31363f04cSPaul Traina  *
41363f04cSPaul Traina  * Redistribution and use in source and binary forms, with or without
51363f04cSPaul Traina  * modification, are permitted provided that the following conditions
61363f04cSPaul Traina  * are met:
71363f04cSPaul Traina  * 1. Redistributions of source code must retain the above copyright
81363f04cSPaul Traina  *    notice, this list of conditions and the following disclaimer.
91363f04cSPaul Traina  * 2. Redistributions in binary form must reproduce the above copyright
101363f04cSPaul Traina  *    notice, this list of conditions and the following disclaimer in the
111363f04cSPaul Traina  *    documentation and/or other materials provided with the distribution.
121363f04cSPaul Traina  *
131363f04cSPaul Traina  * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND
141363f04cSPaul Traina  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
151363f04cSPaul Traina  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
161363f04cSPaul Traina  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
171363f04cSPaul Traina  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
181363f04cSPaul Traina  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
191363f04cSPaul Traina  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
201363f04cSPaul Traina  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
211363f04cSPaul Traina  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
221363f04cSPaul Traina  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
231363f04cSPaul Traina  * SUCH DAMAGE.
241363f04cSPaul Traina  */
251363f04cSPaul Traina 
261363f04cSPaul Traina #if defined(LIBC_SCCS) && !defined(lint)
271363f04cSPaul Traina static char sccsid[] = "@(#)$Id$";
281363f04cSPaul Traina static char rcsid[] = "$Id$";
291363f04cSPaul Traina #endif /* LIBC_SCCS and not lint */
301363f04cSPaul Traina 
311363f04cSPaul Traina #include <sys/param.h>
321363f04cSPaul Traina #include <sys/socket.h>
331363f04cSPaul Traina #include <netinet/in.h>
341363f04cSPaul Traina #include <arpa/inet.h>
351363f04cSPaul Traina #include <netdb.h>
361363f04cSPaul Traina #include <stdio.h>
371363f04cSPaul Traina #include <ctype.h>
381363f04cSPaul Traina #include <errno.h>
391363f04cSPaul Traina #include <string.h>
401363f04cSPaul Traina 
411363f04cSPaul Traina extern struct netent * _getnetbyhtname  __P((const char *));
421363f04cSPaul Traina extern struct netent * _getnetbydnsname __P((const char *));
431363f04cSPaul Traina extern struct netent * _getnetbynisname __P((const char *));
441363f04cSPaul Traina extern struct netent * _getnetbyhtaddr  __P((long, int));
451363f04cSPaul Traina extern struct netent * _getnetbydnsaddr __P((long, int));
461363f04cSPaul Traina extern struct netent * _getnetbynisaddr __P((long, int));
471363f04cSPaul Traina 
481363f04cSPaul Traina #define _PATH_NETCONF	"/etc/net.conf"
491363f04cSPaul Traina 
501363f04cSPaul Traina enum service_type {
511363f04cSPaul Traina   SERVICE_NONE = 0,
521363f04cSPaul Traina   SERVICE_BIND,
531363f04cSPaul Traina   SERVICE_TABLE,
541363f04cSPaul Traina   SERVICE_NIS };
551363f04cSPaul Traina #define SERVICE_MAX	SERVICE_NIS
561363f04cSPaul Traina 
571363f04cSPaul Traina static struct {
581363f04cSPaul Traina   const char *name;
591363f04cSPaul Traina   enum service_type type;
601363f04cSPaul Traina } service_names[] = {
611363f04cSPaul Traina   { "nets", SERVICE_TABLE },
621363f04cSPaul Traina   { "/etc/nets", SERVICE_TABLE },
631363f04cSPaul Traina   { "nettable", SERVICE_TABLE },
641363f04cSPaul Traina   { "ntable", SERVICE_TABLE },
651363f04cSPaul Traina   { "bind", SERVICE_BIND },
661363f04cSPaul Traina   { "dns", SERVICE_BIND },
671363f04cSPaul Traina   { "domain", SERVICE_BIND },
681363f04cSPaul Traina   { "yp", SERVICE_NIS },
691363f04cSPaul Traina   { "yellowpages", SERVICE_NIS },
701363f04cSPaul Traina   { "nis", SERVICE_NIS },
711363f04cSPaul Traina   { 0, SERVICE_NONE }
721363f04cSPaul Traina };
731363f04cSPaul Traina 
741363f04cSPaul Traina static enum service_type service_order[SERVICE_MAX + 1];
751363f04cSPaul Traina static int service_done = 0;
761363f04cSPaul Traina 
771363f04cSPaul Traina static enum service_type
781363f04cSPaul Traina get_service_name(const char *name) {
791363f04cSPaul Traina 	int i;
801363f04cSPaul Traina 	for(i = 0; service_names[i].type != SERVICE_NONE; i++) {
811363f04cSPaul Traina 		if(!strcasecmp(name, service_names[i].name)) {
821363f04cSPaul Traina 			return service_names[i].type;
831363f04cSPaul Traina 		}
841363f04cSPaul Traina 	}
851363f04cSPaul Traina 	return SERVICE_NONE;
861363f04cSPaul Traina }
871363f04cSPaul Traina 
881363f04cSPaul Traina static void
891363f04cSPaul Traina init_services()
901363f04cSPaul Traina {
911363f04cSPaul Traina 	char *cp, buf[BUFSIZ];
921363f04cSPaul Traina 	register int cc = 0;
931363f04cSPaul Traina 	FILE *fd;
941363f04cSPaul Traina 
951363f04cSPaul Traina 	if ((fd = (FILE *)fopen(_PATH_NETCONF, "r")) == NULL) {
961363f04cSPaul Traina 				/* make some assumptions */
971363f04cSPaul Traina 		service_order[0] = SERVICE_TABLE;
981363f04cSPaul Traina 		service_order[1] = SERVICE_NONE;
991363f04cSPaul Traina 	} else {
1001363f04cSPaul Traina 		while (fgets(buf, BUFSIZ, fd) != NULL && cc < SERVICE_MAX) {
1011363f04cSPaul Traina 			if(buf[0] == '#')
1021363f04cSPaul Traina 				continue;
1031363f04cSPaul Traina 
1041363f04cSPaul Traina 			cp = strtok(buf, "\n \t,:;");
1051363f04cSPaul Traina 			do {
1061363f04cSPaul Traina 				if(!isalpha(cp[0])) continue;
1071363f04cSPaul Traina 				service_order[cc] = get_service_name(buf);
1081363f04cSPaul Traina 				if(service_order[cc] != SERVICE_NONE)
1091363f04cSPaul Traina 					cc++;
1101363f04cSPaul Traina 			} while((cp = strtok((char *)0, "\n \t,:;"))
1111363f04cSPaul Traina 				&& (cc < SERVICE_MAX));
1121363f04cSPaul Traina 		}
1131363f04cSPaul Traina 		service_order[cc] = SERVICE_NONE;
1141363f04cSPaul Traina 		fclose(fd);
1151363f04cSPaul Traina 	}
1161363f04cSPaul Traina 	service_done = 1;
1171363f04cSPaul Traina }
1181363f04cSPaul Traina 
1191363f04cSPaul Traina struct netent *
1201363f04cSPaul Traina getnetbyname(const char *name)
1211363f04cSPaul Traina {
1221363f04cSPaul Traina 	struct netent *hp = 0;
1231363f04cSPaul Traina 	int nserv = 0;
1241363f04cSPaul Traina 
1251363f04cSPaul Traina 	if (!service_done)
1261363f04cSPaul Traina 		init_services();
1271363f04cSPaul Traina 
1281363f04cSPaul Traina 	while (!hp) {
1291363f04cSPaul Traina 		switch (service_order[nserv]) {
1301363f04cSPaul Traina 		      case SERVICE_NONE:
1311363f04cSPaul Traina 			return NULL;
1321363f04cSPaul Traina 		      case SERVICE_TABLE:
1331363f04cSPaul Traina 			hp = _getnetbyhtname(name);
1341363f04cSPaul Traina 			break;
1351363f04cSPaul Traina 		      case SERVICE_BIND:
1361363f04cSPaul Traina 			hp = _getnetbydnsname(name);
1371363f04cSPaul Traina 			break;
1381363f04cSPaul Traina 		      case SERVICE_NIS:
1391363f04cSPaul Traina 			hp = _getnetbynisname(name);
1401363f04cSPaul Traina 			break;
1411363f04cSPaul Traina 		}
1421363f04cSPaul Traina 		nserv++;
1431363f04cSPaul Traina 	}
1441363f04cSPaul Traina 	return hp;
1451363f04cSPaul Traina }
1461363f04cSPaul Traina 
1471363f04cSPaul Traina struct netent *
1481363f04cSPaul Traina getnetbyaddr(addr, type)
1491363f04cSPaul Traina 	long addr;
1501363f04cSPaul Traina 	int type;
1511363f04cSPaul Traina {
1521363f04cSPaul Traina 	struct netent *hp = 0;
1531363f04cSPaul Traina 	int nserv = 0;
1541363f04cSPaul Traina 
1551363f04cSPaul Traina 	if (!service_done)
1561363f04cSPaul Traina 		init_services();
1571363f04cSPaul Traina 
1581363f04cSPaul Traina 	while (!hp) {
1591363f04cSPaul Traina 		switch (service_order[nserv]) {
1601363f04cSPaul Traina 		      case SERVICE_NONE:
1611363f04cSPaul Traina 			return 0;
1621363f04cSPaul Traina 		      case SERVICE_TABLE:
1631363f04cSPaul Traina 			hp = _getnetbyhtaddr(addr, type);
1641363f04cSPaul Traina 			break;
1651363f04cSPaul Traina 		      case SERVICE_BIND:
1661363f04cSPaul Traina 			hp = _getnetbydnsaddr(addr, type);
1671363f04cSPaul Traina 			break;
1681363f04cSPaul Traina 		      case SERVICE_NIS:
1691363f04cSPaul Traina 			hp = _getnetbynisaddr(addr, type);
1701363f04cSPaul Traina 			break;
1711363f04cSPaul Traina 		}
1721363f04cSPaul Traina 		nserv++;
1731363f04cSPaul Traina 	}
1741363f04cSPaul Traina 	return hp;
1751363f04cSPaul Traina }
1761363f04cSPaul Traina 
1771363f04cSPaul Traina void
1781363f04cSPaul Traina setnetent(stayopen)
1791363f04cSPaul Traina 	int stayopen;
1801363f04cSPaul Traina {
1811363f04cSPaul Traina 	_setnethtent(stayopen);
1821363f04cSPaul Traina 	_setnetdnsent(stayopen);
1831363f04cSPaul Traina }
1841363f04cSPaul Traina 
1851363f04cSPaul Traina void
1861363f04cSPaul Traina endnetent()
1871363f04cSPaul Traina {
1881363f04cSPaul Traina 	_endnethtent();
1891363f04cSPaul Traina 	_endnetdnsent();
1901363f04cSPaul Traina }
191