0
|
1 /* hosts.c - find out the official name of a host */
|
|
2 #ifndef lint
|
|
3 static char ident[] = "@(#)$Id$";
|
|
4 #endif /* lint */
|
|
5
|
|
6 /* LINTLIBRARY */
|
|
7
|
|
8 /* In the SendMail world, we really don't know what the valid hosts are.
|
|
9 We could poke around in the sendmail.cf file, but that still isn't a
|
|
10 guarantee. As a result, we'll say that everything is a valid host, and
|
|
11 let SendMail worry about it. */
|
|
12
|
|
13
|
|
14 #include "../h/strings.h"
|
|
15 #include <stdio.h>
|
|
16 #include "../zotnet/mts.h"
|
|
17 #include <ctype.h>
|
|
18 #if defined(BSD42) || defined(SOCKETS)
|
|
19 #include <netdb.h>
|
|
20 #endif /* BSD42 or SOCKETS */
|
|
21
|
|
22
|
|
23 #define NOTOK (-1)
|
|
24
|
|
25
|
|
26 static struct host {
|
|
27 char *h_name;
|
|
28 char **h_aliases;
|
|
29 struct host *h_next;
|
|
30 } hosts;
|
|
31
|
|
32 char *getcpy ();
|
|
33
|
|
34 static int init_hs();
|
|
35
|
|
36 /* */
|
|
37
|
|
38 struct hostent *mh_gethostbyname();
|
|
39
|
|
40 char *OfficialName (name)
|
|
41 register char *name;
|
|
42 {
|
|
43 register char *p;
|
|
44 char *q,
|
|
45 site[BUFSIZ];
|
|
46 #if defined(BSD42) || defined(SOCKETS)
|
|
47 register struct hostent *hp;
|
|
48 #endif /* BSD42 or SOCKETS */
|
|
49 static char buffer[BUFSIZ];
|
|
50 register char **r;
|
|
51 register struct host *h;
|
|
52
|
|
53 for (p = name, q = site; *p; p++, q++)
|
|
54 *q = isupper (*p) ? tolower (*p) : *p;
|
|
55 *q = 0;
|
|
56 q = site;
|
|
57
|
|
58 if (uleq (LocalName (), site))
|
|
59 return LocalName ();
|
|
60
|
|
61 #ifdef BSD41A
|
|
62 if (rhost (&q) != NOTOK) {
|
|
63 (void) strcpy (buffer, q);
|
|
64 free (q);
|
|
65 return buffer;
|
|
66 }
|
|
67 #endif /* BSD41A */
|
|
68 #if defined(BSD42) || defined(SOCKETS)
|
|
69 #ifndef BIND
|
|
70 sethostent (1);
|
|
71 #endif
|
|
72 if (hp = mh_gethostbyname (q)) {
|
|
73 (void) strcpy (buffer, hp -> h_name);
|
|
74 return buffer;
|
|
75 }
|
|
76 #endif /* BSD42 or SOCKETS */
|
|
77
|
|
78 if (hosts.h_name || init_hs ())
|
|
79 for (h = hosts.h_next; h; h = h -> h_next)
|
|
80 if (uleq (h -> h_name, q))
|
|
81 return h -> h_name;
|
|
82 else
|
|
83 for (r = h -> h_aliases; *r; r++)
|
|
84 if (uleq (*r, q))
|
|
85 return h -> h_name;
|
|
86
|
|
87 (void) strcpy (buffer, site);
|
|
88 return buffer;
|
|
89 }
|
|
90
|
|
91 /* */
|
|
92
|
|
93 /* Use hostable as an exception file for those hosts that aren't on the
|
|
94 Internet (listed in /etc/hosts). These are usually PhoneNet and UUCP
|
|
95 sites. */
|
|
96
|
|
97
|
|
98 #define NALIASES 50
|
|
99
|
|
100 static int init_hs () {
|
|
101 register char *cp,
|
|
102 *dp,
|
|
103 **q,
|
|
104 **r;
|
|
105 char buffer[BUFSIZ],
|
|
106 *aliases[NALIASES];
|
|
107 register struct host *h;
|
|
108 register FILE *fp;
|
|
109
|
|
110 if ((fp = fopen (hostable, "r")) == NULL)
|
|
111 return 0;
|
|
112
|
|
113 h = &hosts;
|
|
114 while (fgets (buffer, sizeof buffer, fp) != NULL) {
|
|
115 if (cp = index (buffer, '#'))
|
|
116 *cp = 0;
|
|
117 if (cp = index (buffer, '\n'))
|
|
118 *cp = 0;
|
|
119 for (cp = buffer; *cp; cp++)
|
|
120 if (isspace (*cp))
|
|
121 *cp = ' ';
|
|
122 for (cp = buffer; isspace (*cp); cp++)
|
|
123 continue;
|
|
124 if (*cp == 0)
|
|
125 continue;
|
|
126
|
|
127 q = aliases;
|
|
128 if (cp = index (dp = cp, ' ')) {
|
|
129 *cp = 0;
|
|
130 for (cp++; *cp; cp++) {
|
|
131 while (isspace (*cp))
|
|
132 cp++;
|
|
133 if (*cp == 0)
|
|
134 break;
|
|
135 if (cp = index (*q++ = cp, ' '))
|
|
136 *cp = 0;
|
|
137 else
|
|
138 break;
|
|
139 if (q >= aliases + NALIASES)
|
|
140 break;
|
|
141 }
|
|
142 }
|
|
143
|
|
144 *q = 0;
|
|
145
|
|
146 h -> h_next = (struct host *) calloc (1, sizeof *h);
|
|
147 h = h -> h_next;
|
|
148 h -> h_name = getcpy (dp);
|
|
149 r = h -> h_aliases =
|
|
150 (char **) calloc ((unsigned) (q - aliases + 1), sizeof *q);
|
|
151 for (q = aliases; *q; q++)
|
|
152 *r++ = getcpy (*q);
|
|
153 *r = 0;
|
|
154 }
|
|
155
|
|
156 (void) fclose (fp);
|
|
157 return 1;
|
|
158 }
|