Acbosgd.2080 net.bugs.4bsd utcsrgv!utzoo!decvax!ucbvax!ihnss!cbosg!cbosgd!mark Sun Feb 28 11:38:00 1982 rmail revisited From: mark (Mark Horton) It has been pointed out to me that the 4.1BSD rmail program, as distributed, does NOT handle multiple addresses correctly after all. I seem to have been running a more current version. So I'm enclosing an rmail which will do it right. Mark static char *sccsid = "@(#)rmail.c 4.1 (Berkeley) 10/1/80"; static char *mrhid = "@(#)rmail.c 1.5 (MRH) 2/28/82"; /* * rmail: front end for mail to stack up those stupid >From ... remote from ... * lines and make a correct return address. This works with the -f option * to /etc/delivermail so it won't work on systems without delivermail. * However, it ought to be easy to modify a standard /bin/mail to do the * same thing. * * Via and Date lines added by Steve Bellovin of UNC. */ #include #include FILE *popen(); char *index(); #define MAILER "/etc/delivermail" main(argc, argv) char **argv; { FILE *out; /* output to delivermail */ char lbuf[1024]; /* one line of the message */ char from[1024]; /* accumulated path of sender */ char via[1024]; /* uucp path of ARPA sender */ char date[1024]; /* date of original letter */ char ufrom[128]; /* user on remote system */ char sys[128]; /* a system in path */ char junk[1024]; /* scratchpad */ char cmd[1024]; register char *cp, *p; char *arpa, *uucp; register char **to; if (argc From ", 6)) break; /* sscanf(lbuf, "%s %s %s %s %s %s %s remote from %s", junk, ufrom, junk, junk, junk, junk, junk, sys); */ p = index(lbuf, ' '); /* note -- cannot be NULL */ while (isspace(*p)) p++; /* find start of name */ for (cp = p; !isspace(*cp); cp++) /* find end of name */ if (*cp == '\0') break; strncpy(ufrom, p, cp-p); ufrom[cp-p] = '\0'; while(isspace(*cp)) cp++; p = cp; for (;;) { cp = index(cp+1, 'r'); if (cp == NULL) goto nsys; #ifdef DEBUG printf("cp='%s'\n", cp); #endif if (strncmp(cp, "remote from ", 12)==0) break; } sscanf(cp, "remote from %s", sys); strcat(from, sys); strcat(from, "!"); while (--cp > p && isspace(*cp)) ; if (++cp > p) { *cp = '\0'; strcpy(date, p); } nsys:; #ifdef DEBUG printf("ufrom='%s', sys='%s', from now '%s' date=%s\n", ufrom, sys, from, date); #endif } strcat(from, ufrom); arpa = index(from, '@'); if (arpa == NULL) arpa = index(from, '%'); if (arpa) { for (uucp = arpa-1; uucp >= from; uucp--) if (*uucp == '!') break; if (uucp >= from) { *uucp = '\0'; strcpy(via, from); strcpy(from, uucp+1); } } sprintf(cmd, "%s -r%s -em", MAILER, from); for (to = &argv[1]; *to; to++) { strcat(cmd, " "); strcat(cmd, *to); } #ifdef DEBUG printf("cmd='%s'\n", cmd); #endif setuid(0); out = popen(cmd, "w"); if (via[0]) { if (strncmp(lbuf, "Via:", 4) == 0) { lbuf[strlen(lbuf)-1] = '!'; strcat(lbuf, via); fprintf(out, "%s\n", lbuf); fgets(lbuf, sizeof lbuf, stdin); } else fprintf(out, "Via: %s\n", via); } if (date[0] && strncmp(lbuf, "Date", 4)) fprintf(out, "Date: %s\n", date); fputs(lbuf, out); while (fgets(lbuf, sizeof lbuf, stdin)) fputs(lbuf, out); pclose(out); } /* * Return the ptr in sp at which the character c appears; * NULL if not found */ char * index(sp, c) register char *sp, c; { do { if (*sp == c) return(sp); } while (*sp++); return(NULL); } ----------------------------------------------------------------- gopher://quux.org/ conversion by John Goerzen of http://communication.ucsd.edu/A-News/ This Usenet Oldnews Archive article may be copied and distributed freely, provided: 1. There is no money collected for the text(s) of the articles. 2. The following notice remains appended to each copy: The Usenet Oldnews Archive: Compilation Copyright (C) 1981, 1996 Bruce Jones, Henry Spencer, David Wiseman.