|
|
1.1 root 1: /*
2: * Copyright (c) 1981, 1988 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1981, 1988 The Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)rmail.c 4.15 (Berkeley) 5/31/90";
28: #endif /* not lint */
29:
30: /*
31: * RMAIL -- UUCP mail server.
32: *
33: * This program reads the >From ... remote from ... lines that
34: * UUCP is so fond of and turns them into something reasonable.
35: * It calls sendmail giving it a -f option built from these lines.
36: */
37:
38: #include <sysexits.h>
39: #include <sys/types.h>
40: #include <sys/file.h>
41: #include <sys/stat.h>
42: #include <stdio.h>
43: #include <paths.h>
44:
45: typedef char bool;
46: #define TRUE 1
47: #define FALSE 0
48:
49: extern char *index();
50: extern char *rindex();
51:
52: char *Domain = "UUCP"; /* Default "Domain" */
53:
54: main(argc, argv)
55: int argc;
56: char **argv;
57: {
58: char lbuf[1024]; /* one line of the message */
59: char from[512]; /* accumulated path of sender */
60: char ufrom[512]; /* user on remote system */
61: char sys[512]; /* a system in path */
62: char fsys[512]; /* first system in path */
63: char junk[1024]; /* scratchpad */
64: char *args[100]; /* arguments to mailer command */
65: register char *cp;
66: register char *uf = NULL; /* ptr into ufrom */
67: int i;
68: long position;
69: struct stat sbuf;
70: #ifdef DEBUG
71: bool Debug;
72:
73: if (argc > 1 && strcmp(argv[1], "-T") == 0) {
74: Debug = TRUE;
75: argc--;
76: argv++;
77: }
78: #endif
79:
80: if (argc < 2) {
81: fprintf(stderr, "Usage: rmail user ...\n");
82: exit(EX_USAGE);
83: }
84: if (argc > 2 && strncmp(argv[1], "-D", 2) == 0) {
85: Domain = &argv[1][2];
86: argc -= 2;
87: argv += 2;
88: }
89: from[0] = '\0';
90: fsys[0] = '\0';
91: (void) strcpy(ufrom, _PATH_DEVNULL);
92:
93: for (position = 0;; position = ftell(stdin)) {
94: if (fgets(lbuf, sizeof lbuf, stdin) == NULL)
95: exit(EX_DATAERR);
96: if (strncmp(lbuf, "From ", 5) != 0 &&
97: strncmp(lbuf, ">From ", 6) != 0)
98: break;
99: (void) sscanf(lbuf, "%s %s", junk, ufrom);
100: cp = lbuf;
101: uf = ufrom;
102: for (;;) {
103: cp = index(cp + 1, 'r');
104: if (cp == NULL) {
105: register char *p = rindex(uf, '!');
106:
107: if (p != NULL) {
108: *p = '\0';
109: (void) strcpy(sys, uf);
110: uf = p + 1;
111: break;
112: }
113: (void) strcpy(sys, "");
114: break; /* no "remote from" found */
115: }
116: #ifdef DEBUG
117: if (Debug)
118: printf("cp='%s'\n", cp);
119: #endif
120: if (strncmp(cp, "remote from ", 12) == 0)
121: break;
122: }
123: if (cp != NULL)
124: (void) sscanf(cp, "remote from %s", sys);
125: if (fsys[0] == '\0')
126: (void) strcpy(fsys, sys);
127: if (sys[0]) {
128: (void) strcat(from, sys);
129: (void) strcat(from, "!");
130: }
131: #ifdef DEBUG
132: if (Debug)
133: printf("ufrom='%s', sys='%s', from now '%s'\n", uf, sys, from);
134: #endif
135: }
136: if (uf == NULL) { /* No From line was provided */
137: fprintf(stderr, "No From line in rmail\n");
138: exit(EX_DATAERR);
139: }
140: (void) strcat(from, uf);
141: (void) fstat(0, &sbuf);
142: (void) lseek(0, position, L_SET);
143:
144: /*
145: * Now we rebuild the argument list and chain to sendmail. Note that
146: * the above lseek might fail on irregular files, but we check for
147: * that case below.
148: */
149: i = 0;
150: args[i++] = _PATH_SENDMAIL;
151: args[i++] = "-oee"; /* no errors, just status */
152: args[i++] = "-odq"; /* queue it, don't try to deliver */
153: args[i++] = "-oi"; /* ignore '.' on a line by itself */
154: if (fsys[0] != '\0') { /* set sender's host name */
155: static char junk2[512];
156:
157: if (index(fsys, '.') == NULL) {
158: (void) strcat(fsys, ".");
159: (void) strcat(fsys, Domain);
160: }
161: (void) sprintf(junk2, "-oMs%s", fsys);
162: args[i++] = junk2;
163: }
164: /* set protocol used */
165: (void) sprintf(junk, "-oMr%s", Domain);
166: args[i++] = junk;
167: if (from[0] != '\0') { /* set name of ``from'' person */
168: static char junk2[512];
169:
170: (void) sprintf(junk2, "-f%s", from);
171: args[i++] = junk2;
172: }
173: for (; *++argv != NULL; i++) {
174: /*
175: * don't copy arguments beginning with - as they will
176: * be passed to sendmail and could be interpreted as flags
177: * should be fixed in sendmail by using getopt(3), and
178: * just passing "--" before regular args.
179: */
180: if (**argv != '-')
181: args[i] = *argv;
182: }
183: args[i] = NULL;
184: #ifdef DEBUG
185: if (Debug) {
186: printf("Command:");
187: for (i = 0; args[i]; i++)
188: printf(" %s", args[i]);
189: printf("\n");
190: }
191: #endif
192: if ((sbuf.st_mode & S_IFMT) != S_IFREG) {
193: /*
194: * If we were not called with standard input on a regular
195: * file, then we have to fork another process to send the
196: * first line down the pipe.
197: */
198: int pipefd[2];
199: #ifdef DEBUG
200: if (Debug)
201: printf("Not a regular file!\n");
202: #endif
203: if (pipe(pipefd) < 0)
204: exit(EX_OSERR);
205: if (fork() == 0) {
206: /*
207: * Child: send the message down the pipe.
208: */
209: FILE *out;
210:
211: out = fdopen(pipefd[1], "w");
212: close(pipefd[0]);
213: fputs(lbuf, out);
214: while (fgets(lbuf, sizeof lbuf, stdin))
215: fputs(lbuf, out);
216: (void) fclose(out);
217: exit(EX_OK);
218: }
219: /*
220: * Parent: call sendmail with pipe as standard input
221: */
222: close(pipefd[1]);
223: dup2(pipefd[0], 0);
224: }
225: execv(_PATH_SENDMAIL, args);
226: fprintf(stderr, "Exec of %s failed!\n", _PATH_SENDMAIL);
227: exit(EX_OSERR);
228: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.