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