xref: /csrg-svn/lib/libc/net/getnetent.c (revision 8364)
1*8364Ssam /*	getnetent.c	4.4	82/10/07	*/
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';
64*8364Ssam 	net.n_net = inet_network(cp);
658342Ssam 	net.n_addrtype = AF_INET;
667896Ssam 	net.n_aliases = net_aliases;
677896Ssam 	q = net_aliases, cp = p;
687896Ssam 	while (*cp) {
697896Ssam 		if (*cp == ' ' || *cp == '\t') {
707896Ssam 			cp++;
717896Ssam 			continue;
727896Ssam 		}
737896Ssam 		if (q < &net_aliases[MAXALIASES - 1])
747896Ssam 			*q++ = cp;
757896Ssam 		cp = any(cp, " \t");
767896Ssam 		if (*cp != NULL)
777896Ssam 			*cp++ = '\0';
787896Ssam 	}
797896Ssam 	*q = NULL;
807896Ssam 	return (&net);
817896Ssam }
827896Ssam 
837896Ssam static char *
847896Ssam any(cp, match)
857896Ssam 	register char *cp;
867896Ssam 	char *match;
877896Ssam {
887896Ssam 	register char *mp, c;
897896Ssam 
907896Ssam 	while (c = *cp) {
917896Ssam 		for (mp = match; *mp; mp++)
927896Ssam 			if (*mp == c)
937896Ssam 				return (cp);
947896Ssam 		cp++;
957896Ssam 	}
967896Ssam 	return ((char *)0);
977896Ssam }
98