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
34 /* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
35 * Dep. Matematica Universidade de Coimbra, Portugal, Europe
36 *
37 * Permission to use, copy, modify, and distribute this software for any
38 * purpose with or without fee is hereby granted, provided that the above
39 * copyright notice and this permission notice appear in all copies.
40 *
41 * from getnetent.c 1.1 (Coimbra) 93/06/02
42 */
43
44 #if defined(LIBC_SCCS) && !defined(lint)
45 static char sccsid[] = "@(#)getnetent.c 8.1 (Berkeley) 6/4/93";
46 static char orig_rcsid[] = "From: Id: getnetent.c,v 8.4 1997/06/01 20:34:37 vixie Exp";
47 #endif /* LIBC_SCCS and not lint */
48 #include <sys/cdefs.h>
49 #include <sys/types.h>
50
51 #include <sys/types.h>
52 #include <sys/socket.h>
53 #include <netinet/in.h>
54 #include <arpa/inet.h>
55 #include <arpa/nameser.h>
56 #include <netdb.h>
57 #include <stdio.h>
58 #include <string.h>
59 #include <stdarg.h>
60 #include <nsswitch.h>
61
62 #define MAXALIASES 35
63
64 static FILE *netf;
65 static char line[BUFSIZ+1];
66 static struct netent net;
67 static char *net_aliases[MAXALIASES];
68 static int _net_stayopen;
69
70 void
_setnethtent(f)71 _setnethtent(f)
72 int f;
73 {
74
75 if (netf == NULL)
76 netf = fopen(_PATH_NETWORKS, "r" );
77 else
78 rewind(netf);
79 _net_stayopen |= f;
80 }
81
82 void
_endnethtent()83 _endnethtent()
84 {
85
86 if (netf) {
87 fclose(netf);
88 netf = NULL;
89 }
90 _net_stayopen = 0;
91 }
92
93 struct netent *
getnetent()94 getnetent()
95 {
96 char *p;
97 char *cp, **q;
98
99 if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL)
100 return (NULL);
101 again:
102 p = fgets(line, sizeof line, netf);
103 if (p == NULL)
104 return (NULL);
105 if (*p == '#')
106 goto again;
107 cp = strpbrk(p, "#\n");
108 if (cp == NULL)
109 goto again;
110 *cp = '\0';
111 net.n_name = p;
112 cp = strpbrk(p, " \t");
113 if (cp == NULL)
114 goto again;
115 *cp++ = '\0';
116 while (*cp == ' ' || *cp == '\t')
117 cp++;
118 p = strpbrk(cp, " \t");
119 if (p != NULL)
120 *p++ = '\0';
121 net.n_net = inet_network(cp);
122 net.n_addrtype = AF_INET;
123 q = net.n_aliases = net_aliases;
124 if (p != NULL)
125 cp = p;
126 while (cp && *cp) {
127 if (*cp == ' ' || *cp == '\t') {
128 cp++;
129 continue;
130 }
131 if (q < &net_aliases[MAXALIASES - 1])
132 *q++ = cp;
133 cp = strpbrk(cp, " \t");
134 if (cp != NULL)
135 *cp++ = '\0';
136 }
137 *q = NULL;
138 return (&net);
139 }
140
141 int
_ht_getnetbyname(void * rval,void * cb_data,va_list ap)142 _ht_getnetbyname(void *rval, void *cb_data, va_list ap)
143 {
144 const char *name;
145 struct netent *p;
146 char **cp;
147
148 name = va_arg(ap, const char *);
149
150 setnetent(_net_stayopen);
151 while ( (p = getnetent()) ) {
152 if (strcasecmp(p->n_name, name) == 0)
153 break;
154 for (cp = p->n_aliases; *cp != 0; cp++)
155 if (strcasecmp(*cp, name) == 0)
156 goto found;
157 }
158 found:
159 if (!_net_stayopen)
160 endnetent();
161 *(struct netent **)rval = p;
162 return (p != NULL) ? NS_SUCCESS : NS_NOTFOUND;
163 }
164
165 int
_ht_getnetbyaddr(void * rval,void * cb_data,va_list ap)166 _ht_getnetbyaddr(void *rval, void *cb_data, va_list ap)
167 {
168 unsigned long net;
169 int type;
170 struct netent *p;
171
172 net = va_arg(ap, unsigned long);
173 type = va_arg(ap, int);
174
175 setnetent(_net_stayopen);
176 while ( (p = getnetent()) )
177 if (p->n_addrtype == type && p->n_net == net)
178 break;
179 if (!_net_stayopen)
180 endnetent();
181 *(struct netent **)rval = p;
182 return (p != NULL) ? NS_SUCCESS : NS_NOTFOUND;
183 }
184