summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2020-02-09 14:59:20 +0000
committermillert <millert@openbsd.org>2020-02-09 14:59:20 +0000
commite1869fb34cf6f4c047bfb3e3e27f930492096424 (patch)
treeabc64c5e67b9f669592d9889317da6a628f6c5de /libexec
parentmention /etc/examples/bgpd.conf; tweak and OK jmc@, OK benno@ (diff)
downloadwireguard-openbsd-e1869fb34cf6f4c047bfb3e3e27f930492096424.tar.xz
wireguard-openbsd-e1869fb34cf6f4c047bfb3e3e27f930492096424.zip
Use sysexits.h exit values to distinguish between tempfail and permfail.
Unix MTAs use the exit value of the MDA (here mail.local) to determine whether or not a failure to deliver mail should be considered to be a temporary or permanent failure. OK semarie@ beck@
Diffstat (limited to 'libexec')
-rw-r--r--libexec/lockspool/lockspool.c6
-rw-r--r--libexec/mail.local/locking.c25
-rw-r--r--libexec/mail.local/mail.local.c69
-rw-r--r--libexec/mail.local/mail.local.h6
4 files changed, 57 insertions, 49 deletions
diff --git a/libexec/lockspool/lockspool.c b/libexec/lockspool/lockspool.c
index dfa93f21224..2206ee73f96 100644
--- a/libexec/lockspool/lockspool.c
+++ b/libexec/lockspool/lockspool.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lockspool.c,v 1.20 2019/01/25 00:19:26 millert Exp $ */
+/* $OpenBSD: lockspool.c,v 1.21 2020/02/09 14:59:20 millert Exp $ */
/*
* Copyright (c) 1998 Theo de Raadt <deraadt@theos.com>
@@ -63,7 +63,7 @@ main(int argc, char *argv[])
if (argc != 1 && argc != 2)
usage();
if (argc == 2 && getuid() != 0)
- merr(FATAL, "you must be root to lock someone else's spool");
+ merr(1, "you must be root to lock someone else's spool");
signal(SIGTERM, unhold);
signal(SIGINT, unhold);
@@ -114,5 +114,5 @@ void
usage(void)
{
- merr(FATAL, "usage: %s [username]", __progname);
+ merr(1, "usage: %s [username]", __progname);
}
diff --git a/libexec/mail.local/locking.c b/libexec/mail.local/locking.c
index d63642c1828..12bed233ea4 100644
--- a/libexec/mail.local/locking.c
+++ b/libexec/mail.local/locking.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: locking.c,v 1.13 2020/02/02 23:17:09 millert Exp $ */
+/* $OpenBSD: locking.c,v 1.14 2020/02/09 14:59:20 millert Exp $ */
/*
* Copyright (c) 1996-1998 Theo de Raadt <deraadt@theos.com>
@@ -96,8 +96,7 @@ getlock(const char *name, struct passwd *pw)
break;
again:
if (tries > 10) {
- merr(NOTFATAL, "%s: %s", lpath,
- strerror(errno));
+ mwarn("%s: %s", lpath, strerror(errno));
seteuid(0);
return(-1);
}
@@ -129,7 +128,7 @@ again:
S_IRUSR|S_IWUSR)) != -1)
break;
if (tries > 9) {
- merr(NOTFATAL, "%s: %s", lpath, strerror(errno));
+ mwarn("%s: %s", lpath, strerror(errno));
return(-1);
}
sleep(1U << tries);
@@ -154,19 +153,27 @@ baditem(char *path)
if (rename(path, npath) == -1)
unlink(npath);
else
- merr(NOTFATAL, "nasty spool item %s renamed to %s",
- path, npath);
+ mwarn("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, ...)
+mwarn(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsyslog(LOG_ERR, fmt, ap);
va_end(ap);
- if (isfatal)
- exit(1);
+}
+
+void
+merr(int eval, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsyslog(LOG_ERR, fmt, ap);
+ va_end(ap);
+ exit(eval);
}
diff --git a/libexec/mail.local/mail.local.c b/libexec/mail.local/mail.local.c
index 370e6f600a9..a0d38b1a7c0 100644
--- a/libexec/mail.local/mail.local.c
+++ b/libexec/mail.local/mail.local.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mail.local.c,v 1.38 2020/02/07 02:27:37 millert Exp $ */
+/* $OpenBSD: mail.local.c,v 1.39 2020/02/09 14:59:20 millert Exp $ */
/*-
* Copyright (c) 1996-1998 Theo de Raadt <deraadt@theos.com>
@@ -36,6 +36,7 @@
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
+#include <sysexits.h>
#include <syslog.h>
#include <fcntl.h>
#include <netdb.h>
@@ -69,7 +70,7 @@ main(int argc, char *argv[])
case 'f':
case 'r': /* backward compatible */
if (from)
- merr(FATAL, "multiple -f options");
+ merr(EX_USAGE, "multiple -f options");
from = optarg;
break;
case 'l':
@@ -98,8 +99,10 @@ main(int argc, char *argv[])
from = (pw = getpwuid(uid)) ? pw->pw_name : "???";
fd = storemail(from);
- for (eval = 0; *argv; ++argv)
- eval |= deliver(fd, *argv, lockfile);
+ for (eval = 0; *argv; ++argv) {
+ if ((ch = deliver(fd, *argv, lockfile)) != 0)
+ eval = ch;
+ }
exit(eval);
}
@@ -113,9 +116,9 @@ storemail(char *from)
char *line, *tbuf;
if ((tbuf = strdup(_PATH_LOCTMP)) == NULL)
- merr(FATAL, "unable to allocate memory");
+ merr(EX_OSERR, "unable to allocate memory");
if ((fd = mkstemp(tbuf)) == -1 || !(fp = fdopen(fd, "w+")))
- merr(FATAL, "unable to open temporary file");
+ merr(EX_OSERR, "unable to open temporary file");
(void)unlink(tbuf);
free(tbuf);
@@ -129,7 +132,7 @@ storemail(char *from)
else {
/* No trailing newline, so alloc space and copy */
if ((tbuf = malloc(len + 1)) == NULL)
- merr(FATAL, "unable to allocate memory");
+ merr(EX_OSERR, "unable to allocate memory");
memcpy(tbuf, line, len);
tbuf[len] = '\0';
line = tbuf;
@@ -152,7 +155,7 @@ storemail(char *from)
(void)putc('\n', fp);
(void)fflush(fp);
if (ferror(fp))
- merr(FATAL, "temporary file write error");
+ merr(EX_OSERR, "temporary file write error");
return(fd);
}
@@ -161,7 +164,7 @@ deliver(int fd, char *name, int lockfile)
{
struct stat sb, fsb;
struct passwd *pw;
- int mbfd=-1, rval=1, lfd=-1;
+ int mbfd=-1, lfd=-1, rval=EX_OSERR;
char biffmsg[100], buf[8*1024], path[PATH_MAX];
off_t curoff;
size_t off;
@@ -172,8 +175,8 @@ deliver(int fd, char *name, int lockfile)
* handled in the sendmail aliases file.
*/
if (!(pw = getpwnam(name))) {
- merr(NOTFATAL, "unknown name: %s", name);
- return(1);
+ mwarn("unknown name: %s", name);
+ return(EX_NOUSER);
}
(void)snprintf(path, sizeof path, "%s/%s", _PATH_MAILDIR, name);
@@ -181,14 +184,14 @@ deliver(int fd, char *name, int lockfile)
if (lockfile) {
lfd = lockspool(name, pw);
if (lfd == -1)
- return (1);
+ return(EX_OSERR);
}
/* 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));
+ mwarn("%s: %s", path, strerror(errno));
goto bad;
}
if ((mbfd = open(path, O_APPEND|O_CREAT|O_EXCL|O_WRONLY|O_EXLOCK,
@@ -197,7 +200,8 @@ retry:
/* file appeared since lstat */
goto retry;
} else {
- merr(NOTFATAL, "%s: %s", path, strerror(errno));
+ mwarn("%s: %s", path, strerror(errno));
+ rval = EX_CANTCREAT;
goto bad;
}
}
@@ -208,32 +212,32 @@ retry:
* was a reason for doing so.
*/
if (fchown(mbfd, pw->pw_uid, pw->pw_gid) == -1) {
- merr(NOTFATAL, "chown %u:%u: %s",
- pw->pw_uid, pw->pw_gid, name);
+ mwarn("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);
+ mwarn("%s: linked or special file", path);
goto bad;
}
if ((mbfd = open(path, O_APPEND|O_WRONLY|O_EXLOCK,
S_IRUSR|S_IWUSR)) == -1) {
- merr(NOTFATAL, "%s: %s", path, strerror(errno));
+ mwarn("%s: %s", path, strerror(errno));
goto bad;
}
if (fstat(mbfd, &fsb) == -1) {
/* relating error to path may be bad style */
- merr(NOTFATAL, "%s: %s", path, strerror(errno));
+ mwarn("%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);
+ mwarn("%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);
+ mwarn("%s: linked or special file", path);
+ rval = EX_CANTCREAT;
goto bad;
}
}
@@ -241,14 +245,14 @@ retry:
curoff = lseek(mbfd, 0, SEEK_END);
(void)snprintf(biffmsg, sizeof biffmsg, "%s@%lld\n", name, curoff);
if (lseek(fd, 0, SEEK_SET) == (off_t)-1) {
- merr(NOTFATAL, "temporary file: %s", strerror(errno));
+ mwarn("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)) == -1) {
- merr(NOTFATAL, "%s: %s", path, strerror(errno));
+ mwarn("%s: %s", path, strerror(errno));
(void)ftruncate(mbfd, curoff);
goto bad;
}
@@ -257,7 +261,7 @@ retry:
rval = 0;
} else {
(void)ftruncate(mbfd, curoff);
- merr(FATAL, "temporary file: %s", strerror(errno));
+ mwarn("temporary file: %s", strerror(errno));
}
bad:
@@ -292,8 +296,7 @@ notifybiff(char *msg)
if (error) {
/* Be silent if biff service not available. */
if (error != EAI_SERVICE) {
- merr(NOTFATAL, "localhost: %s",
- gai_strerror(error));
+ mwarn("localhost: %s", gai_strerror(error));
}
return;
}
@@ -308,13 +311,13 @@ notifybiff(char *msg)
}
}
if (f == -1) {
- merr(NOTFATAL, "socket: %s", strerror(errno));
+ mwarn("socket: %s", strerror(errno));
return;
}
len = strlen(msg) + 1; /* XXX */
if (sendto(f, msg, len, 0, res->ai_addr, res->ai_addrlen) != len)
- merr(NOTFATAL, "sendto biff: %s", strerror(errno));
+ mwarn("sendto biff: %s", strerror(errno));
}
static int lockfd = -1;
@@ -331,21 +334,21 @@ lockspool(const char *name, struct passwd *pw)
/* If not privileged, open pipe to lockspool(1) instead */
if (pipe2(pfd, O_CLOEXEC) == -1) {
- merr(FATAL, "pipe: %s", strerror(errno));
+ merr(EX_OSERR, "pipe: %s", strerror(errno));
return -1;
}
signal(SIGPIPE, SIG_IGN);
switch ((lockpid = fork())) {
case -1:
- merr(FATAL, "fork: %s", strerror(errno));
+ merr(EX_OSERR, "fork: %s", strerror(errno));
return -1;
case 0:
/* child */
close(pfd[0]);
dup2(pfd[1], STDOUT_FILENO);
execl(_PATH_LOCKSPOOL, "lockspool", (char *)NULL);
- merr(FATAL, "execl: lockspool: %s", strerror(errno));
+ merr(EX_OSERR, "execl: lockspool: %s", strerror(errno));
/* NOTREACHED */
break;
default:
@@ -357,7 +360,7 @@ lockspool(const char *name, struct passwd *pw)
if (read(lockfd, &ch, 1) != 1 || ch != '1') {
unlockspool();
- merr(FATAL, "lockspool: unable to get lock");
+ merr(EX_OSERR, "lockspool: unable to get lock");
}
return lockfd;
@@ -379,5 +382,5 @@ unlockspool(void)
void
usage(void)
{
- merr(FATAL, "usage: mail.local [-Ll] [-f from] user ...");
+ merr(EX_USAGE, "usage: mail.local [-Ll] [-f from] user ...");
}
diff --git a/libexec/mail.local/mail.local.h b/libexec/mail.local/mail.local.h
index 92a0b78cf37..bc3137cb683 100644
--- a/libexec/mail.local/mail.local.h
+++ b/libexec/mail.local/mail.local.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mail.local.h,v 1.6 2020/02/02 23:17:09 millert Exp $ */
+/* $OpenBSD: mail.local.h,v 1.7 2020/02/09 14:59:21 millert Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -29,12 +29,10 @@
* SUCH DAMAGE.
*/
-#define FATAL 1
-#define NOTFATAL 0
-
void baditem(char *);
int deliver(int, char *, int);
void merr(int, const char *, ...);
+void mwarn(const char *, ...);
int getlock(const char *, struct passwd *);
void notifybiff(char *);
void rellock(void);