|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)rmail.c 4.4 (Berkeley) 8/11/83";
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[512]; /* one line of the message */
34: char from[512]; /* accumulated path of sender */
35: char ufrom[64]; /* user on remote system */
36: char sys[64]; /* a system in path */
37: char junk[512]; /* scratchpad */
38: char cmd[2000];
39: register char *cp;
40: register char *uf; /* 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: uf = ufrom;
69: for (;;)
70: {
71: cp = index(cp+1, 'r');
72: if (cp == NULL)
73: {
74: register char *p = rindex(uf, '!');
75:
76: if (p != NULL)
77: {
78: *p = '\0';
79: (void) strcpy(sys, uf);
80: uf = p + 1;
81: break;
82: }
83: cp = "remote from somewhere";
84: }
85: #ifdef DEBUG
86: if (Debug)
87: printf("cp='%s'\n", cp);
88: #endif
89: if (strncmp(cp, "remote from ", 12)==0)
90: break;
91: }
92: if (cp != NULL)
93: (void) sscanf(cp, "remote from %s", sys);
94: (void) strcat(from, sys);
95: (void) strcat(from, "!");
96: #ifdef DEBUG
97: if (Debug)
98: printf("ufrom='%s', sys='%s', from now '%s'\n", uf, sys, from);
99: #endif
100: }
101: (void) strcat(from, uf);
102:
103: (void) sprintf(cmd, "%s -em -f%s", MAILER, from);
104: while (*++argv != NULL)
105: {
106: (void) strcat(cmd, " '");
107: if (**argv == '(')
108: (void) strncat(cmd, *argv + 1, strlen(*argv) - 2);
109: else
110: (void) strcat(cmd, *argv);
111: (void) strcat(cmd, "'");
112: }
113: #ifdef DEBUG
114: if (Debug)
115: printf("cmd='%s'\n", cmd);
116: #endif
117: out = popen(cmd, "w");
118: fputs(lbuf, out);
119: while (fgets(lbuf, sizeof lbuf, stdin))
120: fputs(lbuf, out);
121: i = pclose(out);
122: if ((i & 0377) != 0)
123: {
124: fprintf(stderr, "pclose: status 0%o\n", i);
125: exit(EX_OSERR);
126: }
127:
128: exit((i >> 8) & 0377);
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.