xref: /csrg-svn/lib/libc/net/getnetent.c (revision 9190)
1*9190Ssam /*	getnetent.c	4.5	82/11/14	*/
27896Ssam 
37896Ssam #include <stdio.h>
47896Ssam #include <sys/socket.h>
57896Ssam #include <netdb.h>
67896Ssam #include <ctype.h>
77896Ssam 
87896Ssam #define	MAXALIASES	35
97896Ssam 
107896Ssam static char *NETDB = "/usr/lib/networks";
117896Ssam static FILE *netf = NULL;
127896Ssam static char line[BUFSIZ+1];
137896Ssam static struct netent net;
147896Ssam static char *net_aliases[MAXALIASES];
157896Ssam static int stayopen = 0;
167896Ssam static char *any();
177896Ssam 
187896Ssam setnetent(f)
197896Ssam 	int f;
207896Ssam {
217896Ssam 	if (netf == NULL)
227896Ssam 		netf = fopen(NETDB, "r" );
237896Ssam 	else
247896Ssam 		rewind(netf);
257896Ssam 	stayopen |= f;
267896Ssam }
277896Ssam 
287896Ssam endnetent()
297896Ssam {
307896Ssam 	if (netf && !stayopen) {
317896Ssam 		fclose(netf);
327896Ssam 		netf = NULL;
337896Ssam 	}
347896Ssam }
357896Ssam 
367896Ssam struct netent *
377896Ssam getnetent()
387896Ssam {
397896Ssam 	char *p;
407896Ssam 	register char *cp, **q;
417896Ssam 
427896Ssam 	if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL)
437896Ssam 		return (NULL);
447896Ssam again:
457896Ssam 	p = fgets(line, BUFSIZ, netf);
467896Ssam 	if (p == NULL)
477896Ssam 		return (NULL);
487896Ssam 	if (*p == '#')
497896Ssam 		goto again;
507896Ssam 	cp = any(p, "#\n");
517896Ssam 	if (cp == NULL)
527896Ssam 		goto again;
537896Ssam 	*cp = '\0';
547896Ssam 	net.n_name = p;
557896Ssam 	cp = any(p, " \t");
567896Ssam 	if (cp == NULL)
577896Ssam 		goto again;
587896Ssam 	*cp++ = '\0';
597896Ssam 	while (*cp == ' ' || *cp == '\t')
607896Ssam 		cp++;
617896Ssam 	p = any(cp, " \t");
627896Ssam 	if (p != NULL)
637896Ssam 		*p++ = '\0';
648364Ssam 	net.n_net = inet_network(cp);
658342Ssam 	net.n_addrtype = AF_INET;
66*9190Ssam 	q = net.n_aliases = net_aliases;
67*9190Ssam 	if (p != NULL) {
68*9190Ssam 		cp = p;
69*9190Ssam 		while (*cp) {
70*9190Ssam 			if (*cp == ' ' || *cp == '\t') {
71*9190Ssam 				cp++;
72*9190Ssam 				continue;
73*9190Ssam 			}
74*9190Ssam 			if (q < &net_aliases[MAXALIASES - 1])
75*9190Ssam 				*q++ = cp;
76*9190Ssam 			cp = any(cp, " \t");
77*9190Ssam 			if (*cp != NULL)
78*9190Ssam 				*cp++ = '\0';
797896Ssam 		}
807896Ssam 	}
817896Ssam 	*q = NULL;
827896Ssam 	return (&net);
837896Ssam }
847896Ssam 
857896Ssam static char *
867896Ssam any(cp, match)
877896Ssam 	register char *cp;
887896Ssam 	char *match;
897896Ssam {
907896Ssam 	register char *mp, c;
917896Ssam 
927896Ssam 	while (c = *cp) {
937896Ssam 		for (mp = match; *mp; mp++)
947896Ssam 			if (*mp == c)
957896Ssam 				return (cp);
967896Ssam 		cp++;
977896Ssam 	}
987896Ssam 	return ((char *)0);
997896Ssam }
100