changed "-ee" flag to work with BerkNet better
[unix-history] / usr / src / usr.sbin / sendmail / src / conf.c
CommitLineData
b3cbe40f
EA
1# include <stdio.h>
2# include <pwd.h>
3# include "dlvrmail.h"
4# include <whoami.h>
5
6/*
7** CONF.C -- Delivermail Configuration Tables.
8**
9** Defines the configuration of this installation.
10**
11** The first table describes available mailers. This is
12** just a list of argument vectors, with the following
13** codes embedded:
14** $u -- insert the user name.
15** $h -- insert the host name.
16** $f -- insert the from person name.
17** $c -- insert the hop count.
18** This stuff is interpreted in buildmail. There are two
19** important conventions here: entry zero must be the
20** local mailer & entry one must be the shell.
21**
22** The second table gives a list of special characters. This
23** table is scanned linearly by parse() until an entry is
24** found using one of the magic characters. Other fields
25** give more information on how to handle it.
26**
27** Defined Constants:
28** M_* -- indices into Mailer, used only in this module.
29**
30** Defines:
31** Mailer -- the mailer descriptor table.
32** ParseTab -- the parse table.
33**
34** Notes:
35** Ingres 11/70 version.
36**
37** History:
38** 3/5/80 -- Generalized to use <whoami.h>.
39** 12/26/79 -- written for Ingres 11/70.
40*/
41
42
43
44
45
46# ifdef ING70
47static char *BerkLocal[] = { "i", "ingres", "ing70", NULL };
48char *MyLocNam = "Ing70";
49# define HASARPA
50# define V6
51# endif ING70
52
53# ifdef INGVAX
54/* untested */
55static char *BerkLocal[] = { "j", "ingvax", NULL };
56char *MyLocNam = "IngVax";
57# endif INGVAX
58
59# ifdef CSVAX
60/* untested */
61static char *BerkLocal[] = { "v", "csvax", "vax", NULL };
62char *MyLocNam = "CSVax";
63# define HASUUCP
64# define NETV6MAIL
65# endif CSVAX
66
67# ifdef CORY
68/* untested */
69static char *BerkLocal[] = { "y", "cory", NULL };
70char *MyLocNam = "Cory";
71# endif CORY
72
73# ifdef IMAGE
74/* untested */
75static char *BerkLocal[] = { "m", "image", NULL };
76char *MyLocNam = "Image";
77# define V6
78# endif IMAGE
79
80# ifdef ESVAX
81/* untested */
82static char *BerkLocal[] = { "o", "esvax", NULL };
83char *MyLocNam = "ESVax";
84# endif ESVAX
85
86# ifdef EECS40
87/* untested */
88static char *BerkLocal[] = { "z", "eecs40", NULL };
89char *MyLocNam = "EECS40";
90# define V6
91# endif EECS40
92
93struct mailer Mailer[] =
94{
95 /* local mail -- must be #0 */
96 {
97# ifdef NETV6MAIL
98 "/usr/net/bin/v6mail",
99# else
100 "/bin/mail",
101# endif
102 M_ROPT|M_NOHOST|M_STRIPQ, EX_NOUSER, NULL,
103 { "...local%mail", "-d", "$u", NULL }
104 },
105 /* pipes through programs -- must be #1 */
106 {
107 "/bin/csh",
108 M_HDR|M_NOHOST, EX_UNAVAIL, NULL,
109 { "...prog%mail", "-fc", "$u", NULL }
110 },
111 /* local berkeley mail */
112 {
113 "/usr/net/bin/sendberkmail",
cc7250b7 114 M_FOPT|M_HDR|M_STRIPQ, EX_UNAVAIL, BerkLocal,
b3cbe40f
EA
115 { "...berk%mail", "-m", "$h", "-t", "$u", "-h", "$c", NULL }
116 },
117 /* arpanet mail */
118 {
119 "/usr/lib/mailers/arpa",
cc7250b7 120 M_STRIPQ, 0, NULL,
b3cbe40f
EA
121 { "...arpa%mail", "$f", "$h", "$u", NULL }
122 },
123 /* uucp mail (cheat & use Bell's v7 mail) */
124 {
125# ifdef UCKMAIL
126 "/bin/badmail",
127# else
128 "/bin/mail",
129# endif
130 M_ROPT|M_NOHOST|M_STRIPQ, EX_NOUSER, NULL,
131# ifdef DUMBMAIL
132 { "...uucp%mail", "$h!$u", NULL }
133# else
134 { "...uucp%mail", "-d", "$h!$u", NULL }
135# endif DUMBMAIL
136 },
137};
138
139# define M_LOCAL 0
140# define M_BERK 2
141# define M_ARPA 3
142# define M_UUCP 4
143
144
145
146struct parsetab ParseTab[] =
147{
148 ':', M_BERK, P_ONE, NULL,
149# ifdef HASARPA
150 '@', M_ARPA, P_HLAST|P_USR_UPPER, NULL,
151# else
152 '@', M_BERK, P_HLAST|P_USR_UPPER|P_MOVE, "ing70",
153# endif HASARPA
154 '^', -1, P_MAP, "!",
155# ifdef HASUUCP
156 '!', M_UUCP, 0, NULL,
157# else
158 '!', M_BERK, P_MOVE, "csvax",
159# endif HASUUCP
160 '.', -1, P_MAP|P_ONE, ":",
161 '\0', M_LOCAL, P_MOVE, "",
162};
163\f/*
164** GETNAME -- Get the current users login name.
165**
166** This is in config.c because it is somewhat machine dependent.
167** Examine it carefully for your installation.
168**
169** Algorithm:
170** See if the person is logged in. If so, return
171** the name s/he is logged in as.
172** Look up the user id in /etc/passwd. If found,
173** return that name.
174** Return NULL.
175**
176** Parameters:
177** none
178**
179** Returns:
180** The login name of this user.
181** NULL if this person is noone.
182**
183** Side Effects:
184** none
185**
186** Requires:
187** getlogin (sys)
188** getpwuid (sys)
189** getuid (sys)
190**
191** Called By:
192** main
193**
194** History:
195** 12/26/79 -- written.
196*/
197
198char *
199getname()
200{
201 register char *p;
202 register struct passwd *w;
203 extern char *getlogin();
204 extern struct passwd *getpwuid();
205 static char namebuf[9];
206
207 p = getlogin();
208 if (p != NULL && p[0] != '\0')
209 return (p);
210# ifdef V6
211 w = getpwuid(getuid() & 0377);
212# else
213 w = getpwuid(getuid());
214# endif V6
215 if (w != NULL)
216 {
217 strcpy(namebuf, w->pw_name);
218 return (namebuf);
219 }
220 return (NULL);
221}
222\f
223# ifdef V6
224/*
225** TTYPATH -- Get the path of the user's tty -- Version 6 version.
226**
227** Returns the pathname of the user's tty. Returns NULL if
228** the user is not logged in or if s/he has write permission
229** denied.
230**
231** Parameters:
232** none
233**
234** Returns:
235** pathname of the user's tty.
236** NULL if not logged in or write permission denied.
237**
238** Side Effects:
239** none.
240**
241** WARNING:
242** Return value is in a local buffer.
243**
244** Requires:
245** stat (sys)
246** ttyn (sys)
247** open (sys)
248** read (sys)
249** close (sys)
250** seek (sys)
251**
252** Called By:
253** savemail
254**
255** History:
256** 1/12/80 -- written.
257*/
258
259# include <sys/types.h>
260# include <sys/stat.h>
261
262char *
263ttypath()
264{
265 struct stat stbuf;
266 register int i;
267 static char pathn[] = "/dev/ttyx";
268 extern int errno;
269
270 /* compute the pathname of the controlling tty */
271 if ((i = ttyn(2)) == 'x' && (i = ttyn(1)) == 'x' && (i = ttyn(0)) == 'x')
272 {
273 errno = 0;
274 return (NULL);
275 }
276 pathn[8] = i;
277
278 /* see if we have write permission */
279 if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
280 {
281 errno = 0;
282 return (NULL);
283 }
284
285 /* see if the user is logged in */
286 if (getlogin() == NULL)
287 return (NULL);
288
289 /* looks good */
290 return (pathn);
291}
292\f/*
293** FDOPEN -- Open a stdio file given an open file descriptor.
294**
295** This is included here because it is standard in v7, but we
296** need it in v6.
297**
298** Algorithm:
299** Open /dev/null to create a descriptor.
300** Close that descriptor.
301** Copy the existing fd into the descriptor.
302**
303** Parameters:
304** fd -- the open file descriptor.
305** type -- "r", "w", or whatever.
306**
307** Returns:
308** The file descriptor it creates.
309**
310** Side Effects:
311** none
312**
313** Requires:
314** fopen (sys)
315**
316** Called By:
317** deliver
318**
319** Notes:
320** The mode of fd must match "type".
321*/
322
323FILE *
324fdopen(fd, type)
325 int fd;
326 char *type;
327{
328 register FILE *f;
329
330 f = fopen("/dev/null", type);
331 close(fileno(f));
332 fileno(f) = fd;
333 return (f);
334}
335\f/*
336** INDEX -- Return pointer to character in string
337**
338** For V7 compatibility.
339**
340** Parameters:
341** s -- a string to scan.
342** c -- a character to look for.
343**
344** Returns:
345** If c is in s, returns the address of the first
346** instance of c in s.
347** NULL if c is not in s.
348**
349** Side Effects:
350** none.
351**
352** Requires:
353** none.
354**
355** History:
356** 3/14/80 -- written. Why isn't this in -lS?
357*/
358
359index(s, c)
360 register char *s;
361 register char c;
362{
363 while (*s != '\0')
364 {
365 if (*s++ == c)
366 return (--s);
367 }
368 return (NULL);
369}
370# endif V6
371\f
372# ifndef V6
373/*
374** TTYPATH -- Get the path of the user's tty -- Version 7 version.
375**
376** Returns the pathname of the user's tty. Returns NULL if
377** the user is not logged in or if s/he has write permission
378** denied.
379**
380** Parameters:
381** none
382**
383** Returns:
384** pathname of the user's tty.
385** NULL if not logged in or write permission denied.
386**
387** Side Effects:
388** none.
389**
390** WARNING:
391** Return value is in a local buffer.
392**
393** Requires:
394** stat (sys)
395** ttyn (sys)
396** open (sys)
397** read (sys)
398** close (sys)
399** seek (sys)
400**
401** Called By:
402** savemail
403**
404** History:
405** 1/12/80 -- written.
406*/
407
408# include <sys/types.h>
409# include <sys/stat.h>
410
411char *
412ttypath()
413{
414 struct stat stbuf;
415 register char *pathn;
416 extern int errno;
417 extern char *ttyname();
418
419 /* compute the pathname of the controlling tty */
420 if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && (pathn = ttyname(0)) == NULL)
421 {
422 errno = 0;
423 return (NULL);
424 }
425
426 /* see if we have write permission */
427 if (stat(pathn, &stbuf) < 0 || !flagset(02, stbuf.st_mode))
428 {
429 errno = 0;
430 return (NULL);
431 }
432
433 /* see if the user is logged in */
434 if (getlogin() == NULL)
435 return (NULL);
436
437 /* looks good */
438 return (pathn);
439}
440# endif V6