1c2aa98e2SPeter Wemm /* 25dd76dd0SGregory Neil Shapiro * Copyright (c) 1998-2006, 2008-2010, 2013 Proofpoint, Inc. and its suppliers. 306f25ae9SGregory Neil Shapiro * All rights reserved. 4c2aa98e2SPeter Wemm * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 5c2aa98e2SPeter Wemm * Copyright (c) 1988, 1993 6c2aa98e2SPeter Wemm * The Regents of the University of California. All rights reserved. 7c2aa98e2SPeter Wemm * 8c2aa98e2SPeter Wemm * By using this file, you agree to the terms and conditions set 9c2aa98e2SPeter Wemm * forth in the LICENSE file which can be found at the top level of 10c2aa98e2SPeter Wemm * the sendmail distribution. 11c2aa98e2SPeter Wemm * 12c2aa98e2SPeter Wemm */ 13c2aa98e2SPeter Wemm 1406f25ae9SGregory Neil Shapiro #include <sendmail.h> 15d0cef73dSGregory Neil Shapiro #include <sm/sendmail.h> 165b0945b5SGregory Neil Shapiro #if STARTTLS 175b0945b5SGregory Neil Shapiro # include <tls.h> 185b0945b5SGregory Neil Shapiro #endif 195b0945b5SGregory Neil Shapiro #if DNSSEC_TEST 205b0945b5SGregory Neil Shapiro # include <sm_resolve.h> 215b0945b5SGregory Neil Shapiro #endif 2206f25ae9SGregory Neil Shapiro 234313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: readcf.c,v 8.692 2013-11-22 20:51:56 ca Exp $") 2406f25ae9SGregory Neil Shapiro 2506f25ae9SGregory Neil Shapiro #if NETINET || NETINET6 2606f25ae9SGregory Neil Shapiro # include <arpa/inet.h> 275b0945b5SGregory Neil Shapiro #endif 2806f25ae9SGregory Neil Shapiro 296f9c8e5bSGregory Neil Shapiro 3006f25ae9SGregory Neil Shapiro #define SECONDS 3106f25ae9SGregory Neil Shapiro #define MINUTES * 60 3206f25ae9SGregory Neil Shapiro #define HOUR * 3600 3306f25ae9SGregory Neil Shapiro #define HOURS HOUR 3406f25ae9SGregory Neil Shapiro 35605302a5SGregory Neil Shapiro static void fileclass __P((int, char *, char *, bool, bool, bool)); 3606f25ae9SGregory Neil Shapiro static char **makeargv __P((char *)); 3706f25ae9SGregory Neil Shapiro static void settimeout __P((char *, char *, bool)); 3806f25ae9SGregory Neil Shapiro static void toomany __P((int, int)); 3940266059SGregory Neil Shapiro static char *extrquotstr __P((char *, char **, char *, bool *)); 40b6bacd31SGregory Neil Shapiro static void parse_class_words __P((int, char *)); 41c2aa98e2SPeter Wemm 42da7d7b9cSGregory Neil Shapiro 43da7d7b9cSGregory Neil Shapiro #if _FFR_BOUNCE_QUEUE 44da7d7b9cSGregory Neil Shapiro static char *bouncequeue = NULL; 45da7d7b9cSGregory Neil Shapiro static void initbouncequeue __P((void)); 46da7d7b9cSGregory Neil Shapiro 47da7d7b9cSGregory Neil Shapiro /* 48da7d7b9cSGregory Neil Shapiro ** INITBOUNCEQUEUE -- determine BounceQueue if option is set. 49da7d7b9cSGregory Neil Shapiro ** 50da7d7b9cSGregory Neil Shapiro ** Parameters: 51da7d7b9cSGregory Neil Shapiro ** none. 52da7d7b9cSGregory Neil Shapiro ** 53da7d7b9cSGregory Neil Shapiro ** Returns: 54da7d7b9cSGregory Neil Shapiro ** none. 55da7d7b9cSGregory Neil Shapiro ** 56da7d7b9cSGregory Neil Shapiro ** Side Effects: 57da7d7b9cSGregory Neil Shapiro ** sets BounceQueue 58da7d7b9cSGregory Neil Shapiro */ 59da7d7b9cSGregory Neil Shapiro 60da7d7b9cSGregory Neil Shapiro static void 61da7d7b9cSGregory Neil Shapiro initbouncequeue() 62da7d7b9cSGregory Neil Shapiro { 63da7d7b9cSGregory Neil Shapiro STAB *s; 64da7d7b9cSGregory Neil Shapiro 65da7d7b9cSGregory Neil Shapiro BounceQueue = NOQGRP; 66*2fb4f839SGregory Neil Shapiro if (SM_IS_EMPTY(bouncequeue)) 67da7d7b9cSGregory Neil Shapiro return; 68da7d7b9cSGregory Neil Shapiro 69da7d7b9cSGregory Neil Shapiro s = stab(bouncequeue, ST_QUEUE, ST_FIND); 70da7d7b9cSGregory Neil Shapiro if (s == NULL) 71da7d7b9cSGregory Neil Shapiro { 72da7d7b9cSGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 73da7d7b9cSGregory Neil Shapiro "Warning: option BounceQueue: unknown queue group %s\n", 74da7d7b9cSGregory Neil Shapiro bouncequeue); 75da7d7b9cSGregory Neil Shapiro } 76da7d7b9cSGregory Neil Shapiro else 77da7d7b9cSGregory Neil Shapiro BounceQueue = s->s_quegrp->qg_index; 78da7d7b9cSGregory Neil Shapiro } 79da7d7b9cSGregory Neil Shapiro #endif /* _FFR_BOUNCE_QUEUE */ 80da7d7b9cSGregory Neil Shapiro 81da7d7b9cSGregory Neil Shapiro #if _FFR_RCPTFLAGS 82da7d7b9cSGregory Neil Shapiro void setupdynmailers __P((void)); 83da7d7b9cSGregory Neil Shapiro #else 84da7d7b9cSGregory Neil Shapiro #define setupdynmailers() 85da7d7b9cSGregory Neil Shapiro #endif 86da7d7b9cSGregory Neil Shapiro 87c2aa98e2SPeter Wemm /* 88c2aa98e2SPeter Wemm ** READCF -- read configuration file. 89c2aa98e2SPeter Wemm ** 90c2aa98e2SPeter Wemm ** This routine reads the configuration file and builds the internal 91c2aa98e2SPeter Wemm ** form. 92c2aa98e2SPeter Wemm ** 93c2aa98e2SPeter Wemm ** The file is formatted as a sequence of lines, each taken 94c2aa98e2SPeter Wemm ** atomically. The first character of each line describes how 95c2aa98e2SPeter Wemm ** the line is to be interpreted. The lines are: 96c2aa98e2SPeter Wemm ** Dxval Define macro x to have value val. 97c2aa98e2SPeter Wemm ** Cxword Put word into class x. 98c2aa98e2SPeter Wemm ** Fxfile [fmt] Read file for lines to put into 99c2aa98e2SPeter Wemm ** class x. Use scanf string 'fmt' 100c2aa98e2SPeter Wemm ** or "%s" if not present. Fmt should 101c2aa98e2SPeter Wemm ** only produce one string-valued result. 102c2aa98e2SPeter Wemm ** Hname: value Define header with field-name 'name' 103c2aa98e2SPeter Wemm ** and value as specified; this will be 104c2aa98e2SPeter Wemm ** macro expanded immediately before 105c2aa98e2SPeter Wemm ** use. 106c2aa98e2SPeter Wemm ** Sn Use rewriting set n. 107c2aa98e2SPeter Wemm ** Rlhs rhs Rewrite addresses that match lhs to 108c2aa98e2SPeter Wemm ** be rhs. 109c2aa98e2SPeter Wemm ** Mn arg=val... Define mailer. n is the internal name. 110c2aa98e2SPeter Wemm ** Args specify mailer parameters. 111c2aa98e2SPeter Wemm ** Oxvalue Set option x to value. 11240266059SGregory Neil Shapiro ** O option value Set option (long name) to value. 113c2aa98e2SPeter Wemm ** Pname=value Set precedence name to value. 11440266059SGregory Neil Shapiro ** Qn arg=val... Define queue groups. n is the internal name. 11540266059SGregory Neil Shapiro ** Args specify queue parameters. 116c2aa98e2SPeter Wemm ** Vversioncode[/vendorcode] 117c2aa98e2SPeter Wemm ** Version level/vendor name of 118c2aa98e2SPeter Wemm ** configuration syntax. 119c2aa98e2SPeter Wemm ** Kmapname mapclass arguments.... 120c2aa98e2SPeter Wemm ** Define keyed lookup of a given class. 121c2aa98e2SPeter Wemm ** Arguments are class dependent. 122c2aa98e2SPeter Wemm ** Eenvar=value Set the environment value to the given value. 123c2aa98e2SPeter Wemm ** 124c2aa98e2SPeter Wemm ** Parameters: 125c2aa98e2SPeter Wemm ** cfname -- configuration file name. 12640266059SGregory Neil Shapiro ** safe -- true if this is the system config file; 12740266059SGregory Neil Shapiro ** false otherwise. 128c2aa98e2SPeter Wemm ** e -- the main envelope. 129c2aa98e2SPeter Wemm ** 130c2aa98e2SPeter Wemm ** Returns: 131c2aa98e2SPeter Wemm ** none. 132c2aa98e2SPeter Wemm ** 133c2aa98e2SPeter Wemm ** Side Effects: 134c2aa98e2SPeter Wemm ** Builds several internal tables. 135c2aa98e2SPeter Wemm */ 136c2aa98e2SPeter Wemm 137c2aa98e2SPeter Wemm void 138c2aa98e2SPeter Wemm readcf(cfname, safe, e) 139c2aa98e2SPeter Wemm char *cfname; 140c2aa98e2SPeter Wemm bool safe; 141c2aa98e2SPeter Wemm register ENVELOPE *e; 142c2aa98e2SPeter Wemm { 14340266059SGregory Neil Shapiro SM_FILE_T *cf; 14406f25ae9SGregory Neil Shapiro int ruleset = -1; 145c2aa98e2SPeter Wemm char *q; 146c2aa98e2SPeter Wemm struct rewrite *rwp = NULL; 147c2aa98e2SPeter Wemm char *bp; 148c2aa98e2SPeter Wemm auto char *ep; 149c2aa98e2SPeter Wemm int nfuzzy; 150c2aa98e2SPeter Wemm char *file; 151c2aa98e2SPeter Wemm bool optional; 15240266059SGregory Neil Shapiro bool ok; 153605302a5SGregory Neil Shapiro bool ismap; 154c2aa98e2SPeter Wemm int mid; 155c2aa98e2SPeter Wemm register char *p; 15606f25ae9SGregory Neil Shapiro long sff = SFF_OPENASROOT; 157c2aa98e2SPeter Wemm struct stat statb; 158c2aa98e2SPeter Wemm char buf[MAXLINE]; 159d0cef73dSGregory Neil Shapiro int bufsize; 160c2aa98e2SPeter Wemm char exbuf[MAXLINE]; 161c2aa98e2SPeter Wemm char pvpbuf[MAXLINE + MAXATOM]; 162c2aa98e2SPeter Wemm static char *null_list[1] = { NULL }; 16340266059SGregory Neil Shapiro extern unsigned char TokTypeNoC[]; 164c2aa98e2SPeter Wemm 165c2aa98e2SPeter Wemm FileName = cfname; 166c2aa98e2SPeter Wemm LineNumber = 0; 167c2aa98e2SPeter Wemm 168c2aa98e2SPeter Wemm if (DontLockReadFiles) 169c2aa98e2SPeter Wemm sff |= SFF_NOLOCK; 170c2aa98e2SPeter Wemm cf = safefopen(cfname, O_RDONLY, 0444, sff); 171c2aa98e2SPeter Wemm if (cf == NULL) 172c2aa98e2SPeter Wemm { 173c2aa98e2SPeter Wemm syserr("cannot open"); 17440266059SGregory Neil Shapiro finis(false, true, EX_OSFILE); 175c2aa98e2SPeter Wemm } 176c2aa98e2SPeter Wemm 17740266059SGregory Neil Shapiro if (fstat(sm_io_getinfo(cf, SM_IO_WHAT_FD, NULL), &statb) < 0) 178c2aa98e2SPeter Wemm { 179c2aa98e2SPeter Wemm syserr("cannot fstat"); 18040266059SGregory Neil Shapiro finis(false, true, EX_OSFILE); 181c2aa98e2SPeter Wemm } 182c2aa98e2SPeter Wemm 183c2aa98e2SPeter Wemm if (!S_ISREG(statb.st_mode)) 184c2aa98e2SPeter Wemm { 185c2aa98e2SPeter Wemm syserr("not a plain file"); 18640266059SGregory Neil Shapiro finis(false, true, EX_OSFILE); 187c2aa98e2SPeter Wemm } 188c2aa98e2SPeter Wemm 189c2aa98e2SPeter Wemm if (OpMode != MD_TEST && bitset(S_IWGRP|S_IWOTH, statb.st_mode)) 190c2aa98e2SPeter Wemm { 1919bd497b8SGregory Neil Shapiro if (OpMode == MD_DAEMON || OpMode == MD_INITALIAS || OpMode == MD_CHECKCONFIG) 19240266059SGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 19340266059SGregory Neil Shapiro "%s: WARNING: dangerous write permissions\n", 194c2aa98e2SPeter Wemm FileName); 195c2aa98e2SPeter Wemm if (LogLevel > 0) 196c2aa98e2SPeter Wemm sm_syslog(LOG_CRIT, NOQID, 197c2aa98e2SPeter Wemm "%s: WARNING: dangerous write permissions", 198c2aa98e2SPeter Wemm FileName); 199c2aa98e2SPeter Wemm } 200c2aa98e2SPeter Wemm 20140266059SGregory Neil Shapiro #if XLA 202c2aa98e2SPeter Wemm xla_zero(); 2035b0945b5SGregory Neil Shapiro #endif 204c2aa98e2SPeter Wemm 205d0cef73dSGregory Neil Shapiro while (bufsize = sizeof(buf), 206d0cef73dSGregory Neil Shapiro (bp = fgetfolded(buf, &bufsize, cf)) != NULL) 207c2aa98e2SPeter Wemm { 208d0cef73dSGregory Neil Shapiro char *nbp; 209d0cef73dSGregory Neil Shapiro 210c2aa98e2SPeter Wemm if (bp[0] == '#') 211c2aa98e2SPeter Wemm { 212c2aa98e2SPeter Wemm if (bp != buf) 21340266059SGregory Neil Shapiro sm_free(bp); /* XXX */ 214c2aa98e2SPeter Wemm continue; 215c2aa98e2SPeter Wemm } 216c2aa98e2SPeter Wemm 217c2aa98e2SPeter Wemm /* do macro expansion mappings */ 218d0cef73dSGregory Neil Shapiro nbp = translate_dollars(bp, bp, &bufsize); 219d0cef73dSGregory Neil Shapiro if (nbp != bp && bp != buf) 220d0cef73dSGregory Neil Shapiro sm_free(bp); 221d0cef73dSGregory Neil Shapiro bp = nbp; 222c2aa98e2SPeter Wemm 223c2aa98e2SPeter Wemm /* interpret this line */ 224c2aa98e2SPeter Wemm errno = 0; 225c2aa98e2SPeter Wemm switch (bp[0]) 226c2aa98e2SPeter Wemm { 227c2aa98e2SPeter Wemm case '\0': 228c2aa98e2SPeter Wemm case '#': /* comment */ 229c2aa98e2SPeter Wemm break; 230c2aa98e2SPeter Wemm 231c2aa98e2SPeter Wemm case 'R': /* rewriting rule */ 23206f25ae9SGregory Neil Shapiro if (ruleset < 0) 23306f25ae9SGregory Neil Shapiro { 23406f25ae9SGregory Neil Shapiro syserr("missing valid ruleset for \"%s\"", bp); 23506f25ae9SGregory Neil Shapiro break; 23606f25ae9SGregory Neil Shapiro } 237c2aa98e2SPeter Wemm for (p = &bp[1]; *p != '\0' && *p != '\t'; p++) 238c2aa98e2SPeter Wemm continue; 239c2aa98e2SPeter Wemm 240c2aa98e2SPeter Wemm if (*p == '\0') 241c2aa98e2SPeter Wemm { 242c2aa98e2SPeter Wemm syserr("invalid rewrite line \"%s\" (tab expected)", bp); 243c2aa98e2SPeter Wemm break; 244c2aa98e2SPeter Wemm } 245c2aa98e2SPeter Wemm 246c2aa98e2SPeter Wemm /* allocate space for the rule header */ 247c2aa98e2SPeter Wemm if (rwp == NULL) 248c2aa98e2SPeter Wemm { 249c2aa98e2SPeter Wemm RewriteRules[ruleset] = rwp = 250*2fb4f839SGregory Neil Shapiro (struct rewrite *) sm_malloc_tagged_x(sizeof(*rwp), 251*2fb4f839SGregory Neil Shapiro "rwr1", 1, 0); 252c2aa98e2SPeter Wemm } 253c2aa98e2SPeter Wemm else 254c2aa98e2SPeter Wemm { 255*2fb4f839SGregory Neil Shapiro rwp->r_next = (struct rewrite *) sm_malloc_tagged_x(sizeof(*rwp), 256*2fb4f839SGregory Neil Shapiro "rwr2", 2, 0); 257c2aa98e2SPeter Wemm rwp = rwp->r_next; 258c2aa98e2SPeter Wemm } 259c2aa98e2SPeter Wemm rwp->r_next = NULL; 260c2aa98e2SPeter Wemm 261c2aa98e2SPeter Wemm /* expand and save the LHS */ 262c2aa98e2SPeter Wemm *p = '\0'; 263d0cef73dSGregory Neil Shapiro expand(&bp[1], exbuf, sizeof(exbuf), e); 264c2aa98e2SPeter Wemm rwp->r_lhs = prescan(exbuf, '\t', pvpbuf, 265d0cef73dSGregory Neil Shapiro sizeof(pvpbuf), NULL, 266d0cef73dSGregory Neil Shapiro ConfigLevel >= 9 ? TokTypeNoC : IntTokenTab, 267e92d3f3fSGregory Neil Shapiro true); 268c2aa98e2SPeter Wemm nfuzzy = 0; 269c2aa98e2SPeter Wemm if (rwp->r_lhs != NULL) 270c2aa98e2SPeter Wemm { 271c2aa98e2SPeter Wemm register char **ap; 272c2aa98e2SPeter Wemm 27340266059SGregory Neil Shapiro rwp->r_lhs = copyplist(rwp->r_lhs, true, NULL); 274c2aa98e2SPeter Wemm 275c2aa98e2SPeter Wemm /* count the number of fuzzy matches in LHS */ 276c2aa98e2SPeter Wemm for (ap = rwp->r_lhs; *ap != NULL; ap++) 277c2aa98e2SPeter Wemm { 278c2aa98e2SPeter Wemm char *botch; 279c2aa98e2SPeter Wemm 280c2aa98e2SPeter Wemm botch = NULL; 281d0cef73dSGregory Neil Shapiro switch (ap[0][0] & 0377) 282c2aa98e2SPeter Wemm { 283c2aa98e2SPeter Wemm case MATCHZANY: 284c2aa98e2SPeter Wemm case MATCHANY: 285c2aa98e2SPeter Wemm case MATCHONE: 286c2aa98e2SPeter Wemm case MATCHCLASS: 287c2aa98e2SPeter Wemm case MATCHNCLASS: 288c2aa98e2SPeter Wemm nfuzzy++; 289c2aa98e2SPeter Wemm break; 290c2aa98e2SPeter Wemm 291c2aa98e2SPeter Wemm case MATCHREPL: 292d0cef73dSGregory Neil Shapiro botch = "$1-$9"; 293c2aa98e2SPeter Wemm break; 294c2aa98e2SPeter Wemm 295c2aa98e2SPeter Wemm case CANONUSER: 296c2aa98e2SPeter Wemm botch = "$:"; 297c2aa98e2SPeter Wemm break; 298c2aa98e2SPeter Wemm 299c2aa98e2SPeter Wemm case CALLSUBR: 300c2aa98e2SPeter Wemm botch = "$>"; 301c2aa98e2SPeter Wemm break; 302c2aa98e2SPeter Wemm 303c2aa98e2SPeter Wemm case CONDIF: 304c2aa98e2SPeter Wemm botch = "$?"; 305c2aa98e2SPeter Wemm break; 306c2aa98e2SPeter Wemm 307c2aa98e2SPeter Wemm case CONDFI: 308c2aa98e2SPeter Wemm botch = "$."; 309c2aa98e2SPeter Wemm break; 310c2aa98e2SPeter Wemm 311c2aa98e2SPeter Wemm case HOSTBEGIN: 312c2aa98e2SPeter Wemm botch = "$["; 313c2aa98e2SPeter Wemm break; 314c2aa98e2SPeter Wemm 315c2aa98e2SPeter Wemm case HOSTEND: 316c2aa98e2SPeter Wemm botch = "$]"; 317c2aa98e2SPeter Wemm break; 318c2aa98e2SPeter Wemm 319c2aa98e2SPeter Wemm case LOOKUPBEGIN: 320c2aa98e2SPeter Wemm botch = "$("; 321c2aa98e2SPeter Wemm break; 322c2aa98e2SPeter Wemm 323c2aa98e2SPeter Wemm case LOOKUPEND: 324c2aa98e2SPeter Wemm botch = "$)"; 325c2aa98e2SPeter Wemm break; 326c2aa98e2SPeter Wemm } 327c2aa98e2SPeter Wemm if (botch != NULL) 328c2aa98e2SPeter Wemm syserr("Inappropriate use of %s on LHS", 329c2aa98e2SPeter Wemm botch); 330c2aa98e2SPeter Wemm } 33106f25ae9SGregory Neil Shapiro rwp->r_line = LineNumber; 332c2aa98e2SPeter Wemm } 333c2aa98e2SPeter Wemm else 334c2aa98e2SPeter Wemm { 335c2aa98e2SPeter Wemm syserr("R line: null LHS"); 336c2aa98e2SPeter Wemm rwp->r_lhs = null_list; 337c2aa98e2SPeter Wemm } 338c86d5965SGregory Neil Shapiro if (nfuzzy > MAXMATCH) 339c86d5965SGregory Neil Shapiro { 340c86d5965SGregory Neil Shapiro syserr("R line: too many wildcards"); 341c86d5965SGregory Neil Shapiro rwp->r_lhs = null_list; 342c86d5965SGregory Neil Shapiro } 343c2aa98e2SPeter Wemm 344c2aa98e2SPeter Wemm /* expand and save the RHS */ 345c2aa98e2SPeter Wemm while (*++p == '\t') 346c2aa98e2SPeter Wemm continue; 347c2aa98e2SPeter Wemm q = p; 348c2aa98e2SPeter Wemm while (*p != '\0' && *p != '\t') 349c2aa98e2SPeter Wemm p++; 350c2aa98e2SPeter Wemm *p = '\0'; 351d0cef73dSGregory Neil Shapiro expand(q, exbuf, sizeof(exbuf), e); 352c2aa98e2SPeter Wemm rwp->r_rhs = prescan(exbuf, '\t', pvpbuf, 353d0cef73dSGregory Neil Shapiro sizeof(pvpbuf), NULL, 354d0cef73dSGregory Neil Shapiro ConfigLevel >= 9 ? TokTypeNoC : IntTokenTab, 355e92d3f3fSGregory Neil Shapiro true); 356c2aa98e2SPeter Wemm if (rwp->r_rhs != NULL) 357c2aa98e2SPeter Wemm { 358c2aa98e2SPeter Wemm register char **ap; 359a7ec597cSGregory Neil Shapiro int args, endtoken; 360a7ec597cSGregory Neil Shapiro #if _FFR_EXTRA_MAP_CHECK 361a7ec597cSGregory Neil Shapiro int nexttoken; 3625b0945b5SGregory Neil Shapiro #endif 363a7ec597cSGregory Neil Shapiro bool inmap; 364c2aa98e2SPeter Wemm 36540266059SGregory Neil Shapiro rwp->r_rhs = copyplist(rwp->r_rhs, true, NULL); 366c2aa98e2SPeter Wemm 367c2aa98e2SPeter Wemm /* check no out-of-bounds replacements */ 368c2aa98e2SPeter Wemm nfuzzy += '0'; 369a7ec597cSGregory Neil Shapiro inmap = false; 370a7ec597cSGregory Neil Shapiro args = 0; 371a7ec597cSGregory Neil Shapiro endtoken = 0; 372c2aa98e2SPeter Wemm for (ap = rwp->r_rhs; *ap != NULL; ap++) 373c2aa98e2SPeter Wemm { 374c2aa98e2SPeter Wemm char *botch; 375c2aa98e2SPeter Wemm 376c2aa98e2SPeter Wemm botch = NULL; 377d0cef73dSGregory Neil Shapiro switch (ap[0][0] & 0377) 378c2aa98e2SPeter Wemm { 379c2aa98e2SPeter Wemm case MATCHREPL: 380d0cef73dSGregory Neil Shapiro if (ap[0][1] <= '0' || 381d0cef73dSGregory Neil Shapiro ap[0][1] > nfuzzy) 382c2aa98e2SPeter Wemm { 383c2aa98e2SPeter Wemm syserr("replacement $%c out of bounds", 384d0cef73dSGregory Neil Shapiro ap[0][1]); 385c2aa98e2SPeter Wemm } 386c2aa98e2SPeter Wemm break; 387c2aa98e2SPeter Wemm 388c2aa98e2SPeter Wemm case MATCHZANY: 389c2aa98e2SPeter Wemm botch = "$*"; 390c2aa98e2SPeter Wemm break; 391c2aa98e2SPeter Wemm 392c2aa98e2SPeter Wemm case MATCHANY: 393c2aa98e2SPeter Wemm botch = "$+"; 394c2aa98e2SPeter Wemm break; 395c2aa98e2SPeter Wemm 396c2aa98e2SPeter Wemm case MATCHONE: 397c2aa98e2SPeter Wemm botch = "$-"; 398c2aa98e2SPeter Wemm break; 399c2aa98e2SPeter Wemm 400c2aa98e2SPeter Wemm case MATCHCLASS: 401c2aa98e2SPeter Wemm botch = "$="; 402c2aa98e2SPeter Wemm break; 403c2aa98e2SPeter Wemm 404c2aa98e2SPeter Wemm case MATCHNCLASS: 405c2aa98e2SPeter Wemm botch = "$~"; 406c2aa98e2SPeter Wemm break; 40740266059SGregory Neil Shapiro 408a7ec597cSGregory Neil Shapiro case CANONHOST: 409a7ec597cSGregory Neil Shapiro if (!inmap) 410a7ec597cSGregory Neil Shapiro break; 411a7ec597cSGregory Neil Shapiro if (++args >= MAX_MAP_ARGS) 412a7ec597cSGregory Neil Shapiro syserr("too many arguments for map lookup"); 413a7ec597cSGregory Neil Shapiro break; 414a7ec597cSGregory Neil Shapiro 415a7ec597cSGregory Neil Shapiro case HOSTBEGIN: 416a7ec597cSGregory Neil Shapiro endtoken = HOSTEND; 417a7ec597cSGregory Neil Shapiro /* FALLTHROUGH */ 418a7ec597cSGregory Neil Shapiro case LOOKUPBEGIN: 419a7ec597cSGregory Neil Shapiro /* see above... */ 420d0cef73dSGregory Neil Shapiro if ((ap[0][0] & 0377) == LOOKUPBEGIN) 421a7ec597cSGregory Neil Shapiro endtoken = LOOKUPEND; 422a7ec597cSGregory Neil Shapiro if (inmap) 423a7ec597cSGregory Neil Shapiro syserr("cannot nest map lookups"); 424a7ec597cSGregory Neil Shapiro inmap = true; 425a7ec597cSGregory Neil Shapiro args = 0; 426a7ec597cSGregory Neil Shapiro #if _FFR_EXTRA_MAP_CHECK 427d0cef73dSGregory Neil Shapiro if (ap[1] == NULL) 428a7ec597cSGregory Neil Shapiro { 429a7ec597cSGregory Neil Shapiro syserr("syntax error in map lookup"); 430a7ec597cSGregory Neil Shapiro break; 431a7ec597cSGregory Neil Shapiro } 432d0cef73dSGregory Neil Shapiro nexttoken = ap[1][0] & 0377; 433a7ec597cSGregory Neil Shapiro if (nexttoken == CANONHOST || 434a7ec597cSGregory Neil Shapiro nexttoken == CANONUSER || 4355b0945b5SGregory Neil Shapiro nexttoken == endtoken) 436a7ec597cSGregory Neil Shapiro { 437a7ec597cSGregory Neil Shapiro syserr("missing map name for lookup"); 438a7ec597cSGregory Neil Shapiro break; 439a7ec597cSGregory Neil Shapiro } 440d0cef73dSGregory Neil Shapiro if (ap[2] == NULL) 441a7ec597cSGregory Neil Shapiro { 442a7ec597cSGregory Neil Shapiro syserr("syntax error in map lookup"); 443a7ec597cSGregory Neil Shapiro break; 444a7ec597cSGregory Neil Shapiro } 4455b0945b5SGregory Neil Shapiro if ((unsigned char) ap[0][0] == HOSTBEGIN) 446a7ec597cSGregory Neil Shapiro break; 447d0cef73dSGregory Neil Shapiro nexttoken = ap[2][0] & 0377; 448a7ec597cSGregory Neil Shapiro if (nexttoken == CANONHOST || 449a7ec597cSGregory Neil Shapiro nexttoken == CANONUSER || 450a7ec597cSGregory Neil Shapiro nexttoken == endtoken) 451a7ec597cSGregory Neil Shapiro { 452a7ec597cSGregory Neil Shapiro syserr("missing key name for lookup"); 453a7ec597cSGregory Neil Shapiro break; 454a7ec597cSGregory Neil Shapiro } 455a7ec597cSGregory Neil Shapiro #endif /* _FFR_EXTRA_MAP_CHECK */ 456a7ec597cSGregory Neil Shapiro break; 457a7ec597cSGregory Neil Shapiro 458a7ec597cSGregory Neil Shapiro case HOSTEND: 459a7ec597cSGregory Neil Shapiro case LOOKUPEND: 460d0cef73dSGregory Neil Shapiro if ((ap[0][0] & 0377) != endtoken) 461a7ec597cSGregory Neil Shapiro break; 462a7ec597cSGregory Neil Shapiro inmap = false; 463a7ec597cSGregory Neil Shapiro endtoken = 0; 464a7ec597cSGregory Neil Shapiro break; 465a7ec597cSGregory Neil Shapiro 466a7ec597cSGregory Neil Shapiro 46740266059SGregory Neil Shapiro #if 0 46840266059SGregory Neil Shapiro /* 46940266059SGregory Neil Shapiro ** This doesn't work yet as there are maps defined *after* the cf 47040266059SGregory Neil Shapiro ** is read such as host, user, and alias. So for now, it's removed. 47140266059SGregory Neil Shapiro ** When it comes back, the RELEASE_NOTES entry will be: 47240266059SGregory Neil Shapiro ** Emit warnings for unknown maps when reading the .cf file. Based on 47340266059SGregory Neil Shapiro ** patch from Robert Harker of Harker Systems. 47440266059SGregory Neil Shapiro */ 47540266059SGregory Neil Shapiro 47640266059SGregory Neil Shapiro case LOOKUPBEGIN: 47740266059SGregory Neil Shapiro /* 47840266059SGregory Neil Shapiro ** Got a database lookup, 47940266059SGregory Neil Shapiro ** check if map is defined. 48040266059SGregory Neil Shapiro */ 48140266059SGregory Neil Shapiro 482d0cef73dSGregory Neil Shapiro ep = ap[1]; 483d0cef73dSGregory Neil Shapiro if ((ep[0] & 0377) != MACRODEXPAND && 484d0cef73dSGregory Neil Shapiro stab(ep, ST_MAP, ST_FIND) == NULL) 48540266059SGregory Neil Shapiro { 48640266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, 48740266059SGregory Neil Shapiro SM_TIME_DEFAULT, 48840266059SGregory Neil Shapiro "Warning: %s: line %d: map %s not found\n", 48940266059SGregory Neil Shapiro FileName, 49040266059SGregory Neil Shapiro LineNumber, 49140266059SGregory Neil Shapiro ep); 49240266059SGregory Neil Shapiro } 49340266059SGregory Neil Shapiro break; 49440266059SGregory Neil Shapiro #endif /* 0 */ 495c2aa98e2SPeter Wemm } 496c2aa98e2SPeter Wemm if (botch != NULL) 497c2aa98e2SPeter Wemm syserr("Inappropriate use of %s on RHS", 498c2aa98e2SPeter Wemm botch); 499c2aa98e2SPeter Wemm } 500a7ec597cSGregory Neil Shapiro if (inmap) 501a7ec597cSGregory Neil Shapiro syserr("missing map closing token"); 502c2aa98e2SPeter Wemm } 503c2aa98e2SPeter Wemm else 504c2aa98e2SPeter Wemm { 505c2aa98e2SPeter Wemm syserr("R line: null RHS"); 506c2aa98e2SPeter Wemm rwp->r_rhs = null_list; 507c2aa98e2SPeter Wemm } 508c2aa98e2SPeter Wemm break; 509c2aa98e2SPeter Wemm 510c2aa98e2SPeter Wemm case 'S': /* select rewriting set */ 511d0cef73dSGregory Neil Shapiro expand(&bp[1], exbuf, sizeof(exbuf), e); 512c2aa98e2SPeter Wemm ruleset = strtorwset(exbuf, NULL, ST_ENTER); 513c2aa98e2SPeter Wemm if (ruleset < 0) 514c2aa98e2SPeter Wemm break; 51506f25ae9SGregory Neil Shapiro 516c2aa98e2SPeter Wemm rwp = RewriteRules[ruleset]; 517c2aa98e2SPeter Wemm if (rwp != NULL) 518c2aa98e2SPeter Wemm { 5199bd497b8SGregory Neil Shapiro if (OpMode == MD_TEST || OpMode == MD_CHECKCONFIG) 52040266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, 52140266059SGregory Neil Shapiro SM_TIME_DEFAULT, 52240266059SGregory Neil Shapiro "WARNING: Ruleset %s has multiple definitions\n", 523c2aa98e2SPeter Wemm &bp[1]); 52406f25ae9SGregory Neil Shapiro if (tTd(37, 1)) 52540266059SGregory Neil Shapiro sm_dprintf("WARNING: Ruleset %s has multiple definitions\n", 52606f25ae9SGregory Neil Shapiro &bp[1]); 527c2aa98e2SPeter Wemm while (rwp->r_next != NULL) 528c2aa98e2SPeter Wemm rwp = rwp->r_next; 529c2aa98e2SPeter Wemm } 530c2aa98e2SPeter Wemm break; 531c2aa98e2SPeter Wemm 532c2aa98e2SPeter Wemm case 'D': /* macro definition */ 53340266059SGregory Neil Shapiro mid = macid_parse(&bp[1], &ep); 534193538b7SGregory Neil Shapiro if (mid == 0) 535193538b7SGregory Neil Shapiro break; 536*2fb4f839SGregory Neil Shapiro #if USE_EAI && 0 537*2fb4f839SGregory Neil Shapiro if ('j' == mid && !addr_is_ascii(ep)) 538*2fb4f839SGregory Neil Shapiro { 539*2fb4f839SGregory Neil Shapiro usrerr("hostname %s must be ASCII", ep); 540*2fb4f839SGregory Neil Shapiro finis(false, true, EX_CONFIG); 541*2fb4f839SGregory Neil Shapiro /* NOTREACHED */ 542*2fb4f839SGregory Neil Shapiro } 543*2fb4f839SGregory Neil Shapiro #endif 544c2aa98e2SPeter Wemm p = munchstring(ep, NULL, '\0'); 54540266059SGregory Neil Shapiro macdefine(&e->e_macro, A_TEMP, mid, p); 546c2aa98e2SPeter Wemm break; 547c2aa98e2SPeter Wemm 548c2aa98e2SPeter Wemm case 'H': /* required header line */ 54906f25ae9SGregory Neil Shapiro (void) chompheader(&bp[1], CHHDR_DEF, NULL, e); 550c2aa98e2SPeter Wemm break; 551c2aa98e2SPeter Wemm 552c2aa98e2SPeter Wemm case 'C': /* word class */ 553c2aa98e2SPeter Wemm case 'T': /* trusted user (set class `t') */ 554c2aa98e2SPeter Wemm if (bp[0] == 'C') 555c2aa98e2SPeter Wemm { 55640266059SGregory Neil Shapiro mid = macid_parse(&bp[1], &ep); 557193538b7SGregory Neil Shapiro if (mid == 0) 558193538b7SGregory Neil Shapiro break; 559d0cef73dSGregory Neil Shapiro expand(ep, exbuf, sizeof(exbuf), e); 560c2aa98e2SPeter Wemm p = exbuf; 561*2fb4f839SGregory Neil Shapiro #if _FFR_8BITENVADDR 562*2fb4f839SGregory Neil Shapiro dequote_internal_chars(p, exbuf, sizeof(exbuf)); 563*2fb4f839SGregory Neil Shapiro #endif 564c2aa98e2SPeter Wemm } 565c2aa98e2SPeter Wemm else 566c2aa98e2SPeter Wemm { 567c2aa98e2SPeter Wemm mid = 't'; 568c2aa98e2SPeter Wemm p = &bp[1]; 569c2aa98e2SPeter Wemm } 570c2aa98e2SPeter Wemm while (*p != '\0') 571c2aa98e2SPeter Wemm { 572c2aa98e2SPeter Wemm register char *wd; 573c2aa98e2SPeter Wemm char delim; 574c2aa98e2SPeter Wemm 5755b0945b5SGregory Neil Shapiro while (*p != '\0' && SM_ISSPACE(*p)) 576c2aa98e2SPeter Wemm p++; 577c2aa98e2SPeter Wemm wd = p; 5785b0945b5SGregory Neil Shapiro while (*p != '\0' && !(SM_ISSPACE(*p))) 579c2aa98e2SPeter Wemm p++; 580c2aa98e2SPeter Wemm delim = *p; 581c2aa98e2SPeter Wemm *p = '\0'; 582c2aa98e2SPeter Wemm if (wd[0] != '\0') 583c2aa98e2SPeter Wemm setclass(mid, wd); 584c2aa98e2SPeter Wemm *p = delim; 585c2aa98e2SPeter Wemm } 586c2aa98e2SPeter Wemm break; 587c2aa98e2SPeter Wemm 588c2aa98e2SPeter Wemm case 'F': /* word class from file */ 58940266059SGregory Neil Shapiro mid = macid_parse(&bp[1], &ep); 590193538b7SGregory Neil Shapiro if (mid == 0) 591193538b7SGregory Neil Shapiro break; 5925b0945b5SGregory Neil Shapiro for (p = ep; SM_ISSPACE(*p); ) 593c2aa98e2SPeter Wemm p++; 594c2aa98e2SPeter Wemm if (p[0] == '-' && p[1] == 'o') 595c2aa98e2SPeter Wemm { 59640266059SGregory Neil Shapiro optional = true; 59740266059SGregory Neil Shapiro while (*p != '\0' && 5985b0945b5SGregory Neil Shapiro !(SM_ISSPACE(*p))) 599c2aa98e2SPeter Wemm p++; 6005b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 601c2aa98e2SPeter Wemm p++; 602c2aa98e2SPeter Wemm } 603c2aa98e2SPeter Wemm else 60440266059SGregory Neil Shapiro optional = false; 60506f25ae9SGregory Neil Shapiro 606605302a5SGregory Neil Shapiro /* check if [key]@map:spec */ 607605302a5SGregory Neil Shapiro ismap = false; 608605302a5SGregory Neil Shapiro if (!SM_IS_DIR_DELIM(*p) && 609605302a5SGregory Neil Shapiro *p != '|' && 610605302a5SGregory Neil Shapiro (q = strchr(p, '@')) != NULL) 611605302a5SGregory Neil Shapiro { 612605302a5SGregory Neil Shapiro q++; 613605302a5SGregory Neil Shapiro 614605302a5SGregory Neil Shapiro /* look for @LDAP or @map: in string */ 615605302a5SGregory Neil Shapiro if (strcmp(q, "LDAP") == 0 || 616605302a5SGregory Neil Shapiro (*q != ':' && 617605302a5SGregory Neil Shapiro strchr(q, ':') != NULL)) 618605302a5SGregory Neil Shapiro ismap = true; 619605302a5SGregory Neil Shapiro } 620605302a5SGregory Neil Shapiro 621605302a5SGregory Neil Shapiro if (ismap) 62240266059SGregory Neil Shapiro { 62340266059SGregory Neil Shapiro /* use entire spec */ 624c2aa98e2SPeter Wemm file = p; 62540266059SGregory Neil Shapiro } 62640266059SGregory Neil Shapiro else 62740266059SGregory Neil Shapiro { 62840266059SGregory Neil Shapiro file = extrquotstr(p, &q, " ", &ok); 62940266059SGregory Neil Shapiro if (!ok) 63040266059SGregory Neil Shapiro { 63140266059SGregory Neil Shapiro syserr("illegal filename '%s'", p); 63240266059SGregory Neil Shapiro break; 63340266059SGregory Neil Shapiro } 63440266059SGregory Neil Shapiro } 63540266059SGregory Neil Shapiro 636605302a5SGregory Neil Shapiro if (*file == '|' || ismap) 637c2aa98e2SPeter Wemm p = "%s"; 638c2aa98e2SPeter Wemm else 639c2aa98e2SPeter Wemm { 64006f25ae9SGregory Neil Shapiro p = q; 641c2aa98e2SPeter Wemm if (*p == '\0') 642c2aa98e2SPeter Wemm p = "%s"; 643c2aa98e2SPeter Wemm else 644c2aa98e2SPeter Wemm { 645c2aa98e2SPeter Wemm *p = '\0'; 646c2aa98e2SPeter Wemm while (isascii(*++p) && isspace(*p)) 647c2aa98e2SPeter Wemm continue; 648c2aa98e2SPeter Wemm } 649c2aa98e2SPeter Wemm } 650605302a5SGregory Neil Shapiro fileclass(mid, file, p, ismap, safe, optional); 651c2aa98e2SPeter Wemm break; 652c2aa98e2SPeter Wemm 65340266059SGregory Neil Shapiro #if XLA 654c2aa98e2SPeter Wemm case 'L': /* extended load average description */ 655c2aa98e2SPeter Wemm xla_init(&bp[1]); 656c2aa98e2SPeter Wemm break; 6575b0945b5SGregory Neil Shapiro #endif 658c2aa98e2SPeter Wemm 659c2aa98e2SPeter Wemm #if defined(SUN_EXTENSIONS) && defined(SUN_LOOKUP_MACRO) 660c2aa98e2SPeter Wemm case 'L': /* lookup macro */ 661c2aa98e2SPeter Wemm case 'G': /* lookup class */ 662c2aa98e2SPeter Wemm /* reserved for Sun -- NIS+ database lookup */ 663c2aa98e2SPeter Wemm if (VendorCode != VENDOR_SUN) 664c2aa98e2SPeter Wemm goto badline; 665c2aa98e2SPeter Wemm sun_lg_config_line(bp, e); 666c2aa98e2SPeter Wemm break; 66706f25ae9SGregory Neil Shapiro #endif /* defined(SUN_EXTENSIONS) && defined(SUN_LOOKUP_MACRO) */ 668c2aa98e2SPeter Wemm 669c2aa98e2SPeter Wemm case 'M': /* define mailer */ 670c2aa98e2SPeter Wemm makemailer(&bp[1]); 671c2aa98e2SPeter Wemm break; 672c2aa98e2SPeter Wemm 673c2aa98e2SPeter Wemm case 'O': /* set option */ 67440266059SGregory Neil Shapiro setoption(bp[1], &bp[2], safe, false, e); 675c2aa98e2SPeter Wemm break; 676c2aa98e2SPeter Wemm 677c2aa98e2SPeter Wemm case 'P': /* set precedence */ 678c2aa98e2SPeter Wemm if (NumPriorities >= MAXPRIORITIES) 679c2aa98e2SPeter Wemm { 680c2aa98e2SPeter Wemm toomany('P', MAXPRIORITIES); 681c2aa98e2SPeter Wemm break; 682c2aa98e2SPeter Wemm } 683c2aa98e2SPeter Wemm for (p = &bp[1]; *p != '\0' && *p != '='; p++) 684c2aa98e2SPeter Wemm continue; 685c2aa98e2SPeter Wemm if (*p == '\0') 686c2aa98e2SPeter Wemm goto badline; 687c2aa98e2SPeter Wemm *p = '\0'; 688c2aa98e2SPeter Wemm Priorities[NumPriorities].pri_name = newstr(&bp[1]); 689c2aa98e2SPeter Wemm Priorities[NumPriorities].pri_val = atoi(++p); 690c2aa98e2SPeter Wemm NumPriorities++; 691c2aa98e2SPeter Wemm break; 692c2aa98e2SPeter Wemm 69340266059SGregory Neil Shapiro case 'Q': /* define queue */ 69440266059SGregory Neil Shapiro makequeue(&bp[1], true); 69540266059SGregory Neil Shapiro break; 69640266059SGregory Neil Shapiro 697c2aa98e2SPeter Wemm case 'V': /* configuration syntax version */ 6985b0945b5SGregory Neil Shapiro for (p = &bp[1]; SM_ISSPACE(*p); p++) 699c2aa98e2SPeter Wemm continue; 700c2aa98e2SPeter Wemm if (!isascii(*p) || !isdigit(*p)) 701c2aa98e2SPeter Wemm { 702c2aa98e2SPeter Wemm syserr("invalid argument to V line: \"%.20s\"", 703c2aa98e2SPeter Wemm &bp[1]); 704c2aa98e2SPeter Wemm break; 705c2aa98e2SPeter Wemm } 706c2aa98e2SPeter Wemm ConfigLevel = strtol(p, &ep, 10); 707c2aa98e2SPeter Wemm 708c2aa98e2SPeter Wemm /* 709c2aa98e2SPeter Wemm ** Do heuristic tweaking for back compatibility. 710c2aa98e2SPeter Wemm */ 711c2aa98e2SPeter Wemm 712c2aa98e2SPeter Wemm if (ConfigLevel >= 5) 713c2aa98e2SPeter Wemm { 714c2aa98e2SPeter Wemm /* level 5 configs have short name in $w */ 715c2aa98e2SPeter Wemm p = macvalue('w', e); 716c2aa98e2SPeter Wemm if (p != NULL && (p = strchr(p, '.')) != NULL) 71740266059SGregory Neil Shapiro { 718c2aa98e2SPeter Wemm *p = '\0'; 71940266059SGregory Neil Shapiro macdefine(&e->e_macro, A_TEMP, 'w', 72040266059SGregory Neil Shapiro macvalue('w', e)); 72140266059SGregory Neil Shapiro } 722c2aa98e2SPeter Wemm } 723c2aa98e2SPeter Wemm if (ConfigLevel >= 6) 724c2aa98e2SPeter Wemm { 72540266059SGregory Neil Shapiro ColonOkInAddr = false; 726c2aa98e2SPeter Wemm } 727c2aa98e2SPeter Wemm 728c2aa98e2SPeter Wemm /* 729c2aa98e2SPeter Wemm ** Look for vendor code. 730c2aa98e2SPeter Wemm */ 731c2aa98e2SPeter Wemm 732c2aa98e2SPeter Wemm if (*ep++ == '/') 733c2aa98e2SPeter Wemm { 734c2aa98e2SPeter Wemm /* extract vendor code */ 735c2aa98e2SPeter Wemm for (p = ep; isascii(*p) && isalpha(*p); ) 736c2aa98e2SPeter Wemm p++; 737c2aa98e2SPeter Wemm *p = '\0'; 738c2aa98e2SPeter Wemm 739c2aa98e2SPeter Wemm if (!setvendor(ep)) 740c2aa98e2SPeter Wemm syserr("invalid V line vendor code: \"%s\"", 741c2aa98e2SPeter Wemm ep); 742c2aa98e2SPeter Wemm } 743c2aa98e2SPeter Wemm break; 744c2aa98e2SPeter Wemm 745c2aa98e2SPeter Wemm case 'K': 746d0cef73dSGregory Neil Shapiro expand(&bp[1], exbuf, sizeof(exbuf), e); 747c2aa98e2SPeter Wemm (void) makemapentry(exbuf); 748c2aa98e2SPeter Wemm break; 749c2aa98e2SPeter Wemm 750c2aa98e2SPeter Wemm case 'E': 751c2aa98e2SPeter Wemm p = strchr(bp, '='); 752c2aa98e2SPeter Wemm if (p != NULL) 753c2aa98e2SPeter Wemm *p++ = '\0'; 7544e4196cbSGregory Neil Shapiro sm_setuserenv(&bp[1], p); 755c2aa98e2SPeter Wemm break; 756c2aa98e2SPeter Wemm 75706f25ae9SGregory Neil Shapiro case 'X': /* mail filter */ 75840266059SGregory Neil Shapiro #if MILTER 75906f25ae9SGregory Neil Shapiro milter_setup(&bp[1]); 76040266059SGregory Neil Shapiro #else /* MILTER */ 76140266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 76240266059SGregory Neil Shapiro "Warning: Filter usage ('X') requires Milter support (-DMILTER)\n"); 76340266059SGregory Neil Shapiro #endif /* MILTER */ 76406f25ae9SGregory Neil Shapiro break; 76506f25ae9SGregory Neil Shapiro 766c2aa98e2SPeter Wemm default: 767c2aa98e2SPeter Wemm badline: 768c2aa98e2SPeter Wemm syserr("unknown configuration line \"%s\"", bp); 769c2aa98e2SPeter Wemm } 770c2aa98e2SPeter Wemm if (bp != buf) 77140266059SGregory Neil Shapiro sm_free(bp); /* XXX */ 772c2aa98e2SPeter Wemm } 77340266059SGregory Neil Shapiro if (sm_io_error(cf)) 774c2aa98e2SPeter Wemm { 775c2aa98e2SPeter Wemm syserr("I/O read error"); 77640266059SGregory Neil Shapiro finis(false, true, EX_OSFILE); 777c2aa98e2SPeter Wemm } 77840266059SGregory Neil Shapiro (void) sm_io_close(cf, SM_TIME_DEFAULT); 779c2aa98e2SPeter Wemm FileName = NULL; 780c2aa98e2SPeter Wemm 781da7d7b9cSGregory Neil Shapiro #if _FFR_BOUNCE_QUEUE 782da7d7b9cSGregory Neil Shapiro initbouncequeue(); 783da7d7b9cSGregory Neil Shapiro #endif 784da7d7b9cSGregory Neil Shapiro 785c2aa98e2SPeter Wemm /* initialize host maps from local service tables */ 786c2aa98e2SPeter Wemm inithostmaps(); 787c2aa98e2SPeter Wemm 78806f25ae9SGregory Neil Shapiro /* initialize daemon (if not defined yet) */ 78906f25ae9SGregory Neil Shapiro initdaemon(); 79006f25ae9SGregory Neil Shapiro 791c2aa98e2SPeter Wemm /* determine if we need to do special name-server frotz */ 792c2aa98e2SPeter Wemm { 793c2aa98e2SPeter Wemm int nmaps; 794c2aa98e2SPeter Wemm char *maptype[MAXMAPSTACK]; 795c2aa98e2SPeter Wemm short mapreturn[MAXMAPACTIONS]; 796c2aa98e2SPeter Wemm 797c2aa98e2SPeter Wemm nmaps = switch_map_find("hosts", maptype, mapreturn); 79840266059SGregory Neil Shapiro UseNameServer = false; 799c2aa98e2SPeter Wemm if (nmaps > 0 && nmaps <= MAXMAPSTACK) 800c2aa98e2SPeter Wemm { 801c2aa98e2SPeter Wemm register int mapno; 802c2aa98e2SPeter Wemm 80340266059SGregory Neil Shapiro for (mapno = 0; mapno < nmaps && !UseNameServer; 80440266059SGregory Neil Shapiro mapno++) 805c2aa98e2SPeter Wemm { 806c2aa98e2SPeter Wemm if (strcmp(maptype[mapno], "dns") == 0) 80740266059SGregory Neil Shapiro UseNameServer = true; 808c2aa98e2SPeter Wemm } 809c2aa98e2SPeter Wemm } 810c2aa98e2SPeter Wemm } 811da7d7b9cSGregory Neil Shapiro setupdynmailers(); 812c2aa98e2SPeter Wemm } 813d0cef73dSGregory Neil Shapiro 81440266059SGregory Neil Shapiro /* 815c2aa98e2SPeter Wemm ** TRANSLATE_DOLLARS -- convert $x into internal form 816c2aa98e2SPeter Wemm ** 817c2aa98e2SPeter Wemm ** Actually does all appropriate pre-processing of a config line 818c2aa98e2SPeter Wemm ** to turn it into internal form. 819c2aa98e2SPeter Wemm ** 820c2aa98e2SPeter Wemm ** Parameters: 821d0cef73dSGregory Neil Shapiro ** ibp -- the buffer to translate. 822d0cef73dSGregory Neil Shapiro ** obp -- where to put the translation; may be the same as obp 823d0cef73dSGregory Neil Shapiro ** bsp -- a pointer to the size of obp; will be updated if 824d0cef73dSGregory Neil Shapiro ** the buffer needs to be replaced. 825c2aa98e2SPeter Wemm ** 826c2aa98e2SPeter Wemm ** Returns: 827d0cef73dSGregory Neil Shapiro ** The buffer pointer; may differ from obp if the expansion 828d0cef73dSGregory Neil Shapiro ** is larger then *bsp, in which case this will point to 829d0cef73dSGregory Neil Shapiro ** malloc()ed memory which must be free()d by the caller. 830c2aa98e2SPeter Wemm */ 831c2aa98e2SPeter Wemm 832d0cef73dSGregory Neil Shapiro char * 833d0cef73dSGregory Neil Shapiro translate_dollars(ibp, obp, bsp) 834d0cef73dSGregory Neil Shapiro char *ibp; 835d0cef73dSGregory Neil Shapiro char *obp; 836d0cef73dSGregory Neil Shapiro int *bsp; 837c2aa98e2SPeter Wemm { 838c2aa98e2SPeter Wemm register char *p; 839c2aa98e2SPeter Wemm auto char *ep; 840d0cef73dSGregory Neil Shapiro char *bp; 841d0cef73dSGregory Neil Shapiro 842d0cef73dSGregory Neil Shapiro if (tTd(37, 53)) 843d0cef73dSGregory Neil Shapiro { 844d0cef73dSGregory Neil Shapiro sm_dprintf("translate_dollars("); 845d0cef73dSGregory Neil Shapiro xputs(sm_debug_file(), ibp); 846d0cef73dSGregory Neil Shapiro sm_dprintf(")\n"); 847d0cef73dSGregory Neil Shapiro } 848d0cef73dSGregory Neil Shapiro 849*2fb4f839SGregory Neil Shapiro bp = quote_internal_chars(ibp, obp, bsp, NULL); 850c2aa98e2SPeter Wemm 851c2aa98e2SPeter Wemm for (p = bp; *p != '\0'; p++) 852c2aa98e2SPeter Wemm { 853c2aa98e2SPeter Wemm if (*p == '#' && p > bp && ConfigLevel >= 3) 854c2aa98e2SPeter Wemm { 855c2aa98e2SPeter Wemm register char *e; 856c2aa98e2SPeter Wemm 857c2aa98e2SPeter Wemm switch (*--p & 0377) 858c2aa98e2SPeter Wemm { 859c2aa98e2SPeter Wemm case MACROEXPAND: 860c2aa98e2SPeter Wemm /* it's from $# -- let it go through */ 861c2aa98e2SPeter Wemm p++; 862c2aa98e2SPeter Wemm break; 863c2aa98e2SPeter Wemm 864c2aa98e2SPeter Wemm case '\\': 865c2aa98e2SPeter Wemm /* it's backslash escaped */ 86640266059SGregory Neil Shapiro (void) sm_strlcpy(p, p + 1, strlen(p)); 867c2aa98e2SPeter Wemm break; 868c2aa98e2SPeter Wemm 869c2aa98e2SPeter Wemm default: 87006f25ae9SGregory Neil Shapiro /* delete leading white space */ 8715b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p) && 872c2aa98e2SPeter Wemm *p != '\n' && p > bp) 873d0cef73dSGregory Neil Shapiro { 874c2aa98e2SPeter Wemm p--; 875d0cef73dSGregory Neil Shapiro } 876c2aa98e2SPeter Wemm if ((e = strchr(++p, '\n')) != NULL) 87740266059SGregory Neil Shapiro (void) sm_strlcpy(p, e, strlen(p)); 878c2aa98e2SPeter Wemm else 879c2aa98e2SPeter Wemm *p-- = '\0'; 880c2aa98e2SPeter Wemm break; 881c2aa98e2SPeter Wemm } 882c2aa98e2SPeter Wemm continue; 883c2aa98e2SPeter Wemm } 884c2aa98e2SPeter Wemm 885c2aa98e2SPeter Wemm if (*p != '$' || p[1] == '\0') 886c2aa98e2SPeter Wemm continue; 887c2aa98e2SPeter Wemm 888c2aa98e2SPeter Wemm if (p[1] == '$') 889c2aa98e2SPeter Wemm { 890c2aa98e2SPeter Wemm /* actual dollar sign.... */ 89140266059SGregory Neil Shapiro (void) sm_strlcpy(p, p + 1, strlen(p)); 892c2aa98e2SPeter Wemm continue; 893c2aa98e2SPeter Wemm } 894c2aa98e2SPeter Wemm 895c2aa98e2SPeter Wemm /* convert to macro expansion character */ 896c2aa98e2SPeter Wemm *p++ = MACROEXPAND; 897c2aa98e2SPeter Wemm 898c2aa98e2SPeter Wemm /* special handling for $=, $~, $&, and $? */ 899c2aa98e2SPeter Wemm if (*p == '=' || *p == '~' || *p == '&' || *p == '?') 900c2aa98e2SPeter Wemm p++; 901c2aa98e2SPeter Wemm 902c2aa98e2SPeter Wemm /* convert macro name to code */ 90340266059SGregory Neil Shapiro *p = macid_parse(p, &ep); 90406f25ae9SGregory Neil Shapiro if (ep != p + 1) 90540266059SGregory Neil Shapiro (void) sm_strlcpy(p + 1, ep, strlen(p + 1)); 906c2aa98e2SPeter Wemm } 907c2aa98e2SPeter Wemm 908c2aa98e2SPeter Wemm /* strip trailing white space from the line */ 9095b0945b5SGregory Neil Shapiro while (--p > bp && SM_ISSPACE(*p)) 910c2aa98e2SPeter Wemm *p = '\0'; 911d0cef73dSGregory Neil Shapiro 912d0cef73dSGregory Neil Shapiro if (tTd(37, 53)) 913d0cef73dSGregory Neil Shapiro { 914d0cef73dSGregory Neil Shapiro sm_dprintf(" translate_dollars => "); 915d0cef73dSGregory Neil Shapiro xputs(sm_debug_file(), bp); 916d0cef73dSGregory Neil Shapiro sm_dprintf("\n"); 917d0cef73dSGregory Neil Shapiro } 918d0cef73dSGregory Neil Shapiro 919d0cef73dSGregory Neil Shapiro return bp; 920c2aa98e2SPeter Wemm } 92140266059SGregory Neil Shapiro /* 922c2aa98e2SPeter Wemm ** TOOMANY -- signal too many of some option 923c2aa98e2SPeter Wemm ** 924c2aa98e2SPeter Wemm ** Parameters: 925c2aa98e2SPeter Wemm ** id -- the id of the error line 926c2aa98e2SPeter Wemm ** maxcnt -- the maximum possible values 927c2aa98e2SPeter Wemm ** 928c2aa98e2SPeter Wemm ** Returns: 929c2aa98e2SPeter Wemm ** none. 930c2aa98e2SPeter Wemm ** 931c2aa98e2SPeter Wemm ** Side Effects: 932c2aa98e2SPeter Wemm ** gives a syserr. 933c2aa98e2SPeter Wemm */ 934c2aa98e2SPeter Wemm 93506f25ae9SGregory Neil Shapiro static void 936c2aa98e2SPeter Wemm toomany(id, maxcnt) 937c2aa98e2SPeter Wemm int id; 938c2aa98e2SPeter Wemm int maxcnt; 939c2aa98e2SPeter Wemm { 940c2aa98e2SPeter Wemm syserr("too many %c lines, %d max", id, maxcnt); 941c2aa98e2SPeter Wemm } 94240266059SGregory Neil Shapiro /* 943c2aa98e2SPeter Wemm ** FILECLASS -- read members of a class from a file 944c2aa98e2SPeter Wemm ** 945c2aa98e2SPeter Wemm ** Parameters: 946c2aa98e2SPeter Wemm ** class -- class to define. 947c2aa98e2SPeter Wemm ** filename -- name of file to read. 948c2aa98e2SPeter Wemm ** fmt -- scanf string to use for match. 949605302a5SGregory Neil Shapiro ** ismap -- if set, this is a map lookup. 950c2aa98e2SPeter Wemm ** safe -- if set, this is a safe read. 951c2aa98e2SPeter Wemm ** optional -- if set, it is not an error for the file to 952c2aa98e2SPeter Wemm ** not exist. 953c2aa98e2SPeter Wemm ** 954c2aa98e2SPeter Wemm ** Returns: 955c2aa98e2SPeter Wemm ** none 956c2aa98e2SPeter Wemm ** 957c2aa98e2SPeter Wemm ** Side Effects: 958c2aa98e2SPeter Wemm ** puts all lines in filename that match a scanf into 959c2aa98e2SPeter Wemm ** the named class. 960c2aa98e2SPeter Wemm */ 961c2aa98e2SPeter Wemm 96240266059SGregory Neil Shapiro /* 96340266059SGregory Neil Shapiro ** Break up the match into words and add to class. 96440266059SGregory Neil Shapiro */ 96540266059SGregory Neil Shapiro 96640266059SGregory Neil Shapiro static void 96740266059SGregory Neil Shapiro parse_class_words(class, line) 96840266059SGregory Neil Shapiro int class; 96940266059SGregory Neil Shapiro char *line; 97040266059SGregory Neil Shapiro { 97140266059SGregory Neil Shapiro while (line != NULL && *line != '\0') 97240266059SGregory Neil Shapiro { 97340266059SGregory Neil Shapiro register char *q; 97440266059SGregory Neil Shapiro 97540266059SGregory Neil Shapiro /* strip leading spaces */ 9765b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*line)) 97740266059SGregory Neil Shapiro line++; 97840266059SGregory Neil Shapiro if (*line == '\0') 97940266059SGregory Neil Shapiro break; 98040266059SGregory Neil Shapiro 98140266059SGregory Neil Shapiro /* find the end of the word */ 98240266059SGregory Neil Shapiro q = line; 9835b0945b5SGregory Neil Shapiro while (*line != '\0' && !(SM_ISSPACE(*line))) 98440266059SGregory Neil Shapiro line++; 98540266059SGregory Neil Shapiro if (*line != '\0') 98640266059SGregory Neil Shapiro *line++ = '\0'; 98740266059SGregory Neil Shapiro 98840266059SGregory Neil Shapiro /* enter the word in the symbol table */ 98940266059SGregory Neil Shapiro setclass(class, q); 99040266059SGregory Neil Shapiro } 99140266059SGregory Neil Shapiro } 99240266059SGregory Neil Shapiro 99306f25ae9SGregory Neil Shapiro static void 994605302a5SGregory Neil Shapiro fileclass(class, filename, fmt, ismap, safe, optional) 995c2aa98e2SPeter Wemm int class; 996c2aa98e2SPeter Wemm char *filename; 997c2aa98e2SPeter Wemm char *fmt; 998605302a5SGregory Neil Shapiro bool ismap; 999c2aa98e2SPeter Wemm bool safe; 1000c2aa98e2SPeter Wemm bool optional; 1001c2aa98e2SPeter Wemm { 100240266059SGregory Neil Shapiro SM_FILE_T *f; 100306f25ae9SGregory Neil Shapiro long sff; 1004c2aa98e2SPeter Wemm pid_t pid; 1005c2aa98e2SPeter Wemm register char *p; 1006c2aa98e2SPeter Wemm char buf[MAXLINE]; 1007c2aa98e2SPeter Wemm 1008c2aa98e2SPeter Wemm if (tTd(37, 2)) 100940266059SGregory Neil Shapiro sm_dprintf("fileclass(%s, fmt=%s)\n", filename, fmt); 1010c2aa98e2SPeter Wemm 101140266059SGregory Neil Shapiro if (*filename == '\0') 101240266059SGregory Neil Shapiro { 101340266059SGregory Neil Shapiro syserr("fileclass: missing file name"); 101440266059SGregory Neil Shapiro return; 101540266059SGregory Neil Shapiro } 1016605302a5SGregory Neil Shapiro else if (ismap) 101740266059SGregory Neil Shapiro { 101840266059SGregory Neil Shapiro int status = 0; 101940266059SGregory Neil Shapiro char *key; 102040266059SGregory Neil Shapiro char *mn; 102140266059SGregory Neil Shapiro char *cl, *spec; 102240266059SGregory Neil Shapiro STAB *mapclass; 102340266059SGregory Neil Shapiro MAP map; 102440266059SGregory Neil Shapiro 102540266059SGregory Neil Shapiro mn = newstr(macname(class)); 102640266059SGregory Neil Shapiro 102740266059SGregory Neil Shapiro key = filename; 102840266059SGregory Neil Shapiro 1029605302a5SGregory Neil Shapiro /* skip past key */ 1030605302a5SGregory Neil Shapiro if ((p = strchr(filename, '@')) == NULL) 1031605302a5SGregory Neil Shapiro { 1032605302a5SGregory Neil Shapiro /* should not happen */ 1033605302a5SGregory Neil Shapiro syserr("fileclass: bogus map specification"); 1034605302a5SGregory Neil Shapiro sm_free(mn); 1035605302a5SGregory Neil Shapiro return; 1036605302a5SGregory Neil Shapiro } 1037605302a5SGregory Neil Shapiro 103840266059SGregory Neil Shapiro /* skip past '@' */ 103940266059SGregory Neil Shapiro *p++ = '\0'; 104040266059SGregory Neil Shapiro cl = p; 104140266059SGregory Neil Shapiro 1042a7ec597cSGregory Neil Shapiro #if LDAPMAP 104340266059SGregory Neil Shapiro if (strcmp(cl, "LDAP") == 0) 104440266059SGregory Neil Shapiro { 104540266059SGregory Neil Shapiro int n; 104640266059SGregory Neil Shapiro char *lc; 104740266059SGregory Neil Shapiro char jbuf[MAXHOSTNAMELEN]; 104840266059SGregory Neil Shapiro char lcbuf[MAXLINE]; 104940266059SGregory Neil Shapiro 105040266059SGregory Neil Shapiro /* Get $j */ 1051d0cef73dSGregory Neil Shapiro expand("\201j", jbuf, sizeof(jbuf), &BlankEnvelope); 105240266059SGregory Neil Shapiro if (jbuf[0] == '\0') 105340266059SGregory Neil Shapiro { 105440266059SGregory Neil Shapiro (void) sm_strlcpy(jbuf, "localhost", 1055d0cef73dSGregory Neil Shapiro sizeof(jbuf)); 105640266059SGregory Neil Shapiro } 105740266059SGregory Neil Shapiro 105840266059SGregory Neil Shapiro /* impose the default schema */ 105940266059SGregory Neil Shapiro lc = macvalue(macid("{sendmailMTACluster}"), CurEnv); 106040266059SGregory Neil Shapiro if (lc == NULL) 106140266059SGregory Neil Shapiro lc = ""; 106240266059SGregory Neil Shapiro else 106340266059SGregory Neil Shapiro { 1064d0cef73dSGregory Neil Shapiro expand(lc, lcbuf, sizeof(lcbuf), CurEnv); 106540266059SGregory Neil Shapiro lc = lcbuf; 106640266059SGregory Neil Shapiro } 106740266059SGregory Neil Shapiro 106840266059SGregory Neil Shapiro cl = "ldap"; 1069d0cef73dSGregory Neil Shapiro n = sm_snprintf(buf, sizeof(buf), 1070e92d3f3fSGregory Neil Shapiro "-k (&(objectClass=sendmailMTAClass)(sendmailMTAClassName=%s)(|(sendmailMTACluster=%s)(sendmailMTAHost=%s))) -v sendmailMTAClassValue,sendmailMTAClassSearch:FILTER:sendmailMTAClass,sendmailMTAClassURL:URL:sendmailMTAClass", 107140266059SGregory Neil Shapiro mn, lc, jbuf); 1072d0cef73dSGregory Neil Shapiro if (n >= sizeof(buf)) 107340266059SGregory Neil Shapiro { 107440266059SGregory Neil Shapiro syserr("fileclass: F{%s}: Default LDAP string too long", 107540266059SGregory Neil Shapiro mn); 107640266059SGregory Neil Shapiro sm_free(mn); 107740266059SGregory Neil Shapiro return; 107840266059SGregory Neil Shapiro } 107940266059SGregory Neil Shapiro spec = buf; 108040266059SGregory Neil Shapiro } 108140266059SGregory Neil Shapiro else 1082a7ec597cSGregory Neil Shapiro #endif /* LDAPMAP */ 108340266059SGregory Neil Shapiro { 108440266059SGregory Neil Shapiro if ((spec = strchr(cl, ':')) == NULL) 108540266059SGregory Neil Shapiro { 108640266059SGregory Neil Shapiro syserr("fileclass: F{%s}: missing map class", 108740266059SGregory Neil Shapiro mn); 108840266059SGregory Neil Shapiro sm_free(mn); 108940266059SGregory Neil Shapiro return; 109040266059SGregory Neil Shapiro } 109140266059SGregory Neil Shapiro *spec++ ='\0'; 109240266059SGregory Neil Shapiro } 109340266059SGregory Neil Shapiro 109440266059SGregory Neil Shapiro /* set up map structure */ 109540266059SGregory Neil Shapiro mapclass = stab(cl, ST_MAPCLASS, ST_FIND); 109640266059SGregory Neil Shapiro if (mapclass == NULL) 109740266059SGregory Neil Shapiro { 109840266059SGregory Neil Shapiro syserr("fileclass: F{%s}: class %s not available", 109940266059SGregory Neil Shapiro mn, cl); 110040266059SGregory Neil Shapiro sm_free(mn); 110140266059SGregory Neil Shapiro return; 110240266059SGregory Neil Shapiro } 1103d0cef73dSGregory Neil Shapiro memset(&map, '\0', sizeof(map)); 110440266059SGregory Neil Shapiro map.map_class = &mapclass->s_mapclass; 110540266059SGregory Neil Shapiro map.map_mname = mn; 110640266059SGregory Neil Shapiro map.map_mflags |= MF_FILECLASS; 110740266059SGregory Neil Shapiro 1108605302a5SGregory Neil Shapiro if (tTd(37, 5)) 1109605302a5SGregory Neil Shapiro sm_dprintf("fileclass: F{%s}: map class %s, key %s, spec %s\n", 1110605302a5SGregory Neil Shapiro mn, cl, key, spec); 1111605302a5SGregory Neil Shapiro 1112605302a5SGregory Neil Shapiro 111340266059SGregory Neil Shapiro /* parse map spec */ 111440266059SGregory Neil Shapiro if (!map.map_class->map_parse(&map, spec)) 111540266059SGregory Neil Shapiro { 111640266059SGregory Neil Shapiro /* map_parse() showed the error already */ 111740266059SGregory Neil Shapiro sm_free(mn); 111840266059SGregory Neil Shapiro return; 111940266059SGregory Neil Shapiro } 112040266059SGregory Neil Shapiro map.map_mflags |= MF_VALID; 112140266059SGregory Neil Shapiro 112240266059SGregory Neil Shapiro /* open map */ 112340266059SGregory Neil Shapiro if (map.map_class->map_open(&map, O_RDONLY)) 112440266059SGregory Neil Shapiro { 112540266059SGregory Neil Shapiro map.map_mflags |= MF_OPEN; 112640266059SGregory Neil Shapiro map.map_pid = getpid(); 112740266059SGregory Neil Shapiro } 112840266059SGregory Neil Shapiro else 112940266059SGregory Neil Shapiro { 113040266059SGregory Neil Shapiro if (!optional && 113140266059SGregory Neil Shapiro !bitset(MF_OPTIONAL, map.map_mflags)) 113240266059SGregory Neil Shapiro syserr("fileclass: F{%s}: map open failed", 113340266059SGregory Neil Shapiro mn); 113440266059SGregory Neil Shapiro sm_free(mn); 113540266059SGregory Neil Shapiro return; 113640266059SGregory Neil Shapiro } 113740266059SGregory Neil Shapiro 113840266059SGregory Neil Shapiro /* lookup */ 113940266059SGregory Neil Shapiro p = (*map.map_class->map_lookup)(&map, key, NULL, &status); 114040266059SGregory Neil Shapiro if (status != EX_OK && status != EX_NOTFOUND) 114140266059SGregory Neil Shapiro { 114240266059SGregory Neil Shapiro if (!optional) 114340266059SGregory Neil Shapiro syserr("fileclass: F{%s}: map lookup failed", 114440266059SGregory Neil Shapiro mn); 114540266059SGregory Neil Shapiro p = NULL; 114640266059SGregory Neil Shapiro } 114740266059SGregory Neil Shapiro 114840266059SGregory Neil Shapiro /* use the results */ 114940266059SGregory Neil Shapiro if (p != NULL) 115040266059SGregory Neil Shapiro parse_class_words(class, p); 115140266059SGregory Neil Shapiro 115240266059SGregory Neil Shapiro /* close map */ 115340266059SGregory Neil Shapiro map.map_mflags |= MF_CLOSING; 115440266059SGregory Neil Shapiro map.map_class->map_close(&map); 115540266059SGregory Neil Shapiro map.map_mflags &= ~(MF_OPEN|MF_WRITABLE|MF_CLOSING); 115640266059SGregory Neil Shapiro sm_free(mn); 115740266059SGregory Neil Shapiro return; 115840266059SGregory Neil Shapiro } 115940266059SGregory Neil Shapiro else if (filename[0] == '|') 1160c2aa98e2SPeter Wemm { 1161c2aa98e2SPeter Wemm auto int fd; 1162c2aa98e2SPeter Wemm int i; 1163c2aa98e2SPeter Wemm char *argv[MAXPV + 1]; 1164c2aa98e2SPeter Wemm 1165c2aa98e2SPeter Wemm i = 0; 116640266059SGregory Neil Shapiro for (p = strtok(&filename[1], " \t"); 116740266059SGregory Neil Shapiro p != NULL && i < MAXPV; 116840266059SGregory Neil Shapiro p = strtok(NULL, " \t")) 1169c2aa98e2SPeter Wemm argv[i++] = p; 1170c2aa98e2SPeter Wemm argv[i] = NULL; 1171c2aa98e2SPeter Wemm pid = prog_open(argv, &fd, CurEnv); 1172c2aa98e2SPeter Wemm if (pid < 0) 1173c2aa98e2SPeter Wemm f = NULL; 1174c2aa98e2SPeter Wemm else 117540266059SGregory Neil Shapiro f = sm_io_open(SmFtStdiofd, SM_TIME_DEFAULT, 117640266059SGregory Neil Shapiro (void *) &fd, SM_IO_RDONLY, NULL); 1177c2aa98e2SPeter Wemm } 1178c2aa98e2SPeter Wemm else 1179c2aa98e2SPeter Wemm { 1180c2aa98e2SPeter Wemm pid = -1; 1181c2aa98e2SPeter Wemm sff = SFF_REGONLY; 118206f25ae9SGregory Neil Shapiro if (!bitnset(DBS_CLASSFILEINUNSAFEDIRPATH, DontBlameSendmail)) 1183c2aa98e2SPeter Wemm sff |= SFF_SAFEDIRPATH; 118406f25ae9SGregory Neil Shapiro if (!bitnset(DBS_LINKEDCLASSFILEINWRITABLEDIR, 118506f25ae9SGregory Neil Shapiro DontBlameSendmail)) 1186c2aa98e2SPeter Wemm sff |= SFF_NOWLINK; 1187c2aa98e2SPeter Wemm if (safe) 1188c2aa98e2SPeter Wemm sff |= SFF_OPENASROOT; 118940266059SGregory Neil Shapiro else if (RealUid == 0) 119040266059SGregory Neil Shapiro sff |= SFF_ROOTOK; 1191c2aa98e2SPeter Wemm if (DontLockReadFiles) 1192c2aa98e2SPeter Wemm sff |= SFF_NOLOCK; 1193c2aa98e2SPeter Wemm f = safefopen(filename, O_RDONLY, 0, sff); 1194c2aa98e2SPeter Wemm } 1195c2aa98e2SPeter Wemm if (f == NULL) 1196c2aa98e2SPeter Wemm { 1197c2aa98e2SPeter Wemm if (!optional) 119806f25ae9SGregory Neil Shapiro syserr("fileclass: cannot open '%s'", filename); 1199c2aa98e2SPeter Wemm return; 1200c2aa98e2SPeter Wemm } 1201c2aa98e2SPeter Wemm 1202552d4955SGregory Neil Shapiro while (sm_io_fgets(f, SM_TIME_DEFAULT, buf, sizeof(buf)) >= 0) 1203c2aa98e2SPeter Wemm { 1204c2aa98e2SPeter Wemm #if SCANF 1205c2aa98e2SPeter Wemm char wordbuf[MAXLINE + 1]; 12065b0945b5SGregory Neil Shapiro #endif 1207c2aa98e2SPeter Wemm 1208c2aa98e2SPeter Wemm if (buf[0] == '#') 1209c2aa98e2SPeter Wemm continue; 1210c2aa98e2SPeter Wemm #if SCANF 121140266059SGregory Neil Shapiro if (sm_io_sscanf(buf, fmt, wordbuf) != 1) 1212c2aa98e2SPeter Wemm continue; 1213c2aa98e2SPeter Wemm p = wordbuf; 1214c2aa98e2SPeter Wemm #else /* SCANF */ 1215c2aa98e2SPeter Wemm p = buf; 1216c2aa98e2SPeter Wemm #endif /* SCANF */ 1217c2aa98e2SPeter Wemm 121840266059SGregory Neil Shapiro parse_class_words(class, p); 121940266059SGregory Neil Shapiro 1220c2aa98e2SPeter Wemm /* 122140266059SGregory Neil Shapiro ** If anything else is added here, 122240266059SGregory Neil Shapiro ** check if the '@' map case above 122340266059SGregory Neil Shapiro ** needs the code as well. 1224c2aa98e2SPeter Wemm */ 1225c2aa98e2SPeter Wemm } 1226c2aa98e2SPeter Wemm 122740266059SGregory Neil Shapiro (void) sm_io_close(f, SM_TIME_DEFAULT); 1228c2aa98e2SPeter Wemm if (pid > 0) 1229c2aa98e2SPeter Wemm (void) waitfor(pid); 1230c2aa98e2SPeter Wemm } 1231da7d7b9cSGregory Neil Shapiro 1232da7d7b9cSGregory Neil Shapiro #if _FFR_RCPTFLAGS 1233da7d7b9cSGregory Neil Shapiro /* first character for dynamically created mailers */ 1234da7d7b9cSGregory Neil Shapiro static char dynmailerp = ' '; 1235da7d7b9cSGregory Neil Shapiro 1236da7d7b9cSGregory Neil Shapiro /* list of first characters for cf defined mailers */ 1237da7d7b9cSGregory Neil Shapiro static char frst[MAXMAILERS + 1]; 1238da7d7b9cSGregory Neil Shapiro 1239da7d7b9cSGregory Neil Shapiro /* 1240da7d7b9cSGregory Neil Shapiro ** SETUPDYNMAILERS -- find a char that isn't used as first element of any 1241da7d7b9cSGregory Neil Shapiro ** mailer name. 1242da7d7b9cSGregory Neil Shapiro ** 1243da7d7b9cSGregory Neil Shapiro ** Parameters: 1244da7d7b9cSGregory Neil Shapiro ** none 1245da7d7b9cSGregory Neil Shapiro ** 1246da7d7b9cSGregory Neil Shapiro ** Returns: 1247da7d7b9cSGregory Neil Shapiro ** none 1248da7d7b9cSGregory Neil Shapiro ** 1249da7d7b9cSGregory Neil Shapiro ** Note: space is not valid in cf defined mailers hence the function 1250da7d7b9cSGregory Neil Shapiro ** will always find a char. It's not nice, but this is for 1251da7d7b9cSGregory Neil Shapiro ** internal names only. 1252da7d7b9cSGregory Neil Shapiro */ 1253da7d7b9cSGregory Neil Shapiro 1254da7d7b9cSGregory Neil Shapiro void 1255da7d7b9cSGregory Neil Shapiro setupdynmailers() 1256da7d7b9cSGregory Neil Shapiro { 1257da7d7b9cSGregory Neil Shapiro int i; 1258da7d7b9cSGregory Neil Shapiro char pp[] = "YXZ0123456789ABCDEFGHIJKLMNOPQRSTUVWyxzabcfghijkmnoqtuvw "; 1259da7d7b9cSGregory Neil Shapiro 1260da7d7b9cSGregory Neil Shapiro frst[MAXMAILERS] = '\0'; 1261da7d7b9cSGregory Neil Shapiro for (i = 0; i < strlen(pp); i++) 1262da7d7b9cSGregory Neil Shapiro { 1263da7d7b9cSGregory Neil Shapiro if (strchr(frst, pp[i]) == NULL) 1264da7d7b9cSGregory Neil Shapiro { 1265da7d7b9cSGregory Neil Shapiro dynmailerp = pp[i]; 1266da7d7b9cSGregory Neil Shapiro if (tTd(25, 8)) 1267da7d7b9cSGregory Neil Shapiro sm_dprintf("dynmailerp=%c\n", dynmailerp); 1268da7d7b9cSGregory Neil Shapiro return; 1269da7d7b9cSGregory Neil Shapiro } 1270da7d7b9cSGregory Neil Shapiro } 1271da7d7b9cSGregory Neil Shapiro 1272da7d7b9cSGregory Neil Shapiro /* NOTREACHED */ 1273da7d7b9cSGregory Neil Shapiro SM_ASSERT(0); 1274da7d7b9cSGregory Neil Shapiro } 1275da7d7b9cSGregory Neil Shapiro 1276da7d7b9cSGregory Neil Shapiro /* 1277da7d7b9cSGregory Neil Shapiro ** NEWMODMAILER -- Create a new mailer with modifications 1278da7d7b9cSGregory Neil Shapiro ** 1279da7d7b9cSGregory Neil Shapiro ** Parameters: 1280da7d7b9cSGregory Neil Shapiro ** rcpt -- current RCPT 1281da7d7b9cSGregory Neil Shapiro ** fl -- flag to set 1282da7d7b9cSGregory Neil Shapiro ** 1283da7d7b9cSGregory Neil Shapiro ** Returns: 1284da7d7b9cSGregory Neil Shapiro ** true iff successful. 1285da7d7b9cSGregory Neil Shapiro ** 1286da7d7b9cSGregory Neil Shapiro ** Note: this creates a copy of the mailer for the rcpt and 1287da7d7b9cSGregory Neil Shapiro ** modifies exactly one flag. It does not work 1288da7d7b9cSGregory Neil Shapiro ** for multiple flags! 1289da7d7b9cSGregory Neil Shapiro */ 1290da7d7b9cSGregory Neil Shapiro 1291da7d7b9cSGregory Neil Shapiro bool 1292da7d7b9cSGregory Neil Shapiro newmodmailer(rcpt, fl) 1293da7d7b9cSGregory Neil Shapiro ADDRESS *rcpt; 1294da7d7b9cSGregory Neil Shapiro int fl; 1295da7d7b9cSGregory Neil Shapiro { 1296da7d7b9cSGregory Neil Shapiro int idx; 1297da7d7b9cSGregory Neil Shapiro struct mailer *m; 1298da7d7b9cSGregory Neil Shapiro STAB *s; 1299da7d7b9cSGregory Neil Shapiro char mname[256]; 1300da7d7b9cSGregory Neil Shapiro 1301da7d7b9cSGregory Neil Shapiro SM_REQUIRE(rcpt != NULL); 1302da7d7b9cSGregory Neil Shapiro if (rcpt->q_mailer == NULL) 1303da7d7b9cSGregory Neil Shapiro return false; 1304da7d7b9cSGregory Neil Shapiro if (tTd(25, 8)) 1305da7d7b9cSGregory Neil Shapiro sm_dprintf("newmodmailer: rcpt=%s\n", rcpt->q_paddr); 1306da7d7b9cSGregory Neil Shapiro SM_REQUIRE(rcpt->q_mailer->m_name != NULL); 1307da7d7b9cSGregory Neil Shapiro SM_REQUIRE(rcpt->q_mailer->m_name[0] != '\0'); 1308da7d7b9cSGregory Neil Shapiro sm_strlcpy(mname, rcpt->q_mailer->m_name, sizeof(mname)); 1309da7d7b9cSGregory Neil Shapiro mname[0] = dynmailerp; 1310da7d7b9cSGregory Neil Shapiro if (tTd(25, 8)) 1311da7d7b9cSGregory Neil Shapiro sm_dprintf("newmodmailer: name=%s\n", mname); 1312da7d7b9cSGregory Neil Shapiro s = stab(mname, ST_MAILER, ST_ENTER); 1313da7d7b9cSGregory Neil Shapiro if (s->s_mailer != NULL) 1314da7d7b9cSGregory Neil Shapiro { 1315da7d7b9cSGregory Neil Shapiro idx = s->s_mailer->m_mno; 1316da7d7b9cSGregory Neil Shapiro if (tTd(25, 6)) 1317da7d7b9cSGregory Neil Shapiro sm_dprintf("newmodmailer: found idx=%d\n", idx); 1318da7d7b9cSGregory Neil Shapiro } 1319da7d7b9cSGregory Neil Shapiro else 1320da7d7b9cSGregory Neil Shapiro { 1321da7d7b9cSGregory Neil Shapiro idx = rcpt->q_mailer->m_mno; 1322da7d7b9cSGregory Neil Shapiro idx += MAXMAILERS; 1323da7d7b9cSGregory Neil Shapiro if (tTd(25, 6)) 1324da7d7b9cSGregory Neil Shapiro sm_dprintf("newmodmailer: idx=%d\n", idx); 1325da7d7b9cSGregory Neil Shapiro if (idx > SM_ARRAY_SIZE(Mailer)) 1326da7d7b9cSGregory Neil Shapiro return false; 1327da7d7b9cSGregory Neil Shapiro } 1328da7d7b9cSGregory Neil Shapiro 1329da7d7b9cSGregory Neil Shapiro m = Mailer[idx]; 1330da7d7b9cSGregory Neil Shapiro if (m == NULL) 1331da7d7b9cSGregory Neil Shapiro m = (struct mailer *) xalloc(sizeof(*m)); 1332da7d7b9cSGregory Neil Shapiro memset((char *) m, '\0', sizeof(*m)); 1333da7d7b9cSGregory Neil Shapiro STRUCTCOPY(*rcpt->q_mailer, *m); 1334da7d7b9cSGregory Neil Shapiro Mailer[idx] = m; 1335da7d7b9cSGregory Neil Shapiro 1336da7d7b9cSGregory Neil Shapiro /* "modify" the mailer */ 1337da7d7b9cSGregory Neil Shapiro setbitn(bitidx(fl), m->m_flags); 1338da7d7b9cSGregory Neil Shapiro rcpt->q_mailer = m; 1339da7d7b9cSGregory Neil Shapiro m->m_mno = idx; 1340da7d7b9cSGregory Neil Shapiro m->m_name = newstr(mname); 1341da7d7b9cSGregory Neil Shapiro if (tTd(25, 1)) 1342da7d7b9cSGregory Neil Shapiro sm_dprintf("newmodmailer: mailer[%d]=%s %p\n", 1343da7d7b9cSGregory Neil Shapiro idx, Mailer[idx]->m_name, Mailer[idx]); 1344da7d7b9cSGregory Neil Shapiro 1345da7d7b9cSGregory Neil Shapiro return true; 1346da7d7b9cSGregory Neil Shapiro } 1347da7d7b9cSGregory Neil Shapiro 1348da7d7b9cSGregory Neil Shapiro #endif /* _FFR_RCPTFLAGS */ 1349da7d7b9cSGregory Neil Shapiro 135040266059SGregory Neil Shapiro /* 1351c2aa98e2SPeter Wemm ** MAKEMAILER -- define a new mailer. 1352c2aa98e2SPeter Wemm ** 1353c2aa98e2SPeter Wemm ** Parameters: 1354c2aa98e2SPeter Wemm ** line -- description of mailer. This is in labeled 1355c2aa98e2SPeter Wemm ** fields. The fields are: 1356c2aa98e2SPeter Wemm ** A -- the argv for this mailer 1357c2aa98e2SPeter Wemm ** C -- the character set for MIME conversions 1358c2aa98e2SPeter Wemm ** D -- the directory to run in 1359c2aa98e2SPeter Wemm ** E -- the eol string 1360c2aa98e2SPeter Wemm ** F -- the flags associated with the mailer 1361c2aa98e2SPeter Wemm ** L -- the maximum line length 1362c2aa98e2SPeter Wemm ** M -- the maximum message size 1363c2aa98e2SPeter Wemm ** N -- the niceness at which to run 1364c2aa98e2SPeter Wemm ** P -- the path to the mailer 136540266059SGregory Neil Shapiro ** Q -- the queue group for the mailer 1366c2aa98e2SPeter Wemm ** R -- the recipient rewriting set 1367c2aa98e2SPeter Wemm ** S -- the sender rewriting set 1368c2aa98e2SPeter Wemm ** T -- the mailer type (for DSNs) 1369c2aa98e2SPeter Wemm ** U -- the uid to run as 137006f25ae9SGregory Neil Shapiro ** W -- the time to wait at the end 1371602a2b1bSGregory Neil Shapiro ** m -- maximum messages per connection 137240266059SGregory Neil Shapiro ** r -- maximum number of recipients per message 1373602a2b1bSGregory Neil Shapiro ** / -- new root directory 1374c2aa98e2SPeter Wemm ** The first word is the canonical name of the mailer. 1375c2aa98e2SPeter Wemm ** 1376c2aa98e2SPeter Wemm ** Returns: 1377c2aa98e2SPeter Wemm ** none. 1378c2aa98e2SPeter Wemm ** 1379c2aa98e2SPeter Wemm ** Side Effects: 1380c2aa98e2SPeter Wemm ** enters the mailer into the mailer table. 1381c2aa98e2SPeter Wemm */ 1382c2aa98e2SPeter Wemm 1383da7d7b9cSGregory Neil Shapiro 1384c2aa98e2SPeter Wemm void 1385c2aa98e2SPeter Wemm makemailer(line) 1386c2aa98e2SPeter Wemm char *line; 1387c2aa98e2SPeter Wemm { 1388c2aa98e2SPeter Wemm register char *p; 1389c2aa98e2SPeter Wemm register struct mailer *m; 1390c2aa98e2SPeter Wemm register STAB *s; 1391c2aa98e2SPeter Wemm int i; 1392c2aa98e2SPeter Wemm char fcode; 1393c2aa98e2SPeter Wemm auto char *endp; 139440266059SGregory Neil Shapiro static int nextmailer = 0; /* "free" index into Mailer struct */ 1395c2aa98e2SPeter Wemm 1396c2aa98e2SPeter Wemm /* allocate a mailer and set up defaults */ 1397*2fb4f839SGregory Neil Shapiro m = (struct mailer *) sm_malloc_tagged_x(sizeof(*m), "mailer", 0, 0); 1398d0cef73dSGregory Neil Shapiro memset((char *) m, '\0', sizeof(*m)); 139940266059SGregory Neil Shapiro errno = 0; /* avoid bogus error text */ 1400c2aa98e2SPeter Wemm 1401c2aa98e2SPeter Wemm /* collect the mailer name */ 140240266059SGregory Neil Shapiro for (p = line; 14035b0945b5SGregory Neil Shapiro *p != '\0' && *p != ',' && !(SM_ISSPACE(*p)); 140440266059SGregory Neil Shapiro p++) 1405c2aa98e2SPeter Wemm continue; 1406c2aa98e2SPeter Wemm if (*p != '\0') 1407c2aa98e2SPeter Wemm *p++ = '\0'; 1408c2aa98e2SPeter Wemm if (line[0] == '\0') 1409193538b7SGregory Neil Shapiro { 1410c2aa98e2SPeter Wemm syserr("name required for mailer"); 1411193538b7SGregory Neil Shapiro return; 1412193538b7SGregory Neil Shapiro } 1413c2aa98e2SPeter Wemm m->m_name = newstr(line); 1414da7d7b9cSGregory Neil Shapiro #if _FFR_RCPTFLAGS 1415da7d7b9cSGregory Neil Shapiro frst[nextmailer] = line[0]; 1416da7d7b9cSGregory Neil Shapiro #endif 1417605302a5SGregory Neil Shapiro m->m_qgrp = NOQGRP; 1418e92d3f3fSGregory Neil Shapiro m->m_uid = NO_UID; 1419e92d3f3fSGregory Neil Shapiro m->m_gid = NO_GID; 1420c2aa98e2SPeter Wemm 1421c2aa98e2SPeter Wemm /* now scan through and assign info from the fields */ 1422c2aa98e2SPeter Wemm while (*p != '\0') 1423c2aa98e2SPeter Wemm { 1424c2aa98e2SPeter Wemm auto char *delimptr; 1425c2aa98e2SPeter Wemm 142640266059SGregory Neil Shapiro while (*p != '\0' && 14275b0945b5SGregory Neil Shapiro (*p == ',' || (SM_ISSPACE(*p)))) 1428c2aa98e2SPeter Wemm p++; 1429c2aa98e2SPeter Wemm 1430c2aa98e2SPeter Wemm /* p now points to field code */ 1431c2aa98e2SPeter Wemm fcode = *p; 1432c2aa98e2SPeter Wemm while (*p != '\0' && *p != '=' && *p != ',') 1433c2aa98e2SPeter Wemm p++; 1434c2aa98e2SPeter Wemm if (*p++ != '=') 1435c2aa98e2SPeter Wemm { 1436c2aa98e2SPeter Wemm syserr("mailer %s: `=' expected", m->m_name); 1437c2aa98e2SPeter Wemm return; 1438c2aa98e2SPeter Wemm } 14395b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 1440c2aa98e2SPeter Wemm p++; 1441c2aa98e2SPeter Wemm 1442c2aa98e2SPeter Wemm /* p now points to the field body */ 1443c2aa98e2SPeter Wemm p = munchstring(p, &delimptr, ','); 1444c2aa98e2SPeter Wemm 1445c2aa98e2SPeter Wemm /* install the field into the mailer struct */ 1446c2aa98e2SPeter Wemm switch (fcode) 1447c2aa98e2SPeter Wemm { 1448c2aa98e2SPeter Wemm case 'P': /* pathname */ 144940266059SGregory Neil Shapiro if (*p != '\0') /* error is issued below */ 1450c2aa98e2SPeter Wemm m->m_mailer = newstr(p); 1451c2aa98e2SPeter Wemm break; 1452c2aa98e2SPeter Wemm 1453c2aa98e2SPeter Wemm case 'F': /* flags */ 1454c2aa98e2SPeter Wemm for (; *p != '\0'; p++) 145540266059SGregory Neil Shapiro { 14565b0945b5SGregory Neil Shapiro if (!(SM_ISSPACE(*p))) 145740266059SGregory Neil Shapiro { 145840266059SGregory Neil Shapiro if (*p == M_INTERNAL) 145940266059SGregory Neil Shapiro sm_syslog(LOG_WARNING, NOQID, 146040266059SGregory Neil Shapiro "WARNING: mailer=%s, flag=%c deprecated", 146140266059SGregory Neil Shapiro m->m_name, *p); 1462193538b7SGregory Neil Shapiro setbitn(bitidx(*p), m->m_flags); 146340266059SGregory Neil Shapiro } 146440266059SGregory Neil Shapiro } 1465c2aa98e2SPeter Wemm break; 1466c2aa98e2SPeter Wemm 1467c2aa98e2SPeter Wemm case 'S': /* sender rewriting ruleset */ 1468c2aa98e2SPeter Wemm case 'R': /* recipient rewriting ruleset */ 1469c2aa98e2SPeter Wemm i = strtorwset(p, &endp, ST_ENTER); 1470c2aa98e2SPeter Wemm if (i < 0) 1471c2aa98e2SPeter Wemm return; 1472c2aa98e2SPeter Wemm if (fcode == 'S') 1473c2aa98e2SPeter Wemm m->m_sh_rwset = m->m_se_rwset = i; 1474c2aa98e2SPeter Wemm else 1475c2aa98e2SPeter Wemm m->m_rh_rwset = m->m_re_rwset = i; 1476c2aa98e2SPeter Wemm 1477c2aa98e2SPeter Wemm p = endp; 1478c2aa98e2SPeter Wemm if (*p++ == '/') 1479c2aa98e2SPeter Wemm { 1480c2aa98e2SPeter Wemm i = strtorwset(p, NULL, ST_ENTER); 1481c2aa98e2SPeter Wemm if (i < 0) 1482c2aa98e2SPeter Wemm return; 1483c2aa98e2SPeter Wemm if (fcode == 'S') 1484c2aa98e2SPeter Wemm m->m_sh_rwset = i; 1485c2aa98e2SPeter Wemm else 1486c2aa98e2SPeter Wemm m->m_rh_rwset = i; 1487c2aa98e2SPeter Wemm } 1488c2aa98e2SPeter Wemm break; 1489c2aa98e2SPeter Wemm 1490c2aa98e2SPeter Wemm case 'E': /* end of line string */ 1491c2aa98e2SPeter Wemm if (*p == '\0') 1492c2aa98e2SPeter Wemm syserr("mailer %s: null end-of-line string", 1493c2aa98e2SPeter Wemm m->m_name); 1494193538b7SGregory Neil Shapiro else 1495c2aa98e2SPeter Wemm m->m_eol = newstr(p); 1496c2aa98e2SPeter Wemm break; 1497c2aa98e2SPeter Wemm 1498c2aa98e2SPeter Wemm case 'A': /* argument vector */ 149940266059SGregory Neil Shapiro if (*p != '\0') /* error is issued below */ 1500c2aa98e2SPeter Wemm m->m_argv = makeargv(p); 1501c2aa98e2SPeter Wemm break; 1502c2aa98e2SPeter Wemm 1503c2aa98e2SPeter Wemm case 'M': /* maximum message size */ 1504c2aa98e2SPeter Wemm m->m_maxsize = atol(p); 1505c2aa98e2SPeter Wemm break; 1506c2aa98e2SPeter Wemm 150706f25ae9SGregory Neil Shapiro case 'm': /* maximum messages per connection */ 150806f25ae9SGregory Neil Shapiro m->m_maxdeliveries = atoi(p); 150906f25ae9SGregory Neil Shapiro break; 151006f25ae9SGregory Neil Shapiro 151106f25ae9SGregory Neil Shapiro case 'r': /* max recipient per envelope */ 151206f25ae9SGregory Neil Shapiro m->m_maxrcpt = atoi(p); 151306f25ae9SGregory Neil Shapiro break; 151406f25ae9SGregory Neil Shapiro 1515c2aa98e2SPeter Wemm case 'L': /* maximum line length */ 1516c2aa98e2SPeter Wemm m->m_linelimit = atoi(p); 1517c2aa98e2SPeter Wemm if (m->m_linelimit < 0) 1518c2aa98e2SPeter Wemm m->m_linelimit = 0; 1519c2aa98e2SPeter Wemm break; 1520c2aa98e2SPeter Wemm 1521c2aa98e2SPeter Wemm case 'N': /* run niceness */ 1522c2aa98e2SPeter Wemm m->m_nice = atoi(p); 1523c2aa98e2SPeter Wemm break; 1524c2aa98e2SPeter Wemm 1525c2aa98e2SPeter Wemm case 'D': /* working directory */ 1526c2aa98e2SPeter Wemm if (*p == '\0') 1527c2aa98e2SPeter Wemm syserr("mailer %s: null working directory", 1528c2aa98e2SPeter Wemm m->m_name); 1529193538b7SGregory Neil Shapiro else 1530c2aa98e2SPeter Wemm m->m_execdir = newstr(p); 1531c2aa98e2SPeter Wemm break; 1532c2aa98e2SPeter Wemm 1533c2aa98e2SPeter Wemm case 'C': /* default charset */ 1534c2aa98e2SPeter Wemm if (*p == '\0') 1535c2aa98e2SPeter Wemm syserr("mailer %s: null charset", m->m_name); 1536193538b7SGregory Neil Shapiro else 1537c2aa98e2SPeter Wemm m->m_defcharset = newstr(p); 1538c2aa98e2SPeter Wemm break; 1539c2aa98e2SPeter Wemm 154040266059SGregory Neil Shapiro case 'Q': /* queue for this mailer */ 154140266059SGregory Neil Shapiro if (*p == '\0') 154240266059SGregory Neil Shapiro { 154340266059SGregory Neil Shapiro syserr("mailer %s: null queue", m->m_name); 154440266059SGregory Neil Shapiro break; 154540266059SGregory Neil Shapiro } 154640266059SGregory Neil Shapiro s = stab(p, ST_QUEUE, ST_FIND); 154740266059SGregory Neil Shapiro if (s == NULL) 154840266059SGregory Neil Shapiro syserr("mailer %s: unknown queue %s", 154940266059SGregory Neil Shapiro m->m_name, p); 155040266059SGregory Neil Shapiro else 155140266059SGregory Neil Shapiro m->m_qgrp = s->s_quegrp->qg_index; 155240266059SGregory Neil Shapiro break; 155340266059SGregory Neil Shapiro 1554c2aa98e2SPeter Wemm case 'T': /* MTA-Name/Address/Diagnostic types */ 1555c2aa98e2SPeter Wemm /* extract MTA name type; default to "dns" */ 1556c2aa98e2SPeter Wemm m->m_mtatype = newstr(p); 1557c2aa98e2SPeter Wemm p = strchr(m->m_mtatype, '/'); 1558c2aa98e2SPeter Wemm if (p != NULL) 1559c2aa98e2SPeter Wemm { 1560c2aa98e2SPeter Wemm *p++ = '\0'; 1561c2aa98e2SPeter Wemm if (*p == '\0') 1562c2aa98e2SPeter Wemm p = NULL; 1563c2aa98e2SPeter Wemm } 1564c2aa98e2SPeter Wemm if (*m->m_mtatype == '\0') 1565c2aa98e2SPeter Wemm m->m_mtatype = "dns"; 1566c2aa98e2SPeter Wemm 1567c2aa98e2SPeter Wemm /* extract address type; default to "rfc822" */ 1568c2aa98e2SPeter Wemm m->m_addrtype = p; 1569c2aa98e2SPeter Wemm if (p != NULL) 1570c2aa98e2SPeter Wemm p = strchr(p, '/'); 1571c2aa98e2SPeter Wemm if (p != NULL) 1572c2aa98e2SPeter Wemm { 1573c2aa98e2SPeter Wemm *p++ = '\0'; 1574c2aa98e2SPeter Wemm if (*p == '\0') 1575c2aa98e2SPeter Wemm p = NULL; 1576c2aa98e2SPeter Wemm } 1577*2fb4f839SGregory Neil Shapiro if (SM_IS_EMPTY(m->m_addrtype)) 1578c2aa98e2SPeter Wemm m->m_addrtype = "rfc822"; 1579c2aa98e2SPeter Wemm 1580c2aa98e2SPeter Wemm /* extract diagnostic type; default to "smtp" */ 1581c2aa98e2SPeter Wemm m->m_diagtype = p; 1582*2fb4f839SGregory Neil Shapiro if (SM_IS_EMPTY(m->m_diagtype)) 1583c2aa98e2SPeter Wemm m->m_diagtype = "smtp"; 1584c2aa98e2SPeter Wemm break; 1585c2aa98e2SPeter Wemm 1586c2aa98e2SPeter Wemm case 'U': /* user id */ 1587c2aa98e2SPeter Wemm if (isascii(*p) && !isdigit(*p)) 1588c2aa98e2SPeter Wemm { 1589c2aa98e2SPeter Wemm char *q = p; 1590c2aa98e2SPeter Wemm struct passwd *pw; 1591c2aa98e2SPeter Wemm 1592c2aa98e2SPeter Wemm while (*p != '\0' && isascii(*p) && 1593da7d7b9cSGregory Neil Shapiro #if _FFR_DOTTED_USERNAMES 1594da7d7b9cSGregory Neil Shapiro (isalnum(*p) || strchr(SM_PWN_CHARS, *p) != NULL)) 15955b0945b5SGregory Neil Shapiro #else 1596c2aa98e2SPeter Wemm (isalnum(*p) || strchr("-_", *p) != NULL)) 15975b0945b5SGregory Neil Shapiro #endif 1598c2aa98e2SPeter Wemm p++; 15995b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 1600c2aa98e2SPeter Wemm *p++ = '\0'; 1601c2aa98e2SPeter Wemm if (*p != '\0') 1602c2aa98e2SPeter Wemm *p++ = '\0'; 1603c2aa98e2SPeter Wemm if (*q == '\0') 1604193538b7SGregory Neil Shapiro { 1605c2aa98e2SPeter Wemm syserr("mailer %s: null user name", 1606c2aa98e2SPeter Wemm m->m_name); 1607193538b7SGregory Neil Shapiro break; 1608193538b7SGregory Neil Shapiro } 1609c2aa98e2SPeter Wemm pw = sm_getpwnam(q); 1610c2aa98e2SPeter Wemm if (pw == NULL) 1611193538b7SGregory Neil Shapiro { 1612c2aa98e2SPeter Wemm syserr("readcf: mailer U= flag: unknown user %s", q); 1613193538b7SGregory Neil Shapiro break; 1614193538b7SGregory Neil Shapiro } 1615c2aa98e2SPeter Wemm else 1616c2aa98e2SPeter Wemm { 1617c2aa98e2SPeter Wemm m->m_uid = pw->pw_uid; 1618c2aa98e2SPeter Wemm m->m_gid = pw->pw_gid; 1619c2aa98e2SPeter Wemm } 1620c2aa98e2SPeter Wemm } 1621c2aa98e2SPeter Wemm else 1622c2aa98e2SPeter Wemm { 1623c2aa98e2SPeter Wemm auto char *q; 1624c2aa98e2SPeter Wemm 1625c2aa98e2SPeter Wemm m->m_uid = strtol(p, &q, 0); 1626c2aa98e2SPeter Wemm p = q; 16275b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 1628c2aa98e2SPeter Wemm p++; 1629c2aa98e2SPeter Wemm if (*p != '\0') 1630c2aa98e2SPeter Wemm p++; 1631c2aa98e2SPeter Wemm } 16325b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 1633c2aa98e2SPeter Wemm p++; 1634c2aa98e2SPeter Wemm if (*p == '\0') 1635c2aa98e2SPeter Wemm break; 1636c2aa98e2SPeter Wemm if (isascii(*p) && !isdigit(*p)) 1637c2aa98e2SPeter Wemm { 1638c2aa98e2SPeter Wemm char *q = p; 1639c2aa98e2SPeter Wemm struct group *gr; 1640c2aa98e2SPeter Wemm 1641da7d7b9cSGregory Neil Shapiro while (isascii(*p) && 1642da7d7b9cSGregory Neil Shapiro (isalnum(*p) || strchr(SM_PWN_CHARS, *p) != NULL)) 1643c2aa98e2SPeter Wemm p++; 1644c2aa98e2SPeter Wemm *p++ = '\0'; 1645c2aa98e2SPeter Wemm if (*q == '\0') 1646193538b7SGregory Neil Shapiro { 1647c2aa98e2SPeter Wemm syserr("mailer %s: null group name", 1648c2aa98e2SPeter Wemm m->m_name); 1649193538b7SGregory Neil Shapiro break; 1650193538b7SGregory Neil Shapiro } 1651c2aa98e2SPeter Wemm gr = getgrnam(q); 1652c2aa98e2SPeter Wemm if (gr == NULL) 1653193538b7SGregory Neil Shapiro { 1654c2aa98e2SPeter Wemm syserr("readcf: mailer U= flag: unknown group %s", q); 1655193538b7SGregory Neil Shapiro break; 1656193538b7SGregory Neil Shapiro } 1657c2aa98e2SPeter Wemm else 1658c2aa98e2SPeter Wemm m->m_gid = gr->gr_gid; 1659c2aa98e2SPeter Wemm } 1660c2aa98e2SPeter Wemm else 1661c2aa98e2SPeter Wemm { 1662c2aa98e2SPeter Wemm m->m_gid = strtol(p, NULL, 0); 1663c2aa98e2SPeter Wemm } 1664c2aa98e2SPeter Wemm break; 166506f25ae9SGregory Neil Shapiro 166606f25ae9SGregory Neil Shapiro case 'W': /* wait timeout */ 166706f25ae9SGregory Neil Shapiro m->m_wait = convtime(p, 's'); 166806f25ae9SGregory Neil Shapiro break; 166906f25ae9SGregory Neil Shapiro 167006f25ae9SGregory Neil Shapiro case '/': /* new root directory */ 167106f25ae9SGregory Neil Shapiro if (*p == '\0') 167206f25ae9SGregory Neil Shapiro syserr("mailer %s: null root directory", 167306f25ae9SGregory Neil Shapiro m->m_name); 167406f25ae9SGregory Neil Shapiro else 167506f25ae9SGregory Neil Shapiro m->m_rootdir = newstr(p); 167606f25ae9SGregory Neil Shapiro break; 167706f25ae9SGregory Neil Shapiro 167806f25ae9SGregory Neil Shapiro default: 167906f25ae9SGregory Neil Shapiro syserr("M%s: unknown mailer equate %c=", 168006f25ae9SGregory Neil Shapiro m->m_name, fcode); 168106f25ae9SGregory Neil Shapiro break; 1682c2aa98e2SPeter Wemm } 1683c2aa98e2SPeter Wemm 1684c2aa98e2SPeter Wemm p = delimptr; 1685c2aa98e2SPeter Wemm } 1686c2aa98e2SPeter Wemm 168740266059SGregory Neil Shapiro #if !HASRRESVPORT 168840266059SGregory Neil Shapiro if (bitnset(M_SECURE_PORT, m->m_flags)) 168940266059SGregory Neil Shapiro { 169040266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 169140266059SGregory Neil Shapiro "M%s: Warning: F=%c set on system that doesn't support rresvport()\n", 169240266059SGregory Neil Shapiro m->m_name, M_SECURE_PORT); 169340266059SGregory Neil Shapiro } 169440266059SGregory Neil Shapiro #endif /* !HASRRESVPORT */ 169540266059SGregory Neil Shapiro 169640266059SGregory Neil Shapiro #if !HASNICE 169740266059SGregory Neil Shapiro if (m->m_nice != 0) 169840266059SGregory Neil Shapiro { 169940266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 170040266059SGregory Neil Shapiro "M%s: Warning: N= set on system that doesn't support nice()\n", 170140266059SGregory Neil Shapiro m->m_name); 170240266059SGregory Neil Shapiro } 170340266059SGregory Neil Shapiro #endif /* !HASNICE */ 170440266059SGregory Neil Shapiro 1705c2aa98e2SPeter Wemm /* do some rationality checking */ 1706c2aa98e2SPeter Wemm if (m->m_argv == NULL) 1707c2aa98e2SPeter Wemm { 1708c2aa98e2SPeter Wemm syserr("M%s: A= argument required", m->m_name); 1709c2aa98e2SPeter Wemm return; 1710c2aa98e2SPeter Wemm } 1711c2aa98e2SPeter Wemm if (m->m_mailer == NULL) 1712c2aa98e2SPeter Wemm { 1713c2aa98e2SPeter Wemm syserr("M%s: P= argument required", m->m_name); 1714c2aa98e2SPeter Wemm return; 1715c2aa98e2SPeter Wemm } 1716c2aa98e2SPeter Wemm 171740266059SGregory Neil Shapiro if (nextmailer >= MAXMAILERS) 1718c2aa98e2SPeter Wemm { 1719c2aa98e2SPeter Wemm syserr("too many mailers defined (%d max)", MAXMAILERS); 1720c2aa98e2SPeter Wemm return; 1721c2aa98e2SPeter Wemm } 1722c2aa98e2SPeter Wemm 172306f25ae9SGregory Neil Shapiro if (m->m_maxrcpt <= 0) 172406f25ae9SGregory Neil Shapiro m->m_maxrcpt = DEFAULT_MAX_RCPT; 172506f25ae9SGregory Neil Shapiro 1726c2aa98e2SPeter Wemm /* do some heuristic cleanup for back compatibility */ 1727c2aa98e2SPeter Wemm if (bitnset(M_LIMITS, m->m_flags)) 1728c2aa98e2SPeter Wemm { 1729c2aa98e2SPeter Wemm if (m->m_linelimit == 0) 1730c2aa98e2SPeter Wemm m->m_linelimit = SMTPLINELIM; 1731c2aa98e2SPeter Wemm if (ConfigLevel < 2) 1732c2aa98e2SPeter Wemm setbitn(M_7BITS, m->m_flags); 1733c2aa98e2SPeter Wemm } 1734c2aa98e2SPeter Wemm 173506f25ae9SGregory Neil Shapiro if (strcmp(m->m_mailer, "[TCP]") == 0) 1736c2aa98e2SPeter Wemm { 173740266059SGregory Neil Shapiro syserr("M%s: P=[TCP] must be replaced by P=[IPC]", m->m_name); 1738193538b7SGregory Neil Shapiro return; 1739c2aa98e2SPeter Wemm } 1740c2aa98e2SPeter Wemm 174140266059SGregory Neil Shapiro if (strcmp(m->m_mailer, "[IPC]") == 0) 174206f25ae9SGregory Neil Shapiro { 174306f25ae9SGregory Neil Shapiro /* Use the second argument for host or path to socket */ 174406f25ae9SGregory Neil Shapiro if (m->m_argv[0] == NULL || m->m_argv[1] == NULL || 174506f25ae9SGregory Neil Shapiro m->m_argv[1][0] == '\0') 174606f25ae9SGregory Neil Shapiro { 174706f25ae9SGregory Neil Shapiro syserr("M%s: too few parameters for %s mailer", 174806f25ae9SGregory Neil Shapiro m->m_name, m->m_mailer); 1749193538b7SGregory Neil Shapiro return; 175006f25ae9SGregory Neil Shapiro } 175142e5d165SGregory Neil Shapiro if (strcmp(m->m_argv[0], "TCP") != 0 175206f25ae9SGregory Neil Shapiro #if NETUNIX 175342e5d165SGregory Neil Shapiro && strcmp(m->m_argv[0], "FILE") != 0 17545b0945b5SGregory Neil Shapiro #endif 175506f25ae9SGregory Neil Shapiro ) 175606f25ae9SGregory Neil Shapiro { 175740266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 175840266059SGregory Neil Shapiro "M%s: Warning: first argument in %s mailer must be %s\n", 175906f25ae9SGregory Neil Shapiro m->m_name, m->m_mailer, 176006f25ae9SGregory Neil Shapiro #if NETUNIX 176106f25ae9SGregory Neil Shapiro "TCP or FILE" 17625b0945b5SGregory Neil Shapiro #else 176306f25ae9SGregory Neil Shapiro "TCP" 17645b0945b5SGregory Neil Shapiro #endif 176506f25ae9SGregory Neil Shapiro ); 176606f25ae9SGregory Neil Shapiro } 176740266059SGregory Neil Shapiro if (m->m_mtatype == NULL) 176840266059SGregory Neil Shapiro m->m_mtatype = "dns"; 176940266059SGregory Neil Shapiro if (m->m_addrtype == NULL) 177040266059SGregory Neil Shapiro m->m_addrtype = "rfc822"; 177140266059SGregory Neil Shapiro if (m->m_diagtype == NULL) 177240266059SGregory Neil Shapiro { 177340266059SGregory Neil Shapiro if (m->m_argv[0] != NULL && 177440266059SGregory Neil Shapiro strcmp(m->m_argv[0], "FILE") == 0) 177540266059SGregory Neil Shapiro m->m_diagtype = "x-unix"; 177640266059SGregory Neil Shapiro else 177740266059SGregory Neil Shapiro m->m_diagtype = "smtp"; 177840266059SGregory Neil Shapiro } 177906f25ae9SGregory Neil Shapiro } 178006f25ae9SGregory Neil Shapiro else if (strcmp(m->m_mailer, "[FILE]") == 0) 1781c2aa98e2SPeter Wemm { 1782c2aa98e2SPeter Wemm /* Use the second argument for filename */ 1783c2aa98e2SPeter Wemm if (m->m_argv[0] == NULL || m->m_argv[1] == NULL || 1784c2aa98e2SPeter Wemm m->m_argv[2] != NULL) 1785c2aa98e2SPeter Wemm { 1786c2aa98e2SPeter Wemm syserr("M%s: too %s parameters for [FILE] mailer", 1787c2aa98e2SPeter Wemm m->m_name, 1788c2aa98e2SPeter Wemm (m->m_argv[0] == NULL || 1789c2aa98e2SPeter Wemm m->m_argv[1] == NULL) ? "few" : "many"); 1790193538b7SGregory Neil Shapiro return; 1791c2aa98e2SPeter Wemm } 1792c2aa98e2SPeter Wemm else if (strcmp(m->m_argv[0], "FILE") != 0) 1793c2aa98e2SPeter Wemm { 1794c2aa98e2SPeter Wemm syserr("M%s: first argument in [FILE] mailer must be FILE", 1795c2aa98e2SPeter Wemm m->m_name); 1796193538b7SGregory Neil Shapiro return; 1797c2aa98e2SPeter Wemm } 1798c2aa98e2SPeter Wemm } 1799c2aa98e2SPeter Wemm 1800c2aa98e2SPeter Wemm if (m->m_eol == NULL) 1801c2aa98e2SPeter Wemm { 1802c2aa98e2SPeter Wemm char **pp; 1803c2aa98e2SPeter Wemm 1804c2aa98e2SPeter Wemm /* default for SMTP is \r\n; use \n for local delivery */ 1805c2aa98e2SPeter Wemm for (pp = m->m_argv; *pp != NULL; pp++) 1806c2aa98e2SPeter Wemm { 1807c2aa98e2SPeter Wemm for (p = *pp; *p != '\0'; ) 1808c2aa98e2SPeter Wemm { 1809c2aa98e2SPeter Wemm if ((*p++ & 0377) == MACROEXPAND && *p == 'u') 1810c2aa98e2SPeter Wemm break; 1811c2aa98e2SPeter Wemm } 1812c2aa98e2SPeter Wemm if (*p != '\0') 1813c2aa98e2SPeter Wemm break; 1814c2aa98e2SPeter Wemm } 1815c2aa98e2SPeter Wemm if (*pp == NULL) 1816c2aa98e2SPeter Wemm m->m_eol = "\r\n"; 1817c2aa98e2SPeter Wemm else 1818c2aa98e2SPeter Wemm m->m_eol = "\n"; 1819c2aa98e2SPeter Wemm } 1820c2aa98e2SPeter Wemm 1821c2aa98e2SPeter Wemm /* enter the mailer into the symbol table */ 1822c2aa98e2SPeter Wemm s = stab(m->m_name, ST_MAILER, ST_ENTER); 1823c2aa98e2SPeter Wemm if (s->s_mailer != NULL) 1824c2aa98e2SPeter Wemm { 1825c2aa98e2SPeter Wemm i = s->s_mailer->m_mno; 182640266059SGregory Neil Shapiro sm_free(s->s_mailer); /* XXX */ 1827c2aa98e2SPeter Wemm } 1828c2aa98e2SPeter Wemm else 1829c2aa98e2SPeter Wemm { 183040266059SGregory Neil Shapiro i = nextmailer++; 1831c2aa98e2SPeter Wemm } 1832c2aa98e2SPeter Wemm Mailer[i] = s->s_mailer = m; 1833c2aa98e2SPeter Wemm m->m_mno = i; 1834c2aa98e2SPeter Wemm } 183540266059SGregory Neil Shapiro /* 1836c2aa98e2SPeter Wemm ** MUNCHSTRING -- translate a string into internal form. 1837c2aa98e2SPeter Wemm ** 1838c2aa98e2SPeter Wemm ** Parameters: 1839c2aa98e2SPeter Wemm ** p -- the string to munch. 1840c2aa98e2SPeter Wemm ** delimptr -- if non-NULL, set to the pointer of the 1841c2aa98e2SPeter Wemm ** field delimiter character. 1842c2aa98e2SPeter Wemm ** delim -- the delimiter for the field. 1843c2aa98e2SPeter Wemm ** 1844c2aa98e2SPeter Wemm ** Returns: 1845c2aa98e2SPeter Wemm ** the munched string. 184606f25ae9SGregory Neil Shapiro ** 184706f25ae9SGregory Neil Shapiro ** Side Effects: 184806f25ae9SGregory Neil Shapiro ** the munched string is a local static buffer. 184906f25ae9SGregory Neil Shapiro ** it must be copied before the function is called again. 1850c2aa98e2SPeter Wemm */ 1851c2aa98e2SPeter Wemm 1852c2aa98e2SPeter Wemm char * 1853c2aa98e2SPeter Wemm munchstring(p, delimptr, delim) 1854c2aa98e2SPeter Wemm register char *p; 1855c2aa98e2SPeter Wemm char **delimptr; 1856c2aa98e2SPeter Wemm int delim; 1857c2aa98e2SPeter Wemm { 1858c2aa98e2SPeter Wemm register char *q; 185940266059SGregory Neil Shapiro bool backslash = false; 186040266059SGregory Neil Shapiro bool quotemode = false; 1861c2aa98e2SPeter Wemm static char buf[MAXLINE]; 1862c2aa98e2SPeter Wemm 1863d0cef73dSGregory Neil Shapiro for (q = buf; *p != '\0' && q < &buf[sizeof(buf) - 1]; p++) 1864c2aa98e2SPeter Wemm { 1865c2aa98e2SPeter Wemm if (backslash) 1866c2aa98e2SPeter Wemm { 1867c2aa98e2SPeter Wemm /* everything is roughly literal */ 186840266059SGregory Neil Shapiro backslash = false; 1869c2aa98e2SPeter Wemm switch (*p) 1870c2aa98e2SPeter Wemm { 1871c2aa98e2SPeter Wemm case 'r': /* carriage return */ 1872c2aa98e2SPeter Wemm *q++ = '\r'; 1873c2aa98e2SPeter Wemm continue; 1874c2aa98e2SPeter Wemm 1875c2aa98e2SPeter Wemm case 'n': /* newline */ 1876c2aa98e2SPeter Wemm *q++ = '\n'; 1877c2aa98e2SPeter Wemm continue; 1878c2aa98e2SPeter Wemm 1879c2aa98e2SPeter Wemm case 'f': /* form feed */ 1880c2aa98e2SPeter Wemm *q++ = '\f'; 1881c2aa98e2SPeter Wemm continue; 1882c2aa98e2SPeter Wemm 1883c2aa98e2SPeter Wemm case 'b': /* backspace */ 1884c2aa98e2SPeter Wemm *q++ = '\b'; 1885c2aa98e2SPeter Wemm continue; 1886c2aa98e2SPeter Wemm } 1887c2aa98e2SPeter Wemm *q++ = *p; 1888c2aa98e2SPeter Wemm } 1889c2aa98e2SPeter Wemm else 1890c2aa98e2SPeter Wemm { 1891c2aa98e2SPeter Wemm if (*p == '\\') 189240266059SGregory Neil Shapiro backslash = true; 1893c2aa98e2SPeter Wemm else if (*p == '"') 1894c2aa98e2SPeter Wemm quotemode = !quotemode; 1895c2aa98e2SPeter Wemm else if (quotemode || *p != delim) 1896c2aa98e2SPeter Wemm *q++ = *p; 1897c2aa98e2SPeter Wemm else 1898c2aa98e2SPeter Wemm break; 1899c2aa98e2SPeter Wemm } 1900c2aa98e2SPeter Wemm } 1901c2aa98e2SPeter Wemm 1902c2aa98e2SPeter Wemm if (delimptr != NULL) 1903c2aa98e2SPeter Wemm *delimptr = p; 1904c2aa98e2SPeter Wemm *q++ = '\0'; 190506f25ae9SGregory Neil Shapiro return buf; 1906c2aa98e2SPeter Wemm } 190740266059SGregory Neil Shapiro /* 190840266059SGregory Neil Shapiro ** EXTRQUOTSTR -- extract a (quoted) string. 190940266059SGregory Neil Shapiro ** 191040266059SGregory Neil Shapiro ** This routine deals with quoted (") strings and escaped 191140266059SGregory Neil Shapiro ** spaces (\\ ). 191240266059SGregory Neil Shapiro ** 191340266059SGregory Neil Shapiro ** Parameters: 191440266059SGregory Neil Shapiro ** p -- source string. 191540266059SGregory Neil Shapiro ** delimptr -- if non-NULL, set to the pointer of the 191640266059SGregory Neil Shapiro ** field delimiter character. 191740266059SGregory Neil Shapiro ** delimbuf -- delimiters for the field. 191840266059SGregory Neil Shapiro ** st -- if non-NULL, store the return value (whether the 191940266059SGregory Neil Shapiro ** string was correctly quoted) here. 192040266059SGregory Neil Shapiro ** 192140266059SGregory Neil Shapiro ** Returns: 192240266059SGregory Neil Shapiro ** the extracted string. 192340266059SGregory Neil Shapiro ** 192440266059SGregory Neil Shapiro ** Side Effects: 192540266059SGregory Neil Shapiro ** the returned string is a local static buffer. 192640266059SGregory Neil Shapiro ** it must be copied before the function is called again. 192740266059SGregory Neil Shapiro */ 192840266059SGregory Neil Shapiro 192940266059SGregory Neil Shapiro static char * 193040266059SGregory Neil Shapiro extrquotstr(p, delimptr, delimbuf, st) 193140266059SGregory Neil Shapiro register char *p; 193240266059SGregory Neil Shapiro char **delimptr; 193340266059SGregory Neil Shapiro char *delimbuf; 193440266059SGregory Neil Shapiro bool *st; 193540266059SGregory Neil Shapiro { 193640266059SGregory Neil Shapiro register char *q; 193740266059SGregory Neil Shapiro bool backslash = false; 193840266059SGregory Neil Shapiro bool quotemode = false; 193940266059SGregory Neil Shapiro static char buf[MAXLINE]; 194040266059SGregory Neil Shapiro 1941d0cef73dSGregory Neil Shapiro for (q = buf; *p != '\0' && q < &buf[sizeof(buf) - 1]; p++) 194240266059SGregory Neil Shapiro { 194340266059SGregory Neil Shapiro if (backslash) 194440266059SGregory Neil Shapiro { 194540266059SGregory Neil Shapiro backslash = false; 194640266059SGregory Neil Shapiro if (*p != ' ') 194740266059SGregory Neil Shapiro *q++ = '\\'; 194840266059SGregory Neil Shapiro } 194940266059SGregory Neil Shapiro if (*p == '\\') 195040266059SGregory Neil Shapiro backslash = true; 195140266059SGregory Neil Shapiro else if (*p == '"') 195240266059SGregory Neil Shapiro quotemode = !quotemode; 195340266059SGregory Neil Shapiro else if (quotemode || 195440266059SGregory Neil Shapiro strchr(delimbuf, (int) *p) == NULL) 195540266059SGregory Neil Shapiro *q++ = *p; 195640266059SGregory Neil Shapiro else 195740266059SGregory Neil Shapiro break; 195840266059SGregory Neil Shapiro } 195940266059SGregory Neil Shapiro 196040266059SGregory Neil Shapiro if (delimptr != NULL) 196140266059SGregory Neil Shapiro *delimptr = p; 196240266059SGregory Neil Shapiro *q++ = '\0'; 196340266059SGregory Neil Shapiro if (st != NULL) 196440266059SGregory Neil Shapiro *st = !(quotemode || backslash); 196540266059SGregory Neil Shapiro return buf; 196640266059SGregory Neil Shapiro } 196740266059SGregory Neil Shapiro /* 1968c2aa98e2SPeter Wemm ** MAKEARGV -- break up a string into words 1969c2aa98e2SPeter Wemm ** 1970c2aa98e2SPeter Wemm ** Parameters: 1971c2aa98e2SPeter Wemm ** p -- the string to break up. 1972c2aa98e2SPeter Wemm ** 1973c2aa98e2SPeter Wemm ** Returns: 1974c2aa98e2SPeter Wemm ** a char **argv (dynamically allocated) 1975c2aa98e2SPeter Wemm ** 1976c2aa98e2SPeter Wemm ** Side Effects: 1977c2aa98e2SPeter Wemm ** munges p. 1978c2aa98e2SPeter Wemm */ 1979c2aa98e2SPeter Wemm 198006f25ae9SGregory Neil Shapiro static char ** 1981c2aa98e2SPeter Wemm makeargv(p) 1982c2aa98e2SPeter Wemm register char *p; 1983c2aa98e2SPeter Wemm { 1984c2aa98e2SPeter Wemm char *q; 1985c2aa98e2SPeter Wemm int i; 1986c2aa98e2SPeter Wemm char **avp; 1987c2aa98e2SPeter Wemm char *argv[MAXPV + 1]; 1988c2aa98e2SPeter Wemm 1989c2aa98e2SPeter Wemm /* take apart the words */ 1990c2aa98e2SPeter Wemm i = 0; 1991c2aa98e2SPeter Wemm while (*p != '\0' && i < MAXPV) 1992c2aa98e2SPeter Wemm { 1993c2aa98e2SPeter Wemm q = p; 19945b0945b5SGregory Neil Shapiro while (*p != '\0' && !(SM_ISSPACE(*p))) 1995c2aa98e2SPeter Wemm p++; 19965b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 1997c2aa98e2SPeter Wemm *p++ = '\0'; 1998c2aa98e2SPeter Wemm argv[i++] = newstr(q); 1999c2aa98e2SPeter Wemm } 2000c2aa98e2SPeter Wemm argv[i++] = NULL; 2001c2aa98e2SPeter Wemm 2002c2aa98e2SPeter Wemm /* now make a copy of the argv */ 2003*2fb4f839SGregory Neil Shapiro avp = (char **) sm_malloc_tagged_x(sizeof(*avp) * i, "makeargv", 0, 0); 2004d0cef73dSGregory Neil Shapiro memmove((char *) avp, (char *) argv, sizeof(*avp) * i); 2005c2aa98e2SPeter Wemm 200606f25ae9SGregory Neil Shapiro return avp; 2007c2aa98e2SPeter Wemm } 200840266059SGregory Neil Shapiro /* 2009c2aa98e2SPeter Wemm ** PRINTRULES -- print rewrite rules (for debugging) 2010c2aa98e2SPeter Wemm ** 2011c2aa98e2SPeter Wemm ** Parameters: 2012c2aa98e2SPeter Wemm ** none. 2013c2aa98e2SPeter Wemm ** 2014c2aa98e2SPeter Wemm ** Returns: 2015c2aa98e2SPeter Wemm ** none. 2016c2aa98e2SPeter Wemm ** 2017c2aa98e2SPeter Wemm ** Side Effects: 2018c2aa98e2SPeter Wemm ** prints rewrite rules. 2019c2aa98e2SPeter Wemm */ 2020c2aa98e2SPeter Wemm 2021c2aa98e2SPeter Wemm void 2022c2aa98e2SPeter Wemm printrules() 2023c2aa98e2SPeter Wemm { 2024c2aa98e2SPeter Wemm register struct rewrite *rwp; 2025c2aa98e2SPeter Wemm register int ruleset; 2026c2aa98e2SPeter Wemm 2027c2aa98e2SPeter Wemm for (ruleset = 0; ruleset < 10; ruleset++) 2028c2aa98e2SPeter Wemm { 2029c2aa98e2SPeter Wemm if (RewriteRules[ruleset] == NULL) 2030c2aa98e2SPeter Wemm continue; 2031e92d3f3fSGregory Neil Shapiro sm_dprintf("\n----Rule Set %d:", ruleset); 2032c2aa98e2SPeter Wemm 2033c2aa98e2SPeter Wemm for (rwp = RewriteRules[ruleset]; rwp != NULL; rwp = rwp->r_next) 2034c2aa98e2SPeter Wemm { 2035e92d3f3fSGregory Neil Shapiro sm_dprintf("\nLHS:"); 2036e92d3f3fSGregory Neil Shapiro printav(sm_debug_file(), rwp->r_lhs); 2037e92d3f3fSGregory Neil Shapiro sm_dprintf("RHS:"); 2038e92d3f3fSGregory Neil Shapiro printav(sm_debug_file(), rwp->r_rhs); 2039c2aa98e2SPeter Wemm } 2040c2aa98e2SPeter Wemm } 2041c2aa98e2SPeter Wemm } 204240266059SGregory Neil Shapiro /* 2043c2aa98e2SPeter Wemm ** PRINTMAILER -- print mailer structure (for debugging) 2044c2aa98e2SPeter Wemm ** 2045c2aa98e2SPeter Wemm ** Parameters: 2046e92d3f3fSGregory Neil Shapiro ** fp -- output file 2047c2aa98e2SPeter Wemm ** m -- the mailer to print 2048c2aa98e2SPeter Wemm ** 2049c2aa98e2SPeter Wemm ** Returns: 2050c2aa98e2SPeter Wemm ** none. 2051c2aa98e2SPeter Wemm */ 2052c2aa98e2SPeter Wemm 2053c2aa98e2SPeter Wemm void 2054e92d3f3fSGregory Neil Shapiro printmailer(fp, m) 2055e92d3f3fSGregory Neil Shapiro SM_FILE_T *fp; 2056c2aa98e2SPeter Wemm register MAILER *m; 2057c2aa98e2SPeter Wemm { 2058c2aa98e2SPeter Wemm int j; 2059c2aa98e2SPeter Wemm 2060e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, 206140266059SGregory Neil Shapiro "mailer %d (%s): P=%s S=", m->m_mno, m->m_name, 206240266059SGregory Neil Shapiro m->m_mailer); 206306f25ae9SGregory Neil Shapiro if (RuleSetNames[m->m_se_rwset] == NULL) 2064e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%d/", 206540266059SGregory Neil Shapiro m->m_se_rwset); 206606f25ae9SGregory Neil Shapiro else 2067e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%s/", 206840266059SGregory Neil Shapiro RuleSetNames[m->m_se_rwset]); 206906f25ae9SGregory Neil Shapiro if (RuleSetNames[m->m_sh_rwset] == NULL) 2070e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%d R=", 207140266059SGregory Neil Shapiro m->m_sh_rwset); 207206f25ae9SGregory Neil Shapiro else 2073e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%s R=", 207440266059SGregory Neil Shapiro RuleSetNames[m->m_sh_rwset]); 207506f25ae9SGregory Neil Shapiro if (RuleSetNames[m->m_re_rwset] == NULL) 2076e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%d/", 207740266059SGregory Neil Shapiro m->m_re_rwset); 207806f25ae9SGregory Neil Shapiro else 2079e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%s/", 208040266059SGregory Neil Shapiro RuleSetNames[m->m_re_rwset]); 208106f25ae9SGregory Neil Shapiro if (RuleSetNames[m->m_rh_rwset] == NULL) 2082e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%d ", 208340266059SGregory Neil Shapiro m->m_rh_rwset); 208406f25ae9SGregory Neil Shapiro else 2085e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%s ", 208640266059SGregory Neil Shapiro RuleSetNames[m->m_rh_rwset]); 2087e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "M=%ld U=%d:%d F=", 208840266059SGregory Neil Shapiro m->m_maxsize, (int) m->m_uid, (int) m->m_gid); 2089c2aa98e2SPeter Wemm for (j = '\0'; j <= '\177'; j++) 2090c2aa98e2SPeter Wemm if (bitnset(j, m->m_flags)) 2091e92d3f3fSGregory Neil Shapiro (void) sm_io_putc(fp, SM_TIME_DEFAULT, j); 2092e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, " L=%d E=", 209340266059SGregory Neil Shapiro m->m_linelimit); 2094e92d3f3fSGregory Neil Shapiro xputs(fp, m->m_eol); 2095c2aa98e2SPeter Wemm if (m->m_defcharset != NULL) 2096e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, " C=%s", 209740266059SGregory Neil Shapiro m->m_defcharset); 2098e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, " T=%s/%s/%s", 209940266059SGregory Neil Shapiro m->m_mtatype == NULL 210040266059SGregory Neil Shapiro ? "<undefined>" : m->m_mtatype, 210140266059SGregory Neil Shapiro m->m_addrtype == NULL 210240266059SGregory Neil Shapiro ? "<undefined>" : m->m_addrtype, 210340266059SGregory Neil Shapiro m->m_diagtype == NULL 210440266059SGregory Neil Shapiro ? "<undefined>" : m->m_diagtype); 2105e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, " r=%d", m->m_maxrcpt); 2106c2aa98e2SPeter Wemm if (m->m_argv != NULL) 2107c2aa98e2SPeter Wemm { 2108c2aa98e2SPeter Wemm char **a = m->m_argv; 2109c2aa98e2SPeter Wemm 2110e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, " A="); 2111c2aa98e2SPeter Wemm while (*a != NULL) 2112c2aa98e2SPeter Wemm { 2113c2aa98e2SPeter Wemm if (a != m->m_argv) 2114e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, 211540266059SGregory Neil Shapiro " "); 2116e92d3f3fSGregory Neil Shapiro xputs(fp, *a++); 2117c2aa98e2SPeter Wemm } 2118c2aa98e2SPeter Wemm } 2119e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "\n"); 2120c2aa98e2SPeter Wemm } 2121da7d7b9cSGregory Neil Shapiro 2122da7d7b9cSGregory Neil Shapiro #if STARTTLS 2123da7d7b9cSGregory Neil Shapiro static struct ssl_options 2124da7d7b9cSGregory Neil Shapiro { 2125da7d7b9cSGregory Neil Shapiro const char *sslopt_name; /* name of the flag */ 2126da7d7b9cSGregory Neil Shapiro long sslopt_bits; /* bits to set/clear */ 2127da7d7b9cSGregory Neil Shapiro } SSL_Option[] = 2128da7d7b9cSGregory Neil Shapiro { 2129da7d7b9cSGregory Neil Shapiro /* Workaround for bugs are turned on by default (as well as some others) */ 2130da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_MICROSOFT_SESS_ID_BUG 2131da7d7b9cSGregory Neil Shapiro { "SSL_OP_MICROSOFT_SESS_ID_BUG", SSL_OP_MICROSOFT_SESS_ID_BUG }, 2132da7d7b9cSGregory Neil Shapiro # endif 2133da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG 2134da7d7b9cSGregory Neil Shapiro { "SSL_OP_NETSCAPE_CHALLENGE_BUG", SSL_OP_NETSCAPE_CHALLENGE_BUG }, 2135da7d7b9cSGregory Neil Shapiro # endif 2136da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_LEGACY_SERVER_CONNECT 2137da7d7b9cSGregory Neil Shapiro { "SSL_OP_LEGACY_SERVER_CONNECT", SSL_OP_LEGACY_SERVER_CONNECT }, 2138da7d7b9cSGregory Neil Shapiro # endif 2139da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 2140da7d7b9cSGregory Neil Shapiro { "SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG }, 2141da7d7b9cSGregory Neil Shapiro # endif 2142da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 2143da7d7b9cSGregory Neil Shapiro { "SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG", SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG }, 2144da7d7b9cSGregory Neil Shapiro # endif 2145da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 2146da7d7b9cSGregory Neil Shapiro { "SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER", SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER }, 2147da7d7b9cSGregory Neil Shapiro # endif 2148da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING 2149da7d7b9cSGregory Neil Shapiro { "SSL_OP_MSIE_SSLV2_RSA_PADDING", SSL_OP_MSIE_SSLV2_RSA_PADDING }, 2150da7d7b9cSGregory Neil Shapiro # endif 2151da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG 2152da7d7b9cSGregory Neil Shapiro { "SSL_OP_SSLEAY_080_CLIENT_DH_BUG", SSL_OP_SSLEAY_080_CLIENT_DH_BUG }, 2153da7d7b9cSGregory Neil Shapiro # endif 2154da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_TLS_D5_BUG 2155da7d7b9cSGregory Neil Shapiro { "SSL_OP_TLS_D5_BUG", SSL_OP_TLS_D5_BUG }, 2156da7d7b9cSGregory Neil Shapiro # endif 2157da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_TLS_BLOCK_PADDING_BUG 2158da7d7b9cSGregory Neil Shapiro { "SSL_OP_TLS_BLOCK_PADDING_BUG", SSL_OP_TLS_BLOCK_PADDING_BUG }, 2159da7d7b9cSGregory Neil Shapiro # endif 2160da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 2161da7d7b9cSGregory Neil Shapiro { "SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS", SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS }, 2162da7d7b9cSGregory Neil Shapiro # endif 2163da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_ALL 2164da7d7b9cSGregory Neil Shapiro { "SSL_OP_ALL", SSL_OP_ALL }, 2165da7d7b9cSGregory Neil Shapiro # endif 2166da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_QUERY_MTU 2167da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_QUERY_MTU", SSL_OP_NO_QUERY_MTU }, 2168da7d7b9cSGregory Neil Shapiro # endif 2169da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_COOKIE_EXCHANGE 2170da7d7b9cSGregory Neil Shapiro { "SSL_OP_COOKIE_EXCHANGE", SSL_OP_COOKIE_EXCHANGE }, 2171da7d7b9cSGregory Neil Shapiro # endif 2172da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_TICKET 2173da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_TICKET", SSL_OP_NO_TICKET }, 2174da7d7b9cSGregory Neil Shapiro # endif 2175da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_CISCO_ANYCONNECT 2176da7d7b9cSGregory Neil Shapiro { "SSL_OP_CISCO_ANYCONNECT", SSL_OP_CISCO_ANYCONNECT }, 2177da7d7b9cSGregory Neil Shapiro # endif 2178da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 2179da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION", SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION }, 2180da7d7b9cSGregory Neil Shapiro # endif 2181da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_COMPRESSION 2182da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_COMPRESSION", SSL_OP_NO_COMPRESSION }, 2183da7d7b9cSGregory Neil Shapiro # endif 2184da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 2185da7d7b9cSGregory Neil Shapiro { "SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION", SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION }, 2186da7d7b9cSGregory Neil Shapiro # endif 2187da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_SINGLE_ECDH_USE 2188da7d7b9cSGregory Neil Shapiro { "SSL_OP_SINGLE_ECDH_USE", SSL_OP_SINGLE_ECDH_USE }, 2189da7d7b9cSGregory Neil Shapiro # endif 2190da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_SINGLE_DH_USE 2191da7d7b9cSGregory Neil Shapiro { "SSL_OP_SINGLE_DH_USE", SSL_OP_SINGLE_DH_USE }, 2192da7d7b9cSGregory Neil Shapiro # endif 2193da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_EPHEMERAL_RSA 2194da7d7b9cSGregory Neil Shapiro { "SSL_OP_EPHEMERAL_RSA", SSL_OP_EPHEMERAL_RSA }, 2195da7d7b9cSGregory Neil Shapiro # endif 2196da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_CIPHER_SERVER_PREFERENCE 2197da7d7b9cSGregory Neil Shapiro { "SSL_OP_CIPHER_SERVER_PREFERENCE", SSL_OP_CIPHER_SERVER_PREFERENCE }, 2198da7d7b9cSGregory Neil Shapiro # endif 2199da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_TLS_ROLLBACK_BUG 2200da7d7b9cSGregory Neil Shapiro { "SSL_OP_TLS_ROLLBACK_BUG", SSL_OP_TLS_ROLLBACK_BUG }, 2201da7d7b9cSGregory Neil Shapiro # endif 2202da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_SSLv2 2203da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_SSLv2", SSL_OP_NO_SSLv2 }, 2204da7d7b9cSGregory Neil Shapiro # endif 2205da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_SSLv3 2206da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_SSLv3", SSL_OP_NO_SSLv3 }, 2207da7d7b9cSGregory Neil Shapiro # endif 2208da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_TLSv1 2209da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_TLSv1", SSL_OP_NO_TLSv1 }, 2210da7d7b9cSGregory Neil Shapiro # endif 22115b0945b5SGregory Neil Shapiro # ifdef SSL_OP_NO_TLSv1_3 22125b0945b5SGregory Neil Shapiro { "SSL_OP_NO_TLSv1_3", SSL_OP_NO_TLSv1_3 }, 22135b0945b5SGregory Neil Shapiro # endif 2214da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_TLSv1_2 2215da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_TLSv1_2", SSL_OP_NO_TLSv1_2 }, 2216da7d7b9cSGregory Neil Shapiro # endif 2217da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NO_TLSv1_1 2218da7d7b9cSGregory Neil Shapiro { "SSL_OP_NO_TLSv1_1", SSL_OP_NO_TLSv1_1 }, 2219da7d7b9cSGregory Neil Shapiro # endif 2220da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_PKCS1_CHECK_1 2221da7d7b9cSGregory Neil Shapiro { "SSL_OP_PKCS1_CHECK_1", SSL_OP_PKCS1_CHECK_1 }, 2222da7d7b9cSGregory Neil Shapiro # endif 2223da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_PKCS1_CHECK_2 2224da7d7b9cSGregory Neil Shapiro { "SSL_OP_PKCS1_CHECK_2", SSL_OP_PKCS1_CHECK_2 }, 2225da7d7b9cSGregory Neil Shapiro # endif 2226da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NETSCAPE_CA_DN_BUG 2227da7d7b9cSGregory Neil Shapiro { "SSL_OP_NETSCAPE_CA_DN_BUG", SSL_OP_NETSCAPE_CA_DN_BUG }, 2228da7d7b9cSGregory Neil Shapiro # endif 2229da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 2230da7d7b9cSGregory Neil Shapiro { "SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG }, 2231da7d7b9cSGregory Neil Shapiro # endif 2232da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_CRYPTOPRO_TLSEXT_BUG 2233da7d7b9cSGregory Neil Shapiro { "SSL_OP_CRYPTOPRO_TLSEXT_BUG", SSL_OP_CRYPTOPRO_TLSEXT_BUG }, 2234da7d7b9cSGregory Neil Shapiro # endif 2235da7d7b9cSGregory Neil Shapiro # ifdef SSL_OP_TLSEXT_PADDING 2236da7d7b9cSGregory Neil Shapiro { "SSL_OP_TLSEXT_PADDING", SSL_OP_TLSEXT_PADDING }, 2237da7d7b9cSGregory Neil Shapiro # endif 22385b0945b5SGregory Neil Shapiro # ifdef SSL_OP_NO_RENEGOTIATION 22395b0945b5SGregory Neil Shapiro { "SSL_OP_NO_RENEGOTIATION", SSL_OP_NO_RENEGOTIATION }, 22405b0945b5SGregory Neil Shapiro # endif 22415b0945b5SGregory Neil Shapiro # ifdef SSL_OP_NO_ANTI_REPLAY 22425b0945b5SGregory Neil Shapiro { "SSL_OP_NO_ANTI_REPLAY", SSL_OP_NO_ANTI_REPLAY }, 22435b0945b5SGregory Neil Shapiro # endif 22445b0945b5SGregory Neil Shapiro # ifdef SSL_OP_ALLOW_NO_DHE_KEX 22455b0945b5SGregory Neil Shapiro { "SSL_OP_ALLOW_NO_DHE_KEX", SSL_OP_ALLOW_NO_DHE_KEX }, 22465b0945b5SGregory Neil Shapiro # endif 22475b0945b5SGregory Neil Shapiro # ifdef SSL_OP_NO_ENCRYPT_THEN_MAC 22485b0945b5SGregory Neil Shapiro { "SSL_OP_NO_ENCRYPT_THEN_MAC", SSL_OP_NO_ENCRYPT_THEN_MAC }, 22495b0945b5SGregory Neil Shapiro # endif 22505b0945b5SGregory Neil Shapiro # ifdef SSL_OP_ENABLE_MIDDLEBOX_COMPAT 22515b0945b5SGregory Neil Shapiro { "SSL_OP_ENABLE_MIDDLEBOX_COMPAT", SSL_OP_ENABLE_MIDDLEBOX_COMPAT }, 22525b0945b5SGregory Neil Shapiro # endif 22535b0945b5SGregory Neil Shapiro # ifdef SSL_OP_PRIORITIZE_CHACHA 22545b0945b5SGregory Neil Shapiro { "SSL_OP_PRIORITIZE_CHACHA", SSL_OP_PRIORITIZE_CHACHA }, 22555b0945b5SGregory Neil Shapiro # endif 2256da7d7b9cSGregory Neil Shapiro { NULL, 0 } 2257da7d7b9cSGregory Neil Shapiro }; 2258da7d7b9cSGregory Neil Shapiro 2259da7d7b9cSGregory Neil Shapiro /* 2260da7d7b9cSGregory Neil Shapiro ** READSSLOPTIONS -- read SSL_OP_* values 2261da7d7b9cSGregory Neil Shapiro ** 2262da7d7b9cSGregory Neil Shapiro ** Parameters: 2263da7d7b9cSGregory Neil Shapiro ** opt -- name of option (can be NULL) 2264da7d7b9cSGregory Neil Shapiro ** val -- string with SSL_OP_* values or hex value 2265da7d7b9cSGregory Neil Shapiro ** delim -- end of string (e.g., '\0' or ';') 2266da7d7b9cSGregory Neil Shapiro ** pssloptions -- return value (output) 2267da7d7b9cSGregory Neil Shapiro ** 2268da7d7b9cSGregory Neil Shapiro ** Returns: 2269da7d7b9cSGregory Neil Shapiro ** 0 on success. 2270da7d7b9cSGregory Neil Shapiro */ 2271da7d7b9cSGregory Neil Shapiro 2272da7d7b9cSGregory Neil Shapiro # define SSLOPERR_NAN 1 2273da7d7b9cSGregory Neil Shapiro # define SSLOPERR_NOTFOUND 2 22745b0945b5SGregory Neil Shapiro 22755b0945b5SGregory Neil Shapiro static int readssloptions __P((char *, char *, unsigned long *, int )); 2276da7d7b9cSGregory Neil Shapiro 2277da7d7b9cSGregory Neil Shapiro static int 2278da7d7b9cSGregory Neil Shapiro readssloptions(opt, val, pssloptions, delim) 2279da7d7b9cSGregory Neil Shapiro char *opt; 2280da7d7b9cSGregory Neil Shapiro char *val; 2281da7d7b9cSGregory Neil Shapiro unsigned long *pssloptions; 2282da7d7b9cSGregory Neil Shapiro int delim; 2283da7d7b9cSGregory Neil Shapiro { 2284da7d7b9cSGregory Neil Shapiro char *p; 2285da7d7b9cSGregory Neil Shapiro int ret; 2286da7d7b9cSGregory Neil Shapiro 2287da7d7b9cSGregory Neil Shapiro ret = 0; 2288da7d7b9cSGregory Neil Shapiro for (p = val; *p != '\0' && *p != delim; ) 2289da7d7b9cSGregory Neil Shapiro { 2290da7d7b9cSGregory Neil Shapiro bool clearmode; 2291da7d7b9cSGregory Neil Shapiro char *q; 2292da7d7b9cSGregory Neil Shapiro unsigned long sslopt_val; 2293da7d7b9cSGregory Neil Shapiro struct ssl_options *sslopts; 2294da7d7b9cSGregory Neil Shapiro 2295da7d7b9cSGregory Neil Shapiro while (*p == ' ') 2296da7d7b9cSGregory Neil Shapiro p++; 2297da7d7b9cSGregory Neil Shapiro if (*p == '\0') 2298da7d7b9cSGregory Neil Shapiro break; 2299da7d7b9cSGregory Neil Shapiro clearmode = false; 2300da7d7b9cSGregory Neil Shapiro if (*p == '-' || *p == '+') 2301da7d7b9cSGregory Neil Shapiro clearmode = *p++ == '-'; 2302da7d7b9cSGregory Neil Shapiro q = p; 2303da7d7b9cSGregory Neil Shapiro while (*p != '\0' && !(SM_ISSPACE(*p)) && *p != ',') 2304da7d7b9cSGregory Neil Shapiro p++; 2305da7d7b9cSGregory Neil Shapiro if (*p != '\0') 2306da7d7b9cSGregory Neil Shapiro *p++ = '\0'; 2307da7d7b9cSGregory Neil Shapiro sslopt_val = 0; 2308da7d7b9cSGregory Neil Shapiro if (isdigit(*q)) 2309da7d7b9cSGregory Neil Shapiro { 2310da7d7b9cSGregory Neil Shapiro char *end; 2311da7d7b9cSGregory Neil Shapiro 2312da7d7b9cSGregory Neil Shapiro sslopt_val = strtoul(q, &end, 0); 2313da7d7b9cSGregory Neil Shapiro 2314da7d7b9cSGregory Neil Shapiro /* not a complete "syntax" check but good enough */ 2315da7d7b9cSGregory Neil Shapiro if (end == q) 2316da7d7b9cSGregory Neil Shapiro { 2317da7d7b9cSGregory Neil Shapiro errno = 0; 2318da7d7b9cSGregory Neil Shapiro ret = SSLOPERR_NAN; 2319da7d7b9cSGregory Neil Shapiro if (opt != NULL) 2320da7d7b9cSGregory Neil Shapiro syserr("readcf: %s option value %s not a number", 2321da7d7b9cSGregory Neil Shapiro opt, q); 2322da7d7b9cSGregory Neil Shapiro sslopt_val = 0; 2323da7d7b9cSGregory Neil Shapiro } 2324da7d7b9cSGregory Neil Shapiro } 2325da7d7b9cSGregory Neil Shapiro else 2326da7d7b9cSGregory Neil Shapiro { 2327da7d7b9cSGregory Neil Shapiro for (sslopts = SSL_Option; 2328da7d7b9cSGregory Neil Shapiro sslopts->sslopt_name != NULL; sslopts++) 2329da7d7b9cSGregory Neil Shapiro { 2330*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(q, sslopts->sslopt_name)) 2331da7d7b9cSGregory Neil Shapiro { 2332da7d7b9cSGregory Neil Shapiro sslopt_val = sslopts->sslopt_bits; 2333da7d7b9cSGregory Neil Shapiro break; 2334da7d7b9cSGregory Neil Shapiro } 2335da7d7b9cSGregory Neil Shapiro } 2336da7d7b9cSGregory Neil Shapiro if (sslopts->sslopt_name == NULL) 2337da7d7b9cSGregory Neil Shapiro { 2338da7d7b9cSGregory Neil Shapiro errno = 0; 2339da7d7b9cSGregory Neil Shapiro ret = SSLOPERR_NOTFOUND; 2340da7d7b9cSGregory Neil Shapiro if (opt != NULL) 2341da7d7b9cSGregory Neil Shapiro syserr("readcf: %s option value %s unrecognized", 2342da7d7b9cSGregory Neil Shapiro opt, q); 2343da7d7b9cSGregory Neil Shapiro } 2344da7d7b9cSGregory Neil Shapiro } 2345da7d7b9cSGregory Neil Shapiro if (sslopt_val != 0) 2346da7d7b9cSGregory Neil Shapiro { 2347da7d7b9cSGregory Neil Shapiro if (clearmode) 2348da7d7b9cSGregory Neil Shapiro *pssloptions &= ~sslopt_val; 2349da7d7b9cSGregory Neil Shapiro else 2350da7d7b9cSGregory Neil Shapiro *pssloptions |= sslopt_val; 2351da7d7b9cSGregory Neil Shapiro } 2352da7d7b9cSGregory Neil Shapiro } 2353da7d7b9cSGregory Neil Shapiro return ret; 2354da7d7b9cSGregory Neil Shapiro } 2355da7d7b9cSGregory Neil Shapiro 2356da7d7b9cSGregory Neil Shapiro /* 2357*2fb4f839SGregory Neil Shapiro ** GET_TLS_SE_FEATURES -- get TLS session features (from ruleset) 2358da7d7b9cSGregory Neil Shapiro ** 2359da7d7b9cSGregory Neil Shapiro ** Parameters: 2360da7d7b9cSGregory Neil Shapiro ** e -- envelope 2361da7d7b9cSGregory Neil Shapiro ** ssl -- TLS session context 23625b0945b5SGregory Neil Shapiro ** tlsi_ctx -- TLS info context 2363da7d7b9cSGregory Neil Shapiro ** srv -- server? 2364da7d7b9cSGregory Neil Shapiro ** 2365da7d7b9cSGregory Neil Shapiro ** Returns: 2366*2fb4f839SGregory Neil Shapiro ** EX_OK on success. 2367da7d7b9cSGregory Neil Shapiro */ 2368da7d7b9cSGregory Neil Shapiro 2369da7d7b9cSGregory Neil Shapiro int 2370*2fb4f839SGregory Neil Shapiro get_tls_se_features(e, ssl, tlsi_ctx, srv) 2371da7d7b9cSGregory Neil Shapiro ENVELOPE *e; 2372da7d7b9cSGregory Neil Shapiro SSL *ssl; 23735b0945b5SGregory Neil Shapiro tlsi_ctx_T *tlsi_ctx; 2374da7d7b9cSGregory Neil Shapiro bool srv; 2375da7d7b9cSGregory Neil Shapiro { 2376*2fb4f839SGregory Neil Shapiro bool saveQuickAbort, saveSuprErrs; 2377da7d7b9cSGregory Neil Shapiro char *optionlist, *opt, *val; 2378da7d7b9cSGregory Neil Shapiro char *keyfile, *certfile; 2379da7d7b9cSGregory Neil Shapiro size_t len, i; 2380*2fb4f839SGregory Neil Shapiro int ret, rv; 2381da7d7b9cSGregory Neil Shapiro 2382da7d7b9cSGregory Neil Shapiro # define who (srv ? "server" : "client") 2383da7d7b9cSGregory Neil Shapiro # define NAME_C_S macvalue(macid(srv ? "{client_name}" : "{server_name}"), e) 2384da7d7b9cSGregory Neil Shapiro # define ADDR_C_S macvalue(macid(srv ? "{client_addr}" : "{server_addr}"), e) 2385da7d7b9cSGregory Neil Shapiro # define WHICH srv ? "srv" : "clt" 2386da7d7b9cSGregory Neil Shapiro 2387*2fb4f839SGregory Neil Shapiro SM_REQUIRE(ssl != NULL); 2388*2fb4f839SGregory Neil Shapiro rv = EX_OK; 2389da7d7b9cSGregory Neil Shapiro keyfile = certfile = opt = val = NULL; 2390da7d7b9cSGregory Neil Shapiro saveQuickAbort = QuickAbort; 2391da7d7b9cSGregory Neil Shapiro saveSuprErrs = SuprErrs; 2392da7d7b9cSGregory Neil Shapiro SuprErrs = true; 2393da7d7b9cSGregory Neil Shapiro QuickAbort = false; 2394*2fb4f839SGregory Neil Shapiro # if _FFR_MTA_STS 2395*2fb4f839SGregory Neil Shapiro SM_FREE(STS_SNI); 2396*2fb4f839SGregory Neil Shapiro # endif 2397da7d7b9cSGregory Neil Shapiro 2398da7d7b9cSGregory Neil Shapiro optionlist = NULL; 2399*2fb4f839SGregory Neil Shapiro rv = rscheck(srv ? "tls_srv_features" : "tls_clt_features", 2400da7d7b9cSGregory Neil Shapiro NAME_C_S, ADDR_C_S, e, 2401da7d7b9cSGregory Neil Shapiro RSF_RMCOMM|RSF_ADDR|RSF_STRING, 2402*2fb4f839SGregory Neil Shapiro 5, NULL, NOQID, NULL, &optionlist); 2403*2fb4f839SGregory Neil Shapiro if (EX_OK != rv && LogLevel > 8) 2404da7d7b9cSGregory Neil Shapiro { 2405da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_NOTICE, NOQID, 2406da7d7b9cSGregory Neil Shapiro "rscheck(tls_%s_features)=failed, relay=%s [%s], errors=%d", 2407da7d7b9cSGregory Neil Shapiro WHICH, NAME_C_S, ADDR_C_S, 2408da7d7b9cSGregory Neil Shapiro Errors); 2409da7d7b9cSGregory Neil Shapiro } 2410da7d7b9cSGregory Neil Shapiro QuickAbort = saveQuickAbort; 2411da7d7b9cSGregory Neil Shapiro SuprErrs = saveSuprErrs; 2412*2fb4f839SGregory Neil Shapiro if (EX_OK == rv && LogLevel > 9) 2413da7d7b9cSGregory Neil Shapiro { 2414da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, 2415da7d7b9cSGregory Neil Shapiro "tls_%s_features=%s, relay=%s [%s]", 2416da7d7b9cSGregory Neil Shapiro WHICH, optionlist, NAME_C_S, ADDR_C_S); 2417da7d7b9cSGregory Neil Shapiro } 2418*2fb4f839SGregory Neil Shapiro if (EX_OK != rv || optionlist == NULL || (len = strlen(optionlist)) < 2) 2419da7d7b9cSGregory Neil Shapiro { 2420da7d7b9cSGregory Neil Shapiro if (LogLevel > 9) 2421da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, 2422*2fb4f839SGregory Neil Shapiro "tls_%s_features=empty, stat=%d, relay=%s [%s]", 2423*2fb4f839SGregory Neil Shapiro WHICH, rv, NAME_C_S, ADDR_C_S); 2424*2fb4f839SGregory Neil Shapiro return rv; 2425da7d7b9cSGregory Neil Shapiro } 2426da7d7b9cSGregory Neil Shapiro 2427da7d7b9cSGregory Neil Shapiro i = 0; 2428da7d7b9cSGregory Neil Shapiro if (optionlist[0] == '"' && optionlist[len - 1] == '"') 2429da7d7b9cSGregory Neil Shapiro { 2430da7d7b9cSGregory Neil Shapiro optionlist[0] = ' '; 2431da7d7b9cSGregory Neil Shapiro optionlist[--len] = '\0'; 2432da7d7b9cSGregory Neil Shapiro if (len <= 2) 2433da7d7b9cSGregory Neil Shapiro { 2434da7d7b9cSGregory Neil Shapiro if (LogLevel > 9 && len > 1) 2435da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, 2436da7d7b9cSGregory Neil Shapiro "tls_%s_features=too_short, relay=%s [%s]", 2437da7d7b9cSGregory Neil Shapiro WHICH, NAME_C_S, ADDR_C_S); 2438da7d7b9cSGregory Neil Shapiro 2439da7d7b9cSGregory Neil Shapiro /* this is not treated as error! */ 2440*2fb4f839SGregory Neil Shapiro return EX_OK; 2441da7d7b9cSGregory Neil Shapiro } 2442da7d7b9cSGregory Neil Shapiro i = 1; 2443da7d7b9cSGregory Neil Shapiro } 2444da7d7b9cSGregory Neil Shapiro 2445da7d7b9cSGregory Neil Shapiro # define INVALIDSYNTAX \ 2446da7d7b9cSGregory Neil Shapiro do { \ 2447da7d7b9cSGregory Neil Shapiro if (LogLevel > 7) \ 2448da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, \ 2449da7d7b9cSGregory Neil Shapiro "tls_%s_features=invalid_syntax, opt=%s, relay=%s [%s]", \ 2450da7d7b9cSGregory Neil Shapiro WHICH, opt, NAME_C_S, ADDR_C_S); \ 2451*2fb4f839SGregory Neil Shapiro goto fail; \ 2452da7d7b9cSGregory Neil Shapiro } while (0) 2453da7d7b9cSGregory Neil Shapiro 2454da7d7b9cSGregory Neil Shapiro # define CHECKLEN \ 2455da7d7b9cSGregory Neil Shapiro do { \ 2456da7d7b9cSGregory Neil Shapiro if (i >= len) \ 2457da7d7b9cSGregory Neil Shapiro INVALIDSYNTAX; \ 2458da7d7b9cSGregory Neil Shapiro } while (0) 2459da7d7b9cSGregory Neil Shapiro 2460da7d7b9cSGregory Neil Shapiro # define SKIPWS \ 2461da7d7b9cSGregory Neil Shapiro do { \ 2462da7d7b9cSGregory Neil Shapiro while (i < len && SM_ISSPACE(optionlist[i])) \ 2463da7d7b9cSGregory Neil Shapiro ++i; \ 2464da7d7b9cSGregory Neil Shapiro CHECKLEN; \ 2465da7d7b9cSGregory Neil Shapiro } while (0) 2466da7d7b9cSGregory Neil Shapiro 2467da7d7b9cSGregory Neil Shapiro /* parse and handle opt=val; */ 2468da7d7b9cSGregory Neil Shapiro do { 2469da7d7b9cSGregory Neil Shapiro char sep; 2470da7d7b9cSGregory Neil Shapiro 2471da7d7b9cSGregory Neil Shapiro SKIPWS; 2472da7d7b9cSGregory Neil Shapiro opt = optionlist + i; 2473da7d7b9cSGregory Neil Shapiro sep = '='; 2474da7d7b9cSGregory Neil Shapiro while (i < len && optionlist[i] != sep 2475da7d7b9cSGregory Neil Shapiro && optionlist[i] != '\0' && !SM_ISSPACE(optionlist[i])) 2476da7d7b9cSGregory Neil Shapiro ++i; 2477da7d7b9cSGregory Neil Shapiro CHECKLEN; 2478da7d7b9cSGregory Neil Shapiro while (i < len && SM_ISSPACE(optionlist[i])) 2479da7d7b9cSGregory Neil Shapiro optionlist[i++] = '\0'; 2480da7d7b9cSGregory Neil Shapiro CHECKLEN; 2481da7d7b9cSGregory Neil Shapiro if (optionlist[i] != sep) 2482da7d7b9cSGregory Neil Shapiro INVALIDSYNTAX; 2483da7d7b9cSGregory Neil Shapiro optionlist[i++] = '\0'; 2484da7d7b9cSGregory Neil Shapiro 2485da7d7b9cSGregory Neil Shapiro SKIPWS; 2486da7d7b9cSGregory Neil Shapiro val = optionlist + i; 2487da7d7b9cSGregory Neil Shapiro sep = ';'; 2488da7d7b9cSGregory Neil Shapiro while (i < len && optionlist[i] != sep && optionlist[i] != '\0') 2489da7d7b9cSGregory Neil Shapiro ++i; 2490da7d7b9cSGregory Neil Shapiro if (optionlist[i] != '\0') 2491da7d7b9cSGregory Neil Shapiro { 2492da7d7b9cSGregory Neil Shapiro CHECKLEN; 2493da7d7b9cSGregory Neil Shapiro optionlist[i++] = '\0'; 2494da7d7b9cSGregory Neil Shapiro } 2495da7d7b9cSGregory Neil Shapiro 2496da7d7b9cSGregory Neil Shapiro if (LogLevel > 13) 2497da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_DEBUG, NOQID, 2498da7d7b9cSGregory Neil Shapiro "tls_%s_features=parsed, %s=%s, relay=%s [%s]", 2499da7d7b9cSGregory Neil Shapiro WHICH, opt, val, NAME_C_S, ADDR_C_S); 2500da7d7b9cSGregory Neil Shapiro 2501*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(opt, "options")) 2502da7d7b9cSGregory Neil Shapiro { 2503da7d7b9cSGregory Neil Shapiro unsigned long ssloptions; 2504da7d7b9cSGregory Neil Shapiro 2505da7d7b9cSGregory Neil Shapiro ssloptions = 0; 2506da7d7b9cSGregory Neil Shapiro ret = readssloptions(NULL, val, &ssloptions, ';'); 2507da7d7b9cSGregory Neil Shapiro if (ret == 0) 2508da7d7b9cSGregory Neil Shapiro (void) SSL_set_options(ssl, (long) ssloptions); 2509*2fb4f839SGregory Neil Shapiro else 2510*2fb4f839SGregory Neil Shapiro { 2511*2fb4f839SGregory Neil Shapiro if (LogLevel > 8) 2512da7d7b9cSGregory Neil Shapiro { 2513da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_WARNING, NOQID, 2514da7d7b9cSGregory Neil Shapiro "tls_%s_features=%s, error=%s, relay=%s [%s]", 2515da7d7b9cSGregory Neil Shapiro WHICH, val, 2516da7d7b9cSGregory Neil Shapiro (ret == SSLOPERR_NAN) ? "not a number" : 2517da7d7b9cSGregory Neil Shapiro ((ret == SSLOPERR_NOTFOUND) ? "SSL_OP not found" : 2518da7d7b9cSGregory Neil Shapiro "unknown"), 2519da7d7b9cSGregory Neil Shapiro NAME_C_S, ADDR_C_S); 2520da7d7b9cSGregory Neil Shapiro } 2521*2fb4f839SGregory Neil Shapiro goto fail; 2522da7d7b9cSGregory Neil Shapiro } 2523*2fb4f839SGregory Neil Shapiro } 2524*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(opt, "cipherlist")) 2525da7d7b9cSGregory Neil Shapiro { 2526da7d7b9cSGregory Neil Shapiro if (SSL_set_cipher_list(ssl, val) <= 0) 2527da7d7b9cSGregory Neil Shapiro { 2528da7d7b9cSGregory Neil Shapiro if (LogLevel > 7) 2529da7d7b9cSGregory Neil Shapiro { 2530da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_WARNING, NOQID, 2531da7d7b9cSGregory Neil Shapiro "STARTTLS=%s, error: SSL_set_cipher_list(%s) failed", 2532da7d7b9cSGregory Neil Shapiro who, val); 2533da7d7b9cSGregory Neil Shapiro 25345b0945b5SGregory Neil Shapiro tlslogerr(LOG_WARNING, 9, who); 2535da7d7b9cSGregory Neil Shapiro } 2536*2fb4f839SGregory Neil Shapiro goto fail; 2537da7d7b9cSGregory Neil Shapiro } 2538da7d7b9cSGregory Neil Shapiro } 2539*2fb4f839SGregory Neil Shapiro # if MTA_HAVE_TLSv1_3 2540*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(opt, "ciphersuites")) 2541*2fb4f839SGregory Neil Shapiro { 2542*2fb4f839SGregory Neil Shapiro if (SSL_set_ciphersuites(ssl, val) <= 0) 2543*2fb4f839SGregory Neil Shapiro { 2544*2fb4f839SGregory Neil Shapiro if (LogLevel > 7) 2545*2fb4f839SGregory Neil Shapiro { 2546*2fb4f839SGregory Neil Shapiro sm_syslog(LOG_WARNING, NOQID, 2547*2fb4f839SGregory Neil Shapiro "STARTTLS=%s, error: SSL_set_ciphersuites(%s) failed", 2548*2fb4f839SGregory Neil Shapiro who, val); 2549*2fb4f839SGregory Neil Shapiro 2550*2fb4f839SGregory Neil Shapiro tlslogerr(LOG_WARNING, 9, who); 2551*2fb4f839SGregory Neil Shapiro } 2552*2fb4f839SGregory Neil Shapiro goto fail; 2553*2fb4f839SGregory Neil Shapiro } 2554*2fb4f839SGregory Neil Shapiro } 2555*2fb4f839SGregory Neil Shapiro # endif /* MTA_HAVE_TLSv1_3 */ 2556*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(opt, "flags")) 25575b0945b5SGregory Neil Shapiro { 25585b0945b5SGregory Neil Shapiro char *p; 25595b0945b5SGregory Neil Shapiro 25605b0945b5SGregory Neil Shapiro for (p = val; *p != '\0'; p++) 25615b0945b5SGregory Neil Shapiro { 25625b0945b5SGregory Neil Shapiro if (isascii(*p) && isalnum(*p)) 25635b0945b5SGregory Neil Shapiro setbitn(bitidx(*p), tlsi_ctx->tlsi_flags); 25645b0945b5SGregory Neil Shapiro } 25655b0945b5SGregory Neil Shapiro } 2566*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(opt, "keyfile")) 2567da7d7b9cSGregory Neil Shapiro keyfile = val; 2568*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(opt, "certfile")) 2569da7d7b9cSGregory Neil Shapiro certfile = val; 2570*2fb4f839SGregory Neil Shapiro # if _FFR_MTA_STS 2571*2fb4f839SGregory Neil Shapiro else if (sm_strcasecmp(opt, "servername") == 0 && 2572*2fb4f839SGregory Neil Shapiro sm_strcasecmp(val, "hostname") == 0) 2573*2fb4f839SGregory Neil Shapiro { 2574*2fb4f839SGregory Neil Shapiro char *sn; 2575*2fb4f839SGregory Neil Shapiro 2576*2fb4f839SGregory Neil Shapiro sn = macvalue(macid("{server_name}"), e); 2577*2fb4f839SGregory Neil Shapiro if (sn == NULL) 2578*2fb4f839SGregory Neil Shapiro STS_SNI = NULL; 2579*2fb4f839SGregory Neil Shapiro else 2580*2fb4f839SGregory Neil Shapiro STS_SNI = sm_strdup(sn); 2581*2fb4f839SGregory Neil Shapiro } 2582*2fb4f839SGregory Neil Shapiro else if (sm_strcasecmp(opt, "servername") == 0) 2583*2fb4f839SGregory Neil Shapiro { 2584*2fb4f839SGregory Neil Shapiro if (LogLevel > 7) 2585*2fb4f839SGregory Neil Shapiro { 2586*2fb4f839SGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, 2587*2fb4f839SGregory Neil Shapiro "tls_%s_features=servername, invalid_value=%s, relay=%s [%s]", 2588*2fb4f839SGregory Neil Shapiro WHICH, val, NAME_C_S, ADDR_C_S); 2589*2fb4f839SGregory Neil Shapiro } 2590*2fb4f839SGregory Neil Shapiro goto fail; 2591*2fb4f839SGregory Neil Shapiro } 2592*2fb4f839SGregory Neil Shapiro else if (sm_strcasecmp(opt, "sts") == 0 && 2593*2fb4f839SGregory Neil Shapiro sm_strcasecmp(val, "secure") == 0) 2594*2fb4f839SGregory Neil Shapiro setbitn(bitidx(TLSI_FL_STS_NOFB2CLR), tlsi_ctx->tlsi_flags); 2595*2fb4f839SGregory Neil Shapiro # endif /* _FFR_MTA_STS */ 2596da7d7b9cSGregory Neil Shapiro else 2597da7d7b9cSGregory Neil Shapiro { 2598da7d7b9cSGregory Neil Shapiro if (LogLevel > 7) 2599da7d7b9cSGregory Neil Shapiro { 2600da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, 2601da7d7b9cSGregory Neil Shapiro "tls_%s_features=unknown_option, opt=%s, relay=%s [%s]", 2602da7d7b9cSGregory Neil Shapiro WHICH, opt, NAME_C_S, ADDR_C_S); 2603da7d7b9cSGregory Neil Shapiro } 2604*2fb4f839SGregory Neil Shapiro goto fail; 2605da7d7b9cSGregory Neil Shapiro } 2606da7d7b9cSGregory Neil Shapiro 2607da7d7b9cSGregory Neil Shapiro } while (optionlist[i] != '\0' && i < len); 2608da7d7b9cSGregory Neil Shapiro 2609da7d7b9cSGregory Neil Shapiro /* need cert and key before we can use the options */ 2610da7d7b9cSGregory Neil Shapiro /* does not implement the "," hack for 2nd cert/key pair */ 2611da7d7b9cSGregory Neil Shapiro if (keyfile != NULL && certfile != NULL) 2612da7d7b9cSGregory Neil Shapiro { 2613da7d7b9cSGregory Neil Shapiro load_certkey(ssl, srv, certfile, keyfile); 2614da7d7b9cSGregory Neil Shapiro keyfile = certfile = NULL; 2615da7d7b9cSGregory Neil Shapiro } 2616da7d7b9cSGregory Neil Shapiro else if (keyfile != NULL || certfile != NULL) 2617da7d7b9cSGregory Neil Shapiro { 2618da7d7b9cSGregory Neil Shapiro if (LogLevel > 7) 2619da7d7b9cSGregory Neil Shapiro { 2620da7d7b9cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, 2621da7d7b9cSGregory Neil Shapiro "tls_%s_features=only_one_of_CertFile/KeyFile_specified, relay=%s [%s]", 2622da7d7b9cSGregory Neil Shapiro WHICH, NAME_C_S, ADDR_C_S); 2623da7d7b9cSGregory Neil Shapiro } 2624*2fb4f839SGregory Neil Shapiro goto fail; 2625da7d7b9cSGregory Neil Shapiro } 2626da7d7b9cSGregory Neil Shapiro 2627*2fb4f839SGregory Neil Shapiro return rv; 2628*2fb4f839SGregory Neil Shapiro 2629*2fb4f839SGregory Neil Shapiro fail: 2630*2fb4f839SGregory Neil Shapiro return EX_CONFIG; 2631da7d7b9cSGregory Neil Shapiro # undef who 2632da7d7b9cSGregory Neil Shapiro # undef NAME_C_S 2633da7d7b9cSGregory Neil Shapiro # undef ADDR_C_S 2634da7d7b9cSGregory Neil Shapiro # undef WHICH 2635da7d7b9cSGregory Neil Shapiro } 2636da7d7b9cSGregory Neil Shapiro #endif /* STARTTLS */ 2637da7d7b9cSGregory Neil Shapiro 263840266059SGregory Neil Shapiro /* 2639c2aa98e2SPeter Wemm ** SETOPTION -- set global processing option 2640c2aa98e2SPeter Wemm ** 2641c2aa98e2SPeter Wemm ** Parameters: 2642c2aa98e2SPeter Wemm ** opt -- option name. 2643c2aa98e2SPeter Wemm ** val -- option value (as a text string). 2644c2aa98e2SPeter Wemm ** safe -- set if this came from a configuration file. 2645c2aa98e2SPeter Wemm ** Some options (if set from the command line) will 2646c2aa98e2SPeter Wemm ** reset the user id to avoid security problems. 2647c2aa98e2SPeter Wemm ** sticky -- if set, don't let other setoptions override 2648c2aa98e2SPeter Wemm ** this value. 2649c2aa98e2SPeter Wemm ** e -- the main envelope. 2650c2aa98e2SPeter Wemm ** 2651c2aa98e2SPeter Wemm ** Returns: 2652c2aa98e2SPeter Wemm ** none. 2653c2aa98e2SPeter Wemm ** 2654c2aa98e2SPeter Wemm ** Side Effects: 2655c2aa98e2SPeter Wemm ** Sets options as implied by the arguments. 2656c2aa98e2SPeter Wemm */ 2657c2aa98e2SPeter Wemm 265806f25ae9SGregory Neil Shapiro static BITMAP256 StickyOpt; /* set if option is stuck */ 2659c2aa98e2SPeter Wemm 2660c2aa98e2SPeter Wemm #if NAMED_BIND 2661c2aa98e2SPeter Wemm 266206f25ae9SGregory Neil Shapiro static struct resolverflags 2663c2aa98e2SPeter Wemm { 2664c2aa98e2SPeter Wemm char *rf_name; /* name of the flag */ 2665c2aa98e2SPeter Wemm long rf_bits; /* bits to set/clear */ 2666c2aa98e2SPeter Wemm } ResolverFlags[] = 2667c2aa98e2SPeter Wemm { 2668c2aa98e2SPeter Wemm { "debug", RES_DEBUG }, 2669c2aa98e2SPeter Wemm { "aaonly", RES_AAONLY }, 2670c2aa98e2SPeter Wemm { "usevc", RES_USEVC }, 2671c2aa98e2SPeter Wemm { "primary", RES_PRIMARY }, 2672c2aa98e2SPeter Wemm { "igntc", RES_IGNTC }, 2673c2aa98e2SPeter Wemm { "recurse", RES_RECURSE }, 2674c2aa98e2SPeter Wemm { "defnames", RES_DEFNAMES }, 2675c2aa98e2SPeter Wemm { "stayopen", RES_STAYOPEN }, 2676c2aa98e2SPeter Wemm { "dnsrch", RES_DNSRCH }, 267740266059SGregory Neil Shapiro # ifdef RES_USE_INET6 267840266059SGregory Neil Shapiro { "use_inet6", RES_USE_INET6 }, 26795b0945b5SGregory Neil Shapiro # endif 26805b0945b5SGregory Neil Shapiro # ifdef RES_USE_EDNS0 26815b0945b5SGregory Neil Shapiro { "use_edns0", RES_USE_EDNS0 }, 26825b0945b5SGregory Neil Shapiro # endif 26835b0945b5SGregory Neil Shapiro # ifdef RES_USE_DNSSEC 26845b0945b5SGregory Neil Shapiro { "use_dnssec", RES_USE_DNSSEC }, 26855b0945b5SGregory Neil Shapiro # endif 26865b0945b5SGregory Neil Shapiro # if RES_TRUSTAD 26875b0945b5SGregory Neil Shapiro { "trustad", RES_TRUSTAD }, 26885b0945b5SGregory Neil Shapiro # endif 26895b0945b5SGregory Neil Shapiro { "true", 0 }, /* avoid error on old syntax */ 2690c2aa98e2SPeter Wemm { "true", 0 }, /* avoid error on old syntax */ 2691c2aa98e2SPeter Wemm { NULL, 0 } 2692c2aa98e2SPeter Wemm }; 2693c2aa98e2SPeter Wemm 269406f25ae9SGregory Neil Shapiro #endif /* NAMED_BIND */ 2695c2aa98e2SPeter Wemm 269606f25ae9SGregory Neil Shapiro #define OI_NONE 0 /* no special treatment */ 269706f25ae9SGregory Neil Shapiro #define OI_SAFE 0x0001 /* safe for random people to use */ 269806f25ae9SGregory Neil Shapiro #define OI_SUBOPT 0x0002 /* option has suboptions */ 269906f25ae9SGregory Neil Shapiro 270006f25ae9SGregory Neil Shapiro static struct optioninfo 2701c2aa98e2SPeter Wemm { 2702c2aa98e2SPeter Wemm char *o_name; /* long name of option */ 270340266059SGregory Neil Shapiro unsigned char o_code; /* short name of option */ 270440266059SGregory Neil Shapiro unsigned short o_flags; /* option flags */ 2705c2aa98e2SPeter Wemm } OptionTab[] = 2706c2aa98e2SPeter Wemm { 270706f25ae9SGregory Neil Shapiro #if defined(SUN_EXTENSIONS) && defined(REMOTE_MODE) 270806f25ae9SGregory Neil Shapiro { "RemoteMode", '>', OI_NONE }, 27095b0945b5SGregory Neil Shapiro #endif 271006f25ae9SGregory Neil Shapiro { "SevenBitInput", '7', OI_SAFE }, 271106f25ae9SGregory Neil Shapiro { "EightBitMode", '8', OI_SAFE }, 271206f25ae9SGregory Neil Shapiro { "AliasFile", 'A', OI_NONE }, 271306f25ae9SGregory Neil Shapiro { "AliasWait", 'a', OI_NONE }, 271406f25ae9SGregory Neil Shapiro { "BlankSub", 'B', OI_NONE }, 271506f25ae9SGregory Neil Shapiro { "MinFreeBlocks", 'b', OI_SAFE }, 271606f25ae9SGregory Neil Shapiro { "CheckpointInterval", 'C', OI_SAFE }, 271706f25ae9SGregory Neil Shapiro { "HoldExpensive", 'c', OI_NONE }, 271806f25ae9SGregory Neil Shapiro { "DeliveryMode", 'd', OI_SAFE }, 271906f25ae9SGregory Neil Shapiro { "ErrorHeader", 'E', OI_NONE }, 272006f25ae9SGregory Neil Shapiro { "ErrorMode", 'e', OI_SAFE }, 272106f25ae9SGregory Neil Shapiro { "TempFileMode", 'F', OI_NONE }, 272206f25ae9SGregory Neil Shapiro { "SaveFromLine", 'f', OI_NONE }, 272306f25ae9SGregory Neil Shapiro { "MatchGECOS", 'G', OI_NONE }, 272440266059SGregory Neil Shapiro 272540266059SGregory Neil Shapiro /* no long name, just here to avoid problems in setoption */ 272640266059SGregory Neil Shapiro { "", 'g', OI_NONE }, 272706f25ae9SGregory Neil Shapiro { "HelpFile", 'H', OI_NONE }, 272806f25ae9SGregory Neil Shapiro { "MaxHopCount", 'h', OI_NONE }, 272906f25ae9SGregory Neil Shapiro { "ResolverOptions", 'I', OI_NONE }, 273006f25ae9SGregory Neil Shapiro { "IgnoreDots", 'i', OI_SAFE }, 273106f25ae9SGregory Neil Shapiro { "ForwardPath", 'J', OI_NONE }, 273206f25ae9SGregory Neil Shapiro { "SendMimeErrors", 'j', OI_SAFE }, 273306f25ae9SGregory Neil Shapiro { "ConnectionCacheSize", 'k', OI_NONE }, 273406f25ae9SGregory Neil Shapiro { "ConnectionCacheTimeout", 'K', OI_NONE }, 273506f25ae9SGregory Neil Shapiro { "UseErrorsTo", 'l', OI_NONE }, 273606f25ae9SGregory Neil Shapiro { "LogLevel", 'L', OI_SAFE }, 273706f25ae9SGregory Neil Shapiro { "MeToo", 'm', OI_SAFE }, 273840266059SGregory Neil Shapiro 273940266059SGregory Neil Shapiro /* no long name, just here to avoid problems in setoption */ 274040266059SGregory Neil Shapiro { "", 'M', OI_NONE }, 274106f25ae9SGregory Neil Shapiro { "CheckAliases", 'n', OI_NONE }, 274206f25ae9SGregory Neil Shapiro { "OldStyleHeaders", 'o', OI_SAFE }, 274306f25ae9SGregory Neil Shapiro { "DaemonPortOptions", 'O', OI_NONE }, 274406f25ae9SGregory Neil Shapiro { "PrivacyOptions", 'p', OI_SAFE }, 274506f25ae9SGregory Neil Shapiro { "PostmasterCopy", 'P', OI_NONE }, 274606f25ae9SGregory Neil Shapiro { "QueueFactor", 'q', OI_NONE }, 274706f25ae9SGregory Neil Shapiro { "QueueDirectory", 'Q', OI_NONE }, 274806f25ae9SGregory Neil Shapiro { "DontPruneRoutes", 'R', OI_NONE }, 274906f25ae9SGregory Neil Shapiro { "Timeout", 'r', OI_SUBOPT }, 275006f25ae9SGregory Neil Shapiro { "StatusFile", 'S', OI_NONE }, 275106f25ae9SGregory Neil Shapiro { "SuperSafe", 's', OI_SAFE }, 275206f25ae9SGregory Neil Shapiro { "QueueTimeout", 'T', OI_NONE }, 275306f25ae9SGregory Neil Shapiro { "TimeZoneSpec", 't', OI_NONE }, 275406f25ae9SGregory Neil Shapiro { "UserDatabaseSpec", 'U', OI_NONE }, 275506f25ae9SGregory Neil Shapiro { "DefaultUser", 'u', OI_NONE }, 275606f25ae9SGregory Neil Shapiro { "FallbackMXhost", 'V', OI_NONE }, 275706f25ae9SGregory Neil Shapiro { "Verbose", 'v', OI_SAFE }, 275806f25ae9SGregory Neil Shapiro { "TryNullMXList", 'w', OI_NONE }, 275906f25ae9SGregory Neil Shapiro { "QueueLA", 'x', OI_NONE }, 276006f25ae9SGregory Neil Shapiro { "RefuseLA", 'X', OI_NONE }, 276106f25ae9SGregory Neil Shapiro { "RecipientFactor", 'y', OI_NONE }, 276206f25ae9SGregory Neil Shapiro { "ForkEachJob", 'Y', OI_NONE }, 276306f25ae9SGregory Neil Shapiro { "ClassFactor", 'z', OI_NONE }, 276406f25ae9SGregory Neil Shapiro { "RetryFactor", 'Z', OI_NONE }, 2765c2aa98e2SPeter Wemm #define O_QUEUESORTORD 0x81 276606f25ae9SGregory Neil Shapiro { "QueueSortOrder", O_QUEUESORTORD, OI_SAFE }, 2767c2aa98e2SPeter Wemm #define O_HOSTSFILE 0x82 276806f25ae9SGregory Neil Shapiro { "HostsFile", O_HOSTSFILE, OI_NONE }, 2769c2aa98e2SPeter Wemm #define O_MQA 0x83 277006f25ae9SGregory Neil Shapiro { "MinQueueAge", O_MQA, OI_SAFE }, 2771c2aa98e2SPeter Wemm #define O_DEFCHARSET 0x85 277206f25ae9SGregory Neil Shapiro { "DefaultCharSet", O_DEFCHARSET, OI_SAFE }, 2773c2aa98e2SPeter Wemm #define O_SSFILE 0x86 277406f25ae9SGregory Neil Shapiro { "ServiceSwitchFile", O_SSFILE, OI_NONE }, 2775c2aa98e2SPeter Wemm #define O_DIALDELAY 0x87 277606f25ae9SGregory Neil Shapiro { "DialDelay", O_DIALDELAY, OI_SAFE }, 2777c2aa98e2SPeter Wemm #define O_NORCPTACTION 0x88 277806f25ae9SGregory Neil Shapiro { "NoRecipientAction", O_NORCPTACTION, OI_SAFE }, 2779c2aa98e2SPeter Wemm #define O_SAFEFILEENV 0x89 278006f25ae9SGregory Neil Shapiro { "SafeFileEnvironment", O_SAFEFILEENV, OI_NONE }, 2781c2aa98e2SPeter Wemm #define O_MAXMSGSIZE 0x8a 278206f25ae9SGregory Neil Shapiro { "MaxMessageSize", O_MAXMSGSIZE, OI_NONE }, 2783c2aa98e2SPeter Wemm #define O_COLONOKINADDR 0x8b 278406f25ae9SGregory Neil Shapiro { "ColonOkInAddr", O_COLONOKINADDR, OI_SAFE }, 2785c2aa98e2SPeter Wemm #define O_MAXQUEUERUN 0x8c 278606f25ae9SGregory Neil Shapiro { "MaxQueueRunSize", O_MAXQUEUERUN, OI_SAFE }, 2787c2aa98e2SPeter Wemm #define O_MAXCHILDREN 0x8d 278806f25ae9SGregory Neil Shapiro { "MaxDaemonChildren", O_MAXCHILDREN, OI_NONE }, 2789c2aa98e2SPeter Wemm #define O_KEEPCNAMES 0x8e 279006f25ae9SGregory Neil Shapiro { "DontExpandCnames", O_KEEPCNAMES, OI_NONE }, 2791c2aa98e2SPeter Wemm #define O_MUSTQUOTE 0x8f 279206f25ae9SGregory Neil Shapiro { "MustQuoteChars", O_MUSTQUOTE, OI_NONE }, 2793c2aa98e2SPeter Wemm #define O_SMTPGREETING 0x90 279406f25ae9SGregory Neil Shapiro { "SmtpGreetingMessage", O_SMTPGREETING, OI_NONE }, 2795c2aa98e2SPeter Wemm #define O_UNIXFROM 0x91 279606f25ae9SGregory Neil Shapiro { "UnixFromLine", O_UNIXFROM, OI_NONE }, 2797c2aa98e2SPeter Wemm #define O_OPCHARS 0x92 279806f25ae9SGregory Neil Shapiro { "OperatorChars", O_OPCHARS, OI_NONE }, 2799c2aa98e2SPeter Wemm #define O_DONTINITGRPS 0x93 280006f25ae9SGregory Neil Shapiro { "DontInitGroups", O_DONTINITGRPS, OI_NONE }, 2801c2aa98e2SPeter Wemm #define O_SLFH 0x94 280206f25ae9SGregory Neil Shapiro { "SingleLineFromHeader", O_SLFH, OI_SAFE }, 2803c2aa98e2SPeter Wemm #define O_ABH 0x95 280406f25ae9SGregory Neil Shapiro { "AllowBogusHELO", O_ABH, OI_SAFE }, 2805c2aa98e2SPeter Wemm #define O_CONNTHROT 0x97 280606f25ae9SGregory Neil Shapiro { "ConnectionRateThrottle", O_CONNTHROT, OI_NONE }, 2807c2aa98e2SPeter Wemm #define O_UGW 0x99 280806f25ae9SGregory Neil Shapiro { "UnsafeGroupWrites", O_UGW, OI_NONE }, 2809c2aa98e2SPeter Wemm #define O_DBLBOUNCE 0x9a 281006f25ae9SGregory Neil Shapiro { "DoubleBounceAddress", O_DBLBOUNCE, OI_NONE }, 2811c2aa98e2SPeter Wemm #define O_HSDIR 0x9b 281206f25ae9SGregory Neil Shapiro { "HostStatusDirectory", O_HSDIR, OI_NONE }, 2813c2aa98e2SPeter Wemm #define O_SINGTHREAD 0x9c 281406f25ae9SGregory Neil Shapiro { "SingleThreadDelivery", O_SINGTHREAD, OI_NONE }, 2815c2aa98e2SPeter Wemm #define O_RUNASUSER 0x9d 281606f25ae9SGregory Neil Shapiro { "RunAsUser", O_RUNASUSER, OI_NONE }, 2817c2aa98e2SPeter Wemm #define O_DSN_RRT 0x9e 281806f25ae9SGregory Neil Shapiro { "RrtImpliesDsn", O_DSN_RRT, OI_NONE }, 2819c2aa98e2SPeter Wemm #define O_PIDFILE 0x9f 282006f25ae9SGregory Neil Shapiro { "PidFile", O_PIDFILE, OI_NONE }, 2821c2aa98e2SPeter Wemm #define O_DONTBLAMESENDMAIL 0xa0 282206f25ae9SGregory Neil Shapiro { "DontBlameSendmail", O_DONTBLAMESENDMAIL, OI_NONE }, 2823c2aa98e2SPeter Wemm #define O_DPI 0xa1 282406f25ae9SGregory Neil Shapiro { "DontProbeInterfaces", O_DPI, OI_NONE }, 2825c2aa98e2SPeter Wemm #define O_MAXRCPT 0xa2 282606f25ae9SGregory Neil Shapiro { "MaxRecipientsPerMessage", O_MAXRCPT, OI_SAFE }, 2827c2aa98e2SPeter Wemm #define O_DEADLETTER 0xa3 282806f25ae9SGregory Neil Shapiro { "DeadLetterDrop", O_DEADLETTER, OI_NONE }, 2829c2aa98e2SPeter Wemm #if _FFR_DONTLOCKFILESFORREAD_OPTION 2830c2aa98e2SPeter Wemm # define O_DONTLOCK 0xa4 283106f25ae9SGregory Neil Shapiro { "DontLockFilesForRead", O_DONTLOCK, OI_NONE }, 28325b0945b5SGregory Neil Shapiro #endif 2833c2aa98e2SPeter Wemm #define O_MAXALIASRCSN 0xa5 283406f25ae9SGregory Neil Shapiro { "MaxAliasRecursion", O_MAXALIASRCSN, OI_NONE }, 2835c2aa98e2SPeter Wemm #define O_CNCTONLYTO 0xa6 283606f25ae9SGregory Neil Shapiro { "ConnectOnlyTo", O_CNCTONLYTO, OI_NONE }, 2837065a643dSPeter Wemm #define O_TRUSTUSER 0xa7 283806f25ae9SGregory Neil Shapiro { "TrustedUser", O_TRUSTUSER, OI_NONE }, 2839065a643dSPeter Wemm #define O_MAXMIMEHDRLEN 0xa8 284006f25ae9SGregory Neil Shapiro { "MaxMimeHeaderLength", O_MAXMIMEHDRLEN, OI_NONE }, 2841065a643dSPeter Wemm #define O_CONTROLSOCKET 0xa9 284206f25ae9SGregory Neil Shapiro { "ControlSocketName", O_CONTROLSOCKET, OI_NONE }, 28432e43090eSPeter Wemm #define O_MAXHDRSLEN 0xaa 284406f25ae9SGregory Neil Shapiro { "MaxHeadersLength", O_MAXHDRSLEN, OI_NONE }, 284506f25ae9SGregory Neil Shapiro #if _FFR_MAX_FORWARD_ENTRIES 284606f25ae9SGregory Neil Shapiro # define O_MAXFORWARD 0xab 284706f25ae9SGregory Neil Shapiro { "MaxForwardEntries", O_MAXFORWARD, OI_NONE }, 28485b0945b5SGregory Neil Shapiro #endif 284906f25ae9SGregory Neil Shapiro #define O_PROCTITLEPREFIX 0xac 285006f25ae9SGregory Neil Shapiro { "ProcessTitlePrefix", O_PROCTITLEPREFIX, OI_NONE }, 285106f25ae9SGregory Neil Shapiro #define O_SASLINFO 0xad 285206f25ae9SGregory Neil Shapiro #if _FFR_ALLOW_SASLINFO 285306f25ae9SGregory Neil Shapiro { "DefaultAuthInfo", O_SASLINFO, OI_SAFE }, 28545b0945b5SGregory Neil Shapiro #else 285506f25ae9SGregory Neil Shapiro { "DefaultAuthInfo", O_SASLINFO, OI_NONE }, 28565b0945b5SGregory Neil Shapiro #endif 285706f25ae9SGregory Neil Shapiro #define O_SASLMECH 0xae 285806f25ae9SGregory Neil Shapiro { "AuthMechanisms", O_SASLMECH, OI_NONE }, 285906f25ae9SGregory Neil Shapiro #define O_CLIENTPORT 0xaf 286006f25ae9SGregory Neil Shapiro { "ClientPortOptions", O_CLIENTPORT, OI_NONE }, 286106f25ae9SGregory Neil Shapiro #define O_DF_BUFSIZE 0xb0 286206f25ae9SGregory Neil Shapiro { "DataFileBufferSize", O_DF_BUFSIZE, OI_NONE }, 286306f25ae9SGregory Neil Shapiro #define O_XF_BUFSIZE 0xb1 286406f25ae9SGregory Neil Shapiro { "XscriptFileBufferSize", O_XF_BUFSIZE, OI_NONE }, 286506f25ae9SGregory Neil Shapiro #define O_LDAPDEFAULTSPEC 0xb2 286606f25ae9SGregory Neil Shapiro { "LDAPDefaultSpec", O_LDAPDEFAULTSPEC, OI_NONE }, 286706f25ae9SGregory Neil Shapiro #define O_SRVCERTFILE 0xb4 286806f25ae9SGregory Neil Shapiro { "ServerCertFile", O_SRVCERTFILE, OI_NONE }, 286906f25ae9SGregory Neil Shapiro #define O_SRVKEYFILE 0xb5 2870959366dcSGregory Neil Shapiro { "ServerKeyFile", O_SRVKEYFILE, OI_NONE }, 287106f25ae9SGregory Neil Shapiro #define O_CLTCERTFILE 0xb6 287206f25ae9SGregory Neil Shapiro { "ClientCertFile", O_CLTCERTFILE, OI_NONE }, 287306f25ae9SGregory Neil Shapiro #define O_CLTKEYFILE 0xb7 2874959366dcSGregory Neil Shapiro { "ClientKeyFile", O_CLTKEYFILE, OI_NONE }, 287506f25ae9SGregory Neil Shapiro #define O_CACERTFILE 0xb8 287613bd1963SGregory Neil Shapiro { "CACertFile", O_CACERTFILE, OI_NONE }, 287706f25ae9SGregory Neil Shapiro #define O_CACERTPATH 0xb9 287813bd1963SGregory Neil Shapiro { "CACertPath", O_CACERTPATH, OI_NONE }, 287906f25ae9SGregory Neil Shapiro #define O_DHPARAMS 0xba 288006f25ae9SGregory Neil Shapiro { "DHParameters", O_DHPARAMS, OI_NONE }, 288106f25ae9SGregory Neil Shapiro #define O_INPUTMILTER 0xbb 288206f25ae9SGregory Neil Shapiro { "InputMailFilters", O_INPUTMILTER, OI_NONE }, 288306f25ae9SGregory Neil Shapiro #define O_MILTER 0xbc 288406f25ae9SGregory Neil Shapiro { "Milter", O_MILTER, OI_SUBOPT }, 288506f25ae9SGregory Neil Shapiro #define O_SASLOPTS 0xbd 288606f25ae9SGregory Neil Shapiro { "AuthOptions", O_SASLOPTS, OI_NONE }, 288706f25ae9SGregory Neil Shapiro #define O_QUEUE_FILE_MODE 0xbe 288806f25ae9SGregory Neil Shapiro { "QueueFileMode", O_QUEUE_FILE_MODE, OI_NONE }, 2889da7d7b9cSGregory Neil Shapiro #define O_DIG_ALG 0xbf 2890da7d7b9cSGregory Neil Shapiro { "CertFingerprintAlgorithm", O_DIG_ALG, OI_NONE }, 289106f25ae9SGregory Neil Shapiro #define O_CIPHERLIST 0xc0 289206f25ae9SGregory Neil Shapiro { "CipherList", O_CIPHERLIST, OI_NONE }, 289306f25ae9SGregory Neil Shapiro #define O_RANDFILE 0xc1 289406f25ae9SGregory Neil Shapiro { "RandFile", O_RANDFILE, OI_NONE }, 289540266059SGregory Neil Shapiro #define O_TLS_SRV_OPTS 0xc2 289640266059SGregory Neil Shapiro { "TLSSrvOptions", O_TLS_SRV_OPTS, OI_NONE }, 289740266059SGregory Neil Shapiro #define O_RCPTTHROT 0xc3 289840266059SGregory Neil Shapiro { "BadRcptThrottle", O_RCPTTHROT, OI_SAFE }, 289940266059SGregory Neil Shapiro #define O_DLVR_MIN 0xc4 290040266059SGregory Neil Shapiro { "DeliverByMin", O_DLVR_MIN, OI_NONE }, 290140266059SGregory Neil Shapiro #define O_MAXQUEUECHILDREN 0xc5 290240266059SGregory Neil Shapiro { "MaxQueueChildren", O_MAXQUEUECHILDREN, OI_NONE }, 290340266059SGregory Neil Shapiro #define O_MAXRUNNERSPERQUEUE 0xc6 290440266059SGregory Neil Shapiro { "MaxRunnersPerQueue", O_MAXRUNNERSPERQUEUE, OI_NONE }, 290540266059SGregory Neil Shapiro #define O_DIRECTSUBMODIFIERS 0xc7 290640266059SGregory Neil Shapiro { "DirectSubmissionModifiers", O_DIRECTSUBMODIFIERS, OI_NONE }, 290740266059SGregory Neil Shapiro #define O_NICEQUEUERUN 0xc8 290840266059SGregory Neil Shapiro { "NiceQueueRun", O_NICEQUEUERUN, OI_NONE }, 290940266059SGregory Neil Shapiro #define O_SHMKEY 0xc9 291040266059SGregory Neil Shapiro { "SharedMemoryKey", O_SHMKEY, OI_NONE }, 291140266059SGregory Neil Shapiro #define O_SASLBITS 0xca 291240266059SGregory Neil Shapiro { "AuthMaxBits", O_SASLBITS, OI_NONE }, 291340266059SGregory Neil Shapiro #define O_MBDB 0xcb 291440266059SGregory Neil Shapiro { "MailboxDatabase", O_MBDB, OI_NONE }, 291540266059SGregory Neil Shapiro #define O_MSQ 0xcc 291640266059SGregory Neil Shapiro { "UseMSP", O_MSQ, OI_NONE }, 291740266059SGregory Neil Shapiro #define O_DELAY_LA 0xcd 291840266059SGregory Neil Shapiro { "DelayLA", O_DELAY_LA, OI_NONE }, 291940266059SGregory Neil Shapiro #define O_FASTSPLIT 0xce 292040266059SGregory Neil Shapiro { "FastSplit", O_FASTSPLIT, OI_NONE }, 292140266059SGregory Neil Shapiro #define O_SOFTBOUNCE 0xcf 292240266059SGregory Neil Shapiro { "SoftBounce", O_SOFTBOUNCE, OI_NONE }, 2923605302a5SGregory Neil Shapiro #define O_SHMKEYFILE 0xd0 2924605302a5SGregory Neil Shapiro { "SharedMemoryKeyFile", O_SHMKEYFILE, OI_NONE }, 292513bd1963SGregory Neil Shapiro #define O_REJECTLOGINTERVAL 0xd1 292613bd1963SGregory Neil Shapiro { "RejectLogInterval", O_REJECTLOGINTERVAL, OI_NONE }, 292713bd1963SGregory Neil Shapiro #define O_REQUIRES_DIR_FSYNC 0xd2 292813bd1963SGregory Neil Shapiro { "RequiresDirfsync", O_REQUIRES_DIR_FSYNC, OI_NONE }, 2929e92d3f3fSGregory Neil Shapiro #define O_CONNECTION_RATE_WINDOW_SIZE 0xd3 2930e92d3f3fSGregory Neil Shapiro { "ConnectionRateWindowSize", O_CONNECTION_RATE_WINDOW_SIZE, OI_NONE }, 2931e92d3f3fSGregory Neil Shapiro #define O_CRLFILE 0xd4 2932e92d3f3fSGregory Neil Shapiro { "CRLFile", O_CRLFILE, OI_NONE }, 2933e92d3f3fSGregory Neil Shapiro #define O_FALLBACKSMARTHOST 0xd5 2934e92d3f3fSGregory Neil Shapiro { "FallbackSmartHost", O_FALLBACKSMARTHOST, OI_NONE }, 2935e92d3f3fSGregory Neil Shapiro #define O_SASLREALM 0xd6 2936e92d3f3fSGregory Neil Shapiro { "AuthRealm", O_SASLREALM, OI_NONE }, 2937e92d3f3fSGregory Neil Shapiro #define O_CRLPATH 0xd7 2938e92d3f3fSGregory Neil Shapiro { "CRLPath", O_CRLPATH, OI_NONE }, 2939e92d3f3fSGregory Neil Shapiro #define O_HELONAME 0xd8 2940e92d3f3fSGregory Neil Shapiro { "HeloName", O_HELONAME, OI_NONE }, 29414e4196cbSGregory Neil Shapiro #if _FFR_MEMSTAT 29424e4196cbSGregory Neil Shapiro # define O_REFUSELOWMEM 0xd9 29434e4196cbSGregory Neil Shapiro { "RefuseLowMem", O_REFUSELOWMEM, OI_NONE }, 29444e4196cbSGregory Neil Shapiro # define O_QUEUELOWMEM 0xda 29454e4196cbSGregory Neil Shapiro { "QueueLowMem", O_QUEUELOWMEM, OI_NONE }, 29464e4196cbSGregory Neil Shapiro # define O_MEMRESOURCE 0xdb 29474e4196cbSGregory Neil Shapiro { "MemoryResource", O_MEMRESOURCE, OI_NONE }, 29484e4196cbSGregory Neil Shapiro #endif /* _FFR_MEMSTAT */ 29494e4196cbSGregory Neil Shapiro #define O_MAXNOOPCOMMANDS 0xdc 29504e4196cbSGregory Neil Shapiro { "MaxNOOPCommands", O_MAXNOOPCOMMANDS, OI_NONE }, 29514e4196cbSGregory Neil Shapiro #if _FFR_MSG_ACCEPT 29524e4196cbSGregory Neil Shapiro # define O_MSG_ACCEPT 0xdd 29534e4196cbSGregory Neil Shapiro { "MessageAccept", O_MSG_ACCEPT, OI_NONE }, 29545b0945b5SGregory Neil Shapiro #endif 29554e4196cbSGregory Neil Shapiro #if _FFR_QUEUE_RUN_PARANOIA 29564e4196cbSGregory Neil Shapiro # define O_CHK_Q_RUNNERS 0xde 29574e4196cbSGregory Neil Shapiro { "CheckQueueRunners", O_CHK_Q_RUNNERS, OI_NONE }, 29585b0945b5SGregory Neil Shapiro #endif 2959d0cef73dSGregory Neil Shapiro #if _FFR_EIGHT_BIT_ADDR_OK 2960d0cef73dSGregory Neil Shapiro # if !ALLOW_255 2961*2fb4f839SGregory Neil Shapiro # ERROR "_FFR_EIGHT_BIT_ADDR_OK requires ALLOW_255" 29625b0945b5SGregory Neil Shapiro # endif 2963d0cef73dSGregory Neil Shapiro # define O_EIGHT_BIT_ADDR_OK 0xdf 2964d0cef73dSGregory Neil Shapiro { "EightBitAddrOK", O_EIGHT_BIT_ADDR_OK, OI_NONE }, 2965d0cef73dSGregory Neil Shapiro #endif /* _FFR_EIGHT_BIT_ADDR_OK */ 2966ffb83623SGregory Neil Shapiro #if _FFR_ADDR_TYPE_MODES 2967ffb83623SGregory Neil Shapiro # define O_ADDR_TYPE_MODES 0xe0 2968ffb83623SGregory Neil Shapiro { "AddrTypeModes", O_ADDR_TYPE_MODES, OI_NONE }, 29695b0945b5SGregory Neil Shapiro #endif 2970e3793f76SGregory Neil Shapiro #if _FFR_BADRCPT_SHUTDOWN 2971e3793f76SGregory Neil Shapiro # define O_RCPTSHUTD 0xe1 2972e3793f76SGregory Neil Shapiro { "BadRcptShutdown", O_RCPTSHUTD, OI_SAFE }, 2973e3793f76SGregory Neil Shapiro # define O_RCPTSHUTDG 0xe2 2974e3793f76SGregory Neil Shapiro { "BadRcptShutdownGood", O_RCPTSHUTDG, OI_SAFE }, 2975e3793f76SGregory Neil Shapiro #endif /* _FFR_BADRCPT_SHUTDOWN */ 29769bd497b8SGregory Neil Shapiro #define O_SRV_SSL_OPTIONS 0xe3 29779bd497b8SGregory Neil Shapiro { "ServerSSLOptions", O_SRV_SSL_OPTIONS, OI_NONE }, 29789bd497b8SGregory Neil Shapiro #define O_CLT_SSL_OPTIONS 0xe4 29799bd497b8SGregory Neil Shapiro { "ClientSSLOptions", O_CLT_SSL_OPTIONS, OI_NONE }, 29809bd497b8SGregory Neil Shapiro #define O_MAX_QUEUE_AGE 0xe5 29819bd497b8SGregory Neil Shapiro { "MaxQueueAge", O_MAX_QUEUE_AGE, OI_NONE }, 29829bd497b8SGregory Neil Shapiro #if _FFR_RCPTTHROTDELAY 29839bd497b8SGregory Neil Shapiro # define O_RCPTTHROTDELAY 0xe6 29849bd497b8SGregory Neil Shapiro { "BadRcptThrottleDelay", O_RCPTTHROTDELAY, OI_SAFE }, 29855b0945b5SGregory Neil Shapiro #endif 29866f9c8e5bSGregory Neil Shapiro #if 0 && _FFR_QOS && defined(SOL_IP) && defined(IP_TOS) 29876f9c8e5bSGregory Neil Shapiro # define O_INETQOS 0xe7 /* reserved for FFR_QOS */ 29886f9c8e5bSGregory Neil Shapiro { "InetQoS", O_INETQOS, OI_NONE }, 29896f9c8e5bSGregory Neil Shapiro #endif 2990552d4955SGregory Neil Shapiro #if STARTTLS && _FFR_FIPSMODE 2991552d4955SGregory Neil Shapiro # define O_FIPSMODE 0xe8 2992552d4955SGregory Neil Shapiro { "FIPSMode", O_FIPSMODE, OI_NONE }, 29935b0945b5SGregory Neil Shapiro #endif 2994552d4955SGregory Neil Shapiro #if _FFR_REJECT_NUL_BYTE 2995552d4955SGregory Neil Shapiro # define O_REJECTNUL 0xe9 2996552d4955SGregory Neil Shapiro { "RejectNUL", O_REJECTNUL, OI_SAFE }, 29975b0945b5SGregory Neil Shapiro #endif 2998da7d7b9cSGregory Neil Shapiro #if _FFR_BOUNCE_QUEUE 2999da7d7b9cSGregory Neil Shapiro # define O_BOUNCEQUEUE 0xea 3000da7d7b9cSGregory Neil Shapiro { "BounceQueue", O_BOUNCEQUEUE, OI_NONE }, 30015b0945b5SGregory Neil Shapiro #endif 3002da7d7b9cSGregory Neil Shapiro #if _FFR_ADD_BCC 3003da7d7b9cSGregory Neil Shapiro # define O_ADDBCC 0xeb 3004da7d7b9cSGregory Neil Shapiro { "AddBcc", O_ADDBCC, OI_NONE }, 3005da7d7b9cSGregory Neil Shapiro #endif 3006da7d7b9cSGregory Neil Shapiro #define O_USECOMPRESSEDIPV6ADDRESSES 0xec 3007da7d7b9cSGregory Neil Shapiro { "UseCompressedIPv6Addresses", O_USECOMPRESSEDIPV6ADDRESSES, OI_NONE }, 30085b0945b5SGregory Neil Shapiro #if STARTTLS 30095b0945b5SGregory Neil Shapiro # define O_SSLENGINE 0xed 30105b0945b5SGregory Neil Shapiro { "SSLEngine", O_SSLENGINE, OI_NONE }, 30115b0945b5SGregory Neil Shapiro # define O_SSLENGINEPATH 0xee 30125b0945b5SGregory Neil Shapiro { "SSLEnginePath", O_SSLENGINEPATH, OI_NONE }, 30135b0945b5SGregory Neil Shapiro # define O_TLSFB2CLEAR 0xef 30145b0945b5SGregory Neil Shapiro { "TLSFallbacktoClear", O_TLSFB2CLEAR, OI_NONE }, 30155b0945b5SGregory Neil Shapiro #endif 30165b0945b5SGregory Neil Shapiro #if DNSSEC_TEST 30175b0945b5SGregory Neil Shapiro # define O_NSPORTIP 0xf0 30185b0945b5SGregory Neil Shapiro { "NameServer", O_NSPORTIP, OI_NONE }, 30195b0945b5SGregory Neil Shapiro #endif 30205b0945b5SGregory Neil Shapiro #if DANE 30215b0945b5SGregory Neil Shapiro # define O_DANE 0xf1 30225b0945b5SGregory Neil Shapiro { "DANE", O_DANE, OI_NONE }, 30235b0945b5SGregory Neil Shapiro #endif 30245b0945b5SGregory Neil Shapiro #if DNSSEC_TEST 30255b0945b5SGregory Neil Shapiro # define O_NSSRCHLIST 0xf2 30265b0945b5SGregory Neil Shapiro { "NameSearchList", O_NSSRCHLIST, OI_NONE }, 30275b0945b5SGregory Neil Shapiro #endif 30285b0945b5SGregory Neil Shapiro #if _FFR_BLANKENV_MACV 30295b0945b5SGregory Neil Shapiro # define O_HACKS 0xf4 30305b0945b5SGregory Neil Shapiro { "Hacks", O_HACKS, OI_NONE }, 30315b0945b5SGregory Neil Shapiro #endif 30325b0945b5SGregory Neil Shapiro #if _FFR_KEEPBCC 30335b0945b5SGregory Neil Shapiro # define O_KEEPBCC 0xf3 30345b0945b5SGregory Neil Shapiro { "KeepBcc", O_KEEPBCC, OI_NONE }, 30355b0945b5SGregory Neil Shapiro #endif 30365b0945b5SGregory Neil Shapiro 30375b0945b5SGregory Neil Shapiro #if _FFR_CLIENTCA 30385b0945b5SGregory Neil Shapiro #define O_CLTCACERTFILE 0xf5 30395b0945b5SGregory Neil Shapiro { "ClientCACertFile", O_CLTCACERTFILE, OI_NONE }, 30405b0945b5SGregory Neil Shapiro #define O_CLTCACERTPATH 0xf6 30415b0945b5SGregory Neil Shapiro { "ClientCACertPath", O_CLTCACERTPATH, OI_NONE }, 30425b0945b5SGregory Neil Shapiro #endif 30435b0945b5SGregory Neil Shapiro #if _FFR_TLS_ALTNAMES 30445b0945b5SGregory Neil Shapiro # define O_CHECKALTNAMES 0xf7 30455b0945b5SGregory Neil Shapiro { "SetCertAltnames", O_CHECKALTNAMES, OI_NONE }, 30465b0945b5SGregory Neil Shapiro #endif 3047*2fb4f839SGregory Neil Shapiro #define O_SMTPUTF8 0xf8 3048*2fb4f839SGregory Neil Shapiro { "SmtpUTF8", O_SMTPUTF8, OI_NONE }, 3049*2fb4f839SGregory Neil Shapiro #if _FFR_MTA_STS 3050*2fb4f839SGregory Neil Shapiro # define O_MTASTS 0xf9 3051*2fb4f839SGregory Neil Shapiro { "StrictTransportSecurity", O_MTASTS, OI_NONE }, 3052*2fb4f839SGregory Neil Shapiro #endif 3053*2fb4f839SGregory Neil Shapiro 3054*2fb4f839SGregory Neil Shapiro #if MTA_HAVE_TLSv1_3 3055*2fb4f839SGregory Neil Shapiro #define O_CIPHERSUITES 0xfa 3056*2fb4f839SGregory Neil Shapiro { "CipherSuites", O_CIPHERSUITES, OI_NONE }, 3057*2fb4f839SGregory Neil Shapiro #endif 3058e92d3f3fSGregory Neil Shapiro 305906f25ae9SGregory Neil Shapiro { NULL, '\0', OI_NONE } 3060c2aa98e2SPeter Wemm }; 3061c2aa98e2SPeter Wemm 306240266059SGregory Neil Shapiro # define CANONIFY(val) 306340266059SGregory Neil Shapiro 306440266059SGregory Neil Shapiro # define SET_OPT_DEFAULT(opt, val) opt = val 306540266059SGregory Neil Shapiro 306640266059SGregory Neil Shapiro /* set a string option by expanding the value and assigning it */ 306740266059SGregory Neil Shapiro /* WARNING this belongs ONLY into a case statement! */ 306840266059SGregory Neil Shapiro #define SET_STRING_EXP(str) \ 3069d0cef73dSGregory Neil Shapiro expand(val, exbuf, sizeof(exbuf), e); \ 307040266059SGregory Neil Shapiro newval = sm_pstrdup_x(exbuf); \ 307140266059SGregory Neil Shapiro if (str != NULL) \ 307240266059SGregory Neil Shapiro sm_free(str); \ 307340266059SGregory Neil Shapiro CANONIFY(newval); \ 307440266059SGregory Neil Shapiro str = newval; \ 307540266059SGregory Neil Shapiro break 307640266059SGregory Neil Shapiro 307740266059SGregory Neil Shapiro #define OPTNAME o->o_name == NULL ? "<unknown>" : o->o_name 307840266059SGregory Neil Shapiro 3079c2aa98e2SPeter Wemm void 3080c2aa98e2SPeter Wemm setoption(opt, val, safe, sticky, e) 3081c2aa98e2SPeter Wemm int opt; 3082c2aa98e2SPeter Wemm char *val; 3083c2aa98e2SPeter Wemm bool safe; 3084c2aa98e2SPeter Wemm bool sticky; 3085c2aa98e2SPeter Wemm register ENVELOPE *e; 3086c2aa98e2SPeter Wemm { 3087c2aa98e2SPeter Wemm register char *p; 3088c2aa98e2SPeter Wemm register struct optioninfo *o; 3089c2aa98e2SPeter Wemm char *subopt; 30905b0945b5SGregory Neil Shapiro int i; 3091c2aa98e2SPeter Wemm bool can_setuid = RunAsUid == 0; 3092c2aa98e2SPeter Wemm auto char *ep; 3093c2aa98e2SPeter Wemm char buf[50]; 3094c2aa98e2SPeter Wemm extern bool Warn_Q_option; 309506f25ae9SGregory Neil Shapiro #if _FFR_ALLOW_SASLINFO 309640266059SGregory Neil Shapiro extern unsigned int SubmitMode; 30975b0945b5SGregory Neil Shapiro #endif 3098d0cef73dSGregory Neil Shapiro #if STARTTLS || SM_CONF_SHM 309940266059SGregory Neil Shapiro char *newval; 310040266059SGregory Neil Shapiro char exbuf[MAXLINE]; 31015b0945b5SGregory Neil Shapiro #endif 3102da7d7b9cSGregory Neil Shapiro #if STARTTLS 3103da7d7b9cSGregory Neil Shapiro unsigned long *pssloptions = NULL; 3104da7d7b9cSGregory Neil Shapiro #endif 3105c2aa98e2SPeter Wemm 3106c2aa98e2SPeter Wemm errno = 0; 3107c2aa98e2SPeter Wemm if (opt == ' ') 3108c2aa98e2SPeter Wemm { 3109c2aa98e2SPeter Wemm /* full word options */ 3110c2aa98e2SPeter Wemm struct optioninfo *sel; 3111c2aa98e2SPeter Wemm 3112c2aa98e2SPeter Wemm p = strchr(val, '='); 3113c2aa98e2SPeter Wemm if (p == NULL) 3114c2aa98e2SPeter Wemm p = &val[strlen(val)]; 3115c2aa98e2SPeter Wemm while (*--p == ' ') 3116c2aa98e2SPeter Wemm continue; 3117c2aa98e2SPeter Wemm while (*++p == ' ') 3118c2aa98e2SPeter Wemm *p = '\0'; 3119c2aa98e2SPeter Wemm if (p == val) 3120c2aa98e2SPeter Wemm { 3121c2aa98e2SPeter Wemm syserr("readcf: null option name"); 3122c2aa98e2SPeter Wemm return; 3123c2aa98e2SPeter Wemm } 3124c2aa98e2SPeter Wemm if (*p == '=') 3125c2aa98e2SPeter Wemm *p++ = '\0'; 3126c2aa98e2SPeter Wemm while (*p == ' ') 3127c2aa98e2SPeter Wemm p++; 3128c2aa98e2SPeter Wemm subopt = strchr(val, '.'); 3129c2aa98e2SPeter Wemm if (subopt != NULL) 3130c2aa98e2SPeter Wemm *subopt++ = '\0'; 3131c2aa98e2SPeter Wemm sel = NULL; 3132c2aa98e2SPeter Wemm for (o = OptionTab; o->o_name != NULL; o++) 3133c2aa98e2SPeter Wemm { 313440266059SGregory Neil Shapiro if (sm_strncasecmp(o->o_name, val, strlen(val)) != 0) 3135c2aa98e2SPeter Wemm continue; 3136c2aa98e2SPeter Wemm if (strlen(o->o_name) == strlen(val)) 3137c2aa98e2SPeter Wemm { 3138c2aa98e2SPeter Wemm /* completely specified -- this must be it */ 3139c2aa98e2SPeter Wemm sel = NULL; 3140c2aa98e2SPeter Wemm break; 3141c2aa98e2SPeter Wemm } 3142c2aa98e2SPeter Wemm if (sel != NULL) 3143c2aa98e2SPeter Wemm break; 3144c2aa98e2SPeter Wemm sel = o; 3145c2aa98e2SPeter Wemm } 3146c2aa98e2SPeter Wemm if (sel != NULL && o->o_name == NULL) 3147c2aa98e2SPeter Wemm o = sel; 3148c2aa98e2SPeter Wemm else if (o->o_name == NULL) 3149c2aa98e2SPeter Wemm { 3150c2aa98e2SPeter Wemm syserr("readcf: unknown option name %s", val); 3151c2aa98e2SPeter Wemm return; 3152c2aa98e2SPeter Wemm } 3153c2aa98e2SPeter Wemm else if (sel != NULL) 3154c2aa98e2SPeter Wemm { 3155c2aa98e2SPeter Wemm syserr("readcf: ambiguous option name %s (matches %s and %s)", 3156c2aa98e2SPeter Wemm val, sel->o_name, o->o_name); 3157c2aa98e2SPeter Wemm return; 3158c2aa98e2SPeter Wemm } 3159c2aa98e2SPeter Wemm if (strlen(val) != strlen(o->o_name)) 3160c2aa98e2SPeter Wemm { 3161c2aa98e2SPeter Wemm int oldVerbose = Verbose; 3162c2aa98e2SPeter Wemm 3163c2aa98e2SPeter Wemm Verbose = 1; 3164c2aa98e2SPeter Wemm message("Option %s used as abbreviation for %s", 3165c2aa98e2SPeter Wemm val, o->o_name); 3166c2aa98e2SPeter Wemm Verbose = oldVerbose; 3167c2aa98e2SPeter Wemm } 3168c2aa98e2SPeter Wemm opt = o->o_code; 3169c2aa98e2SPeter Wemm val = p; 3170c2aa98e2SPeter Wemm } 3171c2aa98e2SPeter Wemm else 3172c2aa98e2SPeter Wemm { 3173c2aa98e2SPeter Wemm for (o = OptionTab; o->o_name != NULL; o++) 3174c2aa98e2SPeter Wemm { 3175c2aa98e2SPeter Wemm if (o->o_code == opt) 3176c2aa98e2SPeter Wemm break; 3177c2aa98e2SPeter Wemm } 317840266059SGregory Neil Shapiro if (o->o_name == NULL) 317940266059SGregory Neil Shapiro { 318040266059SGregory Neil Shapiro syserr("readcf: unknown option name 0x%x", opt & 0xff); 318140266059SGregory Neil Shapiro return; 318240266059SGregory Neil Shapiro } 3183c2aa98e2SPeter Wemm subopt = NULL; 3184c2aa98e2SPeter Wemm } 3185c2aa98e2SPeter Wemm 318606f25ae9SGregory Neil Shapiro if (subopt != NULL && !bitset(OI_SUBOPT, o->o_flags)) 318706f25ae9SGregory Neil Shapiro { 318806f25ae9SGregory Neil Shapiro if (tTd(37, 1)) 318940266059SGregory Neil Shapiro sm_dprintf("setoption: %s does not support suboptions, ignoring .%s\n", 319040266059SGregory Neil Shapiro OPTNAME, subopt); 319106f25ae9SGregory Neil Shapiro subopt = NULL; 319206f25ae9SGregory Neil Shapiro } 319306f25ae9SGregory Neil Shapiro 3194c2aa98e2SPeter Wemm if (tTd(37, 1)) 3195c2aa98e2SPeter Wemm { 319640266059SGregory Neil Shapiro sm_dprintf(isascii(opt) && isprint(opt) ? 319706f25ae9SGregory Neil Shapiro "setoption %s (%c)%s%s=" : 319806f25ae9SGregory Neil Shapiro "setoption %s (0x%x)%s%s=", 319940266059SGregory Neil Shapiro OPTNAME, opt, subopt == NULL ? "" : ".", 3200c2aa98e2SPeter Wemm subopt == NULL ? "" : subopt); 3201e92d3f3fSGregory Neil Shapiro xputs(sm_debug_file(), val); 3202c2aa98e2SPeter Wemm } 3203c2aa98e2SPeter Wemm 3204c2aa98e2SPeter Wemm /* 3205c2aa98e2SPeter Wemm ** See if this option is preset for us. 3206c2aa98e2SPeter Wemm */ 3207c2aa98e2SPeter Wemm 3208c2aa98e2SPeter Wemm if (!sticky && bitnset(opt, StickyOpt)) 3209c2aa98e2SPeter Wemm { 3210c2aa98e2SPeter Wemm if (tTd(37, 1)) 321140266059SGregory Neil Shapiro sm_dprintf(" (ignored)\n"); 3212c2aa98e2SPeter Wemm return; 3213c2aa98e2SPeter Wemm } 3214c2aa98e2SPeter Wemm 3215c2aa98e2SPeter Wemm /* 3216c2aa98e2SPeter Wemm ** Check to see if this option can be specified by this user. 3217c2aa98e2SPeter Wemm */ 3218c2aa98e2SPeter Wemm 3219c2aa98e2SPeter Wemm if (!safe && RealUid == 0) 322040266059SGregory Neil Shapiro safe = true; 322106f25ae9SGregory Neil Shapiro if (!safe && !bitset(OI_SAFE, o->o_flags)) 3222c2aa98e2SPeter Wemm { 3223c2aa98e2SPeter Wemm if (opt != 'M' || (val[0] != 'r' && val[0] != 's')) 3224c2aa98e2SPeter Wemm { 322506f25ae9SGregory Neil Shapiro int dp; 322606f25ae9SGregory Neil Shapiro 3227c2aa98e2SPeter Wemm if (tTd(37, 1)) 322840266059SGregory Neil Shapiro sm_dprintf(" (unsafe)"); 322940266059SGregory Neil Shapiro dp = drop_privileges(true); 323006f25ae9SGregory Neil Shapiro setstat(dp); 3231c2aa98e2SPeter Wemm } 3232c2aa98e2SPeter Wemm } 3233c2aa98e2SPeter Wemm if (tTd(37, 1)) 323440266059SGregory Neil Shapiro sm_dprintf("\n"); 3235c2aa98e2SPeter Wemm 3236c2aa98e2SPeter Wemm switch (opt & 0xff) 3237c2aa98e2SPeter Wemm { 3238c2aa98e2SPeter Wemm case '7': /* force seven-bit input */ 3239c2aa98e2SPeter Wemm SevenBitInput = atobool(val); 3240c2aa98e2SPeter Wemm break; 3241c2aa98e2SPeter Wemm 3242c2aa98e2SPeter Wemm case '8': /* handling of 8-bit input */ 32438774250cSGregory Neil Shapiro #if MIME8TO7 3244c2aa98e2SPeter Wemm switch (*val) 3245c2aa98e2SPeter Wemm { 3246c2aa98e2SPeter Wemm case 'p': /* pass 8 bit, convert MIME */ 3247c2aa98e2SPeter Wemm MimeMode = MM_CVTMIME|MM_PASS8BIT; 3248c2aa98e2SPeter Wemm break; 3249c2aa98e2SPeter Wemm 325040266059SGregory Neil Shapiro case 'm': /* convert 8-bit, convert MIME */ 325140266059SGregory Neil Shapiro MimeMode = MM_CVTMIME|MM_MIME8BIT; 325240266059SGregory Neil Shapiro break; 325340266059SGregory Neil Shapiro 3254c2aa98e2SPeter Wemm case 's': /* strict adherence */ 3255c2aa98e2SPeter Wemm MimeMode = MM_CVTMIME; 3256c2aa98e2SPeter Wemm break; 3257c2aa98e2SPeter Wemm 3258c2aa98e2SPeter Wemm # if 0 3259c2aa98e2SPeter Wemm case 'r': /* reject 8-bit, don't convert MIME */ 3260c2aa98e2SPeter Wemm MimeMode = 0; 3261c2aa98e2SPeter Wemm break; 3262c2aa98e2SPeter Wemm 3263c2aa98e2SPeter Wemm case 'j': /* "just send 8" */ 3264c2aa98e2SPeter Wemm MimeMode = MM_PASS8BIT; 3265c2aa98e2SPeter Wemm break; 3266c2aa98e2SPeter Wemm 3267c2aa98e2SPeter Wemm case 'a': /* encode 8 bit if available */ 3268c2aa98e2SPeter Wemm MimeMode = MM_MIME8BIT|MM_PASS8BIT|MM_CVTMIME; 3269c2aa98e2SPeter Wemm break; 3270c2aa98e2SPeter Wemm 3271c2aa98e2SPeter Wemm case 'c': /* convert 8 bit to MIME, never 7 bit */ 3272c2aa98e2SPeter Wemm MimeMode = MM_MIME8BIT; 3273c2aa98e2SPeter Wemm break; 327406f25ae9SGregory Neil Shapiro # endif /* 0 */ 3275c2aa98e2SPeter Wemm 3276c2aa98e2SPeter Wemm default: 3277c2aa98e2SPeter Wemm syserr("Unknown 8-bit mode %c", *val); 327840266059SGregory Neil Shapiro finis(false, true, EX_USAGE); 3279c2aa98e2SPeter Wemm } 32808774250cSGregory Neil Shapiro #else /* MIME8TO7 */ 328140266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 328240266059SGregory Neil Shapiro "Warning: Option: %s requires MIME8TO7 support\n", 328340266059SGregory Neil Shapiro OPTNAME); 328406f25ae9SGregory Neil Shapiro #endif /* MIME8TO7 */ 32858774250cSGregory Neil Shapiro break; 3286c2aa98e2SPeter Wemm 3287c2aa98e2SPeter Wemm case 'A': /* set default alias file */ 3288c2aa98e2SPeter Wemm if (val[0] == '\0') 328940266059SGregory Neil Shapiro { 329040266059SGregory Neil Shapiro char *al; 329140266059SGregory Neil Shapiro 329240266059SGregory Neil Shapiro SET_OPT_DEFAULT(al, "aliases"); 329340266059SGregory Neil Shapiro setalias(al); 329440266059SGregory Neil Shapiro } 3295c2aa98e2SPeter Wemm else 3296c2aa98e2SPeter Wemm setalias(val); 3297c2aa98e2SPeter Wemm break; 3298c2aa98e2SPeter Wemm 3299c2aa98e2SPeter Wemm case 'a': /* look N minutes for "@:@" in alias file */ 3300c2aa98e2SPeter Wemm if (val[0] == '\0') 330140266059SGregory Neil Shapiro SafeAlias = 5 MINUTES; 3302c2aa98e2SPeter Wemm else 3303c2aa98e2SPeter Wemm SafeAlias = convtime(val, 'm'); 3304c2aa98e2SPeter Wemm break; 3305c2aa98e2SPeter Wemm 3306c2aa98e2SPeter Wemm case 'B': /* substitution for blank character */ 3307c2aa98e2SPeter Wemm SpaceSub = val[0]; 3308c2aa98e2SPeter Wemm if (SpaceSub == '\0') 3309c2aa98e2SPeter Wemm SpaceSub = ' '; 3310c2aa98e2SPeter Wemm break; 3311c2aa98e2SPeter Wemm 3312c2aa98e2SPeter Wemm case 'b': /* min blocks free on queue fs/max msg size */ 3313c2aa98e2SPeter Wemm p = strchr(val, '/'); 3314c2aa98e2SPeter Wemm if (p != NULL) 3315c2aa98e2SPeter Wemm { 3316c2aa98e2SPeter Wemm *p++ = '\0'; 3317c2aa98e2SPeter Wemm MaxMessageSize = atol(p); 3318c2aa98e2SPeter Wemm } 3319c2aa98e2SPeter Wemm MinBlocksFree = atol(val); 3320c2aa98e2SPeter Wemm break; 3321c2aa98e2SPeter Wemm 3322c2aa98e2SPeter Wemm case 'c': /* don't connect to "expensive" mailers */ 3323c2aa98e2SPeter Wemm NoConnect = atobool(val); 3324c2aa98e2SPeter Wemm break; 3325c2aa98e2SPeter Wemm 3326c2aa98e2SPeter Wemm case 'C': /* checkpoint every N addresses */ 3327e92d3f3fSGregory Neil Shapiro if (safe || CheckpointInterval > atoi(val)) 3328c2aa98e2SPeter Wemm CheckpointInterval = atoi(val); 3329c2aa98e2SPeter Wemm break; 3330c2aa98e2SPeter Wemm 3331c2aa98e2SPeter Wemm case 'd': /* delivery mode */ 3332c2aa98e2SPeter Wemm switch (*val) 3333c2aa98e2SPeter Wemm { 3334c2aa98e2SPeter Wemm case '\0': 333506f25ae9SGregory Neil Shapiro set_delivery_mode(SM_DELIVER, e); 3336c2aa98e2SPeter Wemm break; 3337c2aa98e2SPeter Wemm 3338c2aa98e2SPeter Wemm case SM_QUEUE: /* queue only */ 3339c2aa98e2SPeter Wemm case SM_DEFER: /* queue only and defer map lookups */ 3340c2aa98e2SPeter Wemm case SM_DELIVER: /* do everything */ 3341c2aa98e2SPeter Wemm case SM_FORK: /* fork after verification */ 33424e4196cbSGregory Neil Shapiro #if _FFR_DM_ONE 33434e4196cbSGregory Neil Shapiro /* deliver first TA in background, then queue */ 33444e4196cbSGregory Neil Shapiro case SM_DM_ONE: 33455b0945b5SGregory Neil Shapiro #endif 3346*2fb4f839SGregory Neil Shapiro #if _FFR_DMTRIGGER 3347*2fb4f839SGregory Neil Shapiro case SM_TRIGGER: 3348*2fb4f839SGregory Neil Shapiro #endif 334906f25ae9SGregory Neil Shapiro set_delivery_mode(*val, e); 3350c2aa98e2SPeter Wemm break; 3351c2aa98e2SPeter Wemm 3352da7d7b9cSGregory Neil Shapiro #if _FFR_PROXY 3353da7d7b9cSGregory Neil Shapiro case SM_PROXY_REQ: 3354da7d7b9cSGregory Neil Shapiro set_delivery_mode(*val, e); 3355da7d7b9cSGregory Neil Shapiro break; 3356da7d7b9cSGregory Neil Shapiro #endif /* _FFR_PROXY */ 33576f9c8e5bSGregory Neil Shapiro 3358c2aa98e2SPeter Wemm default: 3359c2aa98e2SPeter Wemm syserr("Unknown delivery mode %c", *val); 336040266059SGregory Neil Shapiro finis(false, true, EX_USAGE); 3361c2aa98e2SPeter Wemm } 3362c2aa98e2SPeter Wemm break; 3363c2aa98e2SPeter Wemm 3364c2aa98e2SPeter Wemm case 'E': /* error message header/header file */ 3365c2aa98e2SPeter Wemm if (*val != '\0') 3366c2aa98e2SPeter Wemm ErrMsgFile = newstr(val); 3367c2aa98e2SPeter Wemm break; 3368c2aa98e2SPeter Wemm 3369c2aa98e2SPeter Wemm case 'e': /* set error processing mode */ 3370c2aa98e2SPeter Wemm switch (*val) 3371c2aa98e2SPeter Wemm { 3372c2aa98e2SPeter Wemm case EM_QUIET: /* be silent about it */ 3373c2aa98e2SPeter Wemm case EM_MAIL: /* mail back */ 3374c2aa98e2SPeter Wemm case EM_BERKNET: /* do berknet error processing */ 3375c2aa98e2SPeter Wemm case EM_WRITE: /* write back (or mail) */ 3376c2aa98e2SPeter Wemm case EM_PRINT: /* print errors normally (default) */ 3377c2aa98e2SPeter Wemm e->e_errormode = *val; 3378c2aa98e2SPeter Wemm break; 3379c2aa98e2SPeter Wemm } 3380c2aa98e2SPeter Wemm break; 3381c2aa98e2SPeter Wemm 3382c2aa98e2SPeter Wemm case 'F': /* file mode */ 3383c2aa98e2SPeter Wemm FileMode = atooct(val) & 0777; 3384c2aa98e2SPeter Wemm break; 3385c2aa98e2SPeter Wemm 3386c2aa98e2SPeter Wemm case 'f': /* save Unix-style From lines on front */ 3387c2aa98e2SPeter Wemm SaveFrom = atobool(val); 3388c2aa98e2SPeter Wemm break; 3389c2aa98e2SPeter Wemm 3390c2aa98e2SPeter Wemm case 'G': /* match recipients against GECOS field */ 3391c2aa98e2SPeter Wemm MatchGecos = atobool(val); 3392c2aa98e2SPeter Wemm break; 3393c2aa98e2SPeter Wemm 3394c2aa98e2SPeter Wemm case 'g': /* default gid */ 3395c2aa98e2SPeter Wemm g_opt: 3396c2aa98e2SPeter Wemm if (isascii(*val) && isdigit(*val)) 3397c2aa98e2SPeter Wemm DefGid = atoi(val); 3398c2aa98e2SPeter Wemm else 3399c2aa98e2SPeter Wemm { 3400c2aa98e2SPeter Wemm register struct group *gr; 3401c2aa98e2SPeter Wemm 3402c2aa98e2SPeter Wemm DefGid = -1; 3403c2aa98e2SPeter Wemm gr = getgrnam(val); 3404c2aa98e2SPeter Wemm if (gr == NULL) 3405c2aa98e2SPeter Wemm syserr("readcf: option %c: unknown group %s", 3406c2aa98e2SPeter Wemm opt, val); 3407c2aa98e2SPeter Wemm else 3408c2aa98e2SPeter Wemm DefGid = gr->gr_gid; 3409c2aa98e2SPeter Wemm } 3410c2aa98e2SPeter Wemm break; 3411c2aa98e2SPeter Wemm 3412c2aa98e2SPeter Wemm case 'H': /* help file */ 3413c2aa98e2SPeter Wemm if (val[0] == '\0') 341440266059SGregory Neil Shapiro { 341540266059SGregory Neil Shapiro SET_OPT_DEFAULT(HelpFile, "helpfile"); 341640266059SGregory Neil Shapiro } 3417c2aa98e2SPeter Wemm else 3418602a2b1bSGregory Neil Shapiro { 341940266059SGregory Neil Shapiro CANONIFY(val); 3420c2aa98e2SPeter Wemm HelpFile = newstr(val); 3421602a2b1bSGregory Neil Shapiro } 3422c2aa98e2SPeter Wemm break; 3423c2aa98e2SPeter Wemm 3424c2aa98e2SPeter Wemm case 'h': /* maximum hop count */ 3425c2aa98e2SPeter Wemm MaxHopCount = atoi(val); 3426c2aa98e2SPeter Wemm break; 3427c2aa98e2SPeter Wemm 3428c2aa98e2SPeter Wemm case 'I': /* use internet domain name server */ 3429c2aa98e2SPeter Wemm #if NAMED_BIND 3430c2aa98e2SPeter Wemm for (p = val; *p != 0; ) 3431c2aa98e2SPeter Wemm { 3432c2aa98e2SPeter Wemm bool clearmode; 3433c2aa98e2SPeter Wemm char *q; 3434c2aa98e2SPeter Wemm struct resolverflags *rfp; 3435c2aa98e2SPeter Wemm 3436c2aa98e2SPeter Wemm while (*p == ' ') 3437c2aa98e2SPeter Wemm p++; 3438c2aa98e2SPeter Wemm if (*p == '\0') 3439c2aa98e2SPeter Wemm break; 344040266059SGregory Neil Shapiro clearmode = false; 3441c2aa98e2SPeter Wemm if (*p == '-') 344240266059SGregory Neil Shapiro clearmode = true; 3443c2aa98e2SPeter Wemm else if (*p != '+') 3444c2aa98e2SPeter Wemm p--; 3445c2aa98e2SPeter Wemm p++; 3446c2aa98e2SPeter Wemm q = p; 34475b0945b5SGregory Neil Shapiro while (*p != '\0' && !(SM_ISSPACE(*p))) 3448c2aa98e2SPeter Wemm p++; 3449c2aa98e2SPeter Wemm if (*p != '\0') 3450c2aa98e2SPeter Wemm *p++ = '\0'; 3451*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(q, "HasWildcardMX")) 3452c2aa98e2SPeter Wemm { 3453c2aa98e2SPeter Wemm HasWildcardMX = !clearmode; 3454c2aa98e2SPeter Wemm continue; 3455c2aa98e2SPeter Wemm } 3456*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(q, "WorkAroundBrokenAAAA")) 3457602a2b1bSGregory Neil Shapiro { 3458602a2b1bSGregory Neil Shapiro WorkAroundBrokenAAAA = !clearmode; 3459602a2b1bSGregory Neil Shapiro continue; 3460602a2b1bSGregory Neil Shapiro } 3461c2aa98e2SPeter Wemm for (rfp = ResolverFlags; rfp->rf_name != NULL; rfp++) 3462c2aa98e2SPeter Wemm { 3463*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(q, rfp->rf_name)) 3464c2aa98e2SPeter Wemm break; 3465c2aa98e2SPeter Wemm } 3466c2aa98e2SPeter Wemm if (rfp->rf_name == NULL) 3467c2aa98e2SPeter Wemm syserr("readcf: I option value %s unrecognized", q); 3468c2aa98e2SPeter Wemm else if (clearmode) 3469c2aa98e2SPeter Wemm _res.options &= ~rfp->rf_bits; 3470c2aa98e2SPeter Wemm else 3471c2aa98e2SPeter Wemm _res.options |= rfp->rf_bits; 3472c2aa98e2SPeter Wemm } 3473c2aa98e2SPeter Wemm if (tTd(8, 2)) 347440266059SGregory Neil Shapiro sm_dprintf("_res.options = %x, HasWildcardMX = %d\n", 347540266059SGregory Neil Shapiro (unsigned int) _res.options, HasWildcardMX); 347606f25ae9SGregory Neil Shapiro #else /* NAMED_BIND */ 3477c2aa98e2SPeter Wemm usrerr("name server (I option) specified but BIND not compiled in"); 347806f25ae9SGregory Neil Shapiro #endif /* NAMED_BIND */ 3479c2aa98e2SPeter Wemm break; 3480c2aa98e2SPeter Wemm 3481c2aa98e2SPeter Wemm case 'i': /* ignore dot lines in message */ 3482c2aa98e2SPeter Wemm IgnrDot = atobool(val); 3483c2aa98e2SPeter Wemm break; 3484c2aa98e2SPeter Wemm 3485c2aa98e2SPeter Wemm case 'j': /* send errors in MIME (RFC 1341) format */ 3486c2aa98e2SPeter Wemm SendMIMEErrors = atobool(val); 3487c2aa98e2SPeter Wemm break; 3488c2aa98e2SPeter Wemm 3489c2aa98e2SPeter Wemm case 'J': /* .forward search path */ 349040266059SGregory Neil Shapiro CANONIFY(val); 3491c2aa98e2SPeter Wemm ForwardPath = newstr(val); 3492c2aa98e2SPeter Wemm break; 3493c2aa98e2SPeter Wemm 3494c2aa98e2SPeter Wemm case 'k': /* connection cache size */ 3495c2aa98e2SPeter Wemm MaxMciCache = atoi(val); 3496c2aa98e2SPeter Wemm if (MaxMciCache < 0) 3497c2aa98e2SPeter Wemm MaxMciCache = 0; 3498c2aa98e2SPeter Wemm break; 3499c2aa98e2SPeter Wemm 3500c2aa98e2SPeter Wemm case 'K': /* connection cache timeout */ 3501c2aa98e2SPeter Wemm MciCacheTimeout = convtime(val, 'm'); 3502c2aa98e2SPeter Wemm break; 3503c2aa98e2SPeter Wemm 3504c2aa98e2SPeter Wemm case 'l': /* use Errors-To: header */ 3505c2aa98e2SPeter Wemm UseErrorsTo = atobool(val); 3506c2aa98e2SPeter Wemm break; 3507c2aa98e2SPeter Wemm 3508c2aa98e2SPeter Wemm case 'L': /* log level */ 3509c2aa98e2SPeter Wemm if (safe || LogLevel < atoi(val)) 3510c2aa98e2SPeter Wemm LogLevel = atoi(val); 3511c2aa98e2SPeter Wemm break; 3512c2aa98e2SPeter Wemm 3513c2aa98e2SPeter Wemm case 'M': /* define macro */ 351440266059SGregory Neil Shapiro sticky = false; 35155b0945b5SGregory Neil Shapiro i = macid_parse(val, &ep); 35165b0945b5SGregory Neil Shapiro if (i == 0) 3517193538b7SGregory Neil Shapiro break; 3518c2aa98e2SPeter Wemm p = newstr(ep); 3519c2aa98e2SPeter Wemm if (!safe) 3520a7ec597cSGregory Neil Shapiro cleanstrcpy(p, p, strlen(p) + 1); 35215b0945b5SGregory Neil Shapiro macdefine(&CurEnv->e_macro, A_TEMP, i, p); 3522c2aa98e2SPeter Wemm break; 3523c2aa98e2SPeter Wemm 3524c2aa98e2SPeter Wemm case 'm': /* send to me too */ 3525c2aa98e2SPeter Wemm MeToo = atobool(val); 3526c2aa98e2SPeter Wemm break; 3527c2aa98e2SPeter Wemm 3528c2aa98e2SPeter Wemm case 'n': /* validate RHS in newaliases */ 3529c2aa98e2SPeter Wemm CheckAliases = atobool(val); 3530c2aa98e2SPeter Wemm break; 3531c2aa98e2SPeter Wemm 3532c2aa98e2SPeter Wemm /* 'N' available -- was "net name" */ 3533c2aa98e2SPeter Wemm 3534c2aa98e2SPeter Wemm case 'O': /* daemon options */ 353506f25ae9SGregory Neil Shapiro if (!setdaemonoptions(val)) 353606f25ae9SGregory Neil Shapiro syserr("too many daemons defined (%d max)", MAXDAEMONS); 3537c2aa98e2SPeter Wemm break; 3538c2aa98e2SPeter Wemm 3539c2aa98e2SPeter Wemm case 'o': /* assume old style headers */ 3540c2aa98e2SPeter Wemm if (atobool(val)) 3541c2aa98e2SPeter Wemm CurEnv->e_flags |= EF_OLDSTYLE; 3542c2aa98e2SPeter Wemm else 3543c2aa98e2SPeter Wemm CurEnv->e_flags &= ~EF_OLDSTYLE; 3544c2aa98e2SPeter Wemm break; 3545c2aa98e2SPeter Wemm 3546c2aa98e2SPeter Wemm case 'p': /* select privacy level */ 3547c2aa98e2SPeter Wemm p = val; 3548c2aa98e2SPeter Wemm for (;;) 3549c2aa98e2SPeter Wemm { 3550c2aa98e2SPeter Wemm register struct prival *pv; 3551c2aa98e2SPeter Wemm extern struct prival PrivacyValues[]; 3552c2aa98e2SPeter Wemm 3553c2aa98e2SPeter Wemm while (isascii(*p) && (isspace(*p) || ispunct(*p))) 3554c2aa98e2SPeter Wemm p++; 3555c2aa98e2SPeter Wemm if (*p == '\0') 3556c2aa98e2SPeter Wemm break; 3557c2aa98e2SPeter Wemm val = p; 3558c2aa98e2SPeter Wemm while (isascii(*p) && isalnum(*p)) 3559c2aa98e2SPeter Wemm p++; 3560c2aa98e2SPeter Wemm if (*p != '\0') 3561c2aa98e2SPeter Wemm *p++ = '\0'; 3562c2aa98e2SPeter Wemm 3563c2aa98e2SPeter Wemm for (pv = PrivacyValues; pv->pv_name != NULL; pv++) 3564c2aa98e2SPeter Wemm { 3565*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(val, pv->pv_name)) 3566c2aa98e2SPeter Wemm break; 3567c2aa98e2SPeter Wemm } 3568c2aa98e2SPeter Wemm if (pv->pv_name == NULL) 3569c2aa98e2SPeter Wemm syserr("readcf: Op line: %s unrecognized", val); 3570193538b7SGregory Neil Shapiro else 3571c2aa98e2SPeter Wemm PrivacyFlags |= pv->pv_flag; 3572c2aa98e2SPeter Wemm } 357340266059SGregory Neil Shapiro sticky = false; 3574c2aa98e2SPeter Wemm break; 3575c2aa98e2SPeter Wemm 3576c2aa98e2SPeter Wemm case 'P': /* postmaster copy address for returned mail */ 3577c2aa98e2SPeter Wemm PostMasterCopy = newstr(val); 3578c2aa98e2SPeter Wemm break; 3579c2aa98e2SPeter Wemm 3580c2aa98e2SPeter Wemm case 'q': /* slope of queue only function */ 3581c2aa98e2SPeter Wemm QueueFactor = atoi(val); 3582c2aa98e2SPeter Wemm break; 3583c2aa98e2SPeter Wemm 3584c2aa98e2SPeter Wemm case 'Q': /* queue directory */ 3585c2aa98e2SPeter Wemm if (val[0] == '\0') 358642e5d165SGregory Neil Shapiro { 3587c2aa98e2SPeter Wemm QueueDir = "mqueue"; 358842e5d165SGregory Neil Shapiro } 3589c2aa98e2SPeter Wemm else 359042e5d165SGregory Neil Shapiro { 3591c2aa98e2SPeter Wemm QueueDir = newstr(val); 359242e5d165SGregory Neil Shapiro } 3593c2aa98e2SPeter Wemm if (RealUid != 0 && !safe) 359440266059SGregory Neil Shapiro Warn_Q_option = true; 3595c2aa98e2SPeter Wemm break; 3596c2aa98e2SPeter Wemm 3597c2aa98e2SPeter Wemm case 'R': /* don't prune routes */ 3598c2aa98e2SPeter Wemm DontPruneRoutes = atobool(val); 3599c2aa98e2SPeter Wemm break; 3600c2aa98e2SPeter Wemm 3601c2aa98e2SPeter Wemm case 'r': /* read timeout */ 3602c2aa98e2SPeter Wemm if (subopt == NULL) 360306f25ae9SGregory Neil Shapiro inittimeouts(val, sticky); 3604c2aa98e2SPeter Wemm else 360506f25ae9SGregory Neil Shapiro settimeout(subopt, val, sticky); 3606c2aa98e2SPeter Wemm break; 3607c2aa98e2SPeter Wemm 3608c2aa98e2SPeter Wemm case 'S': /* status file */ 3609c2aa98e2SPeter Wemm if (val[0] == '\0') 361040266059SGregory Neil Shapiro { 361140266059SGregory Neil Shapiro SET_OPT_DEFAULT(StatFile, "statistics"); 361240266059SGregory Neil Shapiro } 3613c2aa98e2SPeter Wemm else 3614602a2b1bSGregory Neil Shapiro { 361540266059SGregory Neil Shapiro CANONIFY(val); 3616c2aa98e2SPeter Wemm StatFile = newstr(val); 3617602a2b1bSGregory Neil Shapiro } 3618c2aa98e2SPeter Wemm break; 3619c2aa98e2SPeter Wemm 3620c2aa98e2SPeter Wemm case 's': /* be super safe, even if expensive */ 362140266059SGregory Neil Shapiro if (tolower(*val) == 'i') 362240266059SGregory Neil Shapiro SuperSafe = SAFE_INTERACTIVE; 3623e92d3f3fSGregory Neil Shapiro else if (tolower(*val) == 'p') 3624e92d3f3fSGregory Neil Shapiro #if MILTER 3625e92d3f3fSGregory Neil Shapiro SuperSafe = SAFE_REALLY_POSTMILTER; 3626e92d3f3fSGregory Neil Shapiro #else /* MILTER */ 3627e92d3f3fSGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 3628e92d3f3fSGregory Neil Shapiro "Warning: SuperSafe=PostMilter requires Milter support (-DMILTER)\n"); 3629e92d3f3fSGregory Neil Shapiro #endif /* MILTER */ 363040266059SGregory Neil Shapiro else 363140266059SGregory Neil Shapiro SuperSafe = atobool(val) ? SAFE_REALLY : SAFE_NO; 3632c2aa98e2SPeter Wemm break; 3633c2aa98e2SPeter Wemm 3634c2aa98e2SPeter Wemm case 'T': /* queue timeout */ 3635c2aa98e2SPeter Wemm p = strchr(val, '/'); 3636c2aa98e2SPeter Wemm if (p != NULL) 3637c2aa98e2SPeter Wemm { 3638c2aa98e2SPeter Wemm *p++ = '\0'; 363906f25ae9SGregory Neil Shapiro settimeout("queuewarn", p, sticky); 3640c2aa98e2SPeter Wemm } 364106f25ae9SGregory Neil Shapiro settimeout("queuereturn", val, sticky); 3642c2aa98e2SPeter Wemm break; 3643c2aa98e2SPeter Wemm 3644c2aa98e2SPeter Wemm case 't': /* time zone name */ 3645c2aa98e2SPeter Wemm TimeZoneSpec = newstr(val); 3646c2aa98e2SPeter Wemm break; 3647c2aa98e2SPeter Wemm 3648c2aa98e2SPeter Wemm case 'U': /* location of user database */ 3649c2aa98e2SPeter Wemm UdbSpec = newstr(val); 3650c2aa98e2SPeter Wemm break; 3651c2aa98e2SPeter Wemm 3652c2aa98e2SPeter Wemm case 'u': /* set default uid */ 3653c2aa98e2SPeter Wemm for (p = val; *p != '\0'; p++) 3654c2aa98e2SPeter Wemm { 365540266059SGregory Neil Shapiro #if _FFR_DOTTED_USERNAMES 365640266059SGregory Neil Shapiro if (*p == '/' || *p == ':') 36575b0945b5SGregory Neil Shapiro #else 3658c2aa98e2SPeter Wemm if (*p == '.' || *p == '/' || *p == ':') 36595b0945b5SGregory Neil Shapiro #endif 3660c2aa98e2SPeter Wemm { 3661c2aa98e2SPeter Wemm *p++ = '\0'; 3662c2aa98e2SPeter Wemm break; 3663c2aa98e2SPeter Wemm } 3664c2aa98e2SPeter Wemm } 3665c2aa98e2SPeter Wemm if (isascii(*val) && isdigit(*val)) 3666c2aa98e2SPeter Wemm { 3667c2aa98e2SPeter Wemm DefUid = atoi(val); 3668c2aa98e2SPeter Wemm setdefuser(); 3669c2aa98e2SPeter Wemm } 3670c2aa98e2SPeter Wemm else 3671c2aa98e2SPeter Wemm { 3672c2aa98e2SPeter Wemm register struct passwd *pw; 3673c2aa98e2SPeter Wemm 3674c2aa98e2SPeter Wemm DefUid = -1; 3675c2aa98e2SPeter Wemm pw = sm_getpwnam(val); 3676c2aa98e2SPeter Wemm if (pw == NULL) 3677193538b7SGregory Neil Shapiro { 3678c2aa98e2SPeter Wemm syserr("readcf: option u: unknown user %s", val); 3679193538b7SGregory Neil Shapiro break; 3680193538b7SGregory Neil Shapiro } 3681c2aa98e2SPeter Wemm else 3682c2aa98e2SPeter Wemm { 3683c2aa98e2SPeter Wemm DefUid = pw->pw_uid; 3684c2aa98e2SPeter Wemm DefGid = pw->pw_gid; 3685c2aa98e2SPeter Wemm DefUser = newstr(pw->pw_name); 3686c2aa98e2SPeter Wemm } 3687c2aa98e2SPeter Wemm } 3688c2aa98e2SPeter Wemm 3689c2aa98e2SPeter Wemm #ifdef UID_MAX 3690c2aa98e2SPeter Wemm if (DefUid > UID_MAX) 3691c2aa98e2SPeter Wemm { 3692c2aa98e2SPeter Wemm syserr("readcf: option u: uid value (%ld) > UID_MAX (%ld); ignored", 3693193538b7SGregory Neil Shapiro (long)DefUid, (long)UID_MAX); 3694193538b7SGregory Neil Shapiro break; 3695c2aa98e2SPeter Wemm } 369606f25ae9SGregory Neil Shapiro #endif /* UID_MAX */ 3697c2aa98e2SPeter Wemm 3698c2aa98e2SPeter Wemm /* handle the group if it is there */ 3699c2aa98e2SPeter Wemm if (*p == '\0') 3700c2aa98e2SPeter Wemm break; 3701c2aa98e2SPeter Wemm val = p; 3702c2aa98e2SPeter Wemm goto g_opt; 3703c2aa98e2SPeter Wemm 3704c2aa98e2SPeter Wemm case 'V': /* fallback MX host */ 3705c2aa98e2SPeter Wemm if (val[0] != '\0') 3706e92d3f3fSGregory Neil Shapiro FallbackMX = newstr(val); 3707c2aa98e2SPeter Wemm break; 3708c2aa98e2SPeter Wemm 3709c2aa98e2SPeter Wemm case 'v': /* run in verbose mode */ 3710c2aa98e2SPeter Wemm Verbose = atobool(val) ? 1 : 0; 3711c2aa98e2SPeter Wemm break; 3712c2aa98e2SPeter Wemm 3713c2aa98e2SPeter Wemm case 'w': /* if we are best MX, try host directly */ 3714c2aa98e2SPeter Wemm TryNullMXList = atobool(val); 3715c2aa98e2SPeter Wemm break; 3716c2aa98e2SPeter Wemm 3717c2aa98e2SPeter Wemm /* 'W' available -- was wizard password */ 3718c2aa98e2SPeter Wemm 3719c2aa98e2SPeter Wemm case 'x': /* load avg at which to auto-queue msgs */ 3720c2aa98e2SPeter Wemm QueueLA = atoi(val); 3721c2aa98e2SPeter Wemm break; 3722c2aa98e2SPeter Wemm 3723c2aa98e2SPeter Wemm case 'X': /* load avg at which to auto-reject connections */ 3724c2aa98e2SPeter Wemm RefuseLA = atoi(val); 3725c2aa98e2SPeter Wemm break; 3726c2aa98e2SPeter Wemm 372740266059SGregory Neil Shapiro case O_DELAY_LA: /* load avg at which to delay connections */ 372840266059SGregory Neil Shapiro DelayLA = atoi(val); 372940266059SGregory Neil Shapiro break; 373040266059SGregory Neil Shapiro 3731c2aa98e2SPeter Wemm case 'y': /* work recipient factor */ 3732c2aa98e2SPeter Wemm WkRecipFact = atoi(val); 3733c2aa98e2SPeter Wemm break; 3734c2aa98e2SPeter Wemm 3735c2aa98e2SPeter Wemm case 'Y': /* fork jobs during queue runs */ 3736c2aa98e2SPeter Wemm ForkQueueRuns = atobool(val); 3737c2aa98e2SPeter Wemm break; 3738c2aa98e2SPeter Wemm 3739c2aa98e2SPeter Wemm case 'z': /* work message class factor */ 3740c2aa98e2SPeter Wemm WkClassFact = atoi(val); 3741c2aa98e2SPeter Wemm break; 3742c2aa98e2SPeter Wemm 3743c2aa98e2SPeter Wemm case 'Z': /* work time factor */ 3744c2aa98e2SPeter Wemm WkTimeFact = atoi(val); 3745c2aa98e2SPeter Wemm break; 3746c2aa98e2SPeter Wemm 374706f25ae9SGregory Neil Shapiro 3748605302a5SGregory Neil Shapiro #if _FFR_QUEUE_GROUP_SORTORDER 3749605302a5SGregory Neil Shapiro /* coordinate this with makequeue() */ 37505b0945b5SGregory Neil Shapiro #endif 3751c2aa98e2SPeter Wemm case O_QUEUESORTORD: /* queue sorting order */ 3752c2aa98e2SPeter Wemm switch (*val) 3753c2aa98e2SPeter Wemm { 375440266059SGregory Neil Shapiro case 'f': /* File Name */ 375540266059SGregory Neil Shapiro case 'F': 375640266059SGregory Neil Shapiro QueueSortOrder = QSO_BYFILENAME; 375740266059SGregory Neil Shapiro break; 375840266059SGregory Neil Shapiro 3759c2aa98e2SPeter Wemm case 'h': /* Host first */ 3760c2aa98e2SPeter Wemm case 'H': 376106f25ae9SGregory Neil Shapiro QueueSortOrder = QSO_BYHOST; 3762c2aa98e2SPeter Wemm break; 3763c2aa98e2SPeter Wemm 376440266059SGregory Neil Shapiro case 'm': /* Modification time */ 376540266059SGregory Neil Shapiro case 'M': 376640266059SGregory Neil Shapiro QueueSortOrder = QSO_BYMODTIME; 376740266059SGregory Neil Shapiro break; 376840266059SGregory Neil Shapiro 3769c2aa98e2SPeter Wemm case 'p': /* Priority order */ 3770c2aa98e2SPeter Wemm case 'P': 377106f25ae9SGregory Neil Shapiro QueueSortOrder = QSO_BYPRIORITY; 3772c2aa98e2SPeter Wemm break; 3773c2aa98e2SPeter Wemm 3774c2aa98e2SPeter Wemm case 't': /* Submission time */ 3775c2aa98e2SPeter Wemm case 'T': 377606f25ae9SGregory Neil Shapiro QueueSortOrder = QSO_BYTIME; 377706f25ae9SGregory Neil Shapiro break; 377806f25ae9SGregory Neil Shapiro 377940266059SGregory Neil Shapiro case 'r': /* Random */ 378040266059SGregory Neil Shapiro case 'R': 378140266059SGregory Neil Shapiro QueueSortOrder = QSO_RANDOM; 3782c2aa98e2SPeter Wemm break; 3783c2aa98e2SPeter Wemm 378440266059SGregory Neil Shapiro #if _FFR_RHS 378540266059SGregory Neil Shapiro case 's': /* Shuffled host name */ 378640266059SGregory Neil Shapiro case 'S': 378740266059SGregory Neil Shapiro QueueSortOrder = QSO_BYSHUFFLE; 378840266059SGregory Neil Shapiro break; 378940266059SGregory Neil Shapiro #endif /* _FFR_RHS */ 379040266059SGregory Neil Shapiro 3791e92d3f3fSGregory Neil Shapiro case 'n': /* none */ 3792e92d3f3fSGregory Neil Shapiro case 'N': 3793e92d3f3fSGregory Neil Shapiro QueueSortOrder = QSO_NONE; 3794e92d3f3fSGregory Neil Shapiro break; 3795e92d3f3fSGregory Neil Shapiro 3796c2aa98e2SPeter Wemm default: 3797c2aa98e2SPeter Wemm syserr("Invalid queue sort order \"%s\"", val); 3798c2aa98e2SPeter Wemm } 3799c2aa98e2SPeter Wemm break; 3800c2aa98e2SPeter Wemm 3801c2aa98e2SPeter Wemm case O_HOSTSFILE: /* pathname of /etc/hosts file */ 380240266059SGregory Neil Shapiro CANONIFY(val); 3803c2aa98e2SPeter Wemm HostsFile = newstr(val); 3804c2aa98e2SPeter Wemm break; 3805c2aa98e2SPeter Wemm 3806c2aa98e2SPeter Wemm case O_MQA: /* minimum queue age between deliveries */ 3807c2aa98e2SPeter Wemm MinQueueAge = convtime(val, 'm'); 3808c2aa98e2SPeter Wemm break; 3809c2aa98e2SPeter Wemm 38109bd497b8SGregory Neil Shapiro case O_MAX_QUEUE_AGE: 38119bd497b8SGregory Neil Shapiro MaxQueueAge = convtime(val, 'm'); 38129bd497b8SGregory Neil Shapiro break; 38139bd497b8SGregory Neil Shapiro 3814c2aa98e2SPeter Wemm case O_DEFCHARSET: /* default character set for mimefying */ 381540266059SGregory Neil Shapiro DefaultCharSet = newstr(denlstring(val, true, true)); 3816c2aa98e2SPeter Wemm break; 3817c2aa98e2SPeter Wemm 3818c2aa98e2SPeter Wemm case O_SSFILE: /* service switch file */ 381940266059SGregory Neil Shapiro CANONIFY(val); 3820c2aa98e2SPeter Wemm ServiceSwitchFile = newstr(val); 3821c2aa98e2SPeter Wemm break; 3822c2aa98e2SPeter Wemm 3823c2aa98e2SPeter Wemm case O_DIALDELAY: /* delay for dial-on-demand operation */ 3824c2aa98e2SPeter Wemm DialDelay = convtime(val, 's'); 3825c2aa98e2SPeter Wemm break; 3826c2aa98e2SPeter Wemm 3827c2aa98e2SPeter Wemm case O_NORCPTACTION: /* what to do if no recipient */ 3828*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(val, "none")) 3829c2aa98e2SPeter Wemm NoRecipientAction = NRA_NO_ACTION; 3830*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(val, "add-to")) 3831c2aa98e2SPeter Wemm NoRecipientAction = NRA_ADD_TO; 3832*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(val, "add-apparently-to")) 3833c2aa98e2SPeter Wemm NoRecipientAction = NRA_ADD_APPARENTLY_TO; 3834*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(val, "add-bcc")) 3835c2aa98e2SPeter Wemm NoRecipientAction = NRA_ADD_BCC; 3836*2fb4f839SGregory Neil Shapiro else if (SM_STRCASEEQ(val, "add-to-undisclosed")) 3837c2aa98e2SPeter Wemm NoRecipientAction = NRA_ADD_TO_UNDISCLOSED; 3838c2aa98e2SPeter Wemm else 3839c2aa98e2SPeter Wemm syserr("Invalid NoRecipientAction: %s", val); 3840c2aa98e2SPeter Wemm break; 3841c2aa98e2SPeter Wemm 3842c2aa98e2SPeter Wemm case O_SAFEFILEENV: /* chroot() environ for writing to files */ 3843605302a5SGregory Neil Shapiro if (*val == '\0') 3844605302a5SGregory Neil Shapiro break; 3845605302a5SGregory Neil Shapiro 3846605302a5SGregory Neil Shapiro /* strip trailing slashes */ 3847605302a5SGregory Neil Shapiro p = val + strlen(val) - 1; 3848605302a5SGregory Neil Shapiro while (p >= val && *p == '/') 3849605302a5SGregory Neil Shapiro *p-- = '\0'; 3850605302a5SGregory Neil Shapiro 3851605302a5SGregory Neil Shapiro if (*val == '\0') 3852605302a5SGregory Neil Shapiro break; 3853605302a5SGregory Neil Shapiro 3854c2aa98e2SPeter Wemm SafeFileEnv = newstr(val); 3855c2aa98e2SPeter Wemm break; 3856c2aa98e2SPeter Wemm 3857c2aa98e2SPeter Wemm case O_MAXMSGSIZE: /* maximum message size */ 3858c2aa98e2SPeter Wemm MaxMessageSize = atol(val); 3859c2aa98e2SPeter Wemm break; 3860c2aa98e2SPeter Wemm 3861c2aa98e2SPeter Wemm case O_COLONOKINADDR: /* old style handling of colon addresses */ 3862c2aa98e2SPeter Wemm ColonOkInAddr = atobool(val); 3863c2aa98e2SPeter Wemm break; 3864c2aa98e2SPeter Wemm 3865c2aa98e2SPeter Wemm case O_MAXQUEUERUN: /* max # of jobs in a single queue run */ 386640266059SGregory Neil Shapiro MaxQueueRun = atoi(val); 3867c2aa98e2SPeter Wemm break; 3868c2aa98e2SPeter Wemm 3869c2aa98e2SPeter Wemm case O_MAXCHILDREN: /* max # of children of daemon */ 3870c2aa98e2SPeter Wemm MaxChildren = atoi(val); 3871c2aa98e2SPeter Wemm break; 3872c2aa98e2SPeter Wemm 387340266059SGregory Neil Shapiro case O_MAXQUEUECHILDREN: /* max # of children of daemon */ 387440266059SGregory Neil Shapiro MaxQueueChildren = atoi(val); 387540266059SGregory Neil Shapiro break; 387640266059SGregory Neil Shapiro 387740266059SGregory Neil Shapiro case O_MAXRUNNERSPERQUEUE: /* max # runners in a queue group */ 387840266059SGregory Neil Shapiro MaxRunnersPerQueue = atoi(val); 387940266059SGregory Neil Shapiro break; 388040266059SGregory Neil Shapiro 388140266059SGregory Neil Shapiro case O_NICEQUEUERUN: /* nice queue runs */ 388240266059SGregory Neil Shapiro #if !HASNICE 388340266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 388440266059SGregory Neil Shapiro "Warning: NiceQueueRun set on system that doesn't support nice()\n"); 38855b0945b5SGregory Neil Shapiro #endif 388640266059SGregory Neil Shapiro 388740266059SGregory Neil Shapiro /* XXX do we want to check the range? > 0 ? */ 388840266059SGregory Neil Shapiro NiceQueueRun = atoi(val); 388940266059SGregory Neil Shapiro break; 389040266059SGregory Neil Shapiro 389140266059SGregory Neil Shapiro case O_SHMKEY: /* shared memory key */ 389240266059SGregory Neil Shapiro #if SM_CONF_SHM 389340266059SGregory Neil Shapiro ShmKey = atol(val); 389440266059SGregory Neil Shapiro #else /* SM_CONF_SHM */ 389540266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 389640266059SGregory Neil Shapiro "Warning: Option: %s requires shared memory support (-DSM_CONF_SHM)\n", 389740266059SGregory Neil Shapiro OPTNAME); 389840266059SGregory Neil Shapiro #endif /* SM_CONF_SHM */ 389940266059SGregory Neil Shapiro break; 390040266059SGregory Neil Shapiro 3901605302a5SGregory Neil Shapiro case O_SHMKEYFILE: /* shared memory key file */ 3902605302a5SGregory Neil Shapiro #if SM_CONF_SHM 3903739ac4d4SGregory Neil Shapiro SET_STRING_EXP(ShmKeyFile); 3904605302a5SGregory Neil Shapiro #else /* SM_CONF_SHM */ 3905605302a5SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 3906605302a5SGregory Neil Shapiro "Warning: Option: %s requires shared memory support (-DSM_CONF_SHM)\n", 3907605302a5SGregory Neil Shapiro OPTNAME); 3908605302a5SGregory Neil Shapiro break; 3909739ac4d4SGregory Neil Shapiro #endif /* SM_CONF_SHM */ 3910605302a5SGregory Neil Shapiro 391106f25ae9SGregory Neil Shapiro #if _FFR_MAX_FORWARD_ENTRIES 391206f25ae9SGregory Neil Shapiro case O_MAXFORWARD: /* max # of forward entries */ 391306f25ae9SGregory Neil Shapiro MaxForwardEntries = atoi(val); 391406f25ae9SGregory Neil Shapiro break; 39155b0945b5SGregory Neil Shapiro #endif 391606f25ae9SGregory Neil Shapiro 3917c2aa98e2SPeter Wemm case O_KEEPCNAMES: /* don't expand CNAME records */ 3918c2aa98e2SPeter Wemm DontExpandCnames = atobool(val); 3919c2aa98e2SPeter Wemm break; 3920c2aa98e2SPeter Wemm 3921c2aa98e2SPeter Wemm case O_MUSTQUOTE: /* must quote these characters in phrases */ 3922d0cef73dSGregory Neil Shapiro (void) sm_strlcpy(buf, "@,;:\\()[]", sizeof(buf)); 3923d0cef73dSGregory Neil Shapiro if (strlen(val) < sizeof(buf) - 10) 3924d0cef73dSGregory Neil Shapiro (void) sm_strlcat(buf, val, sizeof(buf)); 392506f25ae9SGregory Neil Shapiro else 392640266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 392740266059SGregory Neil Shapiro "Warning: MustQuoteChars too long, ignored.\n"); 3928c2aa98e2SPeter Wemm MustQuoteChars = newstr(buf); 3929c2aa98e2SPeter Wemm break; 3930c2aa98e2SPeter Wemm 3931c2aa98e2SPeter Wemm case O_SMTPGREETING: /* SMTP greeting message (old $e macro) */ 3932c2aa98e2SPeter Wemm SmtpGreeting = newstr(munchstring(val, NULL, '\0')); 3933c2aa98e2SPeter Wemm break; 3934c2aa98e2SPeter Wemm 3935c2aa98e2SPeter Wemm case O_UNIXFROM: /* UNIX From_ line (old $l macro) */ 3936c2aa98e2SPeter Wemm UnixFromLine = newstr(munchstring(val, NULL, '\0')); 3937c2aa98e2SPeter Wemm break; 3938c2aa98e2SPeter Wemm 3939c2aa98e2SPeter Wemm case O_OPCHARS: /* operator characters (old $o macro) */ 394006f25ae9SGregory Neil Shapiro if (OperatorChars != NULL) 394140266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 394240266059SGregory Neil Shapiro "Warning: OperatorChars is being redefined.\n It should only be set before ruleset definitions.\n"); 3943c2aa98e2SPeter Wemm OperatorChars = newstr(munchstring(val, NULL, '\0')); 3944c2aa98e2SPeter Wemm break; 3945c2aa98e2SPeter Wemm 3946c2aa98e2SPeter Wemm case O_DONTINITGRPS: /* don't call initgroups(3) */ 3947c2aa98e2SPeter Wemm DontInitGroups = atobool(val); 3948c2aa98e2SPeter Wemm break; 3949c2aa98e2SPeter Wemm 3950c2aa98e2SPeter Wemm case O_SLFH: /* make sure from fits on one line */ 3951c2aa98e2SPeter Wemm SingleLineFromHeader = atobool(val); 3952c2aa98e2SPeter Wemm break; 3953c2aa98e2SPeter Wemm 3954c2aa98e2SPeter Wemm case O_ABH: /* allow HELO commands with syntax errors */ 3955c2aa98e2SPeter Wemm AllowBogusHELO = atobool(val); 3956c2aa98e2SPeter Wemm break; 3957c2aa98e2SPeter Wemm 3958c2aa98e2SPeter Wemm case O_CONNTHROT: /* connection rate throttle */ 3959c2aa98e2SPeter Wemm ConnRateThrottle = atoi(val); 3960c2aa98e2SPeter Wemm break; 3961c2aa98e2SPeter Wemm 3962c2aa98e2SPeter Wemm case O_UGW: /* group writable files are unsafe */ 3963c2aa98e2SPeter Wemm if (!atobool(val)) 396406f25ae9SGregory Neil Shapiro { 396506f25ae9SGregory Neil Shapiro setbitn(DBS_GROUPWRITABLEFORWARDFILESAFE, 396606f25ae9SGregory Neil Shapiro DontBlameSendmail); 396706f25ae9SGregory Neil Shapiro setbitn(DBS_GROUPWRITABLEINCLUDEFILESAFE, 396806f25ae9SGregory Neil Shapiro DontBlameSendmail); 396906f25ae9SGregory Neil Shapiro } 3970c2aa98e2SPeter Wemm break; 3971c2aa98e2SPeter Wemm 3972c2aa98e2SPeter Wemm case O_DBLBOUNCE: /* address to which to send double bounces */ 3973c2aa98e2SPeter Wemm DoubleBounceAddr = newstr(val); 3974c2aa98e2SPeter Wemm break; 3975c2aa98e2SPeter Wemm 3976c2aa98e2SPeter Wemm case O_HSDIR: /* persistent host status directory */ 3977c2aa98e2SPeter Wemm if (val[0] != '\0') 3978602a2b1bSGregory Neil Shapiro { 397940266059SGregory Neil Shapiro CANONIFY(val); 3980c2aa98e2SPeter Wemm HostStatDir = newstr(val); 3981602a2b1bSGregory Neil Shapiro } 3982c2aa98e2SPeter Wemm break; 3983c2aa98e2SPeter Wemm 3984c2aa98e2SPeter Wemm case O_SINGTHREAD: /* single thread deliveries (requires hsdir) */ 3985c2aa98e2SPeter Wemm SingleThreadDelivery = atobool(val); 3986c2aa98e2SPeter Wemm break; 3987c2aa98e2SPeter Wemm 3988c2aa98e2SPeter Wemm case O_RUNASUSER: /* run bulk of code as this user */ 3989c2aa98e2SPeter Wemm for (p = val; *p != '\0'; p++) 3990c2aa98e2SPeter Wemm { 399140266059SGregory Neil Shapiro #if _FFR_DOTTED_USERNAMES 399240266059SGregory Neil Shapiro if (*p == '/' || *p == ':') 39935b0945b5SGregory Neil Shapiro #else 3994c2aa98e2SPeter Wemm if (*p == '.' || *p == '/' || *p == ':') 39955b0945b5SGregory Neil Shapiro #endif 3996c2aa98e2SPeter Wemm { 3997c2aa98e2SPeter Wemm *p++ = '\0'; 3998c2aa98e2SPeter Wemm break; 3999c2aa98e2SPeter Wemm } 4000c2aa98e2SPeter Wemm } 4001c2aa98e2SPeter Wemm if (isascii(*val) && isdigit(*val)) 4002c2aa98e2SPeter Wemm { 4003c2aa98e2SPeter Wemm if (can_setuid) 4004c2aa98e2SPeter Wemm RunAsUid = atoi(val); 4005c2aa98e2SPeter Wemm } 4006c2aa98e2SPeter Wemm else 4007c2aa98e2SPeter Wemm { 4008c2aa98e2SPeter Wemm register struct passwd *pw; 4009c2aa98e2SPeter Wemm 4010c2aa98e2SPeter Wemm pw = sm_getpwnam(val); 4011c2aa98e2SPeter Wemm if (pw == NULL) 4012193538b7SGregory Neil Shapiro { 4013c2aa98e2SPeter Wemm syserr("readcf: option RunAsUser: unknown user %s", val); 4014193538b7SGregory Neil Shapiro break; 4015193538b7SGregory Neil Shapiro } 4016c2aa98e2SPeter Wemm else if (can_setuid) 4017c2aa98e2SPeter Wemm { 4018c2aa98e2SPeter Wemm if (*p == '\0') 4019c2aa98e2SPeter Wemm RunAsUserName = newstr(val); 4020c2aa98e2SPeter Wemm RunAsUid = pw->pw_uid; 4021c2aa98e2SPeter Wemm RunAsGid = pw->pw_gid; 4022c2aa98e2SPeter Wemm } 402340266059SGregory Neil Shapiro else if (EffGid == pw->pw_gid) 402440266059SGregory Neil Shapiro RunAsGid = pw->pw_gid; 402540266059SGregory Neil Shapiro else if (UseMSP && *p == '\0') 402640266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 4027da7d7b9cSGregory Neil Shapiro "WARNING: RunAsUser for MSP ignored, check group ids (egid=%ld, want=%ld)\n", 4028da7d7b9cSGregory Neil Shapiro (long) EffGid, 4029da7d7b9cSGregory Neil Shapiro (long) pw->pw_gid); 4030c2aa98e2SPeter Wemm } 4031c2aa98e2SPeter Wemm #ifdef UID_MAX 4032c2aa98e2SPeter Wemm if (RunAsUid > UID_MAX) 4033c2aa98e2SPeter Wemm { 4034c2aa98e2SPeter Wemm syserr("readcf: option RunAsUser: uid value (%ld) > UID_MAX (%ld); ignored", 4035193538b7SGregory Neil Shapiro (long) RunAsUid, (long) UID_MAX); 4036193538b7SGregory Neil Shapiro break; 4037c2aa98e2SPeter Wemm } 403806f25ae9SGregory Neil Shapiro #endif /* UID_MAX */ 4039c2aa98e2SPeter Wemm if (*p != '\0') 4040c2aa98e2SPeter Wemm { 4041c2aa98e2SPeter Wemm if (isascii(*p) && isdigit(*p)) 4042c2aa98e2SPeter Wemm { 404340266059SGregory Neil Shapiro gid_t runasgid; 404440266059SGregory Neil Shapiro 404540266059SGregory Neil Shapiro runasgid = (gid_t) atoi(p); 404640266059SGregory Neil Shapiro if (can_setuid || EffGid == runasgid) 404740266059SGregory Neil Shapiro RunAsGid = runasgid; 404840266059SGregory Neil Shapiro else if (UseMSP) 404940266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, 405040266059SGregory Neil Shapiro SM_TIME_DEFAULT, 4051da7d7b9cSGregory Neil Shapiro "WARNING: RunAsUser for MSP ignored, check group ids (egid=%ld, want=%ld)\n", 4052da7d7b9cSGregory Neil Shapiro (long) EffGid, 4053da7d7b9cSGregory Neil Shapiro (long) runasgid); 4054c2aa98e2SPeter Wemm } 4055c2aa98e2SPeter Wemm else 4056c2aa98e2SPeter Wemm { 4057c2aa98e2SPeter Wemm register struct group *gr; 4058c2aa98e2SPeter Wemm 4059c2aa98e2SPeter Wemm gr = getgrnam(p); 4060c2aa98e2SPeter Wemm if (gr == NULL) 4061c2aa98e2SPeter Wemm syserr("readcf: option RunAsUser: unknown group %s", 4062c2aa98e2SPeter Wemm p); 406340266059SGregory Neil Shapiro else if (can_setuid || EffGid == gr->gr_gid) 4064c2aa98e2SPeter Wemm RunAsGid = gr->gr_gid; 406540266059SGregory Neil Shapiro else if (UseMSP) 406640266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, 406740266059SGregory Neil Shapiro SM_TIME_DEFAULT, 4068da7d7b9cSGregory Neil Shapiro "WARNING: RunAsUser for MSP ignored, check group ids (egid=%ld, want=%ld)\n", 4069da7d7b9cSGregory Neil Shapiro (long) EffGid, 4070da7d7b9cSGregory Neil Shapiro (long) gr->gr_gid); 4071c2aa98e2SPeter Wemm } 4072c2aa98e2SPeter Wemm } 4073c2aa98e2SPeter Wemm if (tTd(47, 5)) 407440266059SGregory Neil Shapiro sm_dprintf("readcf: RunAsUser = %d:%d\n", 407506f25ae9SGregory Neil Shapiro (int) RunAsUid, (int) RunAsGid); 4076c2aa98e2SPeter Wemm break; 4077c2aa98e2SPeter Wemm 4078c2aa98e2SPeter Wemm case O_DSN_RRT: 4079c2aa98e2SPeter Wemm RrtImpliesDsn = atobool(val); 4080c2aa98e2SPeter Wemm break; 4081c2aa98e2SPeter Wemm 4082c2aa98e2SPeter Wemm case O_PIDFILE: 408340266059SGregory Neil Shapiro PSTRSET(PidFile, val); 4084c2aa98e2SPeter Wemm break; 4085c2aa98e2SPeter Wemm 4086c2aa98e2SPeter Wemm case O_DONTBLAMESENDMAIL: 4087c2aa98e2SPeter Wemm p = val; 4088c2aa98e2SPeter Wemm for (;;) 4089c2aa98e2SPeter Wemm { 4090c2aa98e2SPeter Wemm register struct dbsval *dbs; 4091c2aa98e2SPeter Wemm extern struct dbsval DontBlameSendmailValues[]; 4092c2aa98e2SPeter Wemm 4093c2aa98e2SPeter Wemm while (isascii(*p) && (isspace(*p) || ispunct(*p))) 4094c2aa98e2SPeter Wemm p++; 4095c2aa98e2SPeter Wemm if (*p == '\0') 4096c2aa98e2SPeter Wemm break; 4097c2aa98e2SPeter Wemm val = p; 4098c2aa98e2SPeter Wemm while (isascii(*p) && isalnum(*p)) 4099c2aa98e2SPeter Wemm p++; 4100c2aa98e2SPeter Wemm if (*p != '\0') 4101c2aa98e2SPeter Wemm *p++ = '\0'; 4102c2aa98e2SPeter Wemm 4103c2aa98e2SPeter Wemm for (dbs = DontBlameSendmailValues; 4104c2aa98e2SPeter Wemm dbs->dbs_name != NULL; dbs++) 4105c2aa98e2SPeter Wemm { 4106*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(val, dbs->dbs_name)) 4107c2aa98e2SPeter Wemm break; 4108c2aa98e2SPeter Wemm } 4109c2aa98e2SPeter Wemm if (dbs->dbs_name == NULL) 4110c2aa98e2SPeter Wemm syserr("readcf: DontBlameSendmail option: %s unrecognized", val); 4111c2aa98e2SPeter Wemm else if (dbs->dbs_flag == DBS_SAFE) 411206f25ae9SGregory Neil Shapiro clrbitmap(DontBlameSendmail); 4113c2aa98e2SPeter Wemm else 411406f25ae9SGregory Neil Shapiro setbitn(dbs->dbs_flag, DontBlameSendmail); 4115c2aa98e2SPeter Wemm } 411640266059SGregory Neil Shapiro sticky = false; 4117c2aa98e2SPeter Wemm break; 4118c2aa98e2SPeter Wemm 4119c2aa98e2SPeter Wemm case O_DPI: 4120*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(val, "loopback")) 412140266059SGregory Neil Shapiro DontProbeInterfaces = DPI_SKIPLOOPBACK; 412240266059SGregory Neil Shapiro else if (atobool(val)) 412340266059SGregory Neil Shapiro DontProbeInterfaces = DPI_PROBENONE; 412440266059SGregory Neil Shapiro else 412540266059SGregory Neil Shapiro DontProbeInterfaces = DPI_PROBEALL; 4126c2aa98e2SPeter Wemm break; 4127c2aa98e2SPeter Wemm 4128c2aa98e2SPeter Wemm case O_MAXRCPT: 4129c2aa98e2SPeter Wemm MaxRcptPerMsg = atoi(val); 4130c2aa98e2SPeter Wemm break; 4131c2aa98e2SPeter Wemm 413240266059SGregory Neil Shapiro case O_RCPTTHROT: 413340266059SGregory Neil Shapiro BadRcptThrottle = atoi(val); 413440266059SGregory Neil Shapiro break; 413540266059SGregory Neil Shapiro 41369bd497b8SGregory Neil Shapiro #if _FFR_RCPTTHROTDELAY 41379bd497b8SGregory Neil Shapiro case O_RCPTTHROTDELAY: 41389bd497b8SGregory Neil Shapiro BadRcptThrottleDelay = atoi(val); 41399bd497b8SGregory Neil Shapiro break; 41405b0945b5SGregory Neil Shapiro #endif 41419bd497b8SGregory Neil Shapiro 4142c2aa98e2SPeter Wemm case O_DEADLETTER: 414340266059SGregory Neil Shapiro CANONIFY(val); 414440266059SGregory Neil Shapiro PSTRSET(DeadLetterDrop, val); 4145c2aa98e2SPeter Wemm break; 4146c2aa98e2SPeter Wemm 4147c2aa98e2SPeter Wemm #if _FFR_DONTLOCKFILESFORREAD_OPTION 4148c2aa98e2SPeter Wemm case O_DONTLOCK: 4149c2aa98e2SPeter Wemm DontLockReadFiles = atobool(val); 4150c2aa98e2SPeter Wemm break; 41515b0945b5SGregory Neil Shapiro #endif 4152c2aa98e2SPeter Wemm 4153c2aa98e2SPeter Wemm case O_MAXALIASRCSN: 4154c2aa98e2SPeter Wemm MaxAliasRecursion = atoi(val); 4155c2aa98e2SPeter Wemm break; 4156c2aa98e2SPeter Wemm 4157c2aa98e2SPeter Wemm case O_CNCTONLYTO: 4158c2aa98e2SPeter Wemm /* XXX should probably use gethostbyname */ 415906f25ae9SGregory Neil Shapiro #if NETINET || NETINET6 41605b0945b5SGregory Neil Shapiro i = 0; 41615b0945b5SGregory Neil Shapiro if ((subopt = strchr(val, '@')) != NULL) 41625b0945b5SGregory Neil Shapiro { 41635b0945b5SGregory Neil Shapiro *subopt = '\0'; 41645b0945b5SGregory Neil Shapiro i = (int) strtoul(val, NULL, 0); 41655b0945b5SGregory Neil Shapiro 41665b0945b5SGregory Neil Shapiro /* stricter checks? probably not useful. */ 41675b0945b5SGregory Neil Shapiro if (i > USHRT_MAX) 41685b0945b5SGregory Neil Shapiro { 41695b0945b5SGregory Neil Shapiro syserr("readcf: option ConnectOnlyTo: invalid port %s", 41705b0945b5SGregory Neil Shapiro val); 41715b0945b5SGregory Neil Shapiro break; 41725b0945b5SGregory Neil Shapiro } 41735b0945b5SGregory Neil Shapiro val = subopt + 1; 41745b0945b5SGregory Neil Shapiro } 417540266059SGregory Neil Shapiro ConnectOnlyTo.sa.sa_family = AF_UNSPEC; 417606f25ae9SGregory Neil Shapiro # if NETINET6 417740266059SGregory Neil Shapiro if (anynet_pton(AF_INET6, val, 41786f9c8e5bSGregory Neil Shapiro &ConnectOnlyTo.sin6.sin6_addr) == 1) 41795b0945b5SGregory Neil Shapiro { 418040266059SGregory Neil Shapiro ConnectOnlyTo.sa.sa_family = AF_INET6; 41815b0945b5SGregory Neil Shapiro if (i != 0) 41825b0945b5SGregory Neil Shapiro ConnectOnlyTo.sin6.sin6_port = htons(i); 41835b0945b5SGregory Neil Shapiro } 418406f25ae9SGregory Neil Shapiro else 418506f25ae9SGregory Neil Shapiro # endif /* NETINET6 */ 418640266059SGregory Neil Shapiro # if NETINET 418706f25ae9SGregory Neil Shapiro { 418806f25ae9SGregory Neil Shapiro ConnectOnlyTo.sin.sin_addr.s_addr = inet_addr(val); 418940266059SGregory Neil Shapiro if (ConnectOnlyTo.sin.sin_addr.s_addr != INADDR_NONE) 419040266059SGregory Neil Shapiro ConnectOnlyTo.sa.sa_family = AF_INET; 41915b0945b5SGregory Neil Shapiro if (i != 0) 41925b0945b5SGregory Neil Shapiro ConnectOnlyTo.sin.sin_port = htons(i); 419340266059SGregory Neil Shapiro } 419440266059SGregory Neil Shapiro 419540266059SGregory Neil Shapiro # endif /* NETINET */ 419640266059SGregory Neil Shapiro if (ConnectOnlyTo.sa.sa_family == AF_UNSPEC) 419740266059SGregory Neil Shapiro { 419840266059SGregory Neil Shapiro syserr("readcf: option ConnectOnlyTo: invalid IP address %s", 419940266059SGregory Neil Shapiro val); 420040266059SGregory Neil Shapiro break; 420106f25ae9SGregory Neil Shapiro } 420206f25ae9SGregory Neil Shapiro #endif /* NETINET || NETINET6 */ 4203c2aa98e2SPeter Wemm break; 4204c2aa98e2SPeter Wemm 4205065a643dSPeter Wemm case O_TRUSTUSER: 420640266059SGregory Neil Shapiro #if !HASFCHOWN && !defined(_FFR_DROP_TRUSTUSER_WARNING) 420740266059SGregory Neil Shapiro if (!UseMSP) 420840266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 420940266059SGregory Neil Shapiro "readcf: option TrustedUser may cause problems on systems\n which do not support fchown() if UseMSP is not set.\n"); 421040266059SGregory Neil Shapiro #endif /* !HASFCHOWN && !defined(_FFR_DROP_TRUSTUSER_WARNING) */ 4211c2aa98e2SPeter Wemm if (isascii(*val) && isdigit(*val)) 4212065a643dSPeter Wemm TrustedUid = atoi(val); 4213c2aa98e2SPeter Wemm else 4214c2aa98e2SPeter Wemm { 4215c2aa98e2SPeter Wemm register struct passwd *pw; 4216c2aa98e2SPeter Wemm 4217065a643dSPeter Wemm TrustedUid = 0; 4218c2aa98e2SPeter Wemm pw = sm_getpwnam(val); 4219c2aa98e2SPeter Wemm if (pw == NULL) 4220193538b7SGregory Neil Shapiro { 4221065a643dSPeter Wemm syserr("readcf: option TrustedUser: unknown user %s", val); 4222193538b7SGregory Neil Shapiro break; 4223193538b7SGregory Neil Shapiro } 4224c2aa98e2SPeter Wemm else 4225065a643dSPeter Wemm TrustedUid = pw->pw_uid; 4226c2aa98e2SPeter Wemm } 4227c2aa98e2SPeter Wemm 4228c2aa98e2SPeter Wemm #ifdef UID_MAX 4229065a643dSPeter Wemm if (TrustedUid > UID_MAX) 4230c2aa98e2SPeter Wemm { 4231065a643dSPeter Wemm syserr("readcf: option TrustedUser: uid value (%ld) > UID_MAX (%ld)", 4232193538b7SGregory Neil Shapiro (long) TrustedUid, (long) UID_MAX); 4233065a643dSPeter Wemm TrustedUid = 0; 4234c2aa98e2SPeter Wemm } 423506f25ae9SGregory Neil Shapiro #endif /* UID_MAX */ 4236c2aa98e2SPeter Wemm break; 4237c2aa98e2SPeter Wemm 4238065a643dSPeter Wemm case O_MAXMIMEHDRLEN: 4239065a643dSPeter Wemm p = strchr(val, '/'); 4240065a643dSPeter Wemm if (p != NULL) 4241065a643dSPeter Wemm *p++ = '\0'; 4242065a643dSPeter Wemm MaxMimeHeaderLength = atoi(val); 4243065a643dSPeter Wemm if (p != NULL && *p != '\0') 4244065a643dSPeter Wemm MaxMimeFieldLength = atoi(p); 4245065a643dSPeter Wemm else 4246065a643dSPeter Wemm MaxMimeFieldLength = MaxMimeHeaderLength / 2; 4247065a643dSPeter Wemm 4248a7ec597cSGregory Neil Shapiro if (MaxMimeHeaderLength <= 0) 4249065a643dSPeter Wemm MaxMimeHeaderLength = 0; 4250065a643dSPeter Wemm else if (MaxMimeHeaderLength < 128) 425140266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 425240266059SGregory Neil Shapiro "Warning: MaxMimeHeaderLength: header length limit set lower than 128\n"); 4253065a643dSPeter Wemm 4254a7ec597cSGregory Neil Shapiro if (MaxMimeFieldLength <= 0) 4255065a643dSPeter Wemm MaxMimeFieldLength = 0; 4256065a643dSPeter Wemm else if (MaxMimeFieldLength < 40) 425740266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 425840266059SGregory Neil Shapiro "Warning: MaxMimeHeaderLength: field length limit set lower than 40\n"); 4259d0cef73dSGregory Neil Shapiro 4260d0cef73dSGregory Neil Shapiro /* 4261d0cef73dSGregory Neil Shapiro ** Headers field values now include leading space, so let's 4262d0cef73dSGregory Neil Shapiro ** adjust the values to be "backward compatible". 4263d0cef73dSGregory Neil Shapiro */ 4264d0cef73dSGregory Neil Shapiro 4265d0cef73dSGregory Neil Shapiro if (MaxMimeHeaderLength > 0) 4266d0cef73dSGregory Neil Shapiro MaxMimeHeaderLength++; 4267d0cef73dSGregory Neil Shapiro if (MaxMimeFieldLength > 0) 4268d0cef73dSGregory Neil Shapiro MaxMimeFieldLength++; 4269065a643dSPeter Wemm break; 4270065a643dSPeter Wemm 4271065a643dSPeter Wemm case O_CONTROLSOCKET: 427240266059SGregory Neil Shapiro PSTRSET(ControlSocketName, val); 4273065a643dSPeter Wemm break; 4274065a643dSPeter Wemm 42752e43090eSPeter Wemm case O_MAXHDRSLEN: 42762e43090eSPeter Wemm MaxHeadersLength = atoi(val); 427725bab6e9SPeter Wemm 42782e43090eSPeter Wemm if (MaxHeadersLength > 0 && 42792e43090eSPeter Wemm MaxHeadersLength < (MAXHDRSLEN / 2)) 428040266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 428140266059SGregory Neil Shapiro "Warning: MaxHeadersLength: headers length limit set lower than %d\n", 428240266059SGregory Neil Shapiro (MAXHDRSLEN / 2)); 428325bab6e9SPeter Wemm break; 428406f25ae9SGregory Neil Shapiro 428506f25ae9SGregory Neil Shapiro case O_PROCTITLEPREFIX: 428640266059SGregory Neil Shapiro PSTRSET(ProcTitlePrefix, val); 428706f25ae9SGregory Neil Shapiro break; 428806f25ae9SGregory Neil Shapiro 428906f25ae9SGregory Neil Shapiro #if SASL 429006f25ae9SGregory Neil Shapiro case O_SASLINFO: 429106f25ae9SGregory Neil Shapiro # if _FFR_ALLOW_SASLINFO 429206f25ae9SGregory Neil Shapiro /* 429340266059SGregory Neil Shapiro ** Allow users to select their own authinfo file 429440266059SGregory Neil Shapiro ** under certain circumstances, otherwise just ignore 429540266059SGregory Neil Shapiro ** the option. If the option isn't ignored, several 429640266059SGregory Neil Shapiro ** commands don't work very well, e.g., mailq. 429706f25ae9SGregory Neil Shapiro ** However, this is not a "perfect" solution. 429806f25ae9SGregory Neil Shapiro ** If mail is queued, the authentication info 429906f25ae9SGregory Neil Shapiro ** will not be used in subsequent delivery attempts. 430006f25ae9SGregory Neil Shapiro ** If we really want to support this, then it has 430106f25ae9SGregory Neil Shapiro ** to be stored in the queue file. 430206f25ae9SGregory Neil Shapiro */ 430306f25ae9SGregory Neil Shapiro if (!bitset(SUBMIT_MSA, SubmitMode) && RealUid != 0 && 430406f25ae9SGregory Neil Shapiro RunAsUid != RealUid) 430506f25ae9SGregory Neil Shapiro break; 430606f25ae9SGregory Neil Shapiro # endif /* _FFR_ALLOW_SASLINFO */ 430740266059SGregory Neil Shapiro PSTRSET(SASLInfo, val); 430806f25ae9SGregory Neil Shapiro break; 430906f25ae9SGregory Neil Shapiro 431006f25ae9SGregory Neil Shapiro case O_SASLMECH: 431106f25ae9SGregory Neil Shapiro if (AuthMechanisms != NULL) 431240266059SGregory Neil Shapiro sm_free(AuthMechanisms); /* XXX */ 431306f25ae9SGregory Neil Shapiro if (*val != '\0') 431406f25ae9SGregory Neil Shapiro AuthMechanisms = newstr(val); 431506f25ae9SGregory Neil Shapiro else 431606f25ae9SGregory Neil Shapiro AuthMechanisms = NULL; 431706f25ae9SGregory Neil Shapiro break; 431806f25ae9SGregory Neil Shapiro 4319e92d3f3fSGregory Neil Shapiro case O_SASLREALM: 4320e92d3f3fSGregory Neil Shapiro if (AuthRealm != NULL) 4321e92d3f3fSGregory Neil Shapiro sm_free(AuthRealm); 4322e92d3f3fSGregory Neil Shapiro if (*val != '\0') 4323e92d3f3fSGregory Neil Shapiro AuthRealm = newstr(val); 4324e92d3f3fSGregory Neil Shapiro else 4325e92d3f3fSGregory Neil Shapiro AuthRealm = NULL; 4326e92d3f3fSGregory Neil Shapiro break; 4327e92d3f3fSGregory Neil Shapiro 432806f25ae9SGregory Neil Shapiro case O_SASLOPTS: 432906f25ae9SGregory Neil Shapiro while (val != NULL && *val != '\0') 433006f25ae9SGregory Neil Shapiro { 433106f25ae9SGregory Neil Shapiro switch (*val) 433206f25ae9SGregory Neil Shapiro { 433306f25ae9SGregory Neil Shapiro case 'A': 433406f25ae9SGregory Neil Shapiro SASLOpts |= SASL_AUTH_AUTH; 433506f25ae9SGregory Neil Shapiro break; 433613bd1963SGregory Neil Shapiro 433706f25ae9SGregory Neil Shapiro case 'a': 433806f25ae9SGregory Neil Shapiro SASLOpts |= SASL_SEC_NOACTIVE; 433906f25ae9SGregory Neil Shapiro break; 434013bd1963SGregory Neil Shapiro 434106f25ae9SGregory Neil Shapiro case 'c': 434206f25ae9SGregory Neil Shapiro SASLOpts |= SASL_SEC_PASS_CREDENTIALS; 434306f25ae9SGregory Neil Shapiro break; 434413bd1963SGregory Neil Shapiro 434506f25ae9SGregory Neil Shapiro case 'd': 434606f25ae9SGregory Neil Shapiro SASLOpts |= SASL_SEC_NODICTIONARY; 434706f25ae9SGregory Neil Shapiro break; 434813bd1963SGregory Neil Shapiro 434906f25ae9SGregory Neil Shapiro case 'f': 435006f25ae9SGregory Neil Shapiro SASLOpts |= SASL_SEC_FORWARD_SECRECY; 435106f25ae9SGregory Neil Shapiro break; 435213bd1963SGregory Neil Shapiro 435394c01205SGregory Neil Shapiro # if SASL >= 20101 435494c01205SGregory Neil Shapiro case 'm': 435594c01205SGregory Neil Shapiro SASLOpts |= SASL_SEC_MUTUAL_AUTH; 435694c01205SGregory Neil Shapiro break; 435794c01205SGregory Neil Shapiro # endif /* SASL >= 20101 */ 435813bd1963SGregory Neil Shapiro 435906f25ae9SGregory Neil Shapiro case 'p': 436006f25ae9SGregory Neil Shapiro SASLOpts |= SASL_SEC_NOPLAINTEXT; 436106f25ae9SGregory Neil Shapiro break; 436213bd1963SGregory Neil Shapiro 436306f25ae9SGregory Neil Shapiro case 'y': 436406f25ae9SGregory Neil Shapiro SASLOpts |= SASL_SEC_NOANONYMOUS; 436506f25ae9SGregory Neil Shapiro break; 436613bd1963SGregory Neil Shapiro 436740266059SGregory Neil Shapiro case ' ': /* ignore */ 436840266059SGregory Neil Shapiro case '\t': /* ignore */ 436940266059SGregory Neil Shapiro case ',': /* ignore */ 437040266059SGregory Neil Shapiro break; 437113bd1963SGregory Neil Shapiro 437206f25ae9SGregory Neil Shapiro default: 437340266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 437440266059SGregory Neil Shapiro "Warning: Option: %s unknown parameter '%c'\n", 437540266059SGregory Neil Shapiro OPTNAME, 437640266059SGregory Neil Shapiro (isascii(*val) && 437740266059SGregory Neil Shapiro isprint(*val)) 437840266059SGregory Neil Shapiro ? *val : '?'); 437940266059SGregory Neil Shapiro break; 438040266059SGregory Neil Shapiro } 438140266059SGregory Neil Shapiro ++val; 438240266059SGregory Neil Shapiro val = strpbrk(val, ", \t"); 438340266059SGregory Neil Shapiro if (val != NULL) 438440266059SGregory Neil Shapiro ++val; 438540266059SGregory Neil Shapiro } 438640266059SGregory Neil Shapiro break; 438713bd1963SGregory Neil Shapiro 438840266059SGregory Neil Shapiro case O_SASLBITS: 438940266059SGregory Neil Shapiro MaxSLBits = atoi(val); 439040266059SGregory Neil Shapiro break; 439140266059SGregory Neil Shapiro 439240266059SGregory Neil Shapiro #else /* SASL */ 439340266059SGregory Neil Shapiro case O_SASLINFO: 439440266059SGregory Neil Shapiro case O_SASLMECH: 4395e92d3f3fSGregory Neil Shapiro case O_SASLREALM: 439640266059SGregory Neil Shapiro case O_SASLOPTS: 439740266059SGregory Neil Shapiro case O_SASLBITS: 439840266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 439940266059SGregory Neil Shapiro "Warning: Option: %s requires SASL support (-DSASL)\n", 440040266059SGregory Neil Shapiro OPTNAME); 440140266059SGregory Neil Shapiro break; 440240266059SGregory Neil Shapiro #endif /* SASL */ 440340266059SGregory Neil Shapiro 440440266059SGregory Neil Shapiro #if STARTTLS 44055b0945b5SGregory Neil Shapiro case O_TLSFB2CLEAR: 44065b0945b5SGregory Neil Shapiro TLSFallbacktoClear = atobool(val); 44075b0945b5SGregory Neil Shapiro break; 440840266059SGregory Neil Shapiro case O_SRVCERTFILE: 440913bd1963SGregory Neil Shapiro SET_STRING_EXP(SrvCertFile); 441040266059SGregory Neil Shapiro case O_SRVKEYFILE: 441113bd1963SGregory Neil Shapiro SET_STRING_EXP(SrvKeyFile); 441240266059SGregory Neil Shapiro case O_CLTCERTFILE: 441313bd1963SGregory Neil Shapiro SET_STRING_EXP(CltCertFile); 441440266059SGregory Neil Shapiro case O_CLTKEYFILE: 441513bd1963SGregory Neil Shapiro SET_STRING_EXP(CltKeyFile); 441640266059SGregory Neil Shapiro case O_CACERTFILE: 441713bd1963SGregory Neil Shapiro SET_STRING_EXP(CACertFile); 441840266059SGregory Neil Shapiro case O_CACERTPATH: 441913bd1963SGregory Neil Shapiro SET_STRING_EXP(CACertPath); 44205b0945b5SGregory Neil Shapiro # if _FFR_CLIENTCA 44215b0945b5SGregory Neil Shapiro case O_CLTCACERTFILE: 44225b0945b5SGregory Neil Shapiro SET_STRING_EXP(CltCACertFile); 44235b0945b5SGregory Neil Shapiro case O_CLTCACERTPATH: 44245b0945b5SGregory Neil Shapiro SET_STRING_EXP(CltCACertPath); 44255b0945b5SGregory Neil Shapiro # endif 442640266059SGregory Neil Shapiro case O_DHPARAMS: 442740266059SGregory Neil Shapiro SET_STRING_EXP(DHParams); 442840266059SGregory Neil Shapiro case O_CIPHERLIST: 442940266059SGregory Neil Shapiro SET_STRING_EXP(CipherList); 4430*2fb4f839SGregory Neil Shapiro # if MTA_HAVE_TLSv1_3 4431*2fb4f839SGregory Neil Shapiro case O_CIPHERSUITES: 4432*2fb4f839SGregory Neil Shapiro SET_STRING_EXP(CipherSuites); 4433*2fb4f839SGregory Neil Shapiro # endif 4434da7d7b9cSGregory Neil Shapiro case O_DIG_ALG: 4435da7d7b9cSGregory Neil Shapiro SET_STRING_EXP(CertFingerprintAlgorithm); 4436*2fb4f839SGregory Neil Shapiro # if !defined(OPENSSL_NO_ENGINE) 44375b0945b5SGregory Neil Shapiro case O_SSLENGINEPATH: 44385b0945b5SGregory Neil Shapiro SET_STRING_EXP(SSLEnginePath); 44395b0945b5SGregory Neil Shapiro case O_SSLENGINE: 44405b0945b5SGregory Neil Shapiro newval = sm_pstrdup_x(val); 44415b0945b5SGregory Neil Shapiro if (SSLEngine != NULL) 44425b0945b5SGregory Neil Shapiro sm_free(SSLEngine); 44435b0945b5SGregory Neil Shapiro SSLEngine = newval; 44445b0945b5SGregory Neil Shapiro 44455b0945b5SGregory Neil Shapiro /* 44465b0945b5SGregory Neil Shapiro ** Which engines need to be initialized before fork()? 44475b0945b5SGregory Neil Shapiro ** XXX hack, should be an option? 44485b0945b5SGregory Neil Shapiro */ 44495b0945b5SGregory Neil Shapiro 44505b0945b5SGregory Neil Shapiro if (strcmp(SSLEngine, "chil") == 0) 44515b0945b5SGregory Neil Shapiro SSLEngineprefork = true; 44525b0945b5SGregory Neil Shapiro break; 4453*2fb4f839SGregory Neil Shapiro # else /* !defined(OPENSSL_NO_ENGINE) */ 4454*2fb4f839SGregory Neil Shapiro case O_SSLENGINEPATH: 4455*2fb4f839SGregory Neil Shapiro case O_SSLENGINE: 4456*2fb4f839SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 4457*2fb4f839SGregory Neil Shapiro "Warning: Option: %s ignored -- not supported: OPENSSL_NO_ENGINE\n", 4458*2fb4f839SGregory Neil Shapiro OPTNAME); 4459*2fb4f839SGregory Neil Shapiro /* XXX fail? */ 4460*2fb4f839SGregory Neil Shapiro break; 4461*2fb4f839SGregory Neil Shapiro # endif /* !defined(OPENSSL_NO_ENGINE) */ 44629bd497b8SGregory Neil Shapiro case O_SRV_SSL_OPTIONS: 44639bd497b8SGregory Neil Shapiro pssloptions = &Srv_SSL_Options; 44649bd497b8SGregory Neil Shapiro case O_CLT_SSL_OPTIONS: 44659bd497b8SGregory Neil Shapiro if (pssloptions == NULL) 44669bd497b8SGregory Neil Shapiro pssloptions = &Clt_SSL_Options; 4467da7d7b9cSGregory Neil Shapiro (void) readssloptions(o->o_name, val, pssloptions, '\0'); 4468da7d7b9cSGregory Neil Shapiro if (tTd(37, 8)) 4469da7d7b9cSGregory Neil Shapiro sm_dprintf("ssloptions=%#lx\n", *pssloptions); 44709bd497b8SGregory Neil Shapiro 44719bd497b8SGregory Neil Shapiro pssloptions = NULL; 44729bd497b8SGregory Neil Shapiro break; 44739bd497b8SGregory Neil Shapiro 4474e92d3f3fSGregory Neil Shapiro case O_CRLFILE: 4475e92d3f3fSGregory Neil Shapiro SET_STRING_EXP(CRLFile); 4476e92d3f3fSGregory Neil Shapiro break; 4477e92d3f3fSGregory Neil Shapiro 4478e92d3f3fSGregory Neil Shapiro case O_CRLPATH: 4479e92d3f3fSGregory Neil Shapiro SET_STRING_EXP(CRLPath); 4480e92d3f3fSGregory Neil Shapiro break; 448140266059SGregory Neil Shapiro 448240266059SGregory Neil Shapiro /* 448340266059SGregory Neil Shapiro ** XXX How about options per daemon/client instead of globally? 448440266059SGregory Neil Shapiro ** This doesn't work well for some options, e.g., no server cert, 448540266059SGregory Neil Shapiro ** but fine for others. 448640266059SGregory Neil Shapiro ** 448740266059SGregory Neil Shapiro ** XXX Some people may want different certs per server. 448840266059SGregory Neil Shapiro ** 448940266059SGregory Neil Shapiro ** See also srvfeatures() 449040266059SGregory Neil Shapiro */ 449140266059SGregory Neil Shapiro 449240266059SGregory Neil Shapiro case O_TLS_SRV_OPTS: 449340266059SGregory Neil Shapiro while (val != NULL && *val != '\0') 449440266059SGregory Neil Shapiro { 449540266059SGregory Neil Shapiro switch (*val) 449640266059SGregory Neil Shapiro { 449740266059SGregory Neil Shapiro case 'V': 449840266059SGregory Neil Shapiro TLS_Srv_Opts |= TLS_I_NO_VRFY; 449940266059SGregory Neil Shapiro break; 450040266059SGregory Neil Shapiro /* 450140266059SGregory Neil Shapiro ** Server without a cert? That works only if 450240266059SGregory Neil Shapiro ** AnonDH is enabled as cipher, which is not in the 450340266059SGregory Neil Shapiro ** default list. Hence the CipherList option must 450440266059SGregory Neil Shapiro ** be available. Moreover: which clients support this 450540266059SGregory Neil Shapiro ** besides sendmail with this setting? 450640266059SGregory Neil Shapiro */ 450740266059SGregory Neil Shapiro 450840266059SGregory Neil Shapiro case 'C': 450940266059SGregory Neil Shapiro TLS_Srv_Opts &= ~TLS_I_SRV_CERT; 451040266059SGregory Neil Shapiro break; 451140266059SGregory Neil Shapiro case ' ': /* ignore */ 451240266059SGregory Neil Shapiro case '\t': /* ignore */ 451340266059SGregory Neil Shapiro case ',': /* ignore */ 451440266059SGregory Neil Shapiro break; 451540266059SGregory Neil Shapiro default: 451640266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 451740266059SGregory Neil Shapiro "Warning: Option: %s unknown parameter '%c'\n", 451840266059SGregory Neil Shapiro OPTNAME, 451940266059SGregory Neil Shapiro (isascii(*val) && 452040266059SGregory Neil Shapiro isprint(*val)) 452140266059SGregory Neil Shapiro ? *val : '?'); 452206f25ae9SGregory Neil Shapiro break; 452306f25ae9SGregory Neil Shapiro } 452406f25ae9SGregory Neil Shapiro ++val; 452506f25ae9SGregory Neil Shapiro val = strpbrk(val, ", \t"); 452606f25ae9SGregory Neil Shapiro if (val != NULL) 452706f25ae9SGregory Neil Shapiro ++val; 452806f25ae9SGregory Neil Shapiro } 452906f25ae9SGregory Neil Shapiro break; 453006f25ae9SGregory Neil Shapiro 453106f25ae9SGregory Neil Shapiro case O_RANDFILE: 453240266059SGregory Neil Shapiro PSTRSET(RandFile, val); 453306f25ae9SGregory Neil Shapiro break; 453406f25ae9SGregory Neil Shapiro 453506f25ae9SGregory Neil Shapiro #else /* STARTTLS */ 453606f25ae9SGregory Neil Shapiro case O_SRVCERTFILE: 453706f25ae9SGregory Neil Shapiro case O_SRVKEYFILE: 453806f25ae9SGregory Neil Shapiro case O_CLTCERTFILE: 453906f25ae9SGregory Neil Shapiro case O_CLTKEYFILE: 454006f25ae9SGregory Neil Shapiro case O_CACERTFILE: 454106f25ae9SGregory Neil Shapiro case O_CACERTPATH: 45425b0945b5SGregory Neil Shapiro # if _FFR_CLIENTCA 45435b0945b5SGregory Neil Shapiro case O_CLTCACERTFILE: 45445b0945b5SGregory Neil Shapiro case O_CLTCACERTPATH: 45455b0945b5SGregory Neil Shapiro # endif 454606f25ae9SGregory Neil Shapiro case O_DHPARAMS: 4547da7d7b9cSGregory Neil Shapiro case O_SRV_SSL_OPTIONS: 4548da7d7b9cSGregory Neil Shapiro case O_CLT_SSL_OPTIONS: 454906f25ae9SGregory Neil Shapiro case O_CIPHERLIST: 45505b0945b5SGregory Neil Shapiro case O_DIG_ALG: 4551e92d3f3fSGregory Neil Shapiro case O_CRLFILE: 4552e92d3f3fSGregory Neil Shapiro case O_CRLPATH: 455306f25ae9SGregory Neil Shapiro case O_RANDFILE: 455440266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 455540266059SGregory Neil Shapiro "Warning: Option: %s requires TLS support\n", 455640266059SGregory Neil Shapiro OPTNAME); 455706f25ae9SGregory Neil Shapiro break; 455806f25ae9SGregory Neil Shapiro 455906f25ae9SGregory Neil Shapiro #endif /* STARTTLS */ 4560552d4955SGregory Neil Shapiro #if STARTTLS && _FFR_FIPSMODE 4561552d4955SGregory Neil Shapiro case O_FIPSMODE: 4562552d4955SGregory Neil Shapiro FipsMode = atobool(val); 4563552d4955SGregory Neil Shapiro break; 45645b0945b5SGregory Neil Shapiro #endif 456506f25ae9SGregory Neil Shapiro 456606f25ae9SGregory Neil Shapiro case O_CLIENTPORT: 456706f25ae9SGregory Neil Shapiro setclientoptions(val); 456806f25ae9SGregory Neil Shapiro break; 456906f25ae9SGregory Neil Shapiro 457006f25ae9SGregory Neil Shapiro case O_DF_BUFSIZE: 457106f25ae9SGregory Neil Shapiro DataFileBufferSize = atoi(val); 457206f25ae9SGregory Neil Shapiro break; 457306f25ae9SGregory Neil Shapiro 457406f25ae9SGregory Neil Shapiro case O_XF_BUFSIZE: 457506f25ae9SGregory Neil Shapiro XscriptFileBufferSize = atoi(val); 457606f25ae9SGregory Neil Shapiro break; 457706f25ae9SGregory Neil Shapiro 457806f25ae9SGregory Neil Shapiro case O_LDAPDEFAULTSPEC: 457940266059SGregory Neil Shapiro #if LDAPMAP 458006f25ae9SGregory Neil Shapiro ldapmap_set_defaults(val); 458106f25ae9SGregory Neil Shapiro #else /* LDAPMAP */ 458240266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 458340266059SGregory Neil Shapiro "Warning: Option: %s requires LDAP support (-DLDAPMAP)\n", 458440266059SGregory Neil Shapiro OPTNAME); 458506f25ae9SGregory Neil Shapiro #endif /* LDAPMAP */ 458606f25ae9SGregory Neil Shapiro break; 458706f25ae9SGregory Neil Shapiro 458806f25ae9SGregory Neil Shapiro case O_INPUTMILTER: 458940266059SGregory Neil Shapiro #if MILTER 459006f25ae9SGregory Neil Shapiro InputFilterList = newstr(val); 459140266059SGregory Neil Shapiro #else /* MILTER */ 459240266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 459340266059SGregory Neil Shapiro "Warning: Option: %s requires Milter support (-DMILTER)\n", 459440266059SGregory Neil Shapiro OPTNAME); 459540266059SGregory Neil Shapiro #endif /* MILTER */ 459606f25ae9SGregory Neil Shapiro break; 459706f25ae9SGregory Neil Shapiro 459806f25ae9SGregory Neil Shapiro case O_MILTER: 459940266059SGregory Neil Shapiro #if MILTER 460006f25ae9SGregory Neil Shapiro milter_set_option(subopt, val, sticky); 460140266059SGregory Neil Shapiro #else /* MILTER */ 460240266059SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 460340266059SGregory Neil Shapiro "Warning: Option: %s requires Milter support (-DMILTER)\n", 460440266059SGregory Neil Shapiro OPTNAME); 460540266059SGregory Neil Shapiro #endif /* MILTER */ 460606f25ae9SGregory Neil Shapiro break; 460706f25ae9SGregory Neil Shapiro 460806f25ae9SGregory Neil Shapiro case O_QUEUE_FILE_MODE: /* queue file mode */ 460906f25ae9SGregory Neil Shapiro QueueFileMode = atooct(val) & 0777; 461006f25ae9SGregory Neil Shapiro break; 461140266059SGregory Neil Shapiro 461240266059SGregory Neil Shapiro case O_DLVR_MIN: /* deliver by minimum time */ 461340266059SGregory Neil Shapiro DeliverByMin = convtime(val, 's'); 461440266059SGregory Neil Shapiro break; 461540266059SGregory Neil Shapiro 461640266059SGregory Neil Shapiro /* modifiers {daemon_flags} for direct submissions */ 461740266059SGregory Neil Shapiro case O_DIRECTSUBMODIFIERS: 461840266059SGregory Neil Shapiro { 461940266059SGregory Neil Shapiro BITMAP256 m; /* ignored */ 462040266059SGregory Neil Shapiro extern ENVELOPE BlankEnvelope; 462140266059SGregory Neil Shapiro 462240266059SGregory Neil Shapiro macdefine(&BlankEnvelope.e_macro, A_PERM, 462340266059SGregory Neil Shapiro macid("{daemon_flags}"), 462440266059SGregory Neil Shapiro getmodifiers(val, m)); 462540266059SGregory Neil Shapiro } 462640266059SGregory Neil Shapiro break; 462740266059SGregory Neil Shapiro 462840266059SGregory Neil Shapiro case O_FASTSPLIT: 462940266059SGregory Neil Shapiro FastSplit = atoi(val); 463040266059SGregory Neil Shapiro break; 463140266059SGregory Neil Shapiro 463240266059SGregory Neil Shapiro case O_MBDB: 463340266059SGregory Neil Shapiro Mbdb = newstr(val); 463440266059SGregory Neil Shapiro break; 463540266059SGregory Neil Shapiro 463640266059SGregory Neil Shapiro case O_MSQ: 463740266059SGregory Neil Shapiro UseMSP = atobool(val); 463840266059SGregory Neil Shapiro break; 463940266059SGregory Neil Shapiro 464040266059SGregory Neil Shapiro case O_SOFTBOUNCE: 464140266059SGregory Neil Shapiro SoftBounce = atobool(val); 464240266059SGregory Neil Shapiro break; 464325bab6e9SPeter Wemm 464413bd1963SGregory Neil Shapiro case O_REJECTLOGINTERVAL: /* time btwn log msgs while refusing */ 464513bd1963SGregory Neil Shapiro RejectLogInterval = convtime(val, 'h'); 464613bd1963SGregory Neil Shapiro break; 464713bd1963SGregory Neil Shapiro 464813bd1963SGregory Neil Shapiro case O_REQUIRES_DIR_FSYNC: 464913bd1963SGregory Neil Shapiro #if REQUIRES_DIR_FSYNC 465013bd1963SGregory Neil Shapiro RequiresDirfsync = atobool(val); 46515b0945b5SGregory Neil Shapiro #else 465213bd1963SGregory Neil Shapiro /* silently ignored... required for cf file option */ 46535b0945b5SGregory Neil Shapiro #endif 465413bd1963SGregory Neil Shapiro break; 4655e92d3f3fSGregory Neil Shapiro 4656e92d3f3fSGregory Neil Shapiro case O_CONNECTION_RATE_WINDOW_SIZE: 4657e92d3f3fSGregory Neil Shapiro ConnectionRateWindowSize = convtime(val, 's'); 4658e92d3f3fSGregory Neil Shapiro break; 4659e92d3f3fSGregory Neil Shapiro 4660e92d3f3fSGregory Neil Shapiro case O_FALLBACKSMARTHOST: /* fallback smart host */ 4661e92d3f3fSGregory Neil Shapiro if (val[0] != '\0') 4662e92d3f3fSGregory Neil Shapiro FallbackSmartHost = newstr(val); 4663e92d3f3fSGregory Neil Shapiro break; 4664e92d3f3fSGregory Neil Shapiro 4665e92d3f3fSGregory Neil Shapiro case O_HELONAME: 4666e92d3f3fSGregory Neil Shapiro HeloName = newstr(val); 4667e92d3f3fSGregory Neil Shapiro break; 4668d0cef73dSGregory Neil Shapiro 46694e4196cbSGregory Neil Shapiro #if _FFR_MEMSTAT 46704e4196cbSGregory Neil Shapiro case O_REFUSELOWMEM: 46714e4196cbSGregory Neil Shapiro RefuseLowMem = atoi(val); 46724e4196cbSGregory Neil Shapiro break; 46734e4196cbSGregory Neil Shapiro case O_QUEUELOWMEM: 46744e4196cbSGregory Neil Shapiro QueueLowMem = atoi(val); 46754e4196cbSGregory Neil Shapiro break; 46764e4196cbSGregory Neil Shapiro case O_MEMRESOURCE: 46774e4196cbSGregory Neil Shapiro MemoryResource = newstr(val); 46784e4196cbSGregory Neil Shapiro break; 46794e4196cbSGregory Neil Shapiro #endif /* _FFR_MEMSTAT */ 46804e4196cbSGregory Neil Shapiro 46814e4196cbSGregory Neil Shapiro case O_MAXNOOPCOMMANDS: 46824e4196cbSGregory Neil Shapiro MaxNOOPCommands = atoi(val); 46834e4196cbSGregory Neil Shapiro break; 46844e4196cbSGregory Neil Shapiro 46854e4196cbSGregory Neil Shapiro #if _FFR_MSG_ACCEPT 46864e4196cbSGregory Neil Shapiro case O_MSG_ACCEPT: 46874e4196cbSGregory Neil Shapiro MessageAccept = newstr(val); 46884e4196cbSGregory Neil Shapiro break; 46895b0945b5SGregory Neil Shapiro #endif 46904e4196cbSGregory Neil Shapiro 46914e4196cbSGregory Neil Shapiro #if _FFR_QUEUE_RUN_PARANOIA 46924e4196cbSGregory Neil Shapiro case O_CHK_Q_RUNNERS: 46934e4196cbSGregory Neil Shapiro CheckQueueRunners = atoi(val); 46944e4196cbSGregory Neil Shapiro break; 46955b0945b5SGregory Neil Shapiro #endif 469613bd1963SGregory Neil Shapiro 4697d0cef73dSGregory Neil Shapiro #if _FFR_EIGHT_BIT_ADDR_OK 4698d0cef73dSGregory Neil Shapiro case O_EIGHT_BIT_ADDR_OK: 4699d0cef73dSGregory Neil Shapiro EightBitAddrOK = atobool(val); 4700d0cef73dSGregory Neil Shapiro break; 47015b0945b5SGregory Neil Shapiro #endif 4702d0cef73dSGregory Neil Shapiro 4703ffb83623SGregory Neil Shapiro #if _FFR_ADDR_TYPE_MODES 4704ffb83623SGregory Neil Shapiro case O_ADDR_TYPE_MODES: 4705ffb83623SGregory Neil Shapiro AddrTypeModes = atobool(val); 4706ffb83623SGregory Neil Shapiro break; 47075b0945b5SGregory Neil Shapiro #endif 4708ffb83623SGregory Neil Shapiro 4709e3793f76SGregory Neil Shapiro #if _FFR_BADRCPT_SHUTDOWN 4710e3793f76SGregory Neil Shapiro case O_RCPTSHUTD: 4711e3793f76SGregory Neil Shapiro BadRcptShutdown = atoi(val); 4712e3793f76SGregory Neil Shapiro break; 4713e3793f76SGregory Neil Shapiro 4714e3793f76SGregory Neil Shapiro case O_RCPTSHUTDG: 4715e3793f76SGregory Neil Shapiro BadRcptShutdownGood = atoi(val); 4716e3793f76SGregory Neil Shapiro break; 4717e3793f76SGregory Neil Shapiro #endif /* _FFR_BADRCPT_SHUTDOWN */ 4718e3793f76SGregory Neil Shapiro 4719552d4955SGregory Neil Shapiro #if _FFR_REJECT_NUL_BYTE 4720552d4955SGregory Neil Shapiro case O_REJECTNUL: 4721552d4955SGregory Neil Shapiro RejectNUL = atobool(val); 4722552d4955SGregory Neil Shapiro break; 47235b0945b5SGregory Neil Shapiro #endif 4724552d4955SGregory Neil Shapiro 4725da7d7b9cSGregory Neil Shapiro #if _FFR_BOUNCE_QUEUE 4726da7d7b9cSGregory Neil Shapiro case O_BOUNCEQUEUE: 4727da7d7b9cSGregory Neil Shapiro bouncequeue = newstr(val); 4728da7d7b9cSGregory Neil Shapiro break; 47295b0945b5SGregory Neil Shapiro #endif 4730da7d7b9cSGregory Neil Shapiro 4731da7d7b9cSGregory Neil Shapiro #if _FFR_ADD_BCC 4732da7d7b9cSGregory Neil Shapiro case O_ADDBCC: 4733da7d7b9cSGregory Neil Shapiro AddBcc = atobool(val); 4734da7d7b9cSGregory Neil Shapiro break; 4735da7d7b9cSGregory Neil Shapiro #endif 4736da7d7b9cSGregory Neil Shapiro case O_USECOMPRESSEDIPV6ADDRESSES: 4737da7d7b9cSGregory Neil Shapiro UseCompressedIPv6Addresses = atobool(val); 4738da7d7b9cSGregory Neil Shapiro break; 4739da7d7b9cSGregory Neil Shapiro 47405b0945b5SGregory Neil Shapiro #if DNSSEC_TEST 47415b0945b5SGregory Neil Shapiro case O_NSPORTIP: 47425b0945b5SGregory Neil Shapiro nsportip(val); 47435b0945b5SGregory Neil Shapiro break; 47445b0945b5SGregory Neil Shapiro case O_NSSRCHLIST: 47455b0945b5SGregory Neil Shapiro NameSearchList = sm_strdup(val); 47465b0945b5SGregory Neil Shapiro break; 47475b0945b5SGregory Neil Shapiro #endif 47485b0945b5SGregory Neil Shapiro 47495b0945b5SGregory Neil Shapiro #if DANE 47505b0945b5SGregory Neil Shapiro case O_DANE: 4751*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(val, "always")) 47525b0945b5SGregory Neil Shapiro Dane = DANE_ALWAYS; 47535b0945b5SGregory Neil Shapiro else 47545b0945b5SGregory Neil Shapiro Dane = atobool(val) ? DANE_SECURE : DANE_NEVER; 47555b0945b5SGregory Neil Shapiro break; 47565b0945b5SGregory Neil Shapiro #endif 47575b0945b5SGregory Neil Shapiro 47585b0945b5SGregory Neil Shapiro #if _FFR_BLANKENV_MACV 47595b0945b5SGregory Neil Shapiro case O_HACKS: 47605b0945b5SGregory Neil Shapiro Hacks = (int) strtol(val, NULL, 0); 47615b0945b5SGregory Neil Shapiro break; 47625b0945b5SGregory Neil Shapiro #endif 47635b0945b5SGregory Neil Shapiro 47645b0945b5SGregory Neil Shapiro #if _FFR_KEEPBCC 47655b0945b5SGregory Neil Shapiro case O_KEEPBCC: 47665b0945b5SGregory Neil Shapiro KeepBcc = atobool(val); 47675b0945b5SGregory Neil Shapiro break; 47685b0945b5SGregory Neil Shapiro #endif 47695b0945b5SGregory Neil Shapiro 47705b0945b5SGregory Neil Shapiro #if _FFR_TLS_ALTNAMES 47715b0945b5SGregory Neil Shapiro case O_CHECKALTNAMES: 47725b0945b5SGregory Neil Shapiro SetCertAltnames = atobool(val); 47735b0945b5SGregory Neil Shapiro break; 47745b0945b5SGregory Neil Shapiro #endif 4775*2fb4f839SGregory Neil Shapiro case O_SMTPUTF8: 4776*2fb4f839SGregory Neil Shapiro #if USE_EAI 4777*2fb4f839SGregory Neil Shapiro /* hack for testing */ 4778*2fb4f839SGregory Neil Shapiro if (isascii(*val) && isdigit(*val)) 4779*2fb4f839SGregory Neil Shapiro SMTPUTF8 = (int) strtol(val, NULL, 0); 4780*2fb4f839SGregory Neil Shapiro else 4781*2fb4f839SGregory Neil Shapiro SMTPUTF8 = atobool(val); 4782*2fb4f839SGregory Neil Shapiro #else 4783*2fb4f839SGregory Neil Shapiro if (atobool(val)) 4784*2fb4f839SGregory Neil Shapiro syserr("readcf: option: %s set but no USE_EAI support", 4785*2fb4f839SGregory Neil Shapiro OPTNAME); 4786*2fb4f839SGregory Neil Shapiro else 4787*2fb4f839SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 4788*2fb4f839SGregory Neil Shapiro "Warning: Option: %s requires USE_EAI support\n", 4789*2fb4f839SGregory Neil Shapiro OPTNAME); 4790*2fb4f839SGregory Neil Shapiro #endif 4791*2fb4f839SGregory Neil Shapiro break; 4792*2fb4f839SGregory Neil Shapiro #if _FFR_MTA_STS 4793*2fb4f839SGregory Neil Shapiro case O_MTASTS: 4794*2fb4f839SGregory Neil Shapiro MTASTS = atobool(val); 4795*2fb4f839SGregory Neil Shapiro break; 4796*2fb4f839SGregory Neil Shapiro #endif 47975b0945b5SGregory Neil Shapiro 4798c2aa98e2SPeter Wemm default: 4799c2aa98e2SPeter Wemm if (tTd(37, 1)) 4800c2aa98e2SPeter Wemm { 4801c2aa98e2SPeter Wemm if (isascii(opt) && isprint(opt)) 480240266059SGregory Neil Shapiro sm_dprintf("Warning: option %c unknown\n", opt); 4803c2aa98e2SPeter Wemm else 480440266059SGregory Neil Shapiro sm_dprintf("Warning: option 0x%x unknown\n", opt); 4805c2aa98e2SPeter Wemm } 4806c2aa98e2SPeter Wemm break; 4807c2aa98e2SPeter Wemm } 480806f25ae9SGregory Neil Shapiro 480906f25ae9SGregory Neil Shapiro /* 481006f25ae9SGregory Neil Shapiro ** Options with suboptions are responsible for taking care 481106f25ae9SGregory Neil Shapiro ** of sticky-ness (e.g., that a command line setting is kept 481206f25ae9SGregory Neil Shapiro ** when reading in the sendmail.cf file). This has to be done 481306f25ae9SGregory Neil Shapiro ** when the suboptions are parsed since each suboption must be 481406f25ae9SGregory Neil Shapiro ** sticky, not the root option. 481506f25ae9SGregory Neil Shapiro */ 481606f25ae9SGregory Neil Shapiro 481706f25ae9SGregory Neil Shapiro if (sticky && !bitset(OI_SUBOPT, o->o_flags)) 4818c2aa98e2SPeter Wemm setbitn(opt, StickyOpt); 4819c2aa98e2SPeter Wemm } 482040266059SGregory Neil Shapiro /* 4821c2aa98e2SPeter Wemm ** SETCLASS -- set a string into a class 4822c2aa98e2SPeter Wemm ** 4823c2aa98e2SPeter Wemm ** Parameters: 4824c2aa98e2SPeter Wemm ** class -- the class to put the string in. 4825c2aa98e2SPeter Wemm ** str -- the string to enter 4826c2aa98e2SPeter Wemm ** 4827c2aa98e2SPeter Wemm ** Returns: 4828c2aa98e2SPeter Wemm ** none. 4829c2aa98e2SPeter Wemm ** 4830c2aa98e2SPeter Wemm ** Side Effects: 4831c2aa98e2SPeter Wemm ** puts the word into the symbol table. 4832c2aa98e2SPeter Wemm */ 4833c2aa98e2SPeter Wemm 4834c2aa98e2SPeter Wemm void 4835c2aa98e2SPeter Wemm setclass(class, str) 4836c2aa98e2SPeter Wemm int class; 4837c2aa98e2SPeter Wemm char *str; 4838c2aa98e2SPeter Wemm { 4839c2aa98e2SPeter Wemm register STAB *s; 4840c2aa98e2SPeter Wemm 4841d0cef73dSGregory Neil Shapiro if ((str[0] & 0377) == MATCHCLASS) 484206f25ae9SGregory Neil Shapiro { 484306f25ae9SGregory Neil Shapiro int mid; 484406f25ae9SGregory Neil Shapiro 484506f25ae9SGregory Neil Shapiro str++; 484640266059SGregory Neil Shapiro mid = macid(str); 4847193538b7SGregory Neil Shapiro if (mid == 0) 484806f25ae9SGregory Neil Shapiro return; 484906f25ae9SGregory Neil Shapiro 4850c2aa98e2SPeter Wemm if (tTd(37, 8)) 485140266059SGregory Neil Shapiro sm_dprintf("setclass(%s, $=%s)\n", 485206f25ae9SGregory Neil Shapiro macname(class), macname(mid)); 485306f25ae9SGregory Neil Shapiro copy_class(mid, class); 485406f25ae9SGregory Neil Shapiro } 485506f25ae9SGregory Neil Shapiro else 485606f25ae9SGregory Neil Shapiro { 485706f25ae9SGregory Neil Shapiro if (tTd(37, 8)) 485840266059SGregory Neil Shapiro sm_dprintf("setclass(%s, %s)\n", macname(class), str); 485906f25ae9SGregory Neil Shapiro 4860c2aa98e2SPeter Wemm s = stab(str, ST_CLASS, ST_ENTER); 4861193538b7SGregory Neil Shapiro setbitn(bitidx(class), s->s_class); 4862c2aa98e2SPeter Wemm } 486306f25ae9SGregory Neil Shapiro } 486440266059SGregory Neil Shapiro /* 4865c2aa98e2SPeter Wemm ** MAKEMAPENTRY -- create a map entry 4866c2aa98e2SPeter Wemm ** 4867c2aa98e2SPeter Wemm ** Parameters: 4868c2aa98e2SPeter Wemm ** line -- the config file line 4869c2aa98e2SPeter Wemm ** 4870c2aa98e2SPeter Wemm ** Returns: 4871c2aa98e2SPeter Wemm ** A pointer to the map that has been created. 4872c2aa98e2SPeter Wemm ** NULL if there was a syntax error. 4873c2aa98e2SPeter Wemm ** 4874c2aa98e2SPeter Wemm ** Side Effects: 4875c2aa98e2SPeter Wemm ** Enters the map into the dictionary. 4876c2aa98e2SPeter Wemm */ 4877c2aa98e2SPeter Wemm 4878c2aa98e2SPeter Wemm MAP * 4879c2aa98e2SPeter Wemm makemapentry(line) 4880c2aa98e2SPeter Wemm char *line; 4881c2aa98e2SPeter Wemm { 4882c2aa98e2SPeter Wemm register char *p; 4883c2aa98e2SPeter Wemm char *mapname; 4884c2aa98e2SPeter Wemm char *classname; 4885c2aa98e2SPeter Wemm register STAB *s; 4886c2aa98e2SPeter Wemm STAB *class; 4887c2aa98e2SPeter Wemm 48885b0945b5SGregory Neil Shapiro for (p = line; SM_ISSPACE(*p); p++) 4889c2aa98e2SPeter Wemm continue; 4890c2aa98e2SPeter Wemm if (!(isascii(*p) && isalnum(*p))) 4891c2aa98e2SPeter Wemm { 4892c2aa98e2SPeter Wemm syserr("readcf: config K line: no map name"); 4893c2aa98e2SPeter Wemm return NULL; 4894c2aa98e2SPeter Wemm } 4895c2aa98e2SPeter Wemm 4896c2aa98e2SPeter Wemm mapname = p; 4897c2aa98e2SPeter Wemm while ((isascii(*++p) && isalnum(*p)) || *p == '_' || *p == '.') 4898c2aa98e2SPeter Wemm continue; 4899c2aa98e2SPeter Wemm if (*p != '\0') 4900c2aa98e2SPeter Wemm *p++ = '\0'; 49015b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 4902c2aa98e2SPeter Wemm p++; 4903c2aa98e2SPeter Wemm if (!(isascii(*p) && isalnum(*p))) 4904c2aa98e2SPeter Wemm { 4905c2aa98e2SPeter Wemm syserr("readcf: config K line, map %s: no map class", mapname); 4906c2aa98e2SPeter Wemm return NULL; 4907c2aa98e2SPeter Wemm } 4908c2aa98e2SPeter Wemm classname = p; 4909c2aa98e2SPeter Wemm while (isascii(*++p) && isalnum(*p)) 4910c2aa98e2SPeter Wemm continue; 4911c2aa98e2SPeter Wemm if (*p != '\0') 4912c2aa98e2SPeter Wemm *p++ = '\0'; 49135b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 4914c2aa98e2SPeter Wemm p++; 4915c2aa98e2SPeter Wemm 4916c2aa98e2SPeter Wemm /* look up the class */ 4917c2aa98e2SPeter Wemm class = stab(classname, ST_MAPCLASS, ST_FIND); 4918c2aa98e2SPeter Wemm if (class == NULL) 4919c2aa98e2SPeter Wemm { 492040266059SGregory Neil Shapiro syserr("readcf: map %s: class %s not available", mapname, 492140266059SGregory Neil Shapiro classname); 4922c2aa98e2SPeter Wemm return NULL; 4923c2aa98e2SPeter Wemm } 4924c2aa98e2SPeter Wemm 4925c2aa98e2SPeter Wemm /* enter the map */ 4926c2aa98e2SPeter Wemm s = stab(mapname, ST_MAP, ST_ENTER); 4927c2aa98e2SPeter Wemm s->s_map.map_class = &class->s_mapclass; 4928c2aa98e2SPeter Wemm s->s_map.map_mname = newstr(mapname); 4929c2aa98e2SPeter Wemm 4930c2aa98e2SPeter Wemm if (class->s_mapclass.map_parse(&s->s_map, p)) 4931c2aa98e2SPeter Wemm s->s_map.map_mflags |= MF_VALID; 4932c2aa98e2SPeter Wemm 4933c2aa98e2SPeter Wemm if (tTd(37, 5)) 4934c2aa98e2SPeter Wemm { 493540266059SGregory Neil Shapiro sm_dprintf("map %s, class %s, flags %lx, file %s,\n", 4936c2aa98e2SPeter Wemm s->s_map.map_mname, s->s_map.map_class->map_cname, 493740266059SGregory Neil Shapiro s->s_map.map_mflags, s->s_map.map_file); 493840266059SGregory Neil Shapiro sm_dprintf("\tapp %s, domain %s, rebuild %s\n", 493940266059SGregory Neil Shapiro s->s_map.map_app, s->s_map.map_domain, 494040266059SGregory Neil Shapiro s->s_map.map_rebuild); 4941c2aa98e2SPeter Wemm } 4942c2aa98e2SPeter Wemm return &s->s_map; 4943c2aa98e2SPeter Wemm } 494440266059SGregory Neil Shapiro /* 4945c2aa98e2SPeter Wemm ** STRTORWSET -- convert string to rewriting set number 4946c2aa98e2SPeter Wemm ** 4947c2aa98e2SPeter Wemm ** Parameters: 4948c2aa98e2SPeter Wemm ** p -- the pointer to the string to decode. 4949c2aa98e2SPeter Wemm ** endp -- if set, store the trailing delimiter here. 4950c2aa98e2SPeter Wemm ** stabmode -- ST_ENTER to create this entry, ST_FIND if 4951c2aa98e2SPeter Wemm ** it must already exist. 4952c2aa98e2SPeter Wemm ** 4953c2aa98e2SPeter Wemm ** Returns: 4954c2aa98e2SPeter Wemm ** The appropriate ruleset number. 4955c2aa98e2SPeter Wemm ** -1 if it is not valid (error already printed) 4956c2aa98e2SPeter Wemm */ 4957c2aa98e2SPeter Wemm 4958c2aa98e2SPeter Wemm int 4959c2aa98e2SPeter Wemm strtorwset(p, endp, stabmode) 4960c2aa98e2SPeter Wemm char *p; 4961c2aa98e2SPeter Wemm char **endp; 4962c2aa98e2SPeter Wemm int stabmode; 4963c2aa98e2SPeter Wemm { 4964c2aa98e2SPeter Wemm int ruleset; 4965c2aa98e2SPeter Wemm static int nextruleset = MAXRWSETS; 4966c2aa98e2SPeter Wemm 49675b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 4968c2aa98e2SPeter Wemm p++; 4969c2aa98e2SPeter Wemm if (!isascii(*p)) 4970c2aa98e2SPeter Wemm { 4971c2aa98e2SPeter Wemm syserr("invalid ruleset name: \"%.20s\"", p); 4972c2aa98e2SPeter Wemm return -1; 4973c2aa98e2SPeter Wemm } 4974c2aa98e2SPeter Wemm if (isdigit(*p)) 4975c2aa98e2SPeter Wemm { 4976c2aa98e2SPeter Wemm ruleset = strtol(p, endp, 10); 4977c2aa98e2SPeter Wemm if (ruleset >= MAXRWSETS / 2 || ruleset < 0) 4978c2aa98e2SPeter Wemm { 4979c2aa98e2SPeter Wemm syserr("bad ruleset %d (%d max)", 4980c2aa98e2SPeter Wemm ruleset, MAXRWSETS / 2); 4981c2aa98e2SPeter Wemm ruleset = -1; 4982c2aa98e2SPeter Wemm } 4983c2aa98e2SPeter Wemm } 4984c2aa98e2SPeter Wemm else 4985c2aa98e2SPeter Wemm { 4986c2aa98e2SPeter Wemm STAB *s; 4987c2aa98e2SPeter Wemm char delim; 498806f25ae9SGregory Neil Shapiro char *q = NULL; 4989c2aa98e2SPeter Wemm 4990c2aa98e2SPeter Wemm q = p; 49919bd497b8SGregory Neil Shapiro while (*p != '\0' && isascii(*p) && (isalnum(*p) || *p == '_')) 4992c2aa98e2SPeter Wemm p++; 4993c2aa98e2SPeter Wemm if (q == p || !(isascii(*q) && isalpha(*q))) 4994c2aa98e2SPeter Wemm { 4995c2aa98e2SPeter Wemm /* no valid characters */ 4996c2aa98e2SPeter Wemm syserr("invalid ruleset name: \"%.20s\"", q); 4997c2aa98e2SPeter Wemm return -1; 4998c2aa98e2SPeter Wemm } 49995b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*p)) 5000c2aa98e2SPeter Wemm *p++ = '\0'; 5001c2aa98e2SPeter Wemm delim = *p; 5002c2aa98e2SPeter Wemm if (delim != '\0') 5003c2aa98e2SPeter Wemm *p = '\0'; 5004c2aa98e2SPeter Wemm s = stab(q, ST_RULESET, stabmode); 5005c2aa98e2SPeter Wemm if (delim != '\0') 5006c2aa98e2SPeter Wemm *p = delim; 5007c2aa98e2SPeter Wemm 5008c2aa98e2SPeter Wemm if (s == NULL) 5009c2aa98e2SPeter Wemm return -1; 5010c2aa98e2SPeter Wemm 5011c2aa98e2SPeter Wemm if (stabmode == ST_ENTER && delim == '=') 5012c2aa98e2SPeter Wemm { 5013c2aa98e2SPeter Wemm while (isascii(*++p) && isspace(*p)) 5014c2aa98e2SPeter Wemm continue; 5015c2aa98e2SPeter Wemm if (!(isascii(*p) && isdigit(*p))) 5016c2aa98e2SPeter Wemm { 5017c2aa98e2SPeter Wemm syserr("bad ruleset definition \"%s\" (number required after `=')", q); 5018c2aa98e2SPeter Wemm ruleset = -1; 5019c2aa98e2SPeter Wemm } 5020c2aa98e2SPeter Wemm else 5021c2aa98e2SPeter Wemm { 5022c2aa98e2SPeter Wemm ruleset = strtol(p, endp, 10); 5023c2aa98e2SPeter Wemm if (ruleset >= MAXRWSETS / 2 || ruleset < 0) 5024c2aa98e2SPeter Wemm { 5025c2aa98e2SPeter Wemm syserr("bad ruleset number %d in \"%s\" (%d max)", 5026c2aa98e2SPeter Wemm ruleset, q, MAXRWSETS / 2); 5027c2aa98e2SPeter Wemm ruleset = -1; 5028c2aa98e2SPeter Wemm } 5029c2aa98e2SPeter Wemm } 5030c2aa98e2SPeter Wemm } 5031c2aa98e2SPeter Wemm else 5032c2aa98e2SPeter Wemm { 5033c2aa98e2SPeter Wemm if (endp != NULL) 5034c2aa98e2SPeter Wemm *endp = p; 503506f25ae9SGregory Neil Shapiro if (s->s_ruleset >= 0) 5036c2aa98e2SPeter Wemm ruleset = s->s_ruleset; 5037c2aa98e2SPeter Wemm else if ((ruleset = --nextruleset) < MAXRWSETS / 2) 5038c2aa98e2SPeter Wemm { 5039c2aa98e2SPeter Wemm syserr("%s: too many named rulesets (%d max)", 5040c2aa98e2SPeter Wemm q, MAXRWSETS / 2); 5041c2aa98e2SPeter Wemm ruleset = -1; 5042c2aa98e2SPeter Wemm } 5043c2aa98e2SPeter Wemm } 504406f25ae9SGregory Neil Shapiro if (s->s_ruleset >= 0 && 504506f25ae9SGregory Neil Shapiro ruleset >= 0 && 504606f25ae9SGregory Neil Shapiro ruleset != s->s_ruleset) 5047c2aa98e2SPeter Wemm { 5048c2aa98e2SPeter Wemm syserr("%s: ruleset changed value (old %d, new %d)", 5049c2aa98e2SPeter Wemm q, s->s_ruleset, ruleset); 5050c2aa98e2SPeter Wemm ruleset = s->s_ruleset; 5051c2aa98e2SPeter Wemm } 505206f25ae9SGregory Neil Shapiro else if (ruleset >= 0) 5053c2aa98e2SPeter Wemm { 5054c2aa98e2SPeter Wemm s->s_ruleset = ruleset; 5055c2aa98e2SPeter Wemm } 5056193538b7SGregory Neil Shapiro if (stabmode == ST_ENTER && ruleset >= 0) 505706f25ae9SGregory Neil Shapiro { 505806f25ae9SGregory Neil Shapiro char *h = NULL; 505906f25ae9SGregory Neil Shapiro 506006f25ae9SGregory Neil Shapiro if (RuleSetNames[ruleset] != NULL) 506140266059SGregory Neil Shapiro sm_free(RuleSetNames[ruleset]); /* XXX */ 506206f25ae9SGregory Neil Shapiro if (delim != '\0' && (h = strchr(q, delim)) != NULL) 506306f25ae9SGregory Neil Shapiro *h = '\0'; 506406f25ae9SGregory Neil Shapiro RuleSetNames[ruleset] = newstr(q); 506506f25ae9SGregory Neil Shapiro if (delim == '/' && h != NULL) 506606f25ae9SGregory Neil Shapiro *h = delim; /* put back delim */ 506706f25ae9SGregory Neil Shapiro } 5068c2aa98e2SPeter Wemm } 5069c2aa98e2SPeter Wemm return ruleset; 5070c2aa98e2SPeter Wemm } 507140266059SGregory Neil Shapiro /* 507206f25ae9SGregory Neil Shapiro ** SETTIMEOUT -- set an individual timeout 507306f25ae9SGregory Neil Shapiro ** 507406f25ae9SGregory Neil Shapiro ** Parameters: 507506f25ae9SGregory Neil Shapiro ** name -- the name of the timeout. 507606f25ae9SGregory Neil Shapiro ** val -- the value of the timeout. 507706f25ae9SGregory Neil Shapiro ** sticky -- if set, don't let other setoptions override 507806f25ae9SGregory Neil Shapiro ** this value. 507906f25ae9SGregory Neil Shapiro ** 508006f25ae9SGregory Neil Shapiro ** Returns: 508106f25ae9SGregory Neil Shapiro ** none. 508206f25ae9SGregory Neil Shapiro */ 508306f25ae9SGregory Neil Shapiro 508406f25ae9SGregory Neil Shapiro /* set if Timeout sub-option is stuck */ 508506f25ae9SGregory Neil Shapiro static BITMAP256 StickyTimeoutOpt; 508606f25ae9SGregory Neil Shapiro 508706f25ae9SGregory Neil Shapiro static struct timeoutinfo 508806f25ae9SGregory Neil Shapiro { 508906f25ae9SGregory Neil Shapiro char *to_name; /* long name of timeout */ 509040266059SGregory Neil Shapiro unsigned char to_code; /* code for option */ 509106f25ae9SGregory Neil Shapiro } TimeOutTab[] = 509206f25ae9SGregory Neil Shapiro { 509306f25ae9SGregory Neil Shapiro #define TO_INITIAL 0x01 509406f25ae9SGregory Neil Shapiro { "initial", TO_INITIAL }, 509506f25ae9SGregory Neil Shapiro #define TO_MAIL 0x02 509606f25ae9SGregory Neil Shapiro { "mail", TO_MAIL }, 509706f25ae9SGregory Neil Shapiro #define TO_RCPT 0x03 509806f25ae9SGregory Neil Shapiro { "rcpt", TO_RCPT }, 509906f25ae9SGregory Neil Shapiro #define TO_DATAINIT 0x04 510006f25ae9SGregory Neil Shapiro { "datainit", TO_DATAINIT }, 510106f25ae9SGregory Neil Shapiro #define TO_DATABLOCK 0x05 510206f25ae9SGregory Neil Shapiro { "datablock", TO_DATABLOCK }, 510306f25ae9SGregory Neil Shapiro #define TO_DATAFINAL 0x06 510406f25ae9SGregory Neil Shapiro { "datafinal", TO_DATAFINAL }, 510506f25ae9SGregory Neil Shapiro #define TO_COMMAND 0x07 510606f25ae9SGregory Neil Shapiro { "command", TO_COMMAND }, 510706f25ae9SGregory Neil Shapiro #define TO_RSET 0x08 510806f25ae9SGregory Neil Shapiro { "rset", TO_RSET }, 510906f25ae9SGregory Neil Shapiro #define TO_HELO 0x09 511006f25ae9SGregory Neil Shapiro { "helo", TO_HELO }, 511106f25ae9SGregory Neil Shapiro #define TO_QUIT 0x0A 511206f25ae9SGregory Neil Shapiro { "quit", TO_QUIT }, 511306f25ae9SGregory Neil Shapiro #define TO_MISC 0x0B 511406f25ae9SGregory Neil Shapiro { "misc", TO_MISC }, 511506f25ae9SGregory Neil Shapiro #define TO_IDENT 0x0C 511606f25ae9SGregory Neil Shapiro { "ident", TO_IDENT }, 511706f25ae9SGregory Neil Shapiro #define TO_FILEOPEN 0x0D 511806f25ae9SGregory Neil Shapiro { "fileopen", TO_FILEOPEN }, 511906f25ae9SGregory Neil Shapiro #define TO_CONNECT 0x0E 512006f25ae9SGregory Neil Shapiro { "connect", TO_CONNECT }, 512106f25ae9SGregory Neil Shapiro #define TO_ICONNECT 0x0F 512206f25ae9SGregory Neil Shapiro { "iconnect", TO_ICONNECT }, 512306f25ae9SGregory Neil Shapiro #define TO_QUEUEWARN 0x10 512406f25ae9SGregory Neil Shapiro { "queuewarn", TO_QUEUEWARN }, 512506f25ae9SGregory Neil Shapiro { "queuewarn.*", TO_QUEUEWARN }, 512606f25ae9SGregory Neil Shapiro #define TO_QUEUEWARN_NORMAL 0x11 512706f25ae9SGregory Neil Shapiro { "queuewarn.normal", TO_QUEUEWARN_NORMAL }, 512806f25ae9SGregory Neil Shapiro #define TO_QUEUEWARN_URGENT 0x12 512906f25ae9SGregory Neil Shapiro { "queuewarn.urgent", TO_QUEUEWARN_URGENT }, 513006f25ae9SGregory Neil Shapiro #define TO_QUEUEWARN_NON_URGENT 0x13 513106f25ae9SGregory Neil Shapiro { "queuewarn.non-urgent", TO_QUEUEWARN_NON_URGENT }, 513206f25ae9SGregory Neil Shapiro #define TO_QUEUERETURN 0x14 513306f25ae9SGregory Neil Shapiro { "queuereturn", TO_QUEUERETURN }, 513406f25ae9SGregory Neil Shapiro { "queuereturn.*", TO_QUEUERETURN }, 513506f25ae9SGregory Neil Shapiro #define TO_QUEUERETURN_NORMAL 0x15 513606f25ae9SGregory Neil Shapiro { "queuereturn.normal", TO_QUEUERETURN_NORMAL }, 513706f25ae9SGregory Neil Shapiro #define TO_QUEUERETURN_URGENT 0x16 513806f25ae9SGregory Neil Shapiro { "queuereturn.urgent", TO_QUEUERETURN_URGENT }, 513906f25ae9SGregory Neil Shapiro #define TO_QUEUERETURN_NON_URGENT 0x17 514006f25ae9SGregory Neil Shapiro { "queuereturn.non-urgent", TO_QUEUERETURN_NON_URGENT }, 514106f25ae9SGregory Neil Shapiro #define TO_HOSTSTATUS 0x18 514206f25ae9SGregory Neil Shapiro { "hoststatus", TO_HOSTSTATUS }, 514306f25ae9SGregory Neil Shapiro #define TO_RESOLVER_RETRANS 0x19 514406f25ae9SGregory Neil Shapiro { "resolver.retrans", TO_RESOLVER_RETRANS }, 514506f25ae9SGregory Neil Shapiro #define TO_RESOLVER_RETRANS_NORMAL 0x1A 514606f25ae9SGregory Neil Shapiro { "resolver.retrans.normal", TO_RESOLVER_RETRANS_NORMAL }, 514706f25ae9SGregory Neil Shapiro #define TO_RESOLVER_RETRANS_FIRST 0x1B 514806f25ae9SGregory Neil Shapiro { "resolver.retrans.first", TO_RESOLVER_RETRANS_FIRST }, 514906f25ae9SGregory Neil Shapiro #define TO_RESOLVER_RETRY 0x1C 515006f25ae9SGregory Neil Shapiro { "resolver.retry", TO_RESOLVER_RETRY }, 515106f25ae9SGregory Neil Shapiro #define TO_RESOLVER_RETRY_NORMAL 0x1D 515206f25ae9SGregory Neil Shapiro { "resolver.retry.normal", TO_RESOLVER_RETRY_NORMAL }, 515306f25ae9SGregory Neil Shapiro #define TO_RESOLVER_RETRY_FIRST 0x1E 515406f25ae9SGregory Neil Shapiro { "resolver.retry.first", TO_RESOLVER_RETRY_FIRST }, 515506f25ae9SGregory Neil Shapiro #define TO_CONTROL 0x1F 515606f25ae9SGregory Neil Shapiro { "control", TO_CONTROL }, 515740266059SGregory Neil Shapiro #define TO_LHLO 0x20 515840266059SGregory Neil Shapiro { "lhlo", TO_LHLO }, 515940266059SGregory Neil Shapiro #define TO_AUTH 0x21 516040266059SGregory Neil Shapiro { "auth", TO_AUTH }, 516140266059SGregory Neil Shapiro #define TO_STARTTLS 0x22 516240266059SGregory Neil Shapiro { "starttls", TO_STARTTLS }, 516340266059SGregory Neil Shapiro #define TO_ACONNECT 0x23 516440266059SGregory Neil Shapiro { "aconnect", TO_ACONNECT }, 51655ef517c0SGregory Neil Shapiro #define TO_QUEUEWARN_DSN 0x24 51665ef517c0SGregory Neil Shapiro { "queuewarn.dsn", TO_QUEUEWARN_DSN }, 51675ef517c0SGregory Neil Shapiro #define TO_QUEUERETURN_DSN 0x25 51685ef517c0SGregory Neil Shapiro { "queuereturn.dsn", TO_QUEUERETURN_DSN }, 516906f25ae9SGregory Neil Shapiro { NULL, 0 }, 517006f25ae9SGregory Neil Shapiro }; 517106f25ae9SGregory Neil Shapiro 517206f25ae9SGregory Neil Shapiro 517306f25ae9SGregory Neil Shapiro static void 517406f25ae9SGregory Neil Shapiro settimeout(name, val, sticky) 517506f25ae9SGregory Neil Shapiro char *name; 517606f25ae9SGregory Neil Shapiro char *val; 517706f25ae9SGregory Neil Shapiro bool sticky; 517806f25ae9SGregory Neil Shapiro { 517906f25ae9SGregory Neil Shapiro register struct timeoutinfo *to; 518040266059SGregory Neil Shapiro int i, addopts; 518106f25ae9SGregory Neil Shapiro time_t toval; 518206f25ae9SGregory Neil Shapiro 518306f25ae9SGregory Neil Shapiro if (tTd(37, 2)) 518440266059SGregory Neil Shapiro sm_dprintf("settimeout(%s = %s)", name, val); 518506f25ae9SGregory Neil Shapiro 518606f25ae9SGregory Neil Shapiro for (to = TimeOutTab; to->to_name != NULL; to++) 518706f25ae9SGregory Neil Shapiro { 5188*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(to->to_name, name)) 518906f25ae9SGregory Neil Shapiro break; 519006f25ae9SGregory Neil Shapiro } 519106f25ae9SGregory Neil Shapiro 519206f25ae9SGregory Neil Shapiro if (to->to_name == NULL) 5193193538b7SGregory Neil Shapiro { 5194193538b7SGregory Neil Shapiro errno = 0; /* avoid bogus error text */ 519506f25ae9SGregory Neil Shapiro syserr("settimeout: invalid timeout %s", name); 5196193538b7SGregory Neil Shapiro return; 5197193538b7SGregory Neil Shapiro } 519806f25ae9SGregory Neil Shapiro 519906f25ae9SGregory Neil Shapiro /* 520006f25ae9SGregory Neil Shapiro ** See if this option is preset for us. 520106f25ae9SGregory Neil Shapiro */ 520206f25ae9SGregory Neil Shapiro 520306f25ae9SGregory Neil Shapiro if (!sticky && bitnset(to->to_code, StickyTimeoutOpt)) 520406f25ae9SGregory Neil Shapiro { 520506f25ae9SGregory Neil Shapiro if (tTd(37, 2)) 520640266059SGregory Neil Shapiro sm_dprintf(" (ignored)\n"); 520706f25ae9SGregory Neil Shapiro return; 520806f25ae9SGregory Neil Shapiro } 520906f25ae9SGregory Neil Shapiro 521006f25ae9SGregory Neil Shapiro if (tTd(37, 2)) 521140266059SGregory Neil Shapiro sm_dprintf("\n"); 521206f25ae9SGregory Neil Shapiro 521306f25ae9SGregory Neil Shapiro toval = convtime(val, 'm'); 521413058a91SGregory Neil Shapiro addopts = 0; 521506f25ae9SGregory Neil Shapiro 521606f25ae9SGregory Neil Shapiro switch (to->to_code) 521706f25ae9SGregory Neil Shapiro { 521806f25ae9SGregory Neil Shapiro case TO_INITIAL: 521906f25ae9SGregory Neil Shapiro TimeOuts.to_initial = toval; 522006f25ae9SGregory Neil Shapiro break; 522106f25ae9SGregory Neil Shapiro 522206f25ae9SGregory Neil Shapiro case TO_MAIL: 522306f25ae9SGregory Neil Shapiro TimeOuts.to_mail = toval; 522406f25ae9SGregory Neil Shapiro break; 522506f25ae9SGregory Neil Shapiro 522606f25ae9SGregory Neil Shapiro case TO_RCPT: 522706f25ae9SGregory Neil Shapiro TimeOuts.to_rcpt = toval; 522806f25ae9SGregory Neil Shapiro break; 522906f25ae9SGregory Neil Shapiro 523006f25ae9SGregory Neil Shapiro case TO_DATAINIT: 523106f25ae9SGregory Neil Shapiro TimeOuts.to_datainit = toval; 523206f25ae9SGregory Neil Shapiro break; 523306f25ae9SGregory Neil Shapiro 523406f25ae9SGregory Neil Shapiro case TO_DATABLOCK: 523506f25ae9SGregory Neil Shapiro TimeOuts.to_datablock = toval; 523606f25ae9SGregory Neil Shapiro break; 523706f25ae9SGregory Neil Shapiro 523806f25ae9SGregory Neil Shapiro case TO_DATAFINAL: 523906f25ae9SGregory Neil Shapiro TimeOuts.to_datafinal = toval; 524006f25ae9SGregory Neil Shapiro break; 524106f25ae9SGregory Neil Shapiro 524206f25ae9SGregory Neil Shapiro case TO_COMMAND: 524306f25ae9SGregory Neil Shapiro TimeOuts.to_nextcommand = toval; 524406f25ae9SGregory Neil Shapiro break; 524506f25ae9SGregory Neil Shapiro 524606f25ae9SGregory Neil Shapiro case TO_RSET: 524706f25ae9SGregory Neil Shapiro TimeOuts.to_rset = toval; 524806f25ae9SGregory Neil Shapiro break; 524906f25ae9SGregory Neil Shapiro 525006f25ae9SGregory Neil Shapiro case TO_HELO: 525106f25ae9SGregory Neil Shapiro TimeOuts.to_helo = toval; 525206f25ae9SGregory Neil Shapiro break; 525306f25ae9SGregory Neil Shapiro 525406f25ae9SGregory Neil Shapiro case TO_QUIT: 525506f25ae9SGregory Neil Shapiro TimeOuts.to_quit = toval; 525606f25ae9SGregory Neil Shapiro break; 525706f25ae9SGregory Neil Shapiro 525806f25ae9SGregory Neil Shapiro case TO_MISC: 525906f25ae9SGregory Neil Shapiro TimeOuts.to_miscshort = toval; 526006f25ae9SGregory Neil Shapiro break; 526106f25ae9SGregory Neil Shapiro 526206f25ae9SGregory Neil Shapiro case TO_IDENT: 526306f25ae9SGregory Neil Shapiro TimeOuts.to_ident = toval; 526406f25ae9SGregory Neil Shapiro break; 526506f25ae9SGregory Neil Shapiro 526606f25ae9SGregory Neil Shapiro case TO_FILEOPEN: 526706f25ae9SGregory Neil Shapiro TimeOuts.to_fileopen = toval; 526806f25ae9SGregory Neil Shapiro break; 526906f25ae9SGregory Neil Shapiro 527006f25ae9SGregory Neil Shapiro case TO_CONNECT: 527106f25ae9SGregory Neil Shapiro TimeOuts.to_connect = toval; 527206f25ae9SGregory Neil Shapiro break; 527306f25ae9SGregory Neil Shapiro 527406f25ae9SGregory Neil Shapiro case TO_ICONNECT: 527506f25ae9SGregory Neil Shapiro TimeOuts.to_iconnect = toval; 527606f25ae9SGregory Neil Shapiro break; 527706f25ae9SGregory Neil Shapiro 527840266059SGregory Neil Shapiro case TO_ACONNECT: 527940266059SGregory Neil Shapiro TimeOuts.to_aconnect = toval; 528040266059SGregory Neil Shapiro break; 528140266059SGregory Neil Shapiro 528206f25ae9SGregory Neil Shapiro case TO_QUEUEWARN: 528306f25ae9SGregory Neil Shapiro toval = convtime(val, 'h'); 528406f25ae9SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_NORMAL] = toval; 528506f25ae9SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_URGENT] = toval; 528606f25ae9SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_NONURGENT] = toval; 52875ef517c0SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_DSN] = toval; 528813058a91SGregory Neil Shapiro addopts = 2; 528906f25ae9SGregory Neil Shapiro break; 529006f25ae9SGregory Neil Shapiro 529106f25ae9SGregory Neil Shapiro case TO_QUEUEWARN_NORMAL: 529206f25ae9SGregory Neil Shapiro toval = convtime(val, 'h'); 529306f25ae9SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_NORMAL] = toval; 529406f25ae9SGregory Neil Shapiro break; 529506f25ae9SGregory Neil Shapiro 529606f25ae9SGregory Neil Shapiro case TO_QUEUEWARN_URGENT: 529706f25ae9SGregory Neil Shapiro toval = convtime(val, 'h'); 529806f25ae9SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_URGENT] = toval; 529906f25ae9SGregory Neil Shapiro break; 530006f25ae9SGregory Neil Shapiro 530106f25ae9SGregory Neil Shapiro case TO_QUEUEWARN_NON_URGENT: 530206f25ae9SGregory Neil Shapiro toval = convtime(val, 'h'); 530306f25ae9SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_NONURGENT] = toval; 530406f25ae9SGregory Neil Shapiro break; 530506f25ae9SGregory Neil Shapiro 53065ef517c0SGregory Neil Shapiro case TO_QUEUEWARN_DSN: 53075ef517c0SGregory Neil Shapiro toval = convtime(val, 'h'); 53085ef517c0SGregory Neil Shapiro TimeOuts.to_q_warning[TOC_DSN] = toval; 53095ef517c0SGregory Neil Shapiro break; 53105ef517c0SGregory Neil Shapiro 531106f25ae9SGregory Neil Shapiro case TO_QUEUERETURN: 531206f25ae9SGregory Neil Shapiro toval = convtime(val, 'd'); 531306f25ae9SGregory Neil Shapiro TimeOuts.to_q_return[TOC_NORMAL] = toval; 531406f25ae9SGregory Neil Shapiro TimeOuts.to_q_return[TOC_URGENT] = toval; 531506f25ae9SGregory Neil Shapiro TimeOuts.to_q_return[TOC_NONURGENT] = toval; 53165ef517c0SGregory Neil Shapiro TimeOuts.to_q_return[TOC_DSN] = toval; 531713058a91SGregory Neil Shapiro addopts = 2; 531806f25ae9SGregory Neil Shapiro break; 531906f25ae9SGregory Neil Shapiro 532006f25ae9SGregory Neil Shapiro case TO_QUEUERETURN_NORMAL: 532106f25ae9SGregory Neil Shapiro toval = convtime(val, 'd'); 532206f25ae9SGregory Neil Shapiro TimeOuts.to_q_return[TOC_NORMAL] = toval; 532306f25ae9SGregory Neil Shapiro break; 532406f25ae9SGregory Neil Shapiro 532506f25ae9SGregory Neil Shapiro case TO_QUEUERETURN_URGENT: 532606f25ae9SGregory Neil Shapiro toval = convtime(val, 'd'); 532706f25ae9SGregory Neil Shapiro TimeOuts.to_q_return[TOC_URGENT] = toval; 532806f25ae9SGregory Neil Shapiro break; 532906f25ae9SGregory Neil Shapiro 533006f25ae9SGregory Neil Shapiro case TO_QUEUERETURN_NON_URGENT: 533106f25ae9SGregory Neil Shapiro toval = convtime(val, 'd'); 533206f25ae9SGregory Neil Shapiro TimeOuts.to_q_return[TOC_NONURGENT] = toval; 533306f25ae9SGregory Neil Shapiro break; 533406f25ae9SGregory Neil Shapiro 53355ef517c0SGregory Neil Shapiro case TO_QUEUERETURN_DSN: 53365ef517c0SGregory Neil Shapiro toval = convtime(val, 'd'); 53375ef517c0SGregory Neil Shapiro TimeOuts.to_q_return[TOC_DSN] = toval; 53385ef517c0SGregory Neil Shapiro break; 53395ef517c0SGregory Neil Shapiro 534006f25ae9SGregory Neil Shapiro case TO_HOSTSTATUS: 534106f25ae9SGregory Neil Shapiro MciInfoTimeout = toval; 534206f25ae9SGregory Neil Shapiro break; 534306f25ae9SGregory Neil Shapiro 534406f25ae9SGregory Neil Shapiro case TO_RESOLVER_RETRANS: 534506f25ae9SGregory Neil Shapiro toval = convtime(val, 's'); 534606f25ae9SGregory Neil Shapiro TimeOuts.res_retrans[RES_TO_DEFAULT] = toval; 534706f25ae9SGregory Neil Shapiro TimeOuts.res_retrans[RES_TO_FIRST] = toval; 534806f25ae9SGregory Neil Shapiro TimeOuts.res_retrans[RES_TO_NORMAL] = toval; 534913058a91SGregory Neil Shapiro addopts = 2; 535006f25ae9SGregory Neil Shapiro break; 535106f25ae9SGregory Neil Shapiro 535206f25ae9SGregory Neil Shapiro case TO_RESOLVER_RETRY: 535306f25ae9SGregory Neil Shapiro i = atoi(val); 535406f25ae9SGregory Neil Shapiro TimeOuts.res_retry[RES_TO_DEFAULT] = i; 535506f25ae9SGregory Neil Shapiro TimeOuts.res_retry[RES_TO_FIRST] = i; 535606f25ae9SGregory Neil Shapiro TimeOuts.res_retry[RES_TO_NORMAL] = i; 535713058a91SGregory Neil Shapiro addopts = 2; 535806f25ae9SGregory Neil Shapiro break; 535906f25ae9SGregory Neil Shapiro 536006f25ae9SGregory Neil Shapiro case TO_RESOLVER_RETRANS_NORMAL: 536106f25ae9SGregory Neil Shapiro TimeOuts.res_retrans[RES_TO_NORMAL] = convtime(val, 's'); 536206f25ae9SGregory Neil Shapiro break; 536306f25ae9SGregory Neil Shapiro 536406f25ae9SGregory Neil Shapiro case TO_RESOLVER_RETRY_NORMAL: 536506f25ae9SGregory Neil Shapiro TimeOuts.res_retry[RES_TO_NORMAL] = atoi(val); 536606f25ae9SGregory Neil Shapiro break; 536706f25ae9SGregory Neil Shapiro 536806f25ae9SGregory Neil Shapiro case TO_RESOLVER_RETRANS_FIRST: 536906f25ae9SGregory Neil Shapiro TimeOuts.res_retrans[RES_TO_FIRST] = convtime(val, 's'); 537006f25ae9SGregory Neil Shapiro break; 537106f25ae9SGregory Neil Shapiro 537206f25ae9SGregory Neil Shapiro case TO_RESOLVER_RETRY_FIRST: 537306f25ae9SGregory Neil Shapiro TimeOuts.res_retry[RES_TO_FIRST] = atoi(val); 537406f25ae9SGregory Neil Shapiro break; 537506f25ae9SGregory Neil Shapiro 537606f25ae9SGregory Neil Shapiro case TO_CONTROL: 537706f25ae9SGregory Neil Shapiro TimeOuts.to_control = toval; 537806f25ae9SGregory Neil Shapiro break; 537906f25ae9SGregory Neil Shapiro 538040266059SGregory Neil Shapiro case TO_LHLO: 538140266059SGregory Neil Shapiro TimeOuts.to_lhlo = toval; 538240266059SGregory Neil Shapiro break; 538340266059SGregory Neil Shapiro 538440266059SGregory Neil Shapiro #if SASL 538540266059SGregory Neil Shapiro case TO_AUTH: 538640266059SGregory Neil Shapiro TimeOuts.to_auth = toval; 538740266059SGregory Neil Shapiro break; 53885b0945b5SGregory Neil Shapiro #endif 538940266059SGregory Neil Shapiro 539040266059SGregory Neil Shapiro #if STARTTLS 539140266059SGregory Neil Shapiro case TO_STARTTLS: 539240266059SGregory Neil Shapiro TimeOuts.to_starttls = toval; 539340266059SGregory Neil Shapiro break; 53945b0945b5SGregory Neil Shapiro #endif 539540266059SGregory Neil Shapiro 539606f25ae9SGregory Neil Shapiro default: 539706f25ae9SGregory Neil Shapiro syserr("settimeout: invalid timeout %s", name); 539806f25ae9SGregory Neil Shapiro break; 539906f25ae9SGregory Neil Shapiro } 540006f25ae9SGregory Neil Shapiro 540106f25ae9SGregory Neil Shapiro if (sticky) 540213058a91SGregory Neil Shapiro { 540313058a91SGregory Neil Shapiro for (i = 0; i <= addopts; i++) 540413058a91SGregory Neil Shapiro setbitn(to->to_code + i, StickyTimeoutOpt); 540513058a91SGregory Neil Shapiro } 540606f25ae9SGregory Neil Shapiro } 540740266059SGregory Neil Shapiro /* 5408c2aa98e2SPeter Wemm ** INITTIMEOUTS -- parse and set timeout values 5409c2aa98e2SPeter Wemm ** 5410c2aa98e2SPeter Wemm ** Parameters: 5411c2aa98e2SPeter Wemm ** val -- a pointer to the values. If NULL, do initial 5412c2aa98e2SPeter Wemm ** settings. 541306f25ae9SGregory Neil Shapiro ** sticky -- if set, don't let other setoptions override 541406f25ae9SGregory Neil Shapiro ** this suboption value. 5415c2aa98e2SPeter Wemm ** 5416c2aa98e2SPeter Wemm ** Returns: 5417c2aa98e2SPeter Wemm ** none. 5418c2aa98e2SPeter Wemm ** 5419c2aa98e2SPeter Wemm ** Side Effects: 5420c2aa98e2SPeter Wemm ** Initializes the TimeOuts structure 5421c2aa98e2SPeter Wemm */ 5422c2aa98e2SPeter Wemm 5423c2aa98e2SPeter Wemm void 542406f25ae9SGregory Neil Shapiro inittimeouts(val, sticky) 5425c2aa98e2SPeter Wemm register char *val; 542606f25ae9SGregory Neil Shapiro bool sticky; 5427c2aa98e2SPeter Wemm { 5428c2aa98e2SPeter Wemm register char *p; 5429c2aa98e2SPeter Wemm 5430c2aa98e2SPeter Wemm if (tTd(37, 2)) 543140266059SGregory Neil Shapiro sm_dprintf("inittimeouts(%s)\n", val == NULL ? "<NULL>" : val); 5432c2aa98e2SPeter Wemm if (val == NULL) 5433c2aa98e2SPeter Wemm { 5434c2aa98e2SPeter Wemm TimeOuts.to_connect = (time_t) 0 SECONDS; 543540266059SGregory Neil Shapiro TimeOuts.to_aconnect = (time_t) 0 SECONDS; 5436605302a5SGregory Neil Shapiro TimeOuts.to_iconnect = (time_t) 0 SECONDS; 5437c2aa98e2SPeter Wemm TimeOuts.to_initial = (time_t) 5 MINUTES; 5438c2aa98e2SPeter Wemm TimeOuts.to_helo = (time_t) 5 MINUTES; 5439c2aa98e2SPeter Wemm TimeOuts.to_mail = (time_t) 10 MINUTES; 5440c2aa98e2SPeter Wemm TimeOuts.to_rcpt = (time_t) 1 HOUR; 5441c2aa98e2SPeter Wemm TimeOuts.to_datainit = (time_t) 5 MINUTES; 5442c2aa98e2SPeter Wemm TimeOuts.to_datablock = (time_t) 1 HOUR; 5443c2aa98e2SPeter Wemm TimeOuts.to_datafinal = (time_t) 1 HOUR; 5444c2aa98e2SPeter Wemm TimeOuts.to_rset = (time_t) 5 MINUTES; 5445c2aa98e2SPeter Wemm TimeOuts.to_quit = (time_t) 2 MINUTES; 5446c2aa98e2SPeter Wemm TimeOuts.to_nextcommand = (time_t) 1 HOUR; 5447c2aa98e2SPeter Wemm TimeOuts.to_miscshort = (time_t) 2 MINUTES; 5448c2aa98e2SPeter Wemm #if IDENTPROTO 544906f25ae9SGregory Neil Shapiro TimeOuts.to_ident = (time_t) 5 SECONDS; 54505b0945b5SGregory Neil Shapiro #else 5451c2aa98e2SPeter Wemm TimeOuts.to_ident = (time_t) 0 SECONDS; 54525b0945b5SGregory Neil Shapiro #endif 5453c2aa98e2SPeter Wemm TimeOuts.to_fileopen = (time_t) 60 SECONDS; 545406f25ae9SGregory Neil Shapiro TimeOuts.to_control = (time_t) 2 MINUTES; 545540266059SGregory Neil Shapiro TimeOuts.to_lhlo = (time_t) 2 MINUTES; 545640266059SGregory Neil Shapiro #if SASL 545740266059SGregory Neil Shapiro TimeOuts.to_auth = (time_t) 10 MINUTES; 54585b0945b5SGregory Neil Shapiro #endif 545940266059SGregory Neil Shapiro #if STARTTLS 546040266059SGregory Neil Shapiro TimeOuts.to_starttls = (time_t) 1 HOUR; 54615b0945b5SGregory Neil Shapiro #endif 5462c2aa98e2SPeter Wemm if (tTd(37, 5)) 5463c2aa98e2SPeter Wemm { 546440266059SGregory Neil Shapiro sm_dprintf("Timeouts:\n"); 546540266059SGregory Neil Shapiro sm_dprintf(" connect = %ld\n", 546640266059SGregory Neil Shapiro (long) TimeOuts.to_connect); 546740266059SGregory Neil Shapiro sm_dprintf(" aconnect = %ld\n", 546840266059SGregory Neil Shapiro (long) TimeOuts.to_aconnect); 546940266059SGregory Neil Shapiro sm_dprintf(" initial = %ld\n", 547040266059SGregory Neil Shapiro (long) TimeOuts.to_initial); 547140266059SGregory Neil Shapiro sm_dprintf(" helo = %ld\n", (long) TimeOuts.to_helo); 547240266059SGregory Neil Shapiro sm_dprintf(" mail = %ld\n", (long) TimeOuts.to_mail); 547340266059SGregory Neil Shapiro sm_dprintf(" rcpt = %ld\n", (long) TimeOuts.to_rcpt); 547440266059SGregory Neil Shapiro sm_dprintf(" datainit = %ld\n", 547540266059SGregory Neil Shapiro (long) TimeOuts.to_datainit); 547640266059SGregory Neil Shapiro sm_dprintf(" datablock = %ld\n", 547740266059SGregory Neil Shapiro (long) TimeOuts.to_datablock); 547840266059SGregory Neil Shapiro sm_dprintf(" datafinal = %ld\n", 547940266059SGregory Neil Shapiro (long) TimeOuts.to_datafinal); 548040266059SGregory Neil Shapiro sm_dprintf(" rset = %ld\n", (long) TimeOuts.to_rset); 548140266059SGregory Neil Shapiro sm_dprintf(" quit = %ld\n", (long) TimeOuts.to_quit); 548240266059SGregory Neil Shapiro sm_dprintf(" nextcommand = %ld\n", 548340266059SGregory Neil Shapiro (long) TimeOuts.to_nextcommand); 548440266059SGregory Neil Shapiro sm_dprintf(" miscshort = %ld\n", 548540266059SGregory Neil Shapiro (long) TimeOuts.to_miscshort); 548640266059SGregory Neil Shapiro sm_dprintf(" ident = %ld\n", (long) TimeOuts.to_ident); 548740266059SGregory Neil Shapiro sm_dprintf(" fileopen = %ld\n", 548840266059SGregory Neil Shapiro (long) TimeOuts.to_fileopen); 548940266059SGregory Neil Shapiro sm_dprintf(" lhlo = %ld\n", 549040266059SGregory Neil Shapiro (long) TimeOuts.to_lhlo); 549140266059SGregory Neil Shapiro sm_dprintf(" control = %ld\n", 549240266059SGregory Neil Shapiro (long) TimeOuts.to_control); 5493c2aa98e2SPeter Wemm } 5494c2aa98e2SPeter Wemm return; 5495c2aa98e2SPeter Wemm } 5496c2aa98e2SPeter Wemm 5497c2aa98e2SPeter Wemm for (;; val = p) 5498c2aa98e2SPeter Wemm { 54995b0945b5SGregory Neil Shapiro while (SM_ISSPACE(*val)) 5500c2aa98e2SPeter Wemm val++; 5501c2aa98e2SPeter Wemm if (*val == '\0') 5502c2aa98e2SPeter Wemm break; 5503c2aa98e2SPeter Wemm for (p = val; *p != '\0' && *p != ','; p++) 5504c2aa98e2SPeter Wemm continue; 5505c2aa98e2SPeter Wemm if (*p != '\0') 5506c2aa98e2SPeter Wemm *p++ = '\0'; 5507c2aa98e2SPeter Wemm 5508c2aa98e2SPeter Wemm if (isascii(*val) && isdigit(*val)) 5509c2aa98e2SPeter Wemm { 5510c2aa98e2SPeter Wemm /* old syntax -- set everything */ 5511c2aa98e2SPeter Wemm TimeOuts.to_mail = convtime(val, 'm'); 5512c2aa98e2SPeter Wemm TimeOuts.to_rcpt = TimeOuts.to_mail; 5513c2aa98e2SPeter Wemm TimeOuts.to_datainit = TimeOuts.to_mail; 5514c2aa98e2SPeter Wemm TimeOuts.to_datablock = TimeOuts.to_mail; 5515c2aa98e2SPeter Wemm TimeOuts.to_datafinal = TimeOuts.to_mail; 5516c2aa98e2SPeter Wemm TimeOuts.to_nextcommand = TimeOuts.to_mail; 551706f25ae9SGregory Neil Shapiro if (sticky) 551806f25ae9SGregory Neil Shapiro { 551906f25ae9SGregory Neil Shapiro setbitn(TO_MAIL, StickyTimeoutOpt); 552006f25ae9SGregory Neil Shapiro setbitn(TO_RCPT, StickyTimeoutOpt); 552106f25ae9SGregory Neil Shapiro setbitn(TO_DATAINIT, StickyTimeoutOpt); 552206f25ae9SGregory Neil Shapiro setbitn(TO_DATABLOCK, StickyTimeoutOpt); 552306f25ae9SGregory Neil Shapiro setbitn(TO_DATAFINAL, StickyTimeoutOpt); 552406f25ae9SGregory Neil Shapiro setbitn(TO_COMMAND, StickyTimeoutOpt); 552506f25ae9SGregory Neil Shapiro } 5526c2aa98e2SPeter Wemm continue; 5527c2aa98e2SPeter Wemm } 5528c2aa98e2SPeter Wemm else 5529c2aa98e2SPeter Wemm { 5530c2aa98e2SPeter Wemm register char *q = strchr(val, ':'); 5531c2aa98e2SPeter Wemm 5532c2aa98e2SPeter Wemm if (q == NULL && (q = strchr(val, '=')) == NULL) 5533c2aa98e2SPeter Wemm { 5534c2aa98e2SPeter Wemm /* syntax error */ 5535c2aa98e2SPeter Wemm continue; 5536c2aa98e2SPeter Wemm } 5537c2aa98e2SPeter Wemm *q++ = '\0'; 553806f25ae9SGregory Neil Shapiro settimeout(val, q, sticky); 5539c2aa98e2SPeter Wemm } 5540c2aa98e2SPeter Wemm } 5541c2aa98e2SPeter Wemm } 5542*2fb4f839SGregory Neil Shapiro 5543*2fb4f839SGregory Neil Shapiro /* 5544*2fb4f839SGregory Neil Shapiro ** SHOWCFOPTS -- show cf options 5545*2fb4f839SGregory Neil Shapiro ** 5546*2fb4f839SGregory Neil Shapiro ** Parameters: 5547*2fb4f839SGregory Neil Shapiro ** none 5548*2fb4f839SGregory Neil Shapiro ** 5549*2fb4f839SGregory Neil Shapiro ** Returns: 5550*2fb4f839SGregory Neil Shapiro ** none. 5551*2fb4f839SGregory Neil Shapiro */ 5552*2fb4f839SGregory Neil Shapiro 5553*2fb4f839SGregory Neil Shapiro void 5554*2fb4f839SGregory Neil Shapiro showcfopts() 5555*2fb4f839SGregory Neil Shapiro { 5556*2fb4f839SGregory Neil Shapiro struct optioninfo *o; 5557*2fb4f839SGregory Neil Shapiro 5558*2fb4f839SGregory Neil Shapiro for (o = OptionTab; o->o_name != NULL; o++) 5559*2fb4f839SGregory Neil Shapiro { 5560*2fb4f839SGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 5561*2fb4f839SGregory Neil Shapiro "%s\n", o->o_name); 5562*2fb4f839SGregory Neil Shapiro } 5563*2fb4f839SGregory Neil Shapiro } 5564