|
|
1.1 root 1: # include <stdio.h>
2: # include <pwd.h>
3: # include "dlvrmail.h"
4:
5: /*
6: ** CONF.C -- Delivermail Configuration Tables.
7: **
8: ** Defines the configuration of this installation.
9: **
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.
24: ** DUMBMAIL -- set if your /bin/mail doesn't have the
25: ** -d flag.
26: **
27: ** Configuration Variables:
28: ** ArpaHost -- the arpanet name of the host through
29: ** which arpanet mail will be sent.
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.
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.
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.
98: ** This table will almost certainly have to be
99: ** changed on your site if you have anything more
100: ** than the UUCP net.
101: */
102:
103:
104:
105:
106: static char SccsId[] = "@(#)conf.c 1.10 10/21/80";
107:
108:
109: bool UseMsgId = FALSE; /* don't put message id's in anywhere */
110:
111: # include <whoami.h> /* definitions of machine id's at berkeley */
112:
113: # ifdef BERKELEY
114: char *ArpaHost = "Berkeley"; /* host name of gateway on Arpanet */
115: # else BERKELEY
116: char *ArpaHost = "[unknown]";
117: char *MyLocName = sysname;
118: # define HASUUCP /* default to having UUCP net */
119: char *UucpLocal[] = { sysname, NULL };
120: # endif BERKELEY
121:
122: # ifdef ING70
123: static char *BerkLocal[] = { "i", "ingres", "ing70", NULL };
124: # define ArpaLocal NULL
125: char *MyLocName = "Ing70";
126: # define HASARPA
127: # define V6
128: # endif ING70
129:
130: # ifdef INGVAX
131: static char *BerkLocal[] = { "j", "ingvax", NULL };
132: char *MyLocName = "IngVax";
133: # endif INGVAX
134:
135: # ifdef CSVAX
136: static char *BerkLocal[] = { "v", "csvax", "vax", NULL };
137: static char *UucpLocal[] = { "ucbvax", "ernie", NULL };
138: char *MyLocName = "CSVAX";
139: # define HASUUCP
140: # define NETV6MAIL
141: # endif CSVAX
142:
143: # ifdef CORY
144: /* untested */
145: static char *BerkLocal[] = { "y", "cory", NULL };
146: char *MyLocName = "Cory";
147: # endif CORY
148:
149: # ifdef IMAGE
150: /* untested */
151: static char *BerkLocal[] = { "m", "image", NULL };
152: char *MyLocName = "Image";
153: # define V6
154: # endif IMAGE
155:
156: # ifdef ESVAX
157: /* untested */
158: static char *BerkLocal[] = { "o", "esvax", NULL };
159: char *MyLocName = "ESVAX";
160: # endif ESVAX
161:
162: # ifdef EECS40
163: /* untested */
164: static char *BerkLocal[] = { "z", "eecs40", NULL };
165: char *MyLocName = "EECS40";
166: # define V6
167: # endif EECS40
168:
169:
170: # ifndef HASARPA
171: # define ArpaLocal NULL
172: # endif HASARPA
173:
174: # ifndef HASUUCP
175: # define UucpLocal NULL
176: # endif HASUUCP
177:
178:
179: struct mailer Mailer[] =
180: {
181: /* local mail -- must be #0 */
182: {
183: # ifdef NETV6MAIL
184: "/usr/net/bin/v6mail",
185: # else
186: "/bin/mail",
187: # endif
188: M_ROPT|M_NOHOST|M_STRIPQ, EX_NOUSER, NULL,
189: { "...local%mail", "-d", "$u", NULL }
190: },
191: /* pipes through programs -- must be #1 */
192: {
193: "/bin/csh",
194: M_HDR|M_NOHOST, EX_UNAVAILABLE, NULL,
195: { "...prog%mail", "-fc", "$u", NULL }
196: },
197: /* local berkeley mail */
198: {
199: "/usr/net/bin/sendberkmail",
200: M_FOPT|M_HDR|M_STRIPQ, EX_UNAVAILABLE, BerkLocal,
201: { "...berk%mail", "-m", "$h", "-t", "$u", "-h", "$c", NULL }
202: },
203: /* arpanet mail */
204: {
205: "/usr/lib/mailers/arpa",
206: M_STRIPQ, 0, ArpaLocal,
207: { "...arpa%mail", "$f", "$h", "$u", NULL }
208: },
209: /* uucp mail (cheat & use Bell's v7 mail) */
210: {
211: "/bin/mail",
212: M_ROPT|M_STRIPQ, EX_NOUSER, UucpLocal,
213: # ifdef DUMBMAIL
214: { "...uucp%mail", "$h!$u", NULL }
215: # else
216: { "...uucp%mail", "-d", "$h!$u", NULL }
217: # endif DUMBMAIL
218: },
219: };
220:
221: # define M_LOCAL 0
222: # define M_BERK 2
223: # define M_ARPA 3
224: # define M_UUCP 4
225:
226:
227:
228: # ifdef BERKELEY
229: struct parsetab ParseTab[] =
230: {
231: ':', M_BERK, P_ONE, NULL,
232: # ifdef HASARPA
233: '@', M_ARPA, P_HLAST|P_USR_UPPER, NULL,
234: # else
235: '@', M_BERK, P_HLAST|P_USR_UPPER|P_MOVE, "ing70",
236: # endif HASARPA
237: '^', -1, P_MAP, "!",
238: # ifdef HASUUCP
239: '!', M_UUCP, 0, NULL,
240: # else
241: '!', M_BERK, P_MOVE, "csvax",
242: # endif HASUUCP
243: '.', -1, P_MAP|P_ONE, ":",
244: '\0', M_LOCAL, P_MOVE, "",
245: };
246: # else BERKELEY
247: struct parsetab ParseTab[] =
248: {
249: # ifdef HASARPA
250: '@', M_ARPA, P_HLAST|P_USR_UPPER, NULL,
251: # endif HASARPA
252: # ifdef HASUUCP
253: '^', -1, P_MAP, "!",
254: '!', M_UUCP, 0, NULL,
255: # endif HASUUCP
256: '\0', M_LOCAL, P_MOVE, "",
257: };
258: # endif BERKELEY
259: /*
260: ** GETNAME -- Get the current users login name.
261: **
262: ** This is in config.c because it is somewhat machine dependent.
263: ** Examine it carefully for your installation.
264: **
265: ** Algorithm:
266: ** See if the person is logged in. If so, return
267: ** the name s/he is logged in as.
268: ** Look up the user id in /etc/passwd. If found,
269: ** return that name.
270: ** Return NULL.
271: **
272: ** Parameters:
273: ** none
274: **
275: ** Returns:
276: ** The login name of this user.
277: ** NULL if this person is noone.
278: **
279: ** Side Effects:
280: ** none
281: **
282: ** Called By:
283: ** main
284: */
285:
286: char *
287: getname()
288: {
289: register char *p;
290: register struct passwd *w;
291: extern char *getlogin();
292: extern struct passwd *getpwuid();
293: static char namebuf[9];
294:
295: p = getlogin();
296: if (p != NULL && p[0] != '\0')
297: return (p);
298: # ifdef V6
299: w = getpwuid(getuid() & 0377);
300: # else
301: w = getpwuid(getuid());
302: # endif V6
303: if (w != NULL)
304: {
305: strcpy(namebuf, w->pw_name);
306: return (namebuf);
307: }
308: return (NULL);
309: }
310:
311: # ifdef V6
312: /*
313: ** TTYPATH -- Get the path of the user's tty -- Version 6 version.
314: **
315: ** Returns the pathname of the user's tty. Returns NULL if
316: ** the user is not logged in or if s/he has write permission
317: ** denied.
318: **
319: ** Parameters:
320: ** none
321: **
322: ** Returns:
323: ** pathname of the user's tty.
324: ** NULL if not logged in or write permission denied.
325: **
326: ** Side Effects:
327: ** none.
328: **
329: ** WARNING:
330: ** Return value is in a local buffer.
331: **
332: ** Called By:
333: ** savemail
334: */
335:
336: # include <sys/types.h>
337: # include <sys/stat.h>
338:
339: char *
340: ttypath()
341: {
342: struct stat stbuf;
343: register int i;
344: static char pathn[] = "/dev/ttyx";
345: extern int errno;
346:
347: /* compute the pathname of the controlling tty */
348: if ((i = ttyn(2)) == 'x' && (i = ttyn(1)) == 'x' && (i = ttyn(0)) == 'x')
349: {
350: errno = 0;
351: return (NULL);
352: }
353: pathn[8] = i;
354:
355: /* see if we have write permission */
356: if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
357: {
358: errno = 0;
359: return (NULL);
360: }
361:
362: /* see if the user is logged in */
363: if (getlogin() == NULL)
364: return (NULL);
365:
366: /* looks good */
367: return (pathn);
368: }
369: /*
370: ** FDOPEN -- Open a stdio file given an open file descriptor.
371: **
372: ** This is included here because it is standard in v7, but we
373: ** need it in v6.
374: **
375: ** Algorithm:
376: ** Open /dev/null to create a descriptor.
377: ** Close that descriptor.
378: ** Copy the existing fd into the descriptor.
379: **
380: ** Parameters:
381: ** fd -- the open file descriptor.
382: ** type -- "r", "w", or whatever.
383: **
384: ** Returns:
385: ** The file descriptor it creates.
386: **
387: ** Side Effects:
388: ** none
389: **
390: ** Called By:
391: ** deliver
392: **
393: ** Notes:
394: ** The mode of fd must match "type".
395: */
396:
397: FILE *
398: fdopen(fd, type)
399: int fd;
400: char *type;
401: {
402: register FILE *f;
403:
404: f = fopen("/dev/null", type);
405: close(fileno(f));
406: fileno(f) = fd;
407: return (f);
408: }
409: /*
410: ** INDEX -- Return pointer to character in string
411: **
412: ** For V7 compatibility.
413: **
414: ** Parameters:
415: ** s -- a string to scan.
416: ** c -- a character to look for.
417: **
418: ** Returns:
419: ** If c is in s, returns the address of the first
420: ** instance of c in s.
421: ** NULL if c is not in s.
422: **
423: ** Side Effects:
424: ** none.
425: */
426:
427: index(s, c)
428: register char *s;
429: register char c;
430: {
431: while (*s != '\0')
432: {
433: if (*s++ == c)
434: return (--s);
435: }
436: return (NULL);
437: }
438: # endif V6
439:
440: # ifndef V6
441: /*
442: ** TTYPATH -- Get the path of the user's tty -- Version 7 version.
443: **
444: ** Returns the pathname of the user's tty. Returns NULL if
445: ** the user is not logged in or if s/he has write permission
446: ** denied.
447: **
448: ** Parameters:
449: ** none
450: **
451: ** Returns:
452: ** pathname of the user's tty.
453: ** NULL if not logged in or write permission denied.
454: **
455: ** Side Effects:
456: ** none.
457: **
458: ** WARNING:
459: ** Return value is in a local buffer.
460: **
461: ** Called By:
462: ** savemail
463: */
464:
465: # include <sys/types.h>
466: # include <sys/stat.h>
467:
468: char *
469: ttypath()
470: {
471: struct stat stbuf;
472: register char *pathn;
473: extern int errno;
474: extern char *ttyname();
475:
476: /* compute the pathname of the controlling tty */
477: if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL)
478: {
479: errno = 0;
480: return (NULL);
481: }
482:
483: /* see if we have write permission */
484: if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
485: {
486: errno = 0;
487: return (NULL);
488: }
489:
490: /* see if the user is logged in */
491: if (getlogin() == NULL)
492: return (NULL);
493:
494: /* looks good */
495: return (pathn);
496: }
497: # endif V6
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.