/* * recmail: read a mail message on stdin, grab all addresses in To and Cc * lines, and pass the full message to all addressees. This is useful to * send the output of a recently edited mail message (with headers edited too). * It is similar to sendmail -t, but only assumes /bin/mail. */ static char *sccsid = "@(#)recmail.c 1.2 3/30/83"; #include #include #define MAXRECIPS 100 char *recips[MAXRECIPS]; int nrecips = 0; main(argc, argv) char **argv; { FILE *fd; char *tmpf; char linebuf[1024]; char *mailer = "mail"; /* /bin/mail */ int i, pid, wpid; int exstat; char *mypath; char *mktemp(), *getenv(); tmpf = mktemp("/tmp/rmXXXXXX"); fd = fopen(tmpf, "w"); while (fgets(linebuf, sizeof linebuf, stdin) != NULL) { fputs(linebuf, fd); if (strncmp(linebuf, "To: ", 4) == 0 || strncmp(linebuf, "to: ", 4) == 0 || strncmp(linebuf, "TO: ", 4) == 0 || strncmp(linebuf, "Cc: ", 4) == 0 || strncmp(linebuf, "cc: ", 4) == 0 || strncmp(linebuf, "CC: ", 4) == 0) addrecips(linebuf+4); } fclose(fd); /* * Force the path to only consider /bin and /usr/bin, since * that's the version of mail we want (not /usr/ucb/mail) */ mypath = getenv("PATH"); if (mypath) strcpy(mypath, "/bin:/usr/bin"); /* * We send the copies out separately, because of a bug in * USG's /bin/mail which will generate ANOTHER To: line, * even though we already have one, if there are at least * two recipients. */ for (i=0; i= 0 && wpid != pid) ; } } #define isok(c) (isprint(c) && (c) != ' ' && c != ',') addrecips(line) char *line; { char *front, *back, *tail; char *malloc(); tail = line + strlen(line); for (front=line; front < tail; ) { while (!isok(*front) && front < tail) front++; for (back=front; isok(*back); back++) ; *back=0; recips[nrecips] = malloc(strlen(front) + 1); strcpy(recips[nrecips], front); nrecips++; front = back+1; } }