|
|
1.1 ! root 1: static char *sccsid = "@(#)rmail.c 4.1 (Berkeley) 10/1/80"; ! 2: /* ! 3: * rmail: front end for mail to stack up those stupid >From ... remote from ... ! 4: * lines and make a correct return address. This works with the -f option ! 5: * to /etc/delivermail so it won't work on systems without delivermail. ! 6: * However, it ought to be easy to modify a standard /bin/mail to do the ! 7: * same thing. ! 8: * ! 9: * NOTE: Rmail is SPECIFICALLY INTENDED for ERNIE COVAX because of its ! 10: * physical position as a gateway between the uucp net and the arpanet. ! 11: * By default, other sites will probably want /bin/rmail to be a link ! 12: * to /bin/mail, as it was intended by BTL. However, other than the ! 13: * (somewhat annoying) loss of information about when the mail was ! 14: * originally sent, rmail should work OK on other systems running uucp. ! 15: * If you don't run uucp you don't even need any rmail. ! 16: */ ! 17: ! 18: #include <stdio.h> ! 19: FILE *popen(); ! 20: char *index(); ! 21: ! 22: #define MAILER "/etc/delivermail" ! 23: ! 24: main(argc, argv) ! 25: char **argv; ! 26: { ! 27: FILE *out; /* output to delivermail */ ! 28: char lbuf[512]; /* one line of the message */ ! 29: char from[512]; /* accumulated path of sender */ ! 30: char ufrom[64]; /* user on remote system */ ! 31: char sys[64]; /* a system in path */ ! 32: char junk[512]; /* scratchpad */ ! 33: char cmd[512]; ! 34: char *to, *cp; ! 35: ! 36: to = argv[1]; ! 37: if (argc != 2) { ! 38: fprintf(stderr, "Usage: rmail user\n"); ! 39: exit(1); ! 40: } ! 41: ! 42: for (;;) { ! 43: fgets(lbuf, sizeof lbuf, stdin); ! 44: if (strncmp(lbuf, "From ", 5) && strncmp(lbuf, ">From ", 6)) ! 45: break; ! 46: /* sscanf(lbuf, "%s %s %s %s %s %s %s remote from %s", junk, ufrom, junk, junk, junk, junk, junk, sys); */ ! 47: sscanf(lbuf, "%s %s", junk, ufrom); ! 48: cp = lbuf; ! 49: for (;;) { ! 50: cp = index(cp+1, 'r'); ! 51: if (cp == NULL) ! 52: cp = "remote from somewhere"; ! 53: #ifdef DEBUG ! 54: printf("cp='%s'\n", cp); ! 55: #endif ! 56: if (strncmp(cp, "remote from ", 12)==0) ! 57: break; ! 58: } ! 59: sscanf(cp, "remote from %s", sys); ! 60: strcat(from, sys); ! 61: strcat(from, "!"); ! 62: #ifdef DEBUG ! 63: printf("ufrom='%s', sys='%s', from now '%s'\n", ufrom, sys, from); ! 64: #endif ! 65: } ! 66: strcat(from, ufrom); ! 67: ! 68: sprintf(cmd, "%s -r%s %s", MAILER, from, to); ! 69: #ifdef DEBUG ! 70: printf("cmd='%s'\n", cmd); ! 71: #endif ! 72: out = popen(cmd, "w"); ! 73: fputs(lbuf, out); ! 74: while (fgets(lbuf, sizeof lbuf, stdin)) ! 75: fputs(lbuf, out); ! 76: pclose(out); ! 77: } ! 78: ! 79: /* ! 80: * Return the ptr in sp at which the character c appears; ! 81: * NULL if not found ! 82: */ ! 83: ! 84: char * ! 85: index(sp, c) ! 86: register char *sp, c; ! 87: { ! 88: do { ! 89: if (*sp == c) ! 90: return(sp); ! 91: } while (*sp++); ! 92: return(NULL); ! 93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.