Commit | Line | Data |
---|---|---|
b3cbe40f EA |
1 | # include <stdio.h> |
2 | # include <pwd.h> | |
3 | # include "dlvrmail.h" | |
916b3375 | 4 | |
b3cbe40f EA |
5 | /* |
6 | ** CONF.C -- Delivermail Configuration Tables. | |
7 | ** | |
8 | ** Defines the configuration of this installation. | |
9 | ** | |
cb590f52 EA |
10 | ** Compilation Flags: |
11 | ** HASARPA -- set if this machine has a connection to | |
12 | ** the Arpanet. | |
13 | ** HASUUCP -- set if this machine has a connection to | |
14 | ** the UUCP network. | |
15 | ** NETV6MAIL -- set if you want to use "v6mail" that | |
16 | ** comes with the Berkeley network. Normally | |
17 | ** /bin/mail will work fine, but around Berkeley | |
18 | ** we use v6mail because it is a "fixed target". | |
19 | ** V6 -- running on a version 6 system. This determines | |
20 | ** whether to define certain routines between | |
21 | ** the two systems. If you are running a funny | |
22 | ** system, e.g., V6 with long tty names, this | |
23 | ** should be checked carefully. | |
849eaf63 EA |
24 | ** DUMBMAIL -- set if your /bin/mail doesn't have the |
25 | ** -d flag. | |
b3cbe40f | 26 | ** |
cb590f52 | 27 | ** Configuration Variables: |
849eaf63 EA |
28 | ** ArpaHost -- the arpanet name of the host through |
29 | ** which arpanet mail will be sent. | |
cb590f52 EA |
30 | ** MyLocName -- the name of the host on a local network. |
31 | ** This is used to disambiguate the contents of | |
32 | ** ArpaHost among many hosts who may be sharing | |
33 | ** a gateway. | |
849eaf63 EA |
34 | ** ArpaLocal -- a list of local names for this host on |
35 | ** the arpanet. Only functional if HASARPA set. | |
36 | ** UucpLocal -- ditto for the Arpanet. | |
37 | ** BerkLocal -- ditto for the Berknet. | |
cb590f52 EA |
38 | ** Mailer -- a table of mailers known to the system. |
39 | ** The fields are: | |
40 | ** - the pathname of the mailer. | |
41 | ** - a list of flags describing the properties | |
42 | ** of this mailer: | |
43 | ** M_FOPT -- if set, the mailer has a picky "-f" | |
44 | ** option. In this mode, the mailer will | |
45 | ** only accept the "-f" option if the | |
46 | ** sender is actually "root", "network", | |
47 | ** and possibly (but not necessarily) if | |
48 | ** the -f argument matches the real sender. | |
49 | ** The effect is that if the "-f" option | |
50 | ** is given to delivermail then it will be | |
51 | ** passed through (as arguments 1 & 2) to | |
52 | ** the mailer. | |
53 | ** M_ROPT -- identical to M_FOPT, except uses | |
54 | ** -r instead. | |
55 | ** M_QUIET -- if set, don't print a message if | |
56 | ** the mailer returns bad status. | |
57 | ** M_RESTR -- if set, this mailer is restricted | |
58 | ** to use by "daemon"; otherwise, we do a | |
59 | ** setuid(getuid()) before calling the | |
60 | ** mailer. | |
61 | ** M_HDR -- if set, the mailer wants us to | |
62 | ** insert a UNIX "From" line before | |
63 | ** outputing. | |
64 | ** M_NOHOST -- if set, this mailer doesn't care | |
65 | ** about the host part (e.g., the local | |
66 | ** mailer). | |
67 | ** M_STRIPQ -- if set, strip quote (`"') | |
68 | ** characters out of parameters as you | |
69 | ** transliterate them into the argument | |
70 | ** vector. For example, the local mailer | |
71 | ** is called directly, so these should be | |
72 | ** stripped, but the program-mailer (i.e., | |
73 | ** csh) should leave them in. | |
74 | ** - an exit status to use as the code for the | |
75 | ** error message print if the mailer returns | |
76 | ** something we don't understand. | |
77 | ** - A list of names that are to be considered | |
78 | ** "local" (and hence are stripped off) for | |
79 | ** this mailer. | |
80 | ** - An argument vector to be passed to the | |
81 | ** mailer with the following substitutions: | |
82 | ** $f - the from person name. | |
83 | ** $u - the target user name. | |
84 | ** $h - the target user host. | |
85 | ** $c - the hop count. | |
86 | ** >>>>>>>>>> Entry zero must be for the local | |
87 | ** >> NOTE >> mailer and entry one must be for | |
88 | ** >>>>>>>>>> the shell. | |
89 | ** ParseTab -- a table driving the parsing process. Each | |
90 | ** entry contains: | |
91 | ** - a character that will trigger this entry. | |
92 | ** - an index into the Mailer table. | |
93 | ** - a word of flags, described in dlvrmail.h. | |
94 | ** - an argument. If we have P_MAP, it is the | |
95 | ** character to turn the trigger character into. | |
96 | ** If we have P_MOVE, it is the site to send it | |
97 | ** to, using the mailer specified above. | |
849eaf63 EA |
98 | ** This table will almost certainly have to be |
99 | ** changed on your site if you have anything more | |
100 | ** than the UUCP net. | |
b3cbe40f EA |
101 | */ |
102 | ||
103 | ||
104 | ||
105 | ||
31cef89c | 106 | static char SccsId[] = "@(#)conf.c 1.10 10/21/80"; |
cb590f52 | 107 | |
31cef89c | 108 | /************ BEGIN CONFIGURATION SECTION ************/ |
cb590f52 | 109 | |
cb590f52 EA |
110 | bool UseMsgId = FALSE; /* don't put message id's in anywhere */ |
111 | ||
112 | # include <whoami.h> /* definitions of machine id's at berkeley */ | |
b3cbe40f | 113 | |
849eaf63 EA |
114 | char *ArpaHost = "[unknown]"; |
115 | char *MyLocName = sysname; | |
116 | # define HASUUCP /* default to having UUCP net */ | |
117 | char *UucpLocal[] = { sysname, NULL }; | |
31cef89c | 118 | /* if you define HASARPA you must include a declaration for ArpaLocal */ |
b3cbe40f | 119 | |
31cef89c | 120 | /************ END CONFIGURATION SECTION ************/ |
50e67097 EA |
121 | |
122 | # ifndef HASARPA | |
123 | # define ArpaLocal NULL | |
124 | # endif HASARPA | |
125 | ||
126 | # ifndef HASUUCP | |
127 | # define UucpLocal NULL | |
128 | # endif HASUUCP | |
129 | ||
31cef89c BJ |
130 | # ifndef HASBERK |
131 | # define BerkLocal NULL | |
132 | # endif HASBERK | |
133 | ||
50e67097 | 134 | |
b3cbe40f EA |
135 | struct mailer Mailer[] = |
136 | { | |
137 | /* local mail -- must be #0 */ | |
138 | { | |
139 | # ifdef NETV6MAIL | |
140 | "/usr/net/bin/v6mail", | |
141 | # else | |
142 | "/bin/mail", | |
143 | # endif | |
144 | M_ROPT|M_NOHOST|M_STRIPQ, EX_NOUSER, NULL, | |
145 | { "...local%mail", "-d", "$u", NULL } | |
146 | }, | |
147 | /* pipes through programs -- must be #1 */ | |
148 | { | |
149 | "/bin/csh", | |
21ec078e | 150 | M_HDR|M_NOHOST, EX_UNAVAILABLE, NULL, |
b3cbe40f EA |
151 | { "...prog%mail", "-fc", "$u", NULL } |
152 | }, | |
153 | /* local berkeley mail */ | |
154 | { | |
155 | "/usr/net/bin/sendberkmail", | |
21ec078e | 156 | M_FOPT|M_HDR|M_STRIPQ, EX_UNAVAILABLE, BerkLocal, |
b3cbe40f EA |
157 | { "...berk%mail", "-m", "$h", "-t", "$u", "-h", "$c", NULL } |
158 | }, | |
159 | /* arpanet mail */ | |
160 | { | |
161 | "/usr/lib/mailers/arpa", | |
50e67097 | 162 | M_STRIPQ, 0, ArpaLocal, |
b3cbe40f EA |
163 | { "...arpa%mail", "$f", "$h", "$u", NULL } |
164 | }, | |
165 | /* uucp mail (cheat & use Bell's v7 mail) */ | |
166 | { | |
b3cbe40f | 167 | "/bin/mail", |
df2fb49b | 168 | M_ROPT|M_STRIPQ, EX_NOUSER, UucpLocal, |
b3cbe40f EA |
169 | # ifdef DUMBMAIL |
170 | { "...uucp%mail", "$h!$u", NULL } | |
171 | # else | |
172 | { "...uucp%mail", "-d", "$h!$u", NULL } | |
173 | # endif DUMBMAIL | |
174 | }, | |
175 | }; | |
176 | ||
177 | # define M_LOCAL 0 | |
178 | # define M_BERK 2 | |
179 | # define M_ARPA 3 | |
180 | # define M_UUCP 4 | |
181 | ||
182 | ||
183 | ||
849eaf63 EA |
184 | struct parsetab ParseTab[] = |
185 | { | |
186 | # ifdef HASARPA | |
187 | '@', M_ARPA, P_HLAST|P_USR_UPPER, NULL, | |
188 | # endif HASARPA | |
189 | # ifdef HASUUCP | |
190 | '^', -1, P_MAP, "!", | |
191 | '!', M_UUCP, 0, NULL, | |
192 | # endif HASUUCP | |
193 | '\0', M_LOCAL, P_MOVE, "", | |
194 | }; | |
b3cbe40f EA |
195 | \f/* |
196 | ** GETNAME -- Get the current users login name. | |
197 | ** | |
198 | ** This is in config.c because it is somewhat machine dependent. | |
199 | ** Examine it carefully for your installation. | |
200 | ** | |
201 | ** Algorithm: | |
202 | ** See if the person is logged in. If so, return | |
203 | ** the name s/he is logged in as. | |
204 | ** Look up the user id in /etc/passwd. If found, | |
205 | ** return that name. | |
206 | ** Return NULL. | |
207 | ** | |
208 | ** Parameters: | |
209 | ** none | |
210 | ** | |
211 | ** Returns: | |
212 | ** The login name of this user. | |
213 | ** NULL if this person is noone. | |
214 | ** | |
215 | ** Side Effects: | |
216 | ** none | |
217 | ** | |
b3cbe40f EA |
218 | ** Called By: |
219 | ** main | |
b3cbe40f EA |
220 | */ |
221 | ||
222 | char * | |
223 | getname() | |
224 | { | |
225 | register char *p; | |
226 | register struct passwd *w; | |
227 | extern char *getlogin(); | |
228 | extern struct passwd *getpwuid(); | |
229 | static char namebuf[9]; | |
230 | ||
231 | p = getlogin(); | |
232 | if (p != NULL && p[0] != '\0') | |
233 | return (p); | |
234 | # ifdef V6 | |
235 | w = getpwuid(getuid() & 0377); | |
236 | # else | |
237 | w = getpwuid(getuid()); | |
238 | # endif V6 | |
239 | if (w != NULL) | |
240 | { | |
241 | strcpy(namebuf, w->pw_name); | |
242 | return (namebuf); | |
243 | } | |
244 | return (NULL); | |
245 | } | |
246 | \f | |
247 | # ifdef V6 | |
248 | /* | |
249 | ** TTYPATH -- Get the path of the user's tty -- Version 6 version. | |
250 | ** | |
251 | ** Returns the pathname of the user's tty. Returns NULL if | |
252 | ** the user is not logged in or if s/he has write permission | |
253 | ** denied. | |
254 | ** | |
255 | ** Parameters: | |
256 | ** none | |
257 | ** | |
258 | ** Returns: | |
259 | ** pathname of the user's tty. | |
260 | ** NULL if not logged in or write permission denied. | |
261 | ** | |
262 | ** Side Effects: | |
263 | ** none. | |
264 | ** | |
265 | ** WARNING: | |
266 | ** Return value is in a local buffer. | |
267 | ** | |
b3cbe40f EA |
268 | ** Called By: |
269 | ** savemail | |
b3cbe40f EA |
270 | */ |
271 | ||
272 | # include <sys/types.h> | |
273 | # include <sys/stat.h> | |
274 | ||
275 | char * | |
276 | ttypath() | |
277 | { | |
278 | struct stat stbuf; | |
279 | register int i; | |
280 | static char pathn[] = "/dev/ttyx"; | |
281 | extern int errno; | |
282 | ||
283 | /* compute the pathname of the controlling tty */ | |
284 | if ((i = ttyn(2)) == 'x' && (i = ttyn(1)) == 'x' && (i = ttyn(0)) == 'x') | |
285 | { | |
286 | errno = 0; | |
287 | return (NULL); | |
288 | } | |
289 | pathn[8] = i; | |
290 | ||
291 | /* see if we have write permission */ | |
292 | if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode)) | |
293 | { | |
294 | errno = 0; | |
295 | return (NULL); | |
296 | } | |
297 | ||
298 | /* see if the user is logged in */ | |
299 | if (getlogin() == NULL) | |
300 | return (NULL); | |
301 | ||
302 | /* looks good */ | |
303 | return (pathn); | |
304 | } | |
305 | \f/* | |
306 | ** FDOPEN -- Open a stdio file given an open file descriptor. | |
307 | ** | |
308 | ** This is included here because it is standard in v7, but we | |
309 | ** need it in v6. | |
310 | ** | |
311 | ** Algorithm: | |
312 | ** Open /dev/null to create a descriptor. | |
313 | ** Close that descriptor. | |
314 | ** Copy the existing fd into the descriptor. | |
315 | ** | |
316 | ** Parameters: | |
317 | ** fd -- the open file descriptor. | |
318 | ** type -- "r", "w", or whatever. | |
319 | ** | |
320 | ** Returns: | |
321 | ** The file descriptor it creates. | |
322 | ** | |
323 | ** Side Effects: | |
324 | ** none | |
325 | ** | |
b3cbe40f EA |
326 | ** Called By: |
327 | ** deliver | |
328 | ** | |
329 | ** Notes: | |
330 | ** The mode of fd must match "type". | |
331 | */ | |
332 | ||
333 | FILE * | |
334 | fdopen(fd, type) | |
335 | int fd; | |
336 | char *type; | |
337 | { | |
338 | register FILE *f; | |
339 | ||
340 | f = fopen("/dev/null", type); | |
341 | close(fileno(f)); | |
342 | fileno(f) = fd; | |
343 | return (f); | |
344 | } | |
345 | \f/* | |
346 | ** INDEX -- Return pointer to character in string | |
347 | ** | |
348 | ** For V7 compatibility. | |
349 | ** | |
350 | ** Parameters: | |
351 | ** s -- a string to scan. | |
352 | ** c -- a character to look for. | |
353 | ** | |
354 | ** Returns: | |
355 | ** If c is in s, returns the address of the first | |
356 | ** instance of c in s. | |
357 | ** NULL if c is not in s. | |
358 | ** | |
359 | ** Side Effects: | |
360 | ** none. | |
b3cbe40f EA |
361 | */ |
362 | ||
363 | index(s, c) | |
364 | register char *s; | |
365 | register char c; | |
366 | { | |
367 | while (*s != '\0') | |
368 | { | |
369 | if (*s++ == c) | |
370 | return (--s); | |
371 | } | |
372 | return (NULL); | |
373 | } | |
374 | # endif V6 | |
375 | \f | |
376 | # ifndef V6 | |
377 | /* | |
378 | ** TTYPATH -- Get the path of the user's tty -- Version 7 version. | |
379 | ** | |
380 | ** Returns the pathname of the user's tty. Returns NULL if | |
381 | ** the user is not logged in or if s/he has write permission | |
382 | ** denied. | |
383 | ** | |
384 | ** Parameters: | |
385 | ** none | |
386 | ** | |
387 | ** Returns: | |
388 | ** pathname of the user's tty. | |
389 | ** NULL if not logged in or write permission denied. | |
390 | ** | |
391 | ** Side Effects: | |
392 | ** none. | |
393 | ** | |
394 | ** WARNING: | |
395 | ** Return value is in a local buffer. | |
396 | ** | |
b3cbe40f EA |
397 | ** Called By: |
398 | ** savemail | |
b3cbe40f EA |
399 | */ |
400 | ||
401 | # include <sys/types.h> | |
402 | # include <sys/stat.h> | |
403 | ||
404 | char * | |
405 | ttypath() | |
406 | { | |
407 | struct stat stbuf; | |
408 | register char *pathn; | |
409 | extern int errno; | |
410 | extern char *ttyname(); | |
411 | ||
412 | /* compute the pathname of the controlling tty */ | |
413 | if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL) | |
414 | { | |
415 | errno = 0; | |
416 | return (NULL); | |
417 | } | |
418 | ||
419 | /* see if we have write permission */ | |
420 | if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode)) | |
421 | { | |
422 | errno = 0; | |
423 | return (NULL); | |
424 | } | |
425 | ||
426 | /* see if the user is logged in */ | |
427 | if (getlogin() == NULL) | |
428 | return (NULL); | |
429 | ||
430 | /* looks good */ | |
431 | return (pathn); | |
432 | } | |
433 | # endif V6 |