9 date 93.08.25.17.27.43; author jromine; state Exp;
14 date 92.11.04.00.59.59; author jromine; state Exp;
19 date 92.11.04.00.59.14; author jromine; state Exp;
31 @off_t fixes for BSD44
34 @/* rmail.c - replacement for /bin/rmail */
36 static char ident[] = "@@(#)$Id: rmail.c,v 1.2 1992/11/04 00:59:59 jromine Exp jromine $";
39 /* This program has a long, long history. It started as UCB's rmail, and
40 was then modified by OBrien@@Rand-Unix to run with MMDF. Then DpK@@Brl
41 re-wrote it, and SmB@@Unc hacked it up a bit. After that
42 MRose.UCI@@Rand-Relay upgraded it to use the nifty MF (mail filtering)
43 system. Finally, the latter stripped it down to work with MH.
45 This program should be used ONLY if you have both "mts mh" and "uucp on"
46 set in your MH configuration.
51 #include "../h/addrsbr.h"
52 #include "../zotnet/mf.h"
53 #include "../zotnet/tws.h"
55 #include "../zotnet/mts.h"
62 #define ADDROK 0 /* okay to use post to deliver message */
63 #define UUCP 1 /* okay to use uux to deliver message */
64 #define RETURN 2 /* message loses */
67 int pbroke; /* broken-pipe flag */
68 int rtnflag; /* note was sent back */
70 char date[BUFSIZ]; /* date of origination from uucp header */
71 char from[BUFSIZ]; /* accumulated path of sender */
72 char origsys[BUFSIZ]; /* originating system */
73 char origpath[BUFSIZ]; /* path from us to originating system */
74 char usrfrm[BUFSIZ]; /* the 822 version of from[] */
75 char Mailsys[BUFSIZ]; /* address of the mail agent */
76 char overseer[BUFSIZ]; /* address of the watchdog */
78 char mmdf[BUFSIZ]; /* filtered mail file */
80 char *rtnmessage[] = {
81 " Your message has been intercepted trying to access\n",
82 "a restricted access host (e.g. an ARPANET host). A copy\n",
83 "of your message has been sent to the system administrators.\n",
84 "The text of your message follows.\n\n",
89 " ---------------- Returned Mail Follows --------------\n";
91 " --------------- End of Returned Mail ---------------\n";
93 char *oopsmessage[] = {
94 "\n\n\tThe system administrators (%s) have been informed of\n",
95 "the problem, but have not been given a copy of your message.\n\n",
99 FILE * fromf; /* UUCP "From lines */
100 FILE * msgf; /* message text */
101 FILE * pipef; /* output for "post" or "uux" */
123 setlocale(LC_ALL, "");
125 invo_name = r1bindex (*argv, '/');
127 mts_init (invo_name);
130 adios (NULLCP, "usage: %s user [user ...]", invo_name);
135 (void) sprintf (Mailsys, "%s@@%s", Mailer, LocalName ());
136 if (Overseer == NULL)
138 if (index (Overseer, '@@') == NULL) {
139 (void) sprintf (overseer, "%s@@%s", Overseer, LocalName ());
143 (void) mktemp (Errtmp);
144 if (freopen (Errtmp, "w", stderr) == NULL)
145 adios (Errtmp, "unable to create");
146 (void) dup2 (fileno (stderr), fileno (stdout));
148 (void) mktemp (Msgtmp);
149 if ((msgf = fdopen (creat (Msgtmp, Tmpmode), "w")) == NULL)
150 adios (Msgtmp, "unable to create");
152 (void) mktemp (Fromtmp);
153 if ((fromf = fdopen (creat (Fromtmp, Tmpmode), "w")) == NULL)
154 adios (Fromtmp, "unable to create");
159 if (fgets (linebuf, sizeof linebuf, stdin) == NULL)
161 if (strncmp (linebuf, "From ", 5)
162 && strncmp (linebuf, ">From ", 6))
165 if (linebuf[0] != '>')
167 fputs (linebuf, fromf);
168 cp = index (linebuf, ' ');
170 cp = index (cp, ' ');
172 (void) strcpy (fromwhom, fromptr);
173 (void) strncpy (date, cp, 24);
176 if ((cp = index (cp + 1, 'r')) == NULL) {
177 if ((cp = rindex (fromwhom, '!')) != NULL) {
180 if ((p = rindex (fromwhom, '!')) != NULL)
181 (void) strcpy (origsys, p + 1);
183 (void) strcpy (origsys, fromwhom);
184 (void) strcat (from, fromwhom);
185 (void) strcat (from, "!");
186 (void) strcpy (fromwhom, cp + 1);
189 (void) strcpy (sys, SystemName ());
190 (void) strcat (from, sys);
191 (void) strcpy (origsys, sys);
192 (void) strcat (from, "!");
195 if (strncmp (cp, "remote from ", 12) == 0)
199 (void) sscanf (cp, "remote from %s", sys);
200 (void) strcat (from, sys);
201 (void) strcpy (origsys, sys);
202 (void) strcat (from, "!");
205 if (fromwhom[0] == NULL)
206 adios (NULLCP, "no from line");
210 (void) strcpy (origpath, from);
211 (void) strcat (from, fromwhom);
212 get_mmdf_addr (from, usrfrm);
213 if ((cp = rindex (usrfrm, '<')) != NULL) {
214 (void) strcpy (usrfrm, ++cp); /* sigh */
215 if ((cp = rindex (usrfrm, '>')) != NULL)
218 if (usrfrm[0] == NULL)
219 (void) sprintf (usrfrm, "%s!%s%%%s@@%s%c",
220 SystemName (), from, UucpChan (), LocalName (), NULL);
222 fputs (linebuf, msgf);
223 if (txtcpy (stdin, msgf) == NOTOK)
224 fputs ("\n *** Problem during receipt from UUCP ***\n", msgf);
226 (void) freopen (Msgtmp, "r", msgf);
227 (void) freopen (Fromtmp, "r", fromf);
228 (void) unlink (Fromtmp);
232 for (argv++; --argc > 0;) {
236 if (deliver (*argv++) == NOTOK && !rtnflag)
240 (void) fflush (stderr);
241 (void) fflush (stdout);
248 (void) unlink (Msgtmp);
250 (void) unlink (mmdf);
251 (void) unlink (Errtmp);
265 switch (adrcheck (to)) {
267 if (mmdf[0] == NULL && filter () == NOTOK)
268 (void) strcpy (mmdf, Msgtmp);
269 replyval = xpost (to, mmdf);
273 if ((replyval = xuucp (to)) == NOTOK)
276 if ((replyval = txtcpy (fromf, pipef)) != NOTOK)
277 replyval = txtcpy (msgf, pipef);
278 i = (pclose (pipef) >> 8) & 0xff;
279 if (replyval != NOTOK)
280 replyval = (i != 0 ? NOTOK : OK);
287 switch (adrcheck (from)) {
290 (void) strcpy (tmpfil, "/tmp/rmailXXXXXX");
291 (void) unlink (mktemp (tmpfil));
292 if ((pipef = fdopen (creat (tmpfil, Tmpmode), "w")) == NULL)
295 fprintf (pipef, "Date: %s\nFrom: %s\n",
296 dtimenow (), Mailsys);
297 fprintf (pipef, "To: %s\ncc: %s\n", from, Overseer);
299 (void) fclose (pipef);
301 replyval = xpost (from, tmpfil);
302 (void) unlink (tmpfil);
306 if ((replyval = xuucp (from)) == NOTOK)
309 fprintf (pipef, "To: %s\ncc: %s\n", from, Overseer);
311 i = (pclose (pipef) >> 8) & 0xff;
312 if (replyval != NOTOK)
313 replyval = (i != 0 ? NOTOK : OK);
317 (void) strcpy (tmpfil, "/tmp/rmailXXXXXX");
318 (void) unlink (mktemp (tmpfil));
319 if ((pipef = fdopen (creat (tmpfil, Tmpmode), "w")) == NULL)
322 fprintf (pipef, "Date: %s\nFrom: %s\n",
323 dtimenow (), Mailsys);
324 fprintf (pipef, "To: %s\ncc: %s\n", usrfrm, Overseer);
326 (void) fclose (pipef);
328 replyval = xpost (Overseer, tmpfil);
329 (void) unlink (tmpfil);
347 if ((cp = getname (adr)) == NULL)
349 mp = getm (cp, NULLCP, 0, AD_HOST, NULLCP);
356 (void) strcpy (host, mp -> m_host);
358 if (mp -> m_mbox == NULL)
366 return (strcmp (host, SystemName ()) ? UUCP : ADDROK);
369 if (lookup (origsys, Okhosts) == OK)
371 return (okhost (host) == NOTOK ? RETURN : ADDROK);
380 return (lookup (origsys, Okhosts) == OK
381 || lookup (host, Okhosts) == OK
382 || lookup (host, Okdests) == OK ? OK : NOTOK);
394 if ((lookf = fopen (where, "r")) == NULL)
396 while (fgets (entry, sizeof entry, lookf) != NULL) {
398 while (*cp != '\n' && *cp != ' ' && *cp != '\t')
401 if (uleq (what, entry)) {
402 (void) fclose (lookf);
406 (void) fclose (lookf);
419 fprintf (pipef, "Subject: Illegal Address (%s)\n\n", badadr);
420 for (i = 0; rtnmessage[i]; i++)
421 fputs (rtnmessage[i], pipef);
422 fputs (rtnbegin, pipef);
425 (void) txtcpy (fromf, pipef);
427 (void) txtcpy (msgf, pipef);
429 fputs (rtnend, pipef);
440 && (nread = fread (buffer, sizeof (*buffer), BUFSIZ, frm)) > 0)
441 (void) fwrite (buffer, sizeof (*buffer), nread, to);
443 return (ferror (frm) ? NOTOK : OK);
455 for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
462 execlp (postproc, r1bindex (postproc, '/'),
463 "-deliver", addr, file, NULLCP);
464 fprintf (stderr, "unable to exec ");
469 return (pidwait (child_id, OK) ? NOTOK : OK);
482 (void) strcpy (buffer, to);
483 if (cp = index (buffer, '!'))
486 fprintf (stderr, "internal error -- %s has no host\n", to);
489 (void) sprintf (cmdstr, "uux -p %s!rmail \\(%s\\)", buffer, cp);
491 if ((pipef = popen (cmdstr, "w")) == NULL)
494 (void) signal (SIGPIPE, pipeser);
506 static int pipeser (i)
510 (void) signal (i, SIG_IGN);
524 (void) strcpy (tmpfil, "/tmp/rmailXXXXXX");
525 (void) unlink (mktemp (tmpfil));
526 if ((pipef = fdopen (creat (tmpfil, Tmpmode), "w")) == NULL)
529 fprintf (pipef, "Date: %s\nFrom: %s\n", dtimenow (), Mailsys);
530 fprintf (pipef, "To: %s\n", usrfrm);
531 fprintf (pipef, "\nProblems sending mail:\n\n");
533 if ((fp = fopen (Errtmp, "r")) != NULL) {
534 while (fgets (buffer, sizeof buffer, fp) != NULL) {
537 fputs (buffer, pipef);
542 fprintf (pipef, "\tunknown problem\n");
543 for (i = 0; oopsmessage[i]; i++)
544 fprintf (pipef, oopsmessage[i], Overseer);
545 fputs (rtnbegin, pipef);
548 (void) txtcpy (fromf, pipef);
550 (void) txtcpy (msgf, pipef);
552 fputs (rtnend, pipef);
553 (void) fclose (pipef);
555 (void) xpost (usrfrm, tmpfil);
556 (void) unlink (tmpfil);
567 (void) strcpy (tmpfil, "/tmp/rmailXXXXXX");
568 (void) unlink (mktemp (tmpfil));
569 if ((pipef = fdopen (creat (tmpfil, Tmpmode), "w")) == NULL)
572 fprintf (pipef, "Date: %s\nFrom: %s\n", dtimenow (), Mailsys);
573 fprintf (pipef, "To: %s\n", Mailsys);
574 fprintf (pipef, "\nProblems sending mail for %s (aka %s):\n\n",
578 if ((fp = fopen (Errtmp, "r")) != NULL) {
579 while (fgets (buffer, sizeof buffer, fp) != NULL) {
582 fputs (buffer, pipef);
587 fprintf (pipef, "\tunknown problem\n");
590 fprintf (pipef, "\tunable to open %s\n", Errtmp);
591 (void) fclose (pipef);
593 (void) xpost (Mailsys, tmpfil);
594 (void) unlink (tmpfil);
607 (void) strcpy (tmpfil, "/tmp/rmailXXXXXX");
608 (void) unlink (mktemp (tmpfil));
609 if ((fd = creat (tmpfil, Tmpmode)) == NOTOK)
612 if ((fd = open (tmpfil, 2)) == NOTOK)
614 if ((out = fdopen (fd, "w")) == NULL) {
618 if ((td = dup (fd)) == NOTOK) {
623 fprintf (out, "From %s %s\n", from, date);
624 if (txtcpy (msgf, out) == NOTOK) {
630 (void) lseek (td, (off_t)0, 0);
632 (void) strcpy (mmdfil, "/tmp/mmdfXXXXXX");
633 (void) unlink (mktemp (mmdfil));
634 if ((fd = creat (mmdfil, Tmpmode)) == NOTOK) {
636 (void) unlink (tmpfil);
639 if ((fd = open (mmdfil, 2)) == NOTOK) {
641 (void) unlink (tmpfil);
647 switch (i = uucp2mmdf (td, fd, TRUE)) {
649 (void) strcpy (mmdf, mmdfil);
657 (void) unlink (tmpfil);
660 return (i != OK ? NOTOK : OK);
665 get_mmdf_addr (addr, to)
672 if ((adrxp = seekadrx (addr)) == NULL)
675 addr_convert (adrxp, to, TRUE);
676 while (seekadrx (NULLCP))
690 static char ident[] = "@@(#)$Id: comp.c,v 1.6 1992/11/04 00:40:01 jromine Exp $";
696 (void) lseek (td, 0L, 0);