diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /libexec/mail.local |
initial import of NetBSD tree
Diffstat (limited to 'libexec/mail.local')
-rw-r--r-- | libexec/mail.local/Makefile | 9 | ||||
-rw-r--r-- | libexec/mail.local/mail.local.8 | 115 | ||||
-rw-r--r-- | libexec/mail.local/mail.local.c | 321 | ||||
-rw-r--r-- | libexec/mail.local/pathnames.h | 38 |
4 files changed, 483 insertions, 0 deletions
diff --git a/libexec/mail.local/Makefile b/libexec/mail.local/Makefile new file mode 100644 index 00000000000..f61891cb428 --- /dev/null +++ b/libexec/mail.local/Makefile @@ -0,0 +1,9 @@ +# from: @(#)Makefile 5.3 (Berkeley) 1/17/91 +# $Id: Makefile,v 1.1 1995/10/18 08:43:19 deraadt Exp $ + +PROG= mail.local +MAN= mail.local.8 +BINOWN= root +BINMODE=4555 + +.include <bsd.prog.mk> diff --git a/libexec/mail.local/mail.local.8 b/libexec/mail.local/mail.local.8 new file mode 100644 index 00000000000..10d78007a1b --- /dev/null +++ b/libexec/mail.local/mail.local.8 @@ -0,0 +1,115 @@ +.\" Copyright (c) 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. +.\" +.\" from: @(#)mail.local.8 6.8 (Berkeley) 4/27/91 +.\" $Id: mail.local.8,v 1.1 1995/10/18 08:43:19 deraadt Exp $ +.\" +.Dd April 27, 1991 +.Dt MAIL.LOCAL 8 +.Os +.Sh NAME +.Nm mail.local +.Nd store mail in a mailbox +.Sh SYNOPSIS +.Nm mail.local +.Op Fl l +.Op Fl f Ar from +.Ar user ... +.Sh DESCRIPTION +.Nm Mail.local +reads the standard input up to an end-of-file and appends it to each +.Ar user 's +.Pa mail +file. +The +.Ar user +must be a valid user name. +.Pp +The options are as follows: +.Bl -tag -width xxxxxxx +.It Fl f Ar from +Specify the sender's name. +.It Fl l +Request that +.Nm username.lock +files be used for locking. +.El +.Pp +Individual mail messages in the mailbox are delimited by an empty +line followed by a line beginning with the string ``From ''. +A line containing the string ``From '', the sender's name and a time stamp +is prepended to each delivered mail message. +A blank line is appended to each message. +A greater-than character (``>'') is prepended to any line in the message +which could be mistaken for a ``From '' delimiter line. +.Pp +If the +.Op Fl l +flag is specified mailbox locking is done with +.Nm username.lock +files. Otherwise, the mailbox is exclusively locked with +.Xr flock 2 +while mail is appended. +.Pp +If the ``biff'' service is returned by +.Xr getservbyname 3 , +the biff server is notified of delivered mail. +.Pp +The +.Nm mail.local +utility exits 0 on success, and >0 if an error occurs. +.Sh ENVIRONMENT +.Bl -tag -width indent +.It Ev TZ +Used to set the appropriate time zone on the timestamp. +.El +.Sh FILES +.Bl -tag -width /tmp/local.XXXXXX -compact +.It Pa /tmp/local.XXXXXX +temporary files +.It Pa /var/mail/user +user's mailbox directory +.El +.Sh SEE ALSO +.Xr mail 1 , +.Xr xsend 1 , +.Xr flock 2 , +.Xr getservbyname 3 , +.Xr comsat 8 , +.Xr sendmail 8 +.Sh HISTORY +A superset of +.Nm mail.local +(handling mailbox reading as well as mail delivery) +appeared in +.At v7 +as the program +.Nm mail . diff --git a/libexec/mail.local/mail.local.c b/libexec/mail.local/mail.local.c new file mode 100644 index 00000000000..3baf475e92e --- /dev/null +++ b/libexec/mail.local/mail.local.c @@ -0,0 +1,321 @@ +/*- + * Copyright (c) 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. + */ + +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1990 The Regents of the University of California.\n\ + All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +/*static char sccsid[] = "from: @(#)mail.local.c 5.6 (Berkeley) 6/19/91";*/ +static char rcsid[] = "$Id: mail.local.c,v 1.1 1995/10/18 08:43:19 deraadt Exp $"; +#endif /* not lint */ + +#include <sys/param.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <syslog.h> +#include <fcntl.h> +#include <netdb.h> +#include <pwd.h> +#include <time.h> +#include <unistd.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "pathnames.h" + +#define FATAL 1 +#define NOTFATAL 0 + +int deliver __P((int, char *, int)); +void err __P((int, const char *, ...)); +void notifybiff __P((char *)); +int store __P((char *)); +void usage __P((void)); + +main(argc, argv) + int argc; + char **argv; +{ + extern int optind; + extern char *optarg; + struct passwd *pw; + int ch, fd, eval, lockfile=0; + uid_t uid; + char *from; + + openlog("mail.local", LOG_PERROR, LOG_MAIL); + + from = NULL; + while ((ch = getopt(argc, argv, "ldf:r:")) != EOF) + switch(ch) { + case 'd': /* backward compatible */ + break; + case 'f': + case 'r': /* backward compatible */ + if (from) + err(FATAL, "multiple -f options"); + from = optarg; + break; + case 'l': + lockfile++; + break; + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + if (!*argv) + usage(); + + /* + * If from not specified, use the name from getlogin() if the + * uid matches, otherwise, use the name from the password file + * corresponding to the uid. + */ + uid = getuid(); + if (!from && (!(from = getlogin()) || + !(pw = getpwnam(from)) || pw->pw_uid != uid)) + from = (pw = getpwuid(uid)) ? pw->pw_name : "???"; + + fd = store(from); + for (eval = 0; *argv; ++argv) + eval |= deliver(fd, *argv, lockfile); + exit(eval); +} + +store(from) + char *from; +{ + FILE *fp; + time_t tval; + int fd, eline; + char *tn, line[2048]; + + tn = strdup(_PATH_LOCTMP); + if ((fd = mkstemp(tn)) == -1 || !(fp = fdopen(fd, "w+"))) + err(FATAL, "unable to open temporary file"); + (void)unlink(tn); + free(tn); + + (void)time(&tval); + (void)fprintf(fp, "From %s %s", from, ctime(&tval)); + + line[0] = '\0'; + for (eline = 1; fgets(line, sizeof(line), stdin);) { + if (line[0] == '\n') + eline = 1; + else { + if (eline && line[0] == 'F' && !bcmp(line, "From ", 5)) + (void)putc('>', fp); + eline = 0; + } + (void)fprintf(fp, "%s", line); + if (ferror(fp)) + break; + } + + /* If message not newline terminated, need an extra. */ + if (!index(line, '\n')) + (void)putc('\n', fp); + /* Output a newline; note, empty messages are allowed. */ + (void)putc('\n', fp); + + (void)fflush(fp); + if (ferror(fp)) + err(FATAL, "temporary file write error"); + return(fd); +} + +deliver(fd, name, lockfile) + int fd; + char *name; + int lockfile; +{ + struct stat sb; + struct passwd *pw; + int created, mbfd, nr, nw, off, rval=0, lfd=-1; + char biffmsg[100], buf[8*1024], path[MAXPATHLEN], lpath[MAXPATHLEN]; + off_t curoff; + + /* + * Disallow delivery to unknown names -- special mailboxes can be + * handled in the sendmail aliases file. + */ + if (!(pw = getpwnam(name))) { + err(NOTFATAL, "unknown name: %s", name); + return(1); + } + + (void)sprintf(path, "%s/%s", _PATH_MAILDIR, name); + + if(lockfile) { + (void)sprintf(lpath, "%s/%s.lock", _PATH_MAILDIR, name); + + if((lfd = open(lpath, O_CREAT|O_WRONLY|O_EXCL, + S_IRUSR|S_IWUSR)) < 0) { + err(NOTFATAL, "%s: %s", lpath, strerror(errno)); + return(1); + } + } + + if (!(created = lstat(path, &sb)) && + (sb.st_nlink != 1 || S_ISLNK(sb.st_mode))) { + err(NOTFATAL, "%s: linked file", path); + return(1); + } + if((mbfd = open(path, O_APPEND|O_WRONLY|O_EXLOCK, + S_IRUSR|S_IWUSR)) < 0) { + if ((mbfd = open(path, O_APPEND|O_CREAT|O_WRONLY|O_EXLOCK, + S_IRUSR|S_IWUSR)) < 0) { + err(NOTFATAL, "%s: %s", path, strerror(errno)); + return(1); + } + } + + curoff = lseek(mbfd, 0, SEEK_END); + (void)sprintf(biffmsg, "%s@%qd\n", name, curoff); + if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { + err(FATAL, "temporary file: %s", strerror(errno)); + rval = 1; + goto bad; + } + + while ((nr = read(fd, buf, sizeof(buf))) > 0) + for (off = 0; off < nr; off += nw) + if ((nw = write(mbfd, buf + off, nr - off)) < 0) { + err(NOTFATAL, "%s: %s", path, strerror(errno)); + goto trunc; + } + if (nr < 0) { + err(FATAL, "temporary file: %s", strerror(errno)); +trunc: (void)ftruncate(mbfd, curoff); + rval = 1; + } + + /* + * Set the owner and group. Historically, binmail repeated this at + * each mail delivery. We no longer do this, assuming that if the + * ownership or permissions were changed there was a reason for doing + * so. + */ +bad: + if(lockfile) { + if(lfd >= 0) { + unlink(lpath); + close(lfd); + } + } + if (created) + (void)fchown(mbfd, pw->pw_uid, pw->pw_gid); + + (void)fsync(mbfd); /* Don't wait for update. */ + (void)close(mbfd); /* Implicit unlock. */ + + if (!rval) + notifybiff(biffmsg); + return(rval); +} + +void +notifybiff(msg) + char *msg; +{ + static struct sockaddr_in addr; + static int f = -1; + struct hostent *hp; + struct servent *sp; + int len; + + if (!addr.sin_family) { + /* Be silent if biff service not available. */ + if (!(sp = getservbyname("biff", "udp"))) + return; + if (!(hp = gethostbyname("localhost"))) { + err(NOTFATAL, "localhost: %s", strerror(errno)); + return; + } + addr.sin_len = sizeof(struct sockaddr_in); + addr.sin_family = hp->h_addrtype; + addr.sin_port = sp->s_port; + bcopy(hp->h_addr, &addr.sin_addr, hp->h_length); + } + if (f < 0 && (f = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + err(NOTFATAL, "socket: %s", strerror(errno)); + return; + } + len = strlen(msg) + 1; + if (sendto(f, msg, len, 0, (struct sockaddr *)&addr, sizeof(addr)) + != len) + err(NOTFATAL, "sendto biff: %s", strerror(errno)); +} + +void +usage() +{ + err(FATAL, "usage: mail.local [-f from] user ..."); +} + +#if __STDC__ +#include <stdarg.h> +#else +#include <varargs.h> +#endif + +void +#if __STDC__ +err(int isfatal, const char *fmt, ...) +#else +err(isfatal, fmt) + int isfatal; + char *fmt; + va_dcl +#endif +{ + va_list ap; +#if __STDC__ + va_start(ap, fmt); +#else + va_start(ap); +#endif + vsyslog(LOG_ERR, fmt, ap); + va_end(ap); + if (isfatal) + exit(1); +} diff --git a/libexec/mail.local/pathnames.h b/libexec/mail.local/pathnames.h new file mode 100644 index 00000000000..bf5b783ec74 --- /dev/null +++ b/libexec/mail.local/pathnames.h @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 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. + * + * from: @(#)pathnames.h 5.3 (Berkeley) 1/17/91 + * $Id: pathnames.h,v 1.1 1995/10/18 08:43:19 deraadt Exp $ + */ +#include <paths.h> + +#define _PATH_LOCTMP "/tmp/local.XXXXXX" |