|
|
1.1 root 1: /*
2: * recmail: read a mail message on stdin, grab all addresses in To and Cc
3: * lines, and pass the full message to all addressees. This is useful to
4: * send the output of a recently edited mail message (with headers edited too).
5: * It is similar to sendmail -t, but only assumes /bin/mail.
6: */
7: static char *sccsid = "@(#)recmail.c 1.2 3/30/83";
8:
9: #include <stdio.h>
10: #include <ctype.h>
11:
12: #define MAXRECIPS 100
13: char *recips[MAXRECIPS];
14: int nrecips = 0;
15:
16: main(argc, argv)
17: char **argv;
18: {
19: FILE *fd;
20: char *tmpf;
21: char linebuf[1024];
22: char *mailer = "mail"; /* /bin/mail */
23: int i, pid, wpid;
24: int exstat;
25: char *mypath;
26: char *mktemp(), *getenv();
27:
28: tmpf = mktemp("/tmp/rmXXXXXX");
29: fd = fopen(tmpf, "w");
30:
31: while (fgets(linebuf, sizeof linebuf, stdin) != NULL) {
32: fputs(linebuf, fd);
33: if (strncmp(linebuf, "To: ", 4) == 0 ||
34: strncmp(linebuf, "to: ", 4) == 0 ||
35: strncmp(linebuf, "TO: ", 4) == 0 ||
36: strncmp(linebuf, "Cc: ", 4) == 0 ||
37: strncmp(linebuf, "cc: ", 4) == 0 ||
38: strncmp(linebuf, "CC: ", 4) == 0)
39: addrecips(linebuf+4);
40: }
41: fclose(fd);
42:
43: /*
44: * Force the path to only consider /bin and /usr/bin, since
45: * that's the version of mail we want (not /usr/ucb/mail)
46: */
47: mypath = getenv("PATH");
48: if (mypath)
49: strcpy(mypath, "/bin:/usr/bin");
50:
51: /*
52: * We send the copies out separately, because of a bug in
53: * USG's /bin/mail which will generate ANOTHER To: line,
54: * even though we already have one, if there are at least
55: * two recipients.
56: */
57: for (i=0; i<nrecips; i++) {
58: /*
59: * mail recips[i] < tmpf
60: */
61: while ((pid = fork()) == -1) {
62: fprintf(stderr, "fork failed, waiting...\r\n");
63: sleep(60);
64: }
65: if (pid == 0) {
66: close(0);
67: open(tmpf, 0);
68: execlp("mail", "mail", recips[i], 0);
69: perror("mail");
70: exit(1);
71: }
72: while ((wpid = wait(&exstat)) >= 0 && wpid != pid)
73: ;
74: }
75: }
76:
77: #define isok(c) (isprint(c) && (c) != ' ' && c != ',')
78: addrecips(line)
79: char *line;
80: {
81: char *front, *back, *tail;
82: char *malloc();
83:
84: tail = line + strlen(line);
85: for (front=line; front < tail; ) {
86: while (!isok(*front) && front < tail)
87: front++;
88: for (back=front; isok(*back); back++)
89: ;
90: *back=0;
91: recips[nrecips] = malloc(strlen(front) + 1);
92: strcpy(recips[nrecips], front);
93: nrecips++;
94: front = back+1;
95: }
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.