1: #ifndef lint 2: static char sccsid[] = "@(#)rmail.c 4.8 (Berkeley) 5/15/86"; 3: #endif 4: 5: /* 6: ** RMAIL -- UUCP mail server. 7: ** 8: ** This program reads the >From ... remote from ... lines that 9: ** UUCP is so fond of and turns them into something reasonable. 10: ** It calls sendmail giving it a -f option built from these 11: ** lines. 12: */ 13: 14: # include <stdio.h> 15: # include <sysexits.h> 16: 17: typedef char bool; 18: #define TRUE 1 19: #define FALSE 0 20: 21: extern FILE *popen(); 22: extern char *index(); 23: extern char *rindex(); 24: 25: bool Debug; 26: 27: # define MAILER "/usr/lib/sendmail" 28: 29: main(argc, argv) 30: char **argv; 31: { 32: FILE *out; /* output to sendmail */ 33: char lbuf[1024]; /* one line of the message */ 34: char from[512]; /* accumulated path of sender */ 35: char ufrom[512]; /* user on remote system */ 36: char sys[512]; /* a system in path */ 37: char junk[1024]; /* scratchpad */ 38: char cmd[2000]; 39: register char *cp; 40: register char *uf = ufrom; /* ptr into ufrom */ 41: int i; 42: 43: # ifdef DEBUG 44: if (argc > 1 && strcmp(argv[1], "-T") == 0) 45: { 46: Debug = TRUE; 47: argc--; 48: argv++; 49: } 50: # endif DEBUG 51: 52: if (argc < 2) 53: { 54: fprintf(stderr, "Usage: rmail user ...\n"); 55: exit(EX_USAGE); 56: } 57: 58: (void) strcpy(from, ""); 59: (void) strcpy(ufrom, "/dev/null"); 60: 61: for (;;) 62: { 63: (void) fgets(lbuf, sizeof lbuf, stdin); 64: if (strncmp(lbuf, "From ", 5) != 0 && strncmp(lbuf, ">From ", 6) != 0) 65: break; 66: (void) sscanf(lbuf, "%s %s", junk, ufrom); 67: cp = lbuf; 68: for (;;) 69: { 70: cp = index(cp+1, 'r'); 71: if (cp == NULL) 72: { 73: register char *p = rindex(uf, '!'); 74: 75: if (p != NULL) 76: { 77: *p = '\0'; 78: (void) strcpy(sys, uf); 79: uf = p + 1; 80: break; 81: } 82: cp = "remote from somewhere"; 83: } 84: #ifdef DEBUG 85: if (Debug) 86: printf("cp='%s'\n", cp); 87: #endif 88: if (strncmp(cp, "remote from ", 12)==0) 89: break; 90: } 91: if (cp != NULL) 92: (void) sscanf(cp, "remote from %s", sys); 93: (void) strcat(from, sys); 94: (void) strcat(from, "!"); 95: #ifdef DEBUG 96: if (Debug) 97: printf("ufrom='%s', sys='%s', from now '%s'\n", uf, sys, from); 98: #endif 99: } 100: (void) strcat(from, uf); 101: 102: (void) sprintf(cmd, "%s -ee -f%s -i", MAILER, from); 103: while (*++argv != NULL) 104: { 105: (void) strcat(cmd, " '"); 106: if (**argv == '(') 107: (void) strncat(cmd, *argv + 1, strlen(*argv) - 2); 108: else 109: (void) strcat(cmd, *argv); 110: (void) strcat(cmd, "'"); 111: } 112: #ifdef DEBUG 113: if (Debug) 114: printf("cmd='%s'\n", cmd); 115: #endif 116: out = popen(cmd, "w"); 117: fputs(lbuf, out); 118: while (fgets(lbuf, sizeof lbuf, stdin)) 119: fputs(lbuf, out); 120: i = pclose(out); 121: if ((i & 0377) != 0) 122: { 123: fprintf(stderr, "pclose: status 0%o\n", i); 124: exit(EX_OSERR); 125: } 126: 127: exit((i >> 8) & 0377); 128: }