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