diff options
author | Nick Hadaway <raker@gentoo.org> | 2003-06-09 19:01:08 +0000 |
---|---|---|
committer | Nick Hadaway <raker@gentoo.org> | 2003-06-09 19:01:08 +0000 |
commit | 7eb8748e38e933a1606cc21ded41d99bbb65e69e (patch) | |
tree | 14a4064027066ffe091902ce44b8988d20815860 /net-mail/mailx-support/files | |
parent | digest fix (diff) | |
download | gentoo-2-7eb8748e38e933a1606cc21ded41d99bbb65e69e.tar.gz gentoo-2-7eb8748e38e933a1606cc21ded41d99bbb65e69e.tar.bz2 gentoo-2-7eb8748e38e933a1606cc21ded41d99bbb65e69e.zip |
Provides /usr/libexec/lockspool for >=mailx-8.1.2
Diffstat (limited to 'net-mail/mailx-support/files')
12 files changed, 1018 insertions, 0 deletions
diff --git a/net-mail/mailx-support/files/digest-mailx-support-20030215 b/net-mail/mailx-support/files/digest-mailx-support-20030215 new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/net-mail/mailx-support/files/digest-mailx-support-20030215 diff --git a/net-mail/mailx-support/files/mailx-support-20030215-gentoo.patch b/net-mail/mailx-support/files/mailx-support-20030215-gentoo.patch new file mode 100644 index 000000000000..829b85820488 --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215-gentoo.patch @@ -0,0 +1,66 @@ +--- - 2003-02-15 23:35:46.000000000 +0800 ++++ locking.c 2003-02-15 23:19:11.000000000 +0800 +@@ -45,6 +45,7 @@ + #include <stdarg.h> + #include "pathnames.h" + #include "mail.local.h" ++#include "open_with_exlock.h" + + static char lpath[MAXPATHLEN]; + +@@ -93,7 +94,7 @@ + } + goto again; + } +- if ((lfd = open(lpath, O_CREAT|O_WRONLY|O_EXCL|O_EXLOCK, ++ if ((lfd = open_with_exlock(lpath, O_CREAT|O_WRONLY|O_EXCL, + S_IRUSR|S_IWUSR)) != -1) + break; + again: +@@ -104,7 +105,7 @@ + return(-1); + } + if (tries > 9 && +- (lfd = open(lpath, O_WRONLY|O_EXLOCK, 0)) != -1) { ++ (lfd = open_with_exlock(lpath, O_WRONLY, 0)) != -1) { + if (fstat(lfd, &fsb) != -1 && + lstat(lpath, &sb) != -1) { + if (fsb.st_dev == sb.st_dev && +@@ -169,3 +170,4 @@ + if (isfatal) + exit(1); + } ++ +--- - 2003-02-15 23:37:13.000000000 +0800 ++++ mail.local.c 2003-02-15 23:20:50.000000000 +0800 +@@ -66,6 +66,7 @@ + #include <string.h> + #include "pathnames.h" + #include "mail.local.h" ++#include "open_with_exlock.h" + + int + main(int argc, char *argv[]) +@@ -218,7 +219,7 @@ + merr(NOTFATAL, "%s: %s", path, strerror(errno)); + goto bad; + } +- if ((mbfd = open(path, O_APPEND|O_CREAT|O_EXCL|O_WRONLY|O_EXLOCK, ++ if ((mbfd = open_with_exlock(path, O_APPEND|O_CREAT|O_EXCL|O_WRONLY, + S_IRUSR|S_IWUSR)) < 0) { + if (errno == EEXIST) { + /* file appeared since lstat */ +@@ -244,7 +245,7 @@ + merr(NOTFATAL, "%s: linked or special file", path); + goto bad; + } +- if ((mbfd = open(path, O_APPEND|O_WRONLY|O_EXLOCK, ++ if ((mbfd = open_with_exlock(path, O_APPEND|O_WRONLY, + S_IRUSR|S_IWUSR)) < 0) { + merr(NOTFATAL, "%s: %s", path, strerror(errno)); + goto bad; +@@ -340,3 +341,4 @@ + { + merr(FATAL, "usage: mail.local [-lL] [-f from] user ..."); + } ++ diff --git a/net-mail/mailx-support/files/mailx-support-20030215/Makefile b/net-mail/mailx-support/files/mailx-support-20030215/Makefile new file mode 100644 index 000000000000..46a7c6c80aac --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/Makefile @@ -0,0 +1,35 @@ +CC ?= gcc +CFLAGS ?= -pipe +RM ?= rm +INSTALL ?= install + +prefix ?= /usr +libexecdir ?= ${prefix}/libexec +mandir ?= ${prefix}/share/man +infodir ?= ${prefix}/share/info + + +PRODUCTS = lockspool # mail.local + +all: ${PRODUCTS} + +clean: + ${RM} -f ${PRODUCTS} *.o + +mail.local: mail.local.o locking.o open_with_exlock.o + ${CC} ${CFLAGS} -o $@ $^ + +lockspool: lockspool.o locking.o open_with_exlock.o + ${CC} ${CFLAGS} -o $@ $^ + +.c.o: + ${CC} ${CFLAGS} -c -o $@ $^ + +install: all + ${INSTALL} -m 0755 -g 0 -o 0 -d ${libexecdir} + ${INSTALL} -m 0755 -g 0 -o 0 -d ${mandir}/man1 + ${INSTALL} -m 4555 -g 0 -o 0 lockspool ${libexecdir}/lockspool + ${INSTALL} -m 0444 -g 0 -o 0 lockspool.1 ${mandir}/man1 +# ${INSTALL} -m 0555 -g 0 -o 0 mail.local ${libexecdir}/mail.local + + diff --git a/net-mail/mailx-support/files/mailx-support-20030215/locking.c b/net-mail/mailx-support/files/mailx-support-20030215/locking.c new file mode 100644 index 000000000000..b8cd3b3b6dfe --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/locking.c @@ -0,0 +1,171 @@ +/* $OpenBSD: locking.c,v 1.6 2002/07/03 23:39:03 deraadt Exp $ */ + +/* + * Copyright (c) 1996-1998 Theo de Raadt <deraadt@theos.com> + * Copyright (c) 1996-1998 David Mazieres <dm@lcs.mit.edu> + * 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. The name of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 AUTHORS 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 +static char rcsid[] = "$OpenBSD: locking.c,v 1.6 2002/07/03 23:39:03 deraadt Exp $"; +#endif /* not lint */ + +#include <sys/param.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <pwd.h> +#include <syslog.h> +#include <time.h> +#include <unistd.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> +#include "pathnames.h" +#include "mail.local.h" + +static char lpath[MAXPATHLEN]; + +void +rellock(void) +{ + + if (lpath[0]) + unlink(lpath); +} + +int +getlock(char *name, struct passwd *pw) +{ + struct stat sb, fsb; + int lfd=-1; + char buf[8*1024]; + int tries = 0; + + (void)snprintf(lpath, sizeof lpath, "%s/%s.lock", + _PATH_MAILDIR, name); + + if (stat(_PATH_MAILDIR, &sb) != -1 && + (sb.st_mode & S_IWOTH) == S_IWOTH) { + /* + * We have a writeable spool, deal with it as + * securely as possible. + */ + time_t ctim = -1; + + seteuid(pw->pw_uid); + if (lstat(lpath, &sb) != -1) + ctim = sb.st_ctime; + while (1) { + /* + * Deal with existing user.lock files + * or directories or symbolic links that + * should not be here. + */ + if (readlink(lpath, buf, sizeof buf-1) != -1) { + if (lstat(lpath, &sb) != -1 && + S_ISLNK(sb.st_mode)) { + seteuid(sb.st_uid); + unlink(lpath); + seteuid(pw->pw_uid); + } + goto again; + } + if ((lfd = open(lpath, O_CREAT|O_WRONLY|O_EXCL|O_EXLOCK, + S_IRUSR|S_IWUSR)) != -1) + break; +again: + if (tries > 10) { + merr(NOTFATAL, "%s: %s", lpath, + strerror(errno)); + seteuid(0); + return(-1); + } + if (tries > 9 && + (lfd = open(lpath, O_WRONLY|O_EXLOCK, 0)) != -1) { + if (fstat(lfd, &fsb) != -1 && + lstat(lpath, &sb) != -1) { + if (fsb.st_dev == sb.st_dev && + fsb.st_ino == sb.st_ino && + ctim == fsb.st_ctime ) { + seteuid(fsb.st_uid); + baditem(lpath); + seteuid(pw->pw_uid); + } + } + } + sleep(1 << tries); + tries++; + continue; + } + seteuid(0); + } else { + /* + * Only root can write the spool directory. + */ + while (1) { + if ((lfd = open(lpath, O_CREAT|O_WRONLY|O_EXCL, + S_IRUSR|S_IWUSR)) != -1) + break; + if (tries > 9) { + merr(NOTFATAL, "%s: %s", lpath, strerror(errno)); + return(-1); + } + sleep(1 << tries); + tries++; + } + } + return(lfd); +} + +void +baditem(char *path) +{ + char npath[MAXPATHLEN]; + + if (unlink(path) == 0) + return; + snprintf(npath, sizeof npath, "%s/mailXXXXXXXXXX", _PATH_MAILDIR); + if (mktemp(npath) == NULL) + return; + if (rename(path, npath) == -1) + unlink(npath); + else + merr(NOTFATAL, "nasty spool item %s renamed to %s", + path, npath); + /* XXX if we fail to rename, another attempt will happen later */ +} + +void +merr(int isfatal, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vsyslog(LOG_ERR, fmt, ap); + va_end(ap); + if (isfatal) + exit(1); +} diff --git a/net-mail/mailx-support/files/mailx-support-20030215/lockspool.1 b/net-mail/mailx-support/files/mailx-support-20030215/lockspool.1 new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/lockspool.1 diff --git a/net-mail/mailx-support/files/mailx-support-20030215/lockspool.c b/net-mail/mailx-support/files/mailx-support-20030215/lockspool.c new file mode 100644 index 000000000000..8f392dea89cb --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/lockspool.c @@ -0,0 +1,110 @@ +/* $OpenBSD: lockspool.c,v 1.8 2002/07/03 23:39:03 deraadt Exp $ */ + +/* + * Copyright (c) 1998 Theo de Raadt <deraadt@theos.com> + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> + * 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. The name of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 AUTHORS 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 +static const char rcsid[] = "$OpenBSD: lockspool.c,v 1.8 2002/07/03 23:39:03 deraadt Exp $"; +#endif /* not lint */ + +#include <sys/signal.h> +#include <pwd.h> +#include <syslog.h> +#include <unistd.h> +#include <errno.h> +#include <stdio.h> +#include "mail.local.h" + +void unhold(int); +void usage(void); + +extern char *__progname; + +int +main(int argc, char *argv[]) +{ + struct passwd *pw; + char *from, c; + int holdfd; + + openlog(__progname, LOG_PERROR, LOG_MAIL); + + if (argc != 1 && argc != 2) + usage(); + if (argc == 2 && getuid() != 0) + merr(FATAL, "you must be root to lock someone else's spool"); + + signal(SIGTERM, unhold); + signal(SIGINT, unhold); + signal(SIGHUP, unhold); + signal(SIGPIPE, unhold); + + if (argc == 2) + from = argv[1]; + else + from = getlogin(); + + if (from) { + pw = getpwnam(from); + if (pw == NULL) + exit (1); + } else { + pw = getpwuid(getuid()); + if (pw) + from = pw->pw_name; + else + exit (1); + } + + holdfd = getlock(from, pw); + if (holdfd == -1) { + write(STDOUT_FILENO, "0\n", 2); + exit (1); + } + write(STDOUT_FILENO, "1\n", 2); + + while (read(0, &c, 1) == -1 && errno == EINTR) + ; + rellock(); + exit (0); +} + +void +unhold(int signo) +{ + + rellock(); + _exit(0); +} + +void +usage(void) +{ + + merr(FATAL, "usage: %s [username]", __progname); +} diff --git a/net-mail/mailx-support/files/mailx-support-20030215/mail.local.8 b/net-mail/mailx-support/files/mailx-support-20030215/mail.local.8 new file mode 100644 index 000000000000..7e330e54cfbc --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/mail.local.8 @@ -0,0 +1,191 @@ +.\" $OpenBSD: mail.local.8,v 1.23 2002/03/27 15:45:57 mpech Exp $ +.\" 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 +.\" +.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 l +.Op Fl f Ar from +.Ar user ... +.Sh DESCRIPTION +.Nm +reads the standard input up to an end-of-file and appends it to each +.Ar user Ns 's +.Pa mail +file. +The +.Ar user +must be a valid user name. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl f Ar from +Specify the sender's name. +.It Fl l +For compatibility, request that files named +.Pa username.lock +be used for locking. +(This is the default behavior.) +.It Fl L +Don't create a +.Pa username.lock +file while locking the spool. +.El +.Pp +Individual mail messages in the mailbox are delimited by an empty +line followed by a line beginning with the string +.Dq "From\&\ " . +A line containing the string +.Dq "From\&\ " , +the sender's name and a timestamp are prepended to each delivered mail message. +A blank line is appended to each message. +A greater-than character +.Pq Ql > +is prepended to any line in the message which could be mistaken for a +.Dq "From\&\ " +delimiter line. +.Pp +Significant efforts have been made to ensure that +.Nm +acts as securely as possible if the spool directory is mode 1777 or 755. +The default of mode 755 is more secure, but it prevents mail clients from using +.Pa username.lock +style locking. +The use of 1777 is more flexible in an NFS shared-spool environment, +so many sites use it. +However, it does carry some risks, such as attackers filling the spool disk. +Some of these problems may be alleviated +by making the spool a separate filesystem, and placing quotas on it. +The use of any mode other than 1777 and 755 for the spool directory is +recommended against but may work properly. +.Pp +The mailbox is always locked using +.Xr flock 2 +while mail is appended. +Unless the +.Fl L +flag is specified, a +.Pa username.lock +file is also used. +.Pp +If the +.Xr biff 1 +service is returned by +.Xr getservbyname 3 , +the biff server is notified of delivered mail. +.Pp +The +.Nm +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.XXXXXXXXXX -compact +.It Pa /tmp/local.XXXXXXXXXX +temporary files +.It Pa /var/mail/user +user's mailbox directory +.El +.Sh SEE ALSO +.Xr biff 1 , +.Xr mail 1 , +.Xr flock 2 , +.Xr getservbyname 3 , +.Xr comsat 8 , +.Xr sendmail 8 +.Sh HISTORY +A superset of +.Nm +(handling mailbox reading as well as mail delivery) appeared in +.At v7 +as the program +.Xr mail 1 . +.Sh BUGS +Since +.Xr sendmail 8 +bases its idea of whether a message has been delivered or not +on the return value from +.Nm mail.local , +using quotas in +.Pa /var/mail +can be problematic. +By default, +.Xr sendmail 8 +will ask +.Nm +to deliver a message to multiple recipients if possible. +This causes problems in a quota environment since a message may be +delivered to some users but not others due to disk quotas. +Even though the message was delivered to some of the recipients, +.Nm +will exit with an exit code > 0, causing +.Xr sendmail 8 +to attempt redelivery later. +That means that some users will keep getting the same message every time +.Xr sendmail 8 +runs its queue. +.Pp +If you are running with disk quotas on +.Pa /var/mail +it is imperative that you unset the +.Dq m +mailer flag for the +.Sq local +mailer. +To do this, locate the line beginning with +.Dq Mlocal +in +.Pa /etc/mail/sendmail.cf +and remove the +.Dq m +from the flags section, denoted by +.Dq F= . +Alternately, you can override the default mailer flags by adding the line: +.Pp +.Dl define(`LOCAL_MAILER_FLAGS', `rn9S')dnl +.Pp +to your +.Dq \.mc +file (this is the source file that is used to generate +.Pa /etc/mail/sendmail.cf ) . + diff --git a/net-mail/mailx-support/files/mailx-support-20030215/mail.local.c b/net-mail/mailx-support/files/mailx-support-20030215/mail.local.c new file mode 100644 index 000000000000..da300c66f666 --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/mail.local.c @@ -0,0 +1,342 @@ +/* $OpenBSD: mail.local.c,v 1.24 2002/07/03 23:39:03 deraadt Exp $ */ + +/*- + * Copyright (c) 1996-1998 Theo de Raadt <deraadt@theos.com> + * Copyright (c) 1996-1998 David Mazieres <dm@lcs.mit.edu> + * 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 +#if 0 +static char sccsid[] = "from: @(#)mail.local.c 5.6 (Berkeley) 6/19/91"; +#else +static char rcsid[] = "$OpenBSD: mail.local.c,v 1.24 2002/07/03 23:39:03 deraadt Exp $"; +#endif +#endif /* not lint */ + +#include <sys/param.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <sys/signal.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" +#include "mail.local.h" + +int +main(int argc, char *argv[]) +{ + struct passwd *pw; + int ch, fd, eval, lockfile=1, holdme=0; + uid_t uid; + char *from; + + openlog("mail.local", LOG_PERROR, LOG_MAIL); + + from = NULL; + while ((ch = getopt(argc, argv, "lLdf:r:H")) != -1) + switch (ch) { + case 'd': /* backward compatible */ + break; + case 'f': + case 'r': /* backward compatible */ + if (from) + merr(FATAL, "multiple -f options"); + from = optarg; + break; + case 'l': + lockfile=1; + break; + case 'L': + lockfile=0; + break; + case 'H': + holdme=1; + break; + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + /* Support -H flag for backwards compat */ + if (holdme) { + execl(_PATH_LOCKSPOOL, "lockspool", (char *)NULL); + merr(FATAL, "execl: lockspool: %s", strerror(errno)); + } else { + if (!*argv) + usage(); + if (geteuid() != 0) + merr(FATAL, "may only be run by the superuser"); + } + + /* + * 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); +} + +int +store(char *from) +{ + FILE *fp = NULL; + time_t tval; + int fd, eline; + size_t len; + char *line, *tbuf; + + if ((tbuf = strdup(_PATH_LOCTMP)) == NULL) + merr(FATAL, "unable to allocate memory"); + if ((fd = mkstemp(tbuf)) == -1 || !(fp = fdopen(fd, "w+"))) + merr(FATAL, "unable to open temporary file"); + (void)unlink(tbuf); + free(tbuf); + + (void)time(&tval); + (void)fprintf(fp, "From %s %s", from, ctime(&tval)); + + for (eline = 1, tbuf = NULL; (line = fgetln(stdin, &len));) { + /* We have to NUL-terminate the line since fgetln does not */ + if (line[len - 1] == '\n') + line[len - 1] = '\0'; + else { + /* No trailing newline, so alloc space and copy */ + if ((tbuf = malloc(len + 1)) == NULL) + merr(FATAL, "unable to allocate memory"); + memcpy(tbuf, line, len); + tbuf[len++] = '\0'; + line = tbuf; + } + if (line[0] == '\0') + eline = 1; + else { + if (eline && line[0] == 'F' && len > 5 && + !memcmp(line, "From ", 5)) + (void)putc('>', fp); + eline = 0; + } + (void)fprintf(fp, "%s\n", line); + if (ferror(fp)) + break; + } + if (tbuf) + free(tbuf); + + /* Output a newline; note, empty messages are allowed. */ + (void)putc('\n', fp); + (void)fflush(fp); + if (ferror(fp)) + merr(FATAL, "temporary file write error"); + return(fd); +} + +int +deliver(int fd, char *name, int lockfile) +{ + struct stat sb, fsb; + struct passwd *pw; + int mbfd=-1, nr, nw, off, rval=1, lfd=-1; + char biffmsg[100], buf[8*1024], path[MAXPATHLEN]; + off_t curoff; + + /* + * Disallow delivery to unknown names -- special mailboxes can be + * handled in the sendmail aliases file. + */ + if (!(pw = getpwnam(name))) { + merr(NOTFATAL, "unknown name: %s", name); + return(1); + } + + (void)snprintf(path, sizeof path, "%s/%s", _PATH_MAILDIR, name); + + if (lockfile) { + lfd = getlock(name, pw); + if (lfd == -1) + return (1); + } + + /* after this point, always exit via bad to remove lockfile */ +retry: + if (lstat(path, &sb)) { + if (errno != ENOENT) { + merr(NOTFATAL, "%s: %s", path, strerror(errno)); + goto bad; + } + if ((mbfd = open(path, O_APPEND|O_CREAT|O_EXCL|O_WRONLY|O_EXLOCK, + S_IRUSR|S_IWUSR)) < 0) { + if (errno == EEXIST) { + /* file appeared since lstat */ + goto retry; + } else { + merr(NOTFATAL, "%s: %s", path, strerror(errno)); + goto bad; + } + } + /* + * 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. + */ + if (fchown(mbfd, pw->pw_uid, pw->pw_gid) < 0) { + merr(NOTFATAL, "chown %u:%u: %s", + pw->pw_uid, pw->pw_gid, name); + goto bad; + } + } else { + if (sb.st_nlink != 1 || !S_ISREG(sb.st_mode)) { + merr(NOTFATAL, "%s: linked or special file", path); + goto bad; + } + if ((mbfd = open(path, O_APPEND|O_WRONLY|O_EXLOCK, + S_IRUSR|S_IWUSR)) < 0) { + merr(NOTFATAL, "%s: %s", path, strerror(errno)); + goto bad; + } + if (fstat(mbfd, &fsb)) { + /* relating error to path may be bad style */ + merr(NOTFATAL, "%s: %s", path, strerror(errno)); + goto bad; + } + if (sb.st_dev != fsb.st_dev || sb.st_ino != fsb.st_ino) { + merr(NOTFATAL, "%s: changed after open", path); + goto bad; + } + /* paranoia? */ + if (fsb.st_nlink != 1 || !S_ISREG(fsb.st_mode)) { + merr(NOTFATAL, "%s: linked or special file", path); + goto bad; + } + } + + curoff = lseek(mbfd, 0, SEEK_END); + (void)snprintf(biffmsg, sizeof biffmsg, "%s@%qd\n", name, curoff); + if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { + merr(NOTFATAL, "temporary file: %s", strerror(errno)); + 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) { + merr(NOTFATAL, "%s: %s", path, strerror(errno)); + (void)ftruncate(mbfd, curoff); + goto bad; + } + + if (nr == 0) { + rval = 0; + } else { + (void)ftruncate(mbfd, curoff); + merr(FATAL, "temporary file: %s", strerror(errno)); + } + +bad: + if (lfd != -1) { + rellock(); + close(lfd); + } + + if (mbfd != -1) { + (void)fsync(mbfd); /* Don't wait for update. */ + (void)close(mbfd); /* Implicit unlock. */ + } + + if (!rval) + notifybiff(biffmsg); + return(rval); +} + +void +notifybiff(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"))) { + merr(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) { + merr(NOTFATAL, "socket: %s", strerror(errno)); + return; + } + len = strlen(msg) + 1; + if (sendto(f, msg, len, 0, (struct sockaddr *)&addr, sizeof(addr)) + != len) + merr(NOTFATAL, "sendto biff: %s", strerror(errno)); +} + +void +usage(void) +{ + merr(FATAL, "usage: mail.local [-lL] [-f from] user ..."); +} diff --git a/net-mail/mailx-support/files/mailx-support-20030215/mail.local.h b/net-mail/mailx-support/files/mailx-support-20030215/mail.local.h new file mode 100644 index 000000000000..13502d047687 --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/mail.local.h @@ -0,0 +1,47 @@ +/* $OpenBSD: mail.local.h,v 1.3 2002/02/16 21:27:30 millert Exp $ */ + +/*- + * 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. + */ + +#define FATAL 1 +#define NOTFATAL 0 + +void baditem(char *); +int deliver(int, char *, int); +void merr(int, const char *, ...); +int getlock(char *, struct passwd *); +void notifybiff(char *); +void rellock(void); +int store(char *); +void usage(void); + diff --git a/net-mail/mailx-support/files/mailx-support-20030215/open_with_exlock.c b/net-mail/mailx-support/files/mailx-support-20030215/open_with_exlock.c new file mode 100644 index 000000000000..b844d20b5484 --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/open_with_exlock.c @@ -0,0 +1,13 @@ +#include <fcntl.h> + +int open_with_exlock(const char *path, int flags, mode_t mode) +{ + int fd; + fd = open(path, flags, mode); + if (fd == -1) + return -1; + if (flock(fd, LOCK_EX) == -1) + return -1; + return fd; +} + diff --git a/net-mail/mailx-support/files/mailx-support-20030215/open_with_exlock.h b/net-mail/mailx-support/files/mailx-support-20030215/open_with_exlock.h new file mode 100644 index 000000000000..25a16a8f4e13 --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/open_with_exlock.h @@ -0,0 +1,3 @@ +#include <sys/types.h> + +int open_with_exlock(const char *path, int flags, mode_t mode); diff --git a/net-mail/mailx-support/files/mailx-support-20030215/pathnames.h b/net-mail/mailx-support/files/mailx-support-20030215/pathnames.h new file mode 100644 index 000000000000..e8787bdd6db1 --- /dev/null +++ b/net-mail/mailx-support/files/mailx-support-20030215/pathnames.h @@ -0,0 +1,40 @@ +/* $OpenBSD: pathnames.h,v 1.4 2001/01/28 19:34:30 niklas Exp $*/ + +/*- + * 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 + */ +#include <paths.h> + +#define _PATH_LOCTMP "/tmp/local.XXXXXXXXXX" +#define _PATH_LOCKSPOOL "/usr/libexec/lockspool" |