xref: /csrg-svn/lib/libc/net/getnetent.c (revision 10087)
1*10087Ssam /*	getnetent.c	4.7	83/01/02	*/
27896Ssam 
37896Ssam #include <stdio.h>
47896Ssam #include <sys/socket.h>
57896Ssam #include <netdb.h>
67896Ssam #include <ctype.h>
77896Ssam 
87896Ssam #define	MAXALIASES	35
97896Ssam 
109808Ssam static char NETDB[] = "/etc/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;
669190Ssam 	q = net.n_aliases = net_aliases;
67*10087Ssam 	if (p != NULL)
689190Ssam 		cp = p;
69*10087Ssam 	while (cp && *cp) {
70*10087Ssam 		if (*cp == ' ' || *cp == '\t') {
71*10087Ssam 			cp++;
72*10087Ssam 			continue;
737896Ssam 		}
74*10087Ssam 		if (q < &net_aliases[MAXALIASES - 1])
75*10087Ssam 			*q++ = cp;
76*10087Ssam 		cp = any(cp, " \t");
77*10087Ssam 		if (cp != NULL)
78*10087Ssam 			*cp++ = '\0';
797896Ssam 	}
807896Ssam 	*q = NULL;
817896Ssam 	return (&net);
827896Ssam }
837896Ssam 
847896Ssam static char *
857896Ssam any(cp, match)
867896Ssam 	register char *cp;
877896Ssam 	char *match;
887896Ssam {
897896Ssam 	register char *mp, c;
907896Ssam 
917896Ssam 	while (c = *cp) {
927896Ssam 		for (mp = match; *mp; mp++)
937896Ssam 			if (*mp == c)
947896Ssam 				return (cp);
957896Ssam 		cp++;
967896Ssam 	}
977896Ssam 	return ((char *)0);
987896Ssam }
99