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