xref: /dragonfly/lib/libc/net/getnetbyht.c (revision 71126e33)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * @(#)getnetent.c	8.1 (Berkeley) 6/4/93
34  * $FreeBSD: src/lib/libc/net/getnetbyht.c,v 1.7.2.1 2002/07/07 11:34:42 robert Exp $
35  * $DragonFly: src/lib/libc/net/getnetbyht.c,v 1.3 2004/10/25 19:38:01 drhodus Exp $
36  */
37 
38 /* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
39  *	Dep. Matematica Universidade de Coimbra, Portugal, Europe
40  *
41  * Permission to use, copy, modify, and distribute this software for any
42  * purpose with or without fee is hereby granted, provided that the above
43  * copyright notice and this permission notice appear in all copies.
44  *
45  * from getnetent.c	1.1 (Coimbra) 93/06/02
46  */
47 
48 #include <sys/types.h>
49 #include <sys/socket.h>
50 #include <netinet/in.h>
51 #include <arpa/inet.h>
52 #include <arpa/nameser.h>
53 #include <netdb.h>
54 #include <stdio.h>
55 #include <string.h>
56 
57 #define	MAXALIASES	35
58 
59 static FILE *netf;
60 static char line[BUFSIZ+1];
61 static struct netent net;
62 static char *net_aliases[MAXALIASES];
63 static int _net_stayopen;
64 
65 void
66 _setnethtent(f)
67 	int f;
68 {
69 
70 	if (netf == NULL)
71 		netf = fopen(_PATH_NETWORKS, "r" );
72 	else
73 		rewind(netf);
74 	_net_stayopen |= f;
75 }
76 
77 void
78 _endnethtent()
79 {
80 
81 	if (netf) {
82 		fclose(netf);
83 		netf = NULL;
84 	}
85 	_net_stayopen = 0;
86 }
87 
88 struct netent *
89 getnetent()
90 {
91 	char *p;
92 	char *cp, **q;
93 
94 	if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL)
95 		return (NULL);
96 again:
97 	p = fgets(line, sizeof line, netf);
98 	if (p == NULL)
99 		return (NULL);
100 	if (*p == '#')
101 		goto again;
102 	cp = strpbrk(p, "#\n");
103 	if (cp == NULL)
104 		goto again;
105 	*cp = '\0';
106 	net.n_name = p;
107 	cp = strpbrk(p, " \t");
108 	if (cp == NULL)
109 		goto again;
110 	*cp++ = '\0';
111 	while (*cp == ' ' || *cp == '\t')
112 		cp++;
113 	p = strpbrk(cp, " \t");
114 	if (p != NULL)
115 		*p++ = '\0';
116 	net.n_net = inet_network(cp);
117 	net.n_addrtype = AF_INET;
118 	q = net.n_aliases = net_aliases;
119 	if (p != NULL)
120 		cp = p;
121 	while (cp && *cp) {
122 		if (*cp == ' ' || *cp == '\t') {
123 			cp++;
124 			continue;
125 		}
126 		if (q < &net_aliases[MAXALIASES - 1])
127 			*q++ = cp;
128 		cp = strpbrk(cp, " \t");
129 		if (cp != NULL)
130 			*cp++ = '\0';
131 	}
132 	*q = NULL;
133 	return (&net);
134 }
135 
136 struct netent *
137 _getnetbyhtname(name)
138 	const char *name;
139 {
140 	struct netent *p;
141 	char **cp;
142 
143 	setnetent(_net_stayopen);
144 	while ( (p = getnetent()) ) {
145 		if (strcasecmp(p->n_name, name) == 0)
146 			break;
147 		for (cp = p->n_aliases; *cp != 0; cp++)
148 			if (strcasecmp(*cp, name) == 0)
149 				goto found;
150 	}
151 found:
152 	if (!_net_stayopen)
153 		endnetent();
154 	return (p);
155 }
156 
157 struct netent *
158 _getnetbyhtaddr(net, type)
159 	unsigned long net;
160 	int type;
161 {
162 	struct netent *p;
163 
164 	setnetent(_net_stayopen);
165 	while ( (p = getnetent()) )
166 		if (p->n_addrtype == type && p->n_net == net)
167 			break;
168 	if (!_net_stayopen)
169 		endnetent();
170 	return (p);
171 }
172