1/*
2 * Copyright (c) 2017 Gilles Chehade <gilles@poolp.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <sys/wait.h>
18
19#include <err.h>
20#include <errno.h>
21#include <stdlib.h>
22#include <string.h>
23#include <sysexits.h>
24#include <unistd.h>
25
26int
27main(int argc, char *argv[])
28{
29	int ch;
30	int ret;
31
32	if (! geteuid())
33		errx(1, "mail.mda: may not be executed as root");
34
35	while ((ch = getopt(argc, argv, "")) != -1) {
36		switch (ch) {
37		default:
38			break;
39		}
40	}
41	argc -= optind;
42	argv += optind;
43
44	if (argc == 0)
45		errx(1, "mail.mda: command required");
46
47	if (argc > 1)
48		errx(1, "mail.mda: only one command is supported");
49
50	/* could not obtain a shell or could not obtain wait status,
51	 * tempfail */
52	if ((ret = system(argv[0])) == -1)
53		errx(EX_TEMPFAIL, "%s", strerror(errno));
54
55	/* not exited properly but we have no details,
56	 * tempfail */
57	if (! WIFEXITED(ret))
58		exit(EX_TEMPFAIL);
59
60	exit(WEXITSTATUS(ret));
61}
62