1*d56f51eaSDavid van Moolenbroek /*
2*d56f51eaSDavid van Moolenbroek * Copyright (c) 1983 Regents of the University of California.
3*d56f51eaSDavid van Moolenbroek * All rights reserved.
4*d56f51eaSDavid van Moolenbroek *
5*d56f51eaSDavid van Moolenbroek * Redistribution and use in source and binary forms are permitted
6*d56f51eaSDavid van Moolenbroek * provided that the above copyright notice and this paragraph are
7*d56f51eaSDavid van Moolenbroek * duplicated in all such forms and that any documentation,
8*d56f51eaSDavid van Moolenbroek * advertising materials, and other materials related to such
9*d56f51eaSDavid van Moolenbroek * distribution and use acknowledge that the software was developed
10*d56f51eaSDavid van Moolenbroek * by the University of California, Berkeley. The name of the
11*d56f51eaSDavid van Moolenbroek * University may not be used to endorse or promote products derived
12*d56f51eaSDavid van Moolenbroek * from this software without specific prior written permission.
13*d56f51eaSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14*d56f51eaSDavid van Moolenbroek * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15*d56f51eaSDavid van Moolenbroek * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16*d56f51eaSDavid van Moolenbroek */
17*d56f51eaSDavid van Moolenbroek
18*d56f51eaSDavid van Moolenbroek #if defined(LIBC_SCCS) && !defined(lint)
19*d56f51eaSDavid van Moolenbroek static char sccsid[] = "@(#)getnetent.c 5.5 (Berkeley) 6/27/88";
20*d56f51eaSDavid van Moolenbroek #endif /* LIBC_SCCS and not lint */
21*d56f51eaSDavid van Moolenbroek
22*d56f51eaSDavid van Moolenbroek #include "inetprivate.h"
23*d56f51eaSDavid van Moolenbroek
24*d56f51eaSDavid van Moolenbroek #define MAXALIASES 35
25*d56f51eaSDavid van Moolenbroek
26*d56f51eaSDavid van Moolenbroek static char NETDB[] = _PATH_NETWORKS;
27*d56f51eaSDavid van Moolenbroek static FILE *netf = NULL;
28*d56f51eaSDavid van Moolenbroek static char line[BUFSIZ+1];
29*d56f51eaSDavid van Moolenbroek static struct netent net;
30*d56f51eaSDavid van Moolenbroek static char *net_aliases[MAXALIASES];
31*d56f51eaSDavid van Moolenbroek static char *any(char *, char *);
32*d56f51eaSDavid van Moolenbroek
33*d56f51eaSDavid van Moolenbroek int _net_stayopen;
34*d56f51eaSDavid van Moolenbroek extern u_int32_t inet_network(const char *cp);
35*d56f51eaSDavid van Moolenbroek
36*d56f51eaSDavid van Moolenbroek void
setnetent(f)37*d56f51eaSDavid van Moolenbroek setnetent(f)
38*d56f51eaSDavid van Moolenbroek int f;
39*d56f51eaSDavid van Moolenbroek {
40*d56f51eaSDavid van Moolenbroek if (netf == NULL)
41*d56f51eaSDavid van Moolenbroek netf = fopen(NETDB, "r" );
42*d56f51eaSDavid van Moolenbroek else
43*d56f51eaSDavid van Moolenbroek rewind(netf);
44*d56f51eaSDavid van Moolenbroek _net_stayopen |= f;
45*d56f51eaSDavid van Moolenbroek }
46*d56f51eaSDavid van Moolenbroek
47*d56f51eaSDavid van Moolenbroek void
endnetent()48*d56f51eaSDavid van Moolenbroek endnetent()
49*d56f51eaSDavid van Moolenbroek {
50*d56f51eaSDavid van Moolenbroek if (netf) {
51*d56f51eaSDavid van Moolenbroek fclose(netf);
52*d56f51eaSDavid van Moolenbroek netf = NULL;
53*d56f51eaSDavid van Moolenbroek }
54*d56f51eaSDavid van Moolenbroek _net_stayopen = 0;
55*d56f51eaSDavid van Moolenbroek }
56*d56f51eaSDavid van Moolenbroek
57*d56f51eaSDavid van Moolenbroek struct netent *
getnetent()58*d56f51eaSDavid van Moolenbroek getnetent()
59*d56f51eaSDavid van Moolenbroek {
60*d56f51eaSDavid van Moolenbroek char *p;
61*d56f51eaSDavid van Moolenbroek register char *cp, **q;
62*d56f51eaSDavid van Moolenbroek
63*d56f51eaSDavid van Moolenbroek if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL)
64*d56f51eaSDavid van Moolenbroek return (NULL);
65*d56f51eaSDavid van Moolenbroek again:
66*d56f51eaSDavid van Moolenbroek p = fgets(line, BUFSIZ, netf);
67*d56f51eaSDavid van Moolenbroek if (p == NULL)
68*d56f51eaSDavid van Moolenbroek return (NULL);
69*d56f51eaSDavid van Moolenbroek if (*p == '#')
70*d56f51eaSDavid van Moolenbroek goto again;
71*d56f51eaSDavid van Moolenbroek cp = any(p, "#\n");
72*d56f51eaSDavid van Moolenbroek if (cp == NULL)
73*d56f51eaSDavid van Moolenbroek goto again;
74*d56f51eaSDavid van Moolenbroek *cp = '\0';
75*d56f51eaSDavid van Moolenbroek net.n_name = p;
76*d56f51eaSDavid van Moolenbroek cp = any(p, " \t");
77*d56f51eaSDavid van Moolenbroek if (cp == NULL)
78*d56f51eaSDavid van Moolenbroek goto again;
79*d56f51eaSDavid van Moolenbroek *cp++ = '\0';
80*d56f51eaSDavid van Moolenbroek while (*cp == ' ' || *cp == '\t')
81*d56f51eaSDavid van Moolenbroek cp++;
82*d56f51eaSDavid van Moolenbroek p = any(cp, " \t");
83*d56f51eaSDavid van Moolenbroek if (p != NULL)
84*d56f51eaSDavid van Moolenbroek *p++ = '\0';
85*d56f51eaSDavid van Moolenbroek net.n_net = inet_network(cp);
86*d56f51eaSDavid van Moolenbroek net.n_addrtype = AF_INET;
87*d56f51eaSDavid van Moolenbroek q = net.n_aliases = net_aliases;
88*d56f51eaSDavid van Moolenbroek if (p != NULL)
89*d56f51eaSDavid van Moolenbroek cp = p;
90*d56f51eaSDavid van Moolenbroek while (cp && *cp) {
91*d56f51eaSDavid van Moolenbroek if (*cp == ' ' || *cp == '\t') {
92*d56f51eaSDavid van Moolenbroek cp++;
93*d56f51eaSDavid van Moolenbroek continue;
94*d56f51eaSDavid van Moolenbroek }
95*d56f51eaSDavid van Moolenbroek if (q < &net_aliases[MAXALIASES - 1])
96*d56f51eaSDavid van Moolenbroek *q++ = cp;
97*d56f51eaSDavid van Moolenbroek cp = any(cp, " \t");
98*d56f51eaSDavid van Moolenbroek if (cp != NULL)
99*d56f51eaSDavid van Moolenbroek *cp++ = '\0';
100*d56f51eaSDavid van Moolenbroek }
101*d56f51eaSDavid van Moolenbroek *q = NULL;
102*d56f51eaSDavid van Moolenbroek return (&net);
103*d56f51eaSDavid van Moolenbroek }
104*d56f51eaSDavid van Moolenbroek
105*d56f51eaSDavid van Moolenbroek static char *
any(cp,match)106*d56f51eaSDavid van Moolenbroek any(cp, match)
107*d56f51eaSDavid van Moolenbroek register char *cp;
108*d56f51eaSDavid van Moolenbroek char *match;
109*d56f51eaSDavid van Moolenbroek {
110*d56f51eaSDavid van Moolenbroek register char *mp, c;
111*d56f51eaSDavid van Moolenbroek
112*d56f51eaSDavid van Moolenbroek while (c = *cp) {
113*d56f51eaSDavid van Moolenbroek for (mp = match; *mp; mp++)
114*d56f51eaSDavid van Moolenbroek if (*mp == c)
115*d56f51eaSDavid van Moolenbroek return (cp);
116*d56f51eaSDavid van Moolenbroek cp++;
117*d56f51eaSDavid van Moolenbroek }
118*d56f51eaSDavid van Moolenbroek return ((char *)0);
119*d56f51eaSDavid van Moolenbroek }
120