xref: /csrg-svn/lib/libc/net/getnetent.c (revision 12691)
1*12691Ssam /*	getnetent.c	4.8	83/05/23	*/
27896Ssam 
37896Ssam #include <stdio.h>
4*12691Ssam #include <sys/types.h>
57896Ssam #include <sys/socket.h>
67896Ssam #include <netdb.h>
77896Ssam #include <ctype.h>
87896Ssam 
97896Ssam #define	MAXALIASES	35
107896Ssam 
119808Ssam static char NETDB[] = "/etc/networks";
127896Ssam static FILE *netf = NULL;
137896Ssam static char line[BUFSIZ+1];
147896Ssam static struct netent net;
157896Ssam static char *net_aliases[MAXALIASES];
167896Ssam static int stayopen = 0;
177896Ssam static char *any();
187896Ssam 
197896Ssam setnetent(f)
207896Ssam 	int f;
217896Ssam {
227896Ssam 	if (netf == NULL)
237896Ssam 		netf = fopen(NETDB, "r" );
247896Ssam 	else
257896Ssam 		rewind(netf);
267896Ssam 	stayopen |= f;
277896Ssam }
287896Ssam 
297896Ssam endnetent()
307896Ssam {
317896Ssam 	if (netf && !stayopen) {
327896Ssam 		fclose(netf);
337896Ssam 		netf = NULL;
347896Ssam 	}
357896Ssam }
367896Ssam 
377896Ssam struct netent *
387896Ssam getnetent()
397896Ssam {
407896Ssam 	char *p;
417896Ssam 	register char *cp, **q;
427896Ssam 
437896Ssam 	if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL)
447896Ssam 		return (NULL);
457896Ssam again:
467896Ssam 	p = fgets(line, BUFSIZ, netf);
477896Ssam 	if (p == NULL)
487896Ssam 		return (NULL);
497896Ssam 	if (*p == '#')
507896Ssam 		goto again;
517896Ssam 	cp = any(p, "#\n");
527896Ssam 	if (cp == NULL)
537896Ssam 		goto again;
547896Ssam 	*cp = '\0';
557896Ssam 	net.n_name = p;
567896Ssam 	cp = any(p, " \t");
577896Ssam 	if (cp == NULL)
587896Ssam 		goto again;
597896Ssam 	*cp++ = '\0';
607896Ssam 	while (*cp == ' ' || *cp == '\t')
617896Ssam 		cp++;
627896Ssam 	p = any(cp, " \t");
637896Ssam 	if (p != NULL)
647896Ssam 		*p++ = '\0';
658364Ssam 	net.n_net = inet_network(cp);
668342Ssam 	net.n_addrtype = AF_INET;
679190Ssam 	q = net.n_aliases = net_aliases;
6810087Ssam 	if (p != NULL)
699190Ssam 		cp = p;
7010087Ssam 	while (cp && *cp) {
7110087Ssam 		if (*cp == ' ' || *cp == '\t') {
7210087Ssam 			cp++;
7310087Ssam 			continue;
747896Ssam 		}
7510087Ssam 		if (q < &net_aliases[MAXALIASES - 1])
7610087Ssam 			*q++ = cp;
7710087Ssam 		cp = any(cp, " \t");
7810087Ssam 		if (cp != NULL)
7910087Ssam 			*cp++ = '\0';
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