xref: /csrg-svn/lib/libc/net/getnetent.c (revision 7896)
1*7896Ssam /*	getnetent.c	4.1	82/08/25	*/
2*7896Ssam 
3*7896Ssam #include <stdio.h>
4*7896Ssam #include <sys/socket.h>
5*7896Ssam #include <netdb.h>
6*7896Ssam #include <ctype.h>
7*7896Ssam 
8*7896Ssam #define	MAXALIASES	35
9*7896Ssam 
10*7896Ssam static char *NETDB = "/usr/lib/networks";
11*7896Ssam static FILE *netf = NULL;
12*7896Ssam static char line[BUFSIZ+1];
13*7896Ssam static struct netent net;
14*7896Ssam static char *net_aliases[MAXALIASES];
15*7896Ssam static int stayopen = 0;
16*7896Ssam static unsigned long value();
17*7896Ssam static char *any();
18*7896Ssam 
19*7896Ssam setnetent(f)
20*7896Ssam 	int f;
21*7896Ssam {
22*7896Ssam 	if (netf == NULL)
23*7896Ssam 		netf = fopen(NETDB, "r" );
24*7896Ssam 	else
25*7896Ssam 		rewind(netf);
26*7896Ssam 	stayopen |= f;
27*7896Ssam }
28*7896Ssam 
29*7896Ssam endnetent()
30*7896Ssam {
31*7896Ssam 	if (netf && !stayopen) {
32*7896Ssam 		fclose(netf);
33*7896Ssam 		netf = NULL;
34*7896Ssam 	}
35*7896Ssam }
36*7896Ssam 
37*7896Ssam struct netent *
38*7896Ssam getnetent()
39*7896Ssam {
40*7896Ssam 	char *p;
41*7896Ssam 	register char *cp, **q;
42*7896Ssam 
43*7896Ssam 	if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL)
44*7896Ssam 		return (NULL);
45*7896Ssam again:
46*7896Ssam 	p = fgets(line, BUFSIZ, netf);
47*7896Ssam 	if (p == NULL)
48*7896Ssam 		return (NULL);
49*7896Ssam 	if (*p == '#')
50*7896Ssam 		goto again;
51*7896Ssam 	cp = any(p, "#\n");
52*7896Ssam 	if (cp == NULL)
53*7896Ssam 		goto again;
54*7896Ssam 	*cp = '\0';
55*7896Ssam 	net.n_name = p;
56*7896Ssam 	cp = any(p, " \t");
57*7896Ssam 	if (cp == NULL)
58*7896Ssam 		goto again;
59*7896Ssam 	*cp++ = '\0';
60*7896Ssam 	while (*cp == ' ' || *cp == '\t')
61*7896Ssam 		cp++;
62*7896Ssam 	p = any(cp, " \t");
63*7896Ssam 	if (p != NULL)
64*7896Ssam 		*p++ = '\0';
65*7896Ssam 	net.n_net = value(cp);
66*7896Ssam 	net.n_aliases = net_aliases;
67*7896Ssam 	q = net_aliases, cp = p;
68*7896Ssam 	while (*cp) {
69*7896Ssam 		if (*cp == ' ' || *cp == '\t') {
70*7896Ssam 			cp++;
71*7896Ssam 			continue;
72*7896Ssam 		}
73*7896Ssam 		if (q < &net_aliases[MAXALIASES - 1])
74*7896Ssam 			*q++ = cp;
75*7896Ssam 		cp = any(cp, " \t");
76*7896Ssam 		if (*cp != NULL)
77*7896Ssam 			*cp++ = '\0';
78*7896Ssam 	}
79*7896Ssam 	*q = NULL;
80*7896Ssam 	return (&net);
81*7896Ssam }
82*7896Ssam 
83*7896Ssam static unsigned long
84*7896Ssam value(cp)
85*7896Ssam 	register char *cp;
86*7896Ssam {
87*7896Ssam 	register unsigned long val, base, n;
88*7896Ssam 	register char c;
89*7896Ssam 	unsigned long parts[4], *pp = parts;
90*7896Ssam 
91*7896Ssam again:
92*7896Ssam 	val = 0; base = 10;
93*7896Ssam 	if (*cp == '0')
94*7896Ssam 		base = 8, cp++;
95*7896Ssam 	if (*cp == 'x' || *cp == 'X')
96*7896Ssam 		base = 16, cp++;
97*7896Ssam 	while (c = *cp) {
98*7896Ssam 		if (isdigit(c)) {
99*7896Ssam 			val = (val * base) + (c - '0');
100*7896Ssam 			cp++;
101*7896Ssam 			continue;
102*7896Ssam 		}
103*7896Ssam 		if (base == 16 && isxdigit(c)) {
104*7896Ssam 			val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
105*7896Ssam 			cp++;
106*7896Ssam 			continue;
107*7896Ssam 		}
108*7896Ssam 		break;
109*7896Ssam 	}
110*7896Ssam 	if (*cp == '.') {
111*7896Ssam 		/*
112*7896Ssam 		 * Internet format:
113*7896Ssam 		 *	a.b.c.d
114*7896Ssam 		 *	a.b.c	(with c treated as 16-bits)
115*7896Ssam 		 *	a.b	(with b treated as 24 bits)
116*7896Ssam 		 */
117*7896Ssam 		if (pp >= parts + 4)
118*7896Ssam 			return (-1);
119*7896Ssam 		*pp++ = val, cp++;
120*7896Ssam 		goto again;
121*7896Ssam 	}
122*7896Ssam 	if (*cp && !isspace(*cp))
123*7896Ssam 		return (-1);
124*7896Ssam 	n = pp - parts;
125*7896Ssam 	if (n > 0) {
126*7896Ssam 		if (n > 4)
127*7896Ssam 			return (-1);
128*7896Ssam 		*pp++ = val; n++;
129*7896Ssam 		val = parts[0];
130*7896Ssam 		if (n > 1)
131*7896Ssam 			val <<= 24;
132*7896Ssam 		if (n > 2)
133*7896Ssam 			val |= (parts[1] & 0xff) << 16;
134*7896Ssam 		if (n > 3)
135*7896Ssam 			val |= (parts[2] & 0xff) << 8;
136*7896Ssam 		if (n > 1)
137*7896Ssam 			val |= parts[n - 1];
138*7896Ssam #if vax || pdp11
139*7896Ssam 		val = htonl(val);
140*7896Ssam #endif
141*7896Ssam 	}
142*7896Ssam 	return (val);
143*7896Ssam }
144*7896Ssam 
145*7896Ssam static char *
146*7896Ssam any(cp, match)
147*7896Ssam 	register char *cp;
148*7896Ssam 	char *match;
149*7896Ssam {
150*7896Ssam 	register char *mp, c;
151*7896Ssam 
152*7896Ssam 	while (c = *cp) {
153*7896Ssam 		for (mp = match; *mp; mp++)
154*7896Ssam 			if (*mp == c)
155*7896Ssam 				return (cp);
156*7896Ssam 		cp++;
157*7896Ssam 	}
158*7896Ssam 	return ((char *)0);
159*7896Ssam }
160