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