1ded78408SXin LI /* $OpenBSD: mailwrapper.c,v 1.18 2007/11/06 14:39:19 otto Exp $ */ 249fe7301SXin LI /* $NetBSD: mailwrapper.c,v 1.9 2003/03/09 08:10:43 mjl Exp $ */ 33ae92913SPeter Wemm 41de7b4b8SPedro F. Giffuni /*- 51de7b4b8SPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause 61de7b4b8SPedro F. Giffuni * 73ae92913SPeter Wemm * Copyright (c) 1998 83ae92913SPeter Wemm * Perry E. Metzger. All rights reserved. 93ae92913SPeter Wemm * 103ae92913SPeter Wemm * Redistribution and use in source and binary forms, with or without 113ae92913SPeter Wemm * modification, are permitted provided that the following conditions 123ae92913SPeter Wemm * are met: 133ae92913SPeter Wemm * 1. Redistributions of source code must retain the above copyright 143ae92913SPeter Wemm * notice, this list of conditions and the following disclaimer. 153ae92913SPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 163ae92913SPeter Wemm * notice, this list of conditions and the following disclaimer in the 173ae92913SPeter Wemm * documentation and/or other materials provided with the distribution. 183ae92913SPeter Wemm * 3. All advertising materials mentioning features or use of this software 193ae92913SPeter Wemm * must display the following acknowledgment: 203ae92913SPeter Wemm * This product includes software developed for the NetBSD Project 213ae92913SPeter Wemm * by Perry E. Metzger. 223ae92913SPeter Wemm * 4. The name of the author may not be used to endorse or promote products 233ae92913SPeter Wemm * derived from this software without specific prior written permission. 243ae92913SPeter Wemm * 253ae92913SPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 263ae92913SPeter Wemm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 273ae92913SPeter Wemm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 283ae92913SPeter Wemm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 293ae92913SPeter Wemm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 303ae92913SPeter Wemm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 313ae92913SPeter Wemm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 323ae92913SPeter Wemm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 333ae92913SPeter Wemm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 343ae92913SPeter Wemm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 353ae92913SPeter Wemm */ 363ae92913SPeter Wemm 3754ede02dSPhilippe Charnier #include <sys/cdefs.h> 3854ede02dSPhilippe Charnier __FBSDID("$FreeBSD$"); 3954ede02dSPhilippe Charnier 4024ed0a57SBaptiste Daroussin #include <sys/param.h> 4124ed0a57SBaptiste Daroussin 423ae92913SPeter Wemm #include <err.h> 431f474190SStefan Eßer #include <paths.h> 443ae92913SPeter Wemm #include <stdio.h> 453ae92913SPeter Wemm #include <string.h> 463ae92913SPeter Wemm #include <unistd.h> 478fe1b8c0SXin LI #include <stdlib.h> 488b081eaaSBaptiste Daroussin #include <libutil.h> 498fe1b8c0SXin LI #include <sysexits.h> 50ff4d7851SWarner Losh #include <syslog.h> 513ae92913SPeter Wemm 52521cb9d2SPeter Wemm #include "pathnames.h" 533ae92913SPeter Wemm 543ae92913SPeter Wemm struct arglist { 553ae92913SPeter Wemm size_t argc, maxc; 563ae92913SPeter Wemm char **argv; 573ae92913SPeter Wemm }; 583ae92913SPeter Wemm 59d89167b4SAlfred Perlstein int main(int, char *[], char *[]); 603ae92913SPeter Wemm 61d89167b4SAlfred Perlstein static void initarg(struct arglist *); 628fe1b8c0SXin LI static void addarg(struct arglist *, const char *); 633ae92913SPeter Wemm 643ae92913SPeter Wemm static void 658fe1b8c0SXin LI initarg(struct arglist *al) 663ae92913SPeter Wemm { 673ae92913SPeter Wemm al->argc = 0; 683ae92913SPeter Wemm al->maxc = 10; 69ded78408SXin LI if ((al->argv = calloc(al->maxc, sizeof(char *))) == NULL) 70ded78408SXin LI err(EX_TEMPFAIL, "calloc"); 713ae92913SPeter Wemm } 723ae92913SPeter Wemm 733ae92913SPeter Wemm static void 748fe1b8c0SXin LI addarg(struct arglist *al, const char *arg) 753ae92913SPeter Wemm { 76ff4d7851SWarner Losh 773ae92913SPeter Wemm if (al->argc == al->maxc) { 783ae92913SPeter Wemm al->maxc <<= 1; 798fe1b8c0SXin LI al->argv = realloc(al->argv, al->maxc * sizeof(char *)); 808fe1b8c0SXin LI if (al->argv == NULL) 818fe1b8c0SXin LI err(EX_TEMPFAIL, "realloc"); 82ff4d7851SWarner Losh } 838fe1b8c0SXin LI if (arg == NULL) 848fe1b8c0SXin LI al->argv[al->argc++] = NULL; 858fe1b8c0SXin LI else if ((al->argv[al->argc++] = strdup(arg)) == NULL) 868fe1b8c0SXin LI err(EX_TEMPFAIL, "strdup"); 873ae92913SPeter Wemm } 883ae92913SPeter Wemm 893ae92913SPeter Wemm int 908fe1b8c0SXin LI main(int argc, char *argv[], char *envp[]) 913ae92913SPeter Wemm { 923ae92913SPeter Wemm FILE *config; 938b081eaaSBaptiste Daroussin char *line, *cp, *from, *to, *ap; 948fe1b8c0SXin LI const char *progname; 9524ed0a57SBaptiste Daroussin char localmailerconf[MAXPATHLEN]; 9624ed0a57SBaptiste Daroussin const char *mailerconf; 978b081eaaSBaptiste Daroussin size_t len, lineno = 0; 988fe1b8c0SXin LI int i; 993ae92913SPeter Wemm struct arglist al; 1003ae92913SPeter Wemm 1018fe1b8c0SXin LI /* change __progname to mailwrapper so we get sensible error messages */ 1028fe1b8c0SXin LI progname = getprogname(); 1038fe1b8c0SXin LI setprogname("mailwrapper"); 1048fe1b8c0SXin LI 1053ae92913SPeter Wemm initarg(&al); 1068fe1b8c0SXin LI addarg(&al, argv[0]); 1073ae92913SPeter Wemm 108*8e103108SScott Long snprintf(localmailerconf, MAXPATHLEN, "%s/etc/mail/mailer.conf", 109*8e103108SScott Long getenv("LOCALBASE") ? getenv("LOCALBASE") : _PATH_LOCALBASE); 11024ed0a57SBaptiste Daroussin 11124ed0a57SBaptiste Daroussin mailerconf = localmailerconf; 11224ed0a57SBaptiste Daroussin if ((config = fopen(localmailerconf, "r")) == NULL) 11324ed0a57SBaptiste Daroussin mailerconf = _PATH_MAILERCONF; 11424ed0a57SBaptiste Daroussin 11524ed0a57SBaptiste Daroussin if (config == NULL && ((config = fopen(mailerconf, "r")) == NULL)) { 1168fe1b8c0SXin LI addarg(&al, NULL); 1178fe1b8c0SXin LI openlog(getprogname(), LOG_PID, LOG_MAIL); 1188fe1b8c0SXin LI syslog(LOG_INFO, "cannot open %s, using %s as default MTA", 11924ed0a57SBaptiste Daroussin mailerconf, _PATH_DEFAULTMTA); 120ff4d7851SWarner Losh closelog(); 121ff4d7851SWarner Losh execve(_PATH_DEFAULTMTA, al.argv, envp); 1228fe1b8c0SXin LI err(EX_OSERR, "cannot exec %s", _PATH_DEFAULTMTA); 123ff4d7851SWarner Losh /*NOTREACHED*/ 124ff4d7851SWarner Losh } 1253ae92913SPeter Wemm 1263ae92913SPeter Wemm for (;;) { 1278b081eaaSBaptiste Daroussin if ((line = fparseln(config, &len, &lineno, NULL, 0)) == NULL) { 1288b081eaaSBaptiste Daroussin if (feof(config)) 12924ed0a57SBaptiste Daroussin errx(EX_CONFIG, "no mapping in %s", mailerconf); 1308fe1b8c0SXin LI err(EX_CONFIG, "cannot parse line %lu", (u_long)lineno); 1313ae92913SPeter Wemm } 1328b081eaaSBaptiste Daroussin 1333ae92913SPeter Wemm #define WS " \t\n" 1343ae92913SPeter Wemm cp = line; 1353ae92913SPeter Wemm 1363ae92913SPeter Wemm cp += strspn(cp, WS); 1373ae92913SPeter Wemm if (cp[0] == '\0') { 1383ae92913SPeter Wemm /* empty line */ 1393ae92913SPeter Wemm free(line); 1403ae92913SPeter Wemm continue; 1413ae92913SPeter Wemm } 1423ae92913SPeter Wemm 143ded78408SXin LI if ((from = strsep(&cp, WS)) == NULL || cp == NULL) 1443ae92913SPeter Wemm goto parse_error; 1453ae92913SPeter Wemm 1463ae92913SPeter Wemm cp += strspn(cp, WS); 1473ae92913SPeter Wemm 1483ae92913SPeter Wemm if ((to = strsep(&cp, WS)) == NULL) 1493ae92913SPeter Wemm goto parse_error; 1503ae92913SPeter Wemm 1518fe1b8c0SXin LI if (strcmp(from, progname) == 0) { 1523ae92913SPeter Wemm for (ap = strsep(&cp, WS); ap != NULL; 1538fe1b8c0SXin LI ap = strsep(&cp, WS)) { 1543ae92913SPeter Wemm if (*ap) 1558fe1b8c0SXin LI addarg(&al, ap); 1568fe1b8c0SXin LI } 1573ae92913SPeter Wemm break; 1583ae92913SPeter Wemm } 1593ae92913SPeter Wemm 1603ae92913SPeter Wemm free(line); 1613ae92913SPeter Wemm } 1623ae92913SPeter Wemm 1633ae92913SPeter Wemm (void)fclose(config); 1643ae92913SPeter Wemm 1658fe1b8c0SXin LI for (i = 1; i < argc; i++) 1668fe1b8c0SXin LI addarg(&al, argv[i]); 1678fe1b8c0SXin LI 1688fe1b8c0SXin LI addarg(&al, NULL); 1693ae92913SPeter Wemm execve(to, al.argv, envp); 1708fe1b8c0SXin LI err(EX_OSERR, "cannot exec %s", to); 1713ae92913SPeter Wemm /*NOTREACHED*/ 1723ae92913SPeter Wemm parse_error: 1738fe1b8c0SXin LI errx(EX_CONFIG, "parse error in %s at line %lu", 17424ed0a57SBaptiste Daroussin mailerconf, (u_long)lineno); 1753ae92913SPeter Wemm /*NOTREACHED*/ 1763ae92913SPeter Wemm } 177