1*45194Ssklower /*	getx25hostent.c	2.0	86-9-29	*/
2*45194Ssklower 
3*45194Ssklower /*
4*45194Ssklower  * Get next entry from /etc/x25hosts table
5*45194Ssklower  * Adapted from 4.2bsd network support code.
6*45194Ssklower  *
7*45194Ssklower  * Frank Pronk
8*45194Ssklower  * The University of British Columbia
9*45194Ssklower  * Laboratory for Computational Vision
10*45194Ssklower  * Copyright (c)
11*45194Ssklower  */
12*45194Ssklower 
13*45194Ssklower #include <sys/types.h>
14*45194Ssklower #include <sys/socket.h>
15*45194Ssklower #include <sys/stat.h>
16*45194Ssklower #include <netccitt/x25.h>
17*45194Ssklower #include <netdb.h>
18*45194Ssklower #include <ctype.h>
19*45194Ssklower 
20*45194Ssklower /*
21*45194Ssklower  * ccitt version.
22*45194Ssklower  */
23*45194Ssklower 
24*45194Ssklower #define	MAXALIASES	8
25*45194Ssklower #define	MAXADDRSIZE	64
26*45194Ssklower #define LINESIZE	256
27*45194Ssklower 
28*45194Ssklower static char HOSTDB[] = "/etc/x25hosts";
29*45194Ssklower static char line[LINESIZE+1];
30*45194Ssklower static char hostaddr[MAXADDRSIZE];
31*45194Ssklower static struct hostent host;
32*45194Ssklower #ifdef h_addr		/* for 4.3bsd; see <netdb.h> */
33*45194Ssklower static char *host_addrs[2];
34*45194Ssklower #endif
35*45194Ssklower static char *host_aliases[MAXALIASES];
36*45194Ssklower static char *FileStart, *FilePos, *FileEnd;
37*45194Ssklower static short stayopen;
38*45194Ssklower static char *any();
39*45194Ssklower char *malloc ();
40*45194Ssklower 
setx25hostent(f)41*45194Ssklower setx25hostent(f)
42*45194Ssklower 	int f;
43*45194Ssklower {
44*45194Ssklower 	register int fd = -1;
45*45194Ssklower 	struct stat st;
46*45194Ssklower 
47*45194Ssklower 	if (FileStart == 0) {
48*45194Ssklower 		if ((fd = open (HOSTDB, 0)) < 0)
49*45194Ssklower 			return;
50*45194Ssklower 		fstat (fd, &st);
51*45194Ssklower 		if ((FileStart = malloc (st.st_size)) == 0)
52*45194Ssklower 			goto fail;
53*45194Ssklower 		if (read (fd, FileStart, st.st_size) != st.st_size)
54*45194Ssklower 			goto fail;
55*45194Ssklower 		FileEnd = FileStart + st.st_size;
56*45194Ssklower 		close (fd);
57*45194Ssklower 		stayopen |= f;
58*45194Ssklower 	}
59*45194Ssklower 	FilePos = FileStart;
60*45194Ssklower 	return;
61*45194Ssklower fail:
62*45194Ssklower 	if (FileStart) {
63*45194Ssklower 		free (FileStart);
64*45194Ssklower 		FileStart = 0;
65*45194Ssklower 	}
66*45194Ssklower 	if (fd >= 0)
67*45194Ssklower 		close (fd);
68*45194Ssklower }
69*45194Ssklower 
endx25hostent()70*45194Ssklower endx25hostent()
71*45194Ssklower {
72*45194Ssklower 	if (FileStart && !stayopen) {
73*45194Ssklower 		free (FileStart);
74*45194Ssklower 		FileStart = 0;
75*45194Ssklower 	}
76*45194Ssklower }
77*45194Ssklower 
78*45194Ssklower struct hostent *
getx25hostent()79*45194Ssklower getx25hostent()
80*45194Ssklower {
81*45194Ssklower 	register char *p, *cp, **q, *end;
82*45194Ssklower 	long iaddr;
83*45194Ssklower 
84*45194Ssklower 	if (FileStart == 0) {
85*45194Ssklower 		setx25hostent (0);
86*45194Ssklower 		if (FileStart == 0)
87*45194Ssklower 			return (0);
88*45194Ssklower 	}
89*45194Ssklower #ifdef h_addr
90*45194Ssklower 	host.h_addr_list = host_addrs;
91*45194Ssklower 	host_addrs[0] = hostaddr;
92*45194Ssklower #else
93*45194Ssklower 	host.h_addr = hostaddr;
94*45194Ssklower #endif
95*45194Ssklower 	p = FilePos;
96*45194Ssklower 	end = any (p, FileEnd, "\n");
97*45194Ssklower 	for (; end; p = end+1, end = any (end+1, FileEnd, "\n")) {
98*45194Ssklower 		if (*p == '#')
99*45194Ssklower 			continue;
100*45194Ssklower 		bcopy (p, line, (end + 1) - p);
101*45194Ssklower 		p = line;
102*45194Ssklower 		if (cp = any (p, line+LINESIZE, "\n#"))
103*45194Ssklower 			*cp = '\0';
104*45194Ssklower 		if ((cp = any (p, line+LINESIZE, " \t")) == 0)
105*45194Ssklower 			continue;
106*45194Ssklower 		*cp++ = '\0';
107*45194Ssklower 
108*45194Ssklower 		if (ccitt_addr(p, (struct sockaddr_x25 *)hostaddr) == 0)
109*45194Ssklower 			continue;
110*45194Ssklower 		host.h_length = sizeof (struct sockaddr_x25);
111*45194Ssklower 		host.h_addrtype = AF_CCITT;
112*45194Ssklower 
113*45194Ssklower 		while (*cp == ' ' || *cp == '\t')
114*45194Ssklower 			cp++;
115*45194Ssklower 		host.h_name = cp;
116*45194Ssklower 		q = host.h_aliases = host_aliases;
117*45194Ssklower 		cp = any(cp, line+LINESIZE, " \t");
118*45194Ssklower 		if (cp != 0)
119*45194Ssklower 			*cp++ = '\0';
120*45194Ssklower 		while (cp && *cp) {
121*45194Ssklower 			if (*cp == ' ' || *cp == '\t') {
122*45194Ssklower 				cp++;
123*45194Ssklower 				continue;
124*45194Ssklower 			}
125*45194Ssklower 			if (q < &host_aliases[MAXALIASES - 1])
126*45194Ssklower 				*q++ = cp;
127*45194Ssklower 			cp = any(cp, line+LINESIZE, " \t");
128*45194Ssklower 			if (cp != 0)
129*45194Ssklower 				*cp++ = '\0';
130*45194Ssklower 		}
131*45194Ssklower 		*q = 0;
132*45194Ssklower 		FilePos = end + 1;
133*45194Ssklower 		return (&host);
134*45194Ssklower 	}
135*45194Ssklower 	return (0);
136*45194Ssklower }
137*45194Ssklower 
138*45194Ssklower static char *
any(cp,limit,match)139*45194Ssklower any(cp, limit, match)
140*45194Ssklower 	register char *cp;
141*45194Ssklower 	char *limit, *match;
142*45194Ssklower {
143*45194Ssklower 	register char *mp, c;
144*45194Ssklower 
145*45194Ssklower 	while (cp < limit) {
146*45194Ssklower 		c = *cp;
147*45194Ssklower 		for (mp = match; *mp; mp++)
148*45194Ssklower 			if (*mp == c)
149*45194Ssklower 				return (cp);
150*45194Ssklower 		cp++;
151*45194Ssklower 	}
152*45194Ssklower 	return ((char *)0);
153*45194Ssklower }
154