BSD 4 release
[unix-history] / usr / src / cmd / delivermail / conf.c
CommitLineData
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 106static char SccsId[] = "@(#)conf.c 1.10 10/21/80";
cb590f52 107
31cef89c 108/************ BEGIN CONFIGURATION SECTION ************/
cb590f52 109
cb590f52
EA
110bool 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
114char *ArpaHost = "[unknown]";
115char *MyLocName = sysname;
116# define HASUUCP /* default to having UUCP net */
117char *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
135struct 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
184struct 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
222char *
223getname()
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
275char *
276ttypath()
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
333FILE *
334fdopen(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
363index(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
404char *
405ttypath()
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