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