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