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