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