diff options
Diffstat (limited to 'bin/rmail')
| -rw-r--r-- | bin/rmail/Makefile | 6 | ||||
| -rw-r--r-- | bin/rmail/rmail.8 | 68 | ||||
| -rw-r--r-- | bin/rmail/rmail.c | 242 |
3 files changed, 316 insertions, 0 deletions
diff --git a/bin/rmail/Makefile b/bin/rmail/Makefile new file mode 100644 index 000000000000..15e2977878dd --- /dev/null +++ b/bin/rmail/Makefile @@ -0,0 +1,6 @@ +# @(#)Makefile 5.2 (Berkeley) 4/20/91 + +PROG= rmail +MAN8= rmail.8 + +.include <bsd.prog.mk> diff --git a/bin/rmail/rmail.8 b/bin/rmail/rmail.8 new file mode 100644 index 000000000000..1c4a5828d8ff --- /dev/null +++ b/bin/rmail/rmail.8 @@ -0,0 +1,68 @@ +.\" Copyright (c) 1983, 1990 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)rmail.8 6.8 (Berkeley) 4/20/91 +.\" +.Dd April 20, 1991 +.Dt RMAIL 8 +.Os BSD 4.2 +.Sh NAME +.Nm rmail +.Nd handle remote mail received via uucp +.Sh SYNOPSIS +.Nm rmail +.Ar user ... +.Sh DESCRIPTION +.Nm Rmail +interprets incoming mail received via +.Xr uucp 1 , +collapsing ``From'' lines in the form generated +by +.Xr binmail 1 +into a single line of the form ``return-path!sender'', +and passing the processed mail on to +.Xr sendmail 8 . +.Pp +.Nm Rmail +is explicitly designed for use with +.Xr uucp +and +.Xr sendmail . +.Sh SEE ALSO +.Xr binmail 1 , +.Xr uucp 1 , +.Xr sendmail 8 +.Sh HISTORY +.Nm Rmail +apeared in 4.2 BSD. +.Sh BUGS +.Nm Rmail +should not reside in /bin. diff --git a/bin/rmail/rmail.c b/bin/rmail/rmail.c new file mode 100644 index 000000000000..40e16887d7c9 --- /dev/null +++ b/bin/rmail/rmail.c @@ -0,0 +1,242 @@ +/* + * Copyright (c) 1981, 1988 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1981, 1988 The Regents of the University of California.\n\ + All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)rmail.c 4.15 (Berkeley) 5/31/90"; +#endif /* not lint */ + +/* + * RMAIL -- UUCP mail server. + * + * This program reads the >From ... remote from ... lines that + * UUCP is so fond of and turns them into something reasonable. + * It calls sendmail giving it a -f option built from these lines. + */ + +#include <sysexits.h> +#include <sys/types.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <stdio.h> +#include <paths.h> + +typedef char bool; +#define TRUE 1 +#define FALSE 0 + +extern char *index(); +extern char *rindex(); + +char *Domain = "UUCP"; /* Default "Domain" */ + +main(argc, argv) + int argc; + char **argv; +{ + char lbuf[1024]; /* one line of the message */ + char from[512]; /* accumulated path of sender */ + char ufrom[512]; /* user on remote system */ + char sys[512]; /* a system in path */ + char fsys[512]; /* first system in path */ + char junk[1024]; /* scratchpad */ + char *args[100]; /* arguments to mailer command */ + register char *cp; + register char *uf = NULL; /* ptr into ufrom */ + int i; + long position; + struct stat sbuf; +#ifdef DEBUG + bool Debug; + + if (argc > 1 && strcmp(argv[1], "-T") == 0) { + Debug = TRUE; + argc--; + argv++; + } +#endif + + if (argc < 2) { + fprintf(stderr, "Usage: rmail user ...\n"); + exit(EX_USAGE); + } + if (argc > 2 && strncmp(argv[1], "-D", 2) == 0) { + Domain = &argv[1][2]; + argc -= 2; + argv += 2; + } + from[0] = '\0'; + fsys[0] = '\0'; + (void) strcpy(ufrom, _PATH_DEVNULL); + + for (position = 0;; position = ftell(stdin)) { + if (fgets(lbuf, sizeof lbuf, stdin) == NULL) + exit(EX_DATAERR); + if (strncmp(lbuf, "From ", 5) != 0 && + strncmp(lbuf, ">From ", 6) != 0) + break; + (void) sscanf(lbuf, "%s %s", junk, ufrom); + cp = lbuf; + uf = ufrom; + for (;;) { + cp = index(cp + 1, 'r'); + if (cp == NULL) { + register char *p = rindex(uf, '!'); + + if (p != NULL) { + *p = '\0'; + (void) strcpy(sys, uf); + uf = p + 1; + break; + } + (void) strcpy(sys, ""); + break; /* no "remote from" found */ + } +#ifdef DEBUG + if (Debug) + printf("cp='%s'\n", cp); +#endif + if (strncmp(cp, "remote from ", 12) == 0) + break; + } + if (cp != NULL) + (void) sscanf(cp, "remote from %s", sys); + if (fsys[0] == '\0') + (void) strcpy(fsys, sys); + if (sys[0]) { + (void) strcat(from, sys); + (void) strcat(from, "!"); + } +#ifdef DEBUG + if (Debug) + printf("ufrom='%s', sys='%s', from now '%s'\n", uf, sys, from); +#endif + } + if (uf == NULL) { /* No From line was provided */ + fprintf(stderr, "No From line in rmail\n"); + exit(EX_DATAERR); + } + (void) strcat(from, uf); + (void) fstat(0, &sbuf); + (void) lseek(0, position, L_SET); + + /* + * Now we rebuild the argument list and chain to sendmail. Note that + * the above lseek might fail on irregular files, but we check for + * that case below. + */ + i = 0; + args[i++] = _PATH_SENDMAIL; + args[i++] = "-oee"; /* no errors, just status */ + args[i++] = "-odq"; /* queue it, don't try to deliver */ + args[i++] = "-oi"; /* ignore '.' on a line by itself */ + if (fsys[0] != '\0') { /* set sender's host name */ + static char junk2[512]; + + if (index(fsys, '.') == NULL) { + (void) strcat(fsys, "."); + (void) strcat(fsys, Domain); + } + (void) sprintf(junk2, "-oMs%s", fsys); + args[i++] = junk2; + } + /* set protocol used */ + (void) sprintf(junk, "-oMr%s", Domain); + args[i++] = junk; + if (from[0] != '\0') { /* set name of ``from'' person */ + static char junk2[512]; + + (void) sprintf(junk2, "-f%s", from); + args[i++] = junk2; + } + for (; *++argv != NULL; i++) { + /* + * don't copy arguments beginning with - as they will + * be passed to sendmail and could be interpreted as flags + * should be fixed in sendmail by using getopt(3), and + * just passing "--" before regular args. + */ + if (**argv != '-') + args[i] = *argv; + } + args[i] = NULL; +#ifdef DEBUG + if (Debug) { + printf("Command:"); + for (i = 0; args[i]; i++) + printf(" %s", args[i]); + printf("\n"); + } +#endif + if ((sbuf.st_mode & S_IFMT) != S_IFREG) { + /* + * If we were not called with standard input on a regular + * file, then we have to fork another process to send the + * first line down the pipe. + */ + int pipefd[2]; +#ifdef DEBUG + if (Debug) + printf("Not a regular file!\n"); +#endif + if (pipe(pipefd) < 0) + exit(EX_OSERR); + if (fork() == 0) { + /* + * Child: send the message down the pipe. + */ + FILE *out; + + out = fdopen(pipefd[1], "w"); + close(pipefd[0]); + fputs(lbuf, out); + while (fgets(lbuf, sizeof lbuf, stdin)) + fputs(lbuf, out); + (void) fclose(out); + exit(EX_OK); + } + /* + * Parent: call sendmail with pipe as standard input + */ + close(pipefd[1]); + dup2(pipefd[0], 0); + } + execv(_PATH_SENDMAIL, args); + fprintf(stderr, "Exec of %s failed!\n", _PATH_SENDMAIL); + exit(EX_OSERR); +} |
