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 4*1de7b4b8SPedro F. Giffuni /*- 5*1de7b4b8SPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause 6*1de7b4b8SPedro 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> 433ae92913SPeter Wemm #include <stdio.h> 443ae92913SPeter Wemm #include <string.h> 453ae92913SPeter Wemm #include <unistd.h> 468fe1b8c0SXin LI #include <stdlib.h> 47521cb9d2SPeter Wemm #include <libutil.h> 488fe1b8c0SXin LI #include <sysexits.h> 49ff4d7851SWarner Losh #include <syslog.h> 503ae92913SPeter Wemm 51521cb9d2SPeter Wemm #include "pathnames.h" 523ae92913SPeter Wemm 533ae92913SPeter Wemm struct arglist { 543ae92913SPeter Wemm size_t argc, maxc; 553ae92913SPeter Wemm char **argv; 563ae92913SPeter Wemm }; 573ae92913SPeter Wemm 58d89167b4SAlfred Perlstein int main(int, char *[], char *[]); 593ae92913SPeter Wemm 60d89167b4SAlfred Perlstein static void initarg(struct arglist *); 618fe1b8c0SXin LI static void addarg(struct arglist *, const char *); 623ae92913SPeter Wemm 633ae92913SPeter Wemm static void 648fe1b8c0SXin LI initarg(struct arglist *al) 653ae92913SPeter Wemm { 663ae92913SPeter Wemm al->argc = 0; 673ae92913SPeter Wemm al->maxc = 10; 68ded78408SXin LI if ((al->argv = calloc(al->maxc, sizeof(char *))) == NULL) 69ded78408SXin LI err(EX_TEMPFAIL, "calloc"); 703ae92913SPeter Wemm } 713ae92913SPeter Wemm 723ae92913SPeter Wemm static void 738fe1b8c0SXin LI addarg(struct arglist *al, const char *arg) 743ae92913SPeter Wemm { 75ff4d7851SWarner Losh 763ae92913SPeter Wemm if (al->argc == al->maxc) { 773ae92913SPeter Wemm al->maxc <<= 1; 788fe1b8c0SXin LI al->argv = realloc(al->argv, al->maxc * sizeof(char *)); 798fe1b8c0SXin LI if (al->argv == NULL) 808fe1b8c0SXin LI err(EX_TEMPFAIL, "realloc"); 81ff4d7851SWarner Losh } 828fe1b8c0SXin LI if (arg == NULL) 838fe1b8c0SXin LI al->argv[al->argc++] = NULL; 848fe1b8c0SXin LI else if ((al->argv[al->argc++] = strdup(arg)) == NULL) 858fe1b8c0SXin LI err(EX_TEMPFAIL, "strdup"); 863ae92913SPeter Wemm } 873ae92913SPeter Wemm 883ae92913SPeter Wemm int 898fe1b8c0SXin LI main(int argc, char *argv[], char *envp[]) 903ae92913SPeter Wemm { 913ae92913SPeter Wemm FILE *config; 923ae92913SPeter Wemm char *line, *cp, *from, *to, *ap; 938fe1b8c0SXin LI const char *progname; 9424ed0a57SBaptiste Daroussin char localmailerconf[MAXPATHLEN]; 9524ed0a57SBaptiste Daroussin const char *mailerconf; 963ae92913SPeter Wemm size_t len, lineno = 0; 978fe1b8c0SXin LI int i; 983ae92913SPeter Wemm struct arglist al; 993ae92913SPeter Wemm 1008fe1b8c0SXin LI /* change __progname to mailwrapper so we get sensible error messages */ 1018fe1b8c0SXin LI progname = getprogname(); 1028fe1b8c0SXin LI setprogname("mailwrapper"); 1038fe1b8c0SXin LI 1043ae92913SPeter Wemm initarg(&al); 1058fe1b8c0SXin LI addarg(&al, argv[0]); 1063ae92913SPeter Wemm 10724ed0a57SBaptiste Daroussin snprintf(localmailerconf, MAXPATHLEN, "%s/etc/mail/mailer.conf", 10824ed0a57SBaptiste Daroussin getenv("LOCALBASE") ? getenv("LOCALBASE") : "/usr/local"); 10924ed0a57SBaptiste Daroussin 11024ed0a57SBaptiste Daroussin mailerconf = localmailerconf; 11124ed0a57SBaptiste Daroussin if ((config = fopen(localmailerconf, "r")) == NULL) 11224ed0a57SBaptiste Daroussin mailerconf = _PATH_MAILERCONF; 11324ed0a57SBaptiste Daroussin 11424ed0a57SBaptiste Daroussin if (config == NULL && ((config = fopen(mailerconf, "r")) == NULL)) { 1158fe1b8c0SXin LI addarg(&al, NULL); 1168fe1b8c0SXin LI openlog(getprogname(), LOG_PID, LOG_MAIL); 1178fe1b8c0SXin LI syslog(LOG_INFO, "cannot open %s, using %s as default MTA", 11824ed0a57SBaptiste Daroussin mailerconf, _PATH_DEFAULTMTA); 119ff4d7851SWarner Losh closelog(); 120ff4d7851SWarner Losh execve(_PATH_DEFAULTMTA, al.argv, envp); 1218fe1b8c0SXin LI err(EX_OSERR, "cannot exec %s", _PATH_DEFAULTMTA); 122ff4d7851SWarner Losh /*NOTREACHED*/ 123ff4d7851SWarner Losh } 1243ae92913SPeter Wemm 1253ae92913SPeter Wemm for (;;) { 1263ae92913SPeter Wemm if ((line = fparseln(config, &len, &lineno, NULL, 0)) == NULL) { 1273ae92913SPeter Wemm if (feof(config)) 12824ed0a57SBaptiste Daroussin errx(EX_CONFIG, "no mapping in %s", mailerconf); 1298fe1b8c0SXin LI err(EX_CONFIG, "cannot parse line %lu", (u_long)lineno); 1303ae92913SPeter Wemm } 1313ae92913SPeter Wemm 1323ae92913SPeter Wemm #define WS " \t\n" 1333ae92913SPeter Wemm cp = line; 1343ae92913SPeter Wemm 1353ae92913SPeter Wemm cp += strspn(cp, WS); 1363ae92913SPeter Wemm if (cp[0] == '\0') { 1373ae92913SPeter Wemm /* empty line */ 1383ae92913SPeter Wemm free(line); 1393ae92913SPeter Wemm continue; 1403ae92913SPeter Wemm } 1413ae92913SPeter Wemm 142ded78408SXin LI if ((from = strsep(&cp, WS)) == NULL || cp == NULL) 1433ae92913SPeter Wemm goto parse_error; 1443ae92913SPeter Wemm 1453ae92913SPeter Wemm cp += strspn(cp, WS); 1463ae92913SPeter Wemm 1473ae92913SPeter Wemm if ((to = strsep(&cp, WS)) == NULL) 1483ae92913SPeter Wemm goto parse_error; 1493ae92913SPeter Wemm 1508fe1b8c0SXin LI if (strcmp(from, progname) == 0) { 1513ae92913SPeter Wemm for (ap = strsep(&cp, WS); ap != NULL; 1528fe1b8c0SXin LI ap = strsep(&cp, WS)) { 1533ae92913SPeter Wemm if (*ap) 1548fe1b8c0SXin LI addarg(&al, ap); 1558fe1b8c0SXin LI } 1563ae92913SPeter Wemm break; 1573ae92913SPeter Wemm } 1583ae92913SPeter Wemm 1593ae92913SPeter Wemm free(line); 1603ae92913SPeter Wemm } 1613ae92913SPeter Wemm 1623ae92913SPeter Wemm (void)fclose(config); 1633ae92913SPeter Wemm 1648fe1b8c0SXin LI for (i = 1; i < argc; i++) 1658fe1b8c0SXin LI addarg(&al, argv[i]); 1668fe1b8c0SXin LI 1678fe1b8c0SXin LI addarg(&al, NULL); 1683ae92913SPeter Wemm execve(to, al.argv, envp); 1698fe1b8c0SXin LI err(EX_OSERR, "cannot exec %s", to); 1703ae92913SPeter Wemm /*NOTREACHED*/ 1713ae92913SPeter Wemm parse_error: 1728fe1b8c0SXin LI errx(EX_CONFIG, "parse error in %s at line %lu", 17324ed0a57SBaptiste Daroussin mailerconf, (u_long)lineno); 1743ae92913SPeter Wemm /*NOTREACHED*/ 1753ae92913SPeter Wemm } 176