1N/A * Copyright (c) 1998-2006, 2008-2010 Sendmail, Inc. and its suppliers. 1N/A * All rights reserved. 1N/A * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 1N/A * Copyright (c) 1988, 1993 1N/A * The Regents of the University of California. All rights reserved. 1N/A * By using this file, you agree to the terms and conditions set 1N/A * forth in the LICENSE file which can be found at the top level of 1N/A * the sendmail distribution. 1N/A#
endif /* NETINET || NETINET6 */ 1N/A** READCF -- read configuration file. 1N/A** This routine reads the configuration file and builds the internal 1N/A** The file is formatted as a sequence of lines, each taken 1N/A** atomically. The first character of each line describes how 1N/A** the line is to be interpreted. The lines are: 1N/A** Dxval Define macro x to have value val. 1N/A** Cxword Put word into class x. 1N/A** Fxfile [fmt] Read file for lines to put into 1N/A** class x. Use scanf string 'fmt' 1N/A** or "%s" if not present. Fmt should 1N/A** only produce one string-valued result. 1N/A** Hname: value Define header with field-name 'name' 1N/A** and value as specified; this will be 1N/A** macro expanded immediately before 1N/A** Sn Use rewriting set n. 1N/A** Rlhs rhs Rewrite addresses that match lhs to 1N/A** Mn arg=val... Define mailer. n is the internal name. 1N/A** Args specify mailer parameters. 1N/A** Oxvalue Set option x to value. 1N/A** O option value Set option (long name) to value. 1N/A** Pname=value Set precedence name to value. 1N/A** Qn arg=val... Define queue groups. n is the internal name. 1N/A** Args specify queue parameters. 1N/A** Vversioncode[/vendorcode] 1N/A** configuration syntax. 1N/A** Kmapname mapclass arguments.... 1N/A** Define keyed lookup of a given class. 1N/A** Arguments are class dependent. 1N/A** Eenvar=value Set the environment value to the given value. 1N/A** cfname -- configuration file name. 1N/A** safe -- true if this is the system config file; 1N/A** e -- the main envelope. 1N/A** Builds several internal tables. 1N/A#
endif /* STARTTLS */ 1N/A "%s: WARNING: dangerous write permissions\n",
1N/A "%s: WARNING: dangerous write permissions",
1N/A /* do macro expansion mappings */ 1N/A /* interpret this line */ 1N/A case '#':
/* comment */ 1N/A case 'R':
/* rewriting rule */ 1N/A for (p = &
bp[
1]; *p !=
'\0' && *p !=
'\t'; p++)
1N/A syserr(
"invalid rewrite line \"%s\" (tab expected)",
bp);
1N/A /* allocate space for the rule header */ 1N/A /* expand and save the LHS */ 1N/A /* count the number of fuzzy matches in LHS */ 1N/A /* expand and save the RHS */ 1N/A while (*++p ==
'\t')
1N/A while (*p !=
'\0' && *p !=
'\t')
1N/A#
endif /* _FFR_EXTRA_MAP_CHECK */ 1N/A /* check no out-of-bounds replacements */ 1N/A#
endif /* _FFR_EXTRA_MAP_CHECK */ 1N/A** This doesn't work yet as there are maps defined *after* the cf 1N/A** is read such as host, user, and alias. So for now, it's removed. 1N/A** When it comes back, the RELEASE_NOTES entry will be: 1N/A** Emit warnings for unknown maps when reading the .cf file. Based on 1N/A** patch from Robert Harker of Harker Systems. 1N/A ** Got a database lookup, 1N/A ** check if map is defined. 1N/A "Warning: %s: line %d: map %s not found\n",
1N/A case 'S':
/* select rewriting set */ 1N/A "WARNING: Ruleset %s has multiple definitions\n",
1N/A case 'D':
/* macro definition */ 1N/A case 'H':
/* required header line */ 1N/A case 'C':
/* word class */ 1N/A case 'T':
/* trusted user (set class `t') */ 1N/A case 'F':
/* word class from file */ 1N/A if (p[0] ==
'-' && p[
1] ==
'o')
1N/A while (*p !=
'\0' &&
1N/A /* check if [key]@map:spec */ 1N/A /* look for @LDAP or @map: in string */ 1N/A /* use entire spec */ 1N/A case 'L':
/* extended load average description */ 1N/A case 'L':
/* lookup macro */ 1N/A case 'G':
/* lookup class */ 1N/A /* reserved for Sun -- NIS+ database lookup */ 1N/A#
endif /* defined(SUN_EXTENSIONS) && defined(SUN_LOOKUP_MACRO) */ 1N/A case 'M':
/* define mailer */ 1N/A case 'O':
/* set option */ 1N/A case 'P':
/* set precedence */ 1N/A for (p = &
bp[
1]; *p !=
'\0' && *p !=
'='; p++)
1N/A case 'Q':
/* define queue */ 1N/A case 'V':
/* configuration syntax version */ 1N/A syserr(
"invalid argument to V line: \"%.20s\"",
1N/A ** Do heuristic tweaking for back compatibility. 1N/A /* level 5 configs have short name in $w */ 1N/A ** Look for vendor code. 1N/A /* extract vendor code */ 1N/A case 'X':
/* mail filter */ 1N/A "Warning: Filter usage ('X') requires Milter support (-DMILTER)\n");
1N/A /* initialize host maps from local service tables */ 1N/A /* initialize daemon (if not defined yet) */ 1N/A /* determine if we need to do special name-server frotz */ 1N/A** TRANSLATE_DOLLARS -- convert $x into internal form 1N/A** Actually does all appropriate pre-processing of a config line 1N/A** to turn it into internal form. 1N/A** ibp -- the buffer to translate. 1N/A** obp -- where to put the translation; may be the same as obp 1N/A** bsp -- a pointer to the size of obp; will be updated if 1N/A** the buffer needs to be replaced. 1N/A** The buffer pointer; may differ from obp if the expansion 1N/A** is larger then *bsp, in which case this will point to 1N/A** malloc()ed memory which must be free()d by the caller. 1N/A for (p =
bp; *p !=
'\0'; p++)
1N/A switch (*--p & 0
377)
1N/A /* it's from $# -- let it go through */ 1N/A /* it's backslash escaped */ 1N/A /* delete leading white space */ 1N/A if (*p !=
'$' || p[
1] ==
'\0')
1N/A /* actual dollar sign.... */ 1N/A /* convert to macro expansion character */ 1N/A /* special handling for $=, $~, $&, and $? */ 1N/A if (*p ==
'=' || *p ==
'~' || *p ==
'&' || *p ==
'?')
1N/A /* convert macro name to code */ 1N/A /* strip trailing white space from the line */ 1N/A** TOOMANY -- signal too many of some option 1N/A** id -- the id of the error line 1N/A** maxcnt -- the maximum possible values 1N/A** FILECLASS -- read members of a class from a file 1N/A** class -- class to define. 1N/A** filename -- name of file to read. 1N/A** fmt -- scanf string to use for match. 1N/A** ismap -- if set, this is a map lookup. 1N/A** safe -- if set, this is a safe read. 1N/A** optional -- if set, it is not an error for the file to 1N/A** puts all lines in filename that match a scanf into 1N/A** Break up the match into words and add to class. 1N/A /* strip leading spaces */ 1N/A /* find the end of the word */ 1N/A /* enter the word in the symbol table */ 1N/A /* should not happen */ 1N/A syserr(
"fileclass: bogus map specification");
1N/A /* impose the default schema */ 1N/A "-k (&(objectClass=sendmailMTAClass)(sendmailMTAClassName=%s)(|(sendmailMTACluster=%s)(sendmailMTAHost=%s))) -v sendmailMTAClassValue,sendmailMTAClassSearch:FILTER:sendmailMTAClass,sendmailMTAClassURL:URL:sendmailMTAClass",
1N/A syserr(
"fileclass: F{%s}: Default LDAP string too long",
1N/A syserr(
"fileclass: F{%s}: missing map class",
1N/A /* set up map structure */ 1N/A syserr(
"fileclass: F{%s}: class %s not available",
1N/A /* parse map spec */ 1N/A /* map_parse() showed the error already */ 1N/A syserr(
"fileclass: F{%s}: map lookup failed",
1N/A /* use the results */ 1N/A ** If anything else is added here, 1N/A ** check if the '@' map case above 1N/A ** needs the code as well. 1N/A** MAKEMAILER -- define a new mailer. 1N/A** line -- description of mailer. This is in labeled 1N/A** fields. The fields are: 1N/A** A -- the argv for this mailer 1N/A** C -- the character set for MIME conversions 1N/A** D -- the directory to run in 1N/A** E -- the eol string 1N/A** F -- the flags associated with the mailer 1N/A** L -- the maximum line length 1N/A** M -- the maximum message size 1N/A** N -- the niceness at which to run 1N/A** P -- the path to the mailer 1N/A** Q -- the queue group for the mailer 1N/A** R -- the recipient rewriting set 1N/A** S -- the sender rewriting set 1N/A** T -- the mailer type (for DSNs) 1N/A** U -- the uid to run as 1N/A** W -- the time to wait at the end 1N/A** m -- maximum messages per connection 1N/A** r -- maximum number of recipients per message 1N/A** / -- new root directory 1N/A** The first word is the canonical name of the mailer. 1N/A** enters the mailer into the mailer table. 1N/A /* allocate a mailer and set up defaults */ 1N/A /* collect the mailer name */ 1N/A /* now scan through and assign info from the fields */ 1N/A while (*p !=
'\0' &&
1N/A /* p now points to field code */ 1N/A while (*p !=
'\0' && *p !=
'=' && *p !=
',')
1N/A /* p now points to the field body */ 1N/A /* install the field into the mailer struct */ 1N/A case 'P':
/* pathname */ 1N/A if (*p !=
'\0')
/* error is issued below */ 1N/A case 'F':
/* flags */ 1N/A for (; *p !=
'\0'; p++)
1N/A "WARNING: mailer=%s, flag=%c deprecated",
1N/A#
endif /* _FFR_DEPRECATE_MAILER_FLAG_I */ 1N/A case 'S':
/* sender rewriting ruleset */ 1N/A case 'R':
/* recipient rewriting ruleset */ 1N/A case 'E':
/* end of line string */ 1N/A case 'A':
/* argument vector */ 1N/A if (*p !=
'\0')
/* error is issued below */ 1N/A case 'M':
/* maximum message size */ 1N/A case 'm':
/* maximum messages per connection */ 1N/A case 'r':
/* max recipient per envelope */ 1N/A case 'L':
/* maximum line length */ 1N/A case 'N':
/* run niceness */ 1N/A case 'D':
/* working directory */ 1N/A case 'C':
/* default charset */ 1N/A case 'Q':
/* queue for this mailer */ 1N/A /* extract MTA name type; default to "dns" */ 1N/A /* extract address type; default to "rfc822" */ 1N/A /* extract diagnostic type; default to "smtp" */ 1N/A case 'U':
/* user id */ 1N/A syserr(
"readcf: mailer U= flag: unknown user %s", q);
1N/A syserr(
"readcf: mailer U= flag: unknown group %s", q);
1N/A case 'W':
/* wait timeout */ 1N/A case '/':
/* new root directory */ 1N/A "M%s: Warning: F=%c set on system that doesn't support rresvport()\n",
1N/A#
endif /* !HASRRESVPORT */ 1N/A "M%s: Warning: N= set on system that doesn't support nice()\n",
1N/A#
endif /* !HASNICE */ 1N/A /* do some rationality checking */ 1N/A /* do some heuristic cleanup for back compatibility */ 1N/A /* Use the second argument for host or path to socket */ 1N/A syserr(
"M%s: too few parameters for %s mailer",
1N/A "M%s: Warning: first argument in %s mailer must be %s\n",
1N/A /* Use the second argument for filename */ 1N/A syserr(
"M%s: too %s parameters for [FILE] mailer",
1N/A syserr(
"M%s: first argument in [FILE] mailer must be FILE",
1N/A /* default for SMTP is \r\n; use \n for local delivery */ 1N/A for (p = *
pp; *p !=
'\0'; )
1N/A /* enter the mailer into the symbol table */ 1N/A** MUNCHSTRING -- translate a string into internal form. 1N/A** p -- the string to munch. 1N/A** delimptr -- if non-NULL, set to the pointer of the 1N/A** field delimiter character. 1N/A** delim -- the delimiter for the field. 1N/A** the munched string. 1N/A** the munched string is a local static buffer. 1N/A** it must be copied before the function is called again. 1N/A /* everything is roughly literal */ 1N/A case 'r':
/* carriage return */ 1N/A case 'n':
/* newline */ 1N/A case 'f':
/* form feed */ 1N/A case 'b':
/* backspace */ 1N/A** EXTRQUOTSTR -- extract a (quoted) string. 1N/A** This routine deals with quoted (") strings and escaped 1N/A** p -- source string. 1N/A** delimptr -- if non-NULL, set to the pointer of the 1N/A** field delimiter character. 1N/A** delimbuf -- delimiters for the field. 1N/A** st -- if non-NULL, store the return value (whether the 1N/A** string was correctly quoted) here. 1N/A** the extracted string. 1N/A** the returned string is a local static buffer. 1N/A** it must be copied before the function is called again. 1N/A** MAKEARGV -- break up a string into words 1N/A** p -- the string to break up. 1N/A** a char **argv (dynamically allocated) 1N/A /* take apart the words */ 1N/A /* now make a copy of the argv */ 1N/A** PRINTRULES -- print rewrite rules (for debugging) 1N/A** prints rewrite rules. 1N/A** PRINTMAILER -- print mailer structure (for debugging) 1N/A** m -- the mailer to print 1N/A for (j =
'\0'; j <=
'\177'; j++)
1N/A** SETOPTION -- set global processing option 1N/A** opt -- option name. 1N/A** val -- option value (as a text string). 1N/A** safe -- set if this came from a configuration file. 1N/A** Some options (if set from the command line) will 1N/A** reset the user id to avoid security problems. 1N/A** sticky -- if set, don't let other setoptions override 1N/A** e -- the main envelope. 1N/A** Sets options as implied by the arguments. 1N/A#
endif /* RES_USE_INET6 */ 1N/A {
"true", 0 },
/* avoid error on old syntax */ 1N/A#
endif /* NAMED_BIND */ 1N/A#
define OI_SAFE 0x0001 /* safe for random people to use */ 1N/A unsigned char o_code;
/* short name of option */ 1N/A#
endif /* defined(SUN_EXTENSIONS) && defined(REMOTE_MODE) */ 1N/A /* no long name, just here to avoid problems in setoption */ 1N/A /* no long name, just here to avoid problems in setoption */ 1N/A#
endif /* _FFR_DONTLOCKFILESFORREAD_OPTION */ 1N/A#
endif /* _FFR_MAX_FORWARD_ENTRIES */ 1N/A#
else /* _FFR_ALLOW_SASLINFO */ 1N/A#
endif /* _FFR_ALLOW_SASLINFO */ 1N/A#
endif /* _FFR_TLS_1 */ 1N/A#
endif /* _FFR_CRLPATH */ 1N/A#
endif /* _FFR_MEMSTAT */ 1N/A#
endif /* _FFR_MSG_ACCEPT */ 1N/A#
endif /* _FFR_QUEUE_RUN_PARANOIA */ 1N/A#
endif /* !ALLOW_255 */ 1N/A#
endif /* _FFR_EIGHT_BIT_ADDR_OK */ 1N/A#
endif /* _FFR_ADDR_TYPE_MODES */ 1N/A#
endif /* _FFR_BADRCPT_SHUTDOWN */ 1N/A#
endif /* STARTTLS && _FFR_TLS_1 */ 1N/A#
endif /* _FFR_EXPDELAY */ 1N/A#
endif /* _FFR_RCPTTHROTDELAY */ 1N/A/* these are turned on by default */ 1N/A#
endif /* STARTTLS && _FFR_TLS_1 */ 1N/A/* set a string option by expanding the value and assigning it */ 1N/A/* WARNING this belongs ONLY into a case statement! */ 1N/A#
endif /* _FFR_ALLOW_SASLINFO */ 1N/A#
endif /* STARTTLS || SM_CONF_SHM */ 1N/A#
endif /* STARTTLS && _FFR_TLS_1 */ 1N/A /* full word options */ 1N/A /* completely specified -- this must be it */ 1N/A syserr(
"readcf: ambiguous option name %s (matches %s and %s)",
1N/A sm_dprintf(
"setoption: %s does not support suboptions, ignoring .%s\n",
1N/A "setoption %s (%c)%s%s=" :
1N/A "setoption %s (0x%x)%s%s=",
1N/A ** See if this option is preset for us. 1N/A ** Check to see if this option can be specified by this user. 1N/A case '7':
/* force seven-bit input */ 1N/A case '8':
/* handling of 8-bit input */ 1N/A case 'p':
/* pass 8 bit, convert MIME */ 1N/A case 'm':
/* convert 8-bit, convert MIME */ 1N/A case 's':
/* strict adherence */ 1N/A case 'r':
/* reject 8-bit, don't convert MIME */ 1N/A case 'j':
/* "just send 8" */ 1N/A case 'a':
/* encode 8 bit if available */ 1N/A case 'c':
/* convert 8 bit to MIME, never 7 bit */ 1N/A "Warning: Option: %s requires MIME8TO7 support\n",
1N/A#
endif /* MIME8TO7 */ 1N/A case 'A':
/* set default alias file */ 1N/A case 'a':
/* look N minutes for "@:@" in alias file */ 1N/A case 'B':
/* substitution for blank character */ 1N/A case 'b':
/* min blocks free on queue fs/max msg size */ 1N/A case 'c':
/* don't connect to "expensive" mailers */ 1N/A case 'C':
/* checkpoint every N addresses */ 1N/A case 'd':
/* delivery mode */ 1N/A /* deliver first TA in background, then queue */ 1N/A#
endif /* _FFR_DM_ONE */ 1N/A case 'e':
/* set error processing mode */ 1N/A case 'F':
/* file mode */ 1N/A case 'f':
/* save Unix-style From lines on front */ 1N/A case 'G':
/* match recipients against GECOS field */ 1N/A case 'g':
/* default gid */ 1N/A syserr(
"readcf: option %c: unknown group %s",
1N/A case 'H':
/* help file */ 1N/A case 'h':
/* maximum hop count */ 1N/A case 'I':
/* use internet domain name server */ 1N/A syserr(
"readcf: I option value %s unrecognized", q);
1N/A#
else /* NAMED_BIND */ 1N/A usrerr(
"name server (I option) specified but BIND not compiled in");
1N/A#
endif /* NAMED_BIND */ 1N/A case 'i':
/* ignore dot lines in message */ 1N/A case 'j':
/* send errors in MIME (RFC 1341) format */ 1N/A case 'J':
/* .forward search path */ 1N/A case 'k':
/* connection cache size */ 1N/A case 'K':
/* connection cache timeout */ 1N/A case 'l':
/* use Errors-To: header */ 1N/A case 'L':
/* log level */ 1N/A case 'M':
/* define macro */ 1N/A case 'm':
/* send to me too */ 1N/A case 'n':
/* validate RHS in newaliases */ 1N/A /* 'N' available -- was "net name" */ 1N/A case 'O':
/* daemon options */ 1N/A case 'o':
/* assume old style headers */ 1N/A case 'p':
/* select privacy level */ 1N/A case 'P':
/* postmaster copy address for returned mail */ 1N/A case 'q':
/* slope of queue only function */ 1N/A case 'Q':
/* queue directory */ 1N/A case 'R':
/* don't prune routes */ 1N/A case 'r':
/* read timeout */ 1N/A case 'S':
/* status file */ 1N/A case 's':
/* be super safe, even if expensive */ 1N/A "Warning: SuperSafe=PostMilter requires Milter support (-DMILTER)\n");
1N/A case 'T':
/* queue timeout */ 1N/A case 't':
/* time zone name */ 1N/A case 'U':
/* location of user database */ 1N/A case 'u':
/* set default uid */ 1N/A for (p =
val; *p !=
'\0'; p++)
1N/A if (*p ==
'/' || *p ==
':')
1N/A#
else /* _FFR_DOTTED_USERNAMES */ 1N/A if (*p ==
'.' || *p ==
'/' || *p ==
':')
1N/A#
endif /* _FFR_DOTTED_USERNAMES */ 1N/A syserr(
"readcf: option u: uid value (%ld) > UID_MAX (%ld); ignored",
1N/A#
endif /* UID_MAX */ 1N/A /* handle the group if it is there */ 1N/A case 'V':
/* fallback MX host */ 1N/A case 'v':
/* run in verbose mode */ 1N/A case 'w':
/* if we are best MX, try host directly */ 1N/A /* 'W' available -- was wizard password */ 1N/A case 'x':
/* load avg at which to auto-queue msgs */ 1N/A case 'X':
/* load avg at which to auto-reject connections */ 1N/A case 'y':
/* work recipient factor */ 1N/A case 'Y':
/* fork jobs during queue runs */ 1N/A case 'z':
/* work message class factor */ 1N/A case 'Z':
/* work time factor */ 1N/A /* coordinate this with makequeue() */ 1N/A#
endif /* _FFR_QUEUE_GROUP_SORTORDER */ 1N/A case 'f':
/* File Name */ 1N/A case 'h':
/* Host first */ 1N/A case 'm':
/* Modification time */ 1N/A case 'p':
/* Priority order */ 1N/A case 't':
/* Submission time */ 1N/A case 'r':
/* Random */ 1N/A case 's':
/* Shuffled host name */ 1N/A#
endif /* _FFR_RHS */ 1N/A case 'n':
/* none */ 1N/A case O_MQA:
/* minimum queue age between deliveries */ 1N/A#
endif /* _FFR_EXPDELAY */ 1N/A /* strip trailing slashes */ 1N/A "Warning: NiceQueueRun set on system that doesn't support nice()\n");
1N/A#
endif /* !HASNICE */ 1N/A /* XXX do we want to check the range? > 0 ? */ 1N/A#
else /* SM_CONF_SHM */ 1N/A "Warning: Option: %s requires shared memory support (-DSM_CONF_SHM)\n",
1N/A#
endif /* SM_CONF_SHM */ 1N/A#
else /* SM_CONF_SHM */ 1N/A "Warning: Option: %s requires shared memory support (-DSM_CONF_SHM)\n",
1N/A#
endif /* SM_CONF_SHM */ 1N/A#
endif /* _FFR_MAX_FORWARD_ENTRIES */ 1N/A "Warning: MustQuoteChars too long, ignored.\n");
1N/A "Warning: OperatorChars is being redefined.\n It should only be set before ruleset definitions.\n");
1N/A case O_SLFH:
/* make sure from fits on one line */ 1N/A case O_ABH:
/* allow HELO commands with syntax errors */ 1N/A case O_UGW:
/* group writable files are unsafe */ 1N/A case O_HSDIR:
/* persistent host status directory */ 1N/A for (p =
val; *p !=
'\0'; p++)
1N/A if (*p ==
'/' || *p ==
':')
1N/A#
else /* _FFR_DOTTED_USERNAMES */ 1N/A if (*p ==
'.' || *p ==
'/' || *p ==
':')
1N/A#
endif /* _FFR_DOTTED_USERNAMES */ 1N/A "WARNING: RunAsUser for MSP ignored, check group ids (egid=%d, want=%d)\n",
1N/A syserr(
"readcf: option RunAsUser: uid value (%ld) > UID_MAX (%ld); ignored",
1N/A#
endif /* UID_MAX */ 1N/A "WARNING: RunAsUser for MSP ignored, check group ids (egid=%d, want=%d)\n",
1N/A syserr(
"readcf: option RunAsUser: unknown group %s",
1N/A "WARNING: RunAsUser for MSP ignored, check group ids (egid=%d, want=%d)\n",
1N/A syserr(
"readcf: DontBlameSendmail option: %s unrecognized",
val);
1N/A#
endif /* _FFR_RCPTTHROTDELAY */ 1N/A#
endif /* _FFR_DONTLOCKFILESFORREAD_OPTION */ 1N/A /* XXX should probably use gethostbyname */ 1N/A#
endif /* NETINET6 */ 1N/A#
endif /* NETINET */ 1N/A syserr(
"readcf: option ConnectOnlyTo: invalid IP address %s",
1N/A#
endif /* NETINET || NETINET6 */ 1N/A "readcf: option TrustedUser may cause problems on systems\n which do not support fchown() if UseMSP is not set.\n");
1N/A#
endif /* !HASFCHOWN && !defined(_FFR_DROP_TRUSTUSER_WARNING) */ 1N/A syserr(
"readcf: option TrustedUser: uid value (%ld) > UID_MAX (%ld)",
1N/A#
endif /* UID_MAX */ 1N/A "Warning: MaxMimeHeaderLength: header length limit set lower than 128\n");
1N/A "Warning: MaxMimeHeaderLength: field length limit set lower than 40\n");
1N/A ** Headers field values now include leading space, so let's 1N/A ** adjust the values to be "backward compatible". 1N/A "Warning: MaxHeadersLength: headers length limit set lower than %d\n",
1N/A ** Allow users to select their own authinfo file 1N/A ** under certain circumstances, otherwise just ignore 1N/A ** the option. If the option isn't ignored, several 1N/A ** commands don't work very well, e.g., mailq. 1N/A ** However, this is not a "perfect" solution. 1N/A ** If mail is queued, the authentication info 1N/A ** will not be used in subsequent delivery attempts. 1N/A ** If we really want to support this, then it has 1N/A ** to be stored in the queue file. 1N/A#
endif /* _FFR_ALLOW_SASLINFO */ 1N/A#
endif /* SASL >= 20101 */ 1N/A case ' ':
/* ignore */ 1N/A case '\t':
/* ignore */ 1N/A case ',':
/* ignore */ 1N/A "Warning: Option: %s unknown parameter '%c'\n",
1N/A "Warning: Option: %s requires SASL support (-DSASL)\n",
1N/A if (*p ==
'-' || *p ==
'+')
1N/A syserr(
"readcf: %s option value %s unrecognized",
1N/A#
endif /* _FFR_TLS_1 */ 1N/A#
else /* OPENSSL_VERSION_NUMBER > 0x00907000L */ 1N/A "Warning: Option: %s requires at least OpenSSL 0.9.7\n",
1N/A#
endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */ 1N/A#
else /* OPENSSL_VERSION_NUMBER > 0x00907000L */ 1N/A "Warning: Option: %s requires at least OpenSSL 0.9.7\n",
1N/A#
endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */ 1N/A#
endif /* _FFR_CRLPATH */ 1N/A ** This doesn't work well for some options, e.g., no server cert, 1N/A ** but fine for others. 1N/A ** XXX Some people may want different certs per server. 1N/A ** See also srvfeatures() 1N/A ** Server without a cert? That works only if 1N/A ** AnonDH is enabled as cipher, which is not in the 1N/A ** default list. Hence the CipherList option must 1N/A ** be available. Moreover: which clients support this 1N/A ** besides sendmail with this setting? 1N/A#
endif /* _FFR_TLS_1 */ 1N/A case ' ':
/* ignore */ 1N/A case '\t':
/* ignore */ 1N/A case ',':
/* ignore */ 1N/A "Warning: Option: %s unknown parameter '%c'\n",
1N/A#
endif /* _FFR_TLS_1 */ 1N/A#
endif /* _FFR_CRLPATH */ 1N/A "Warning: Option: %s requires TLS support\n",
1N/A#
endif /* STARTTLS */ 1N/A "Warning: Option: %s requires LDAP support (-DLDAPMAP)\n",
1N/A "Warning: Option: %s requires Milter support (-DMILTER)\n",
1N/A "Warning: Option: %s requires Milter support (-DMILTER)\n",
1N/A /* modifiers {daemon_flags} for direct submissions */ 1N/A#
else /* REQUIRES_DIR_FSYNC */ 1N/A /* silently ignored... required for cf file option */ 1N/A#
endif /* REQUIRES_DIR_FSYNC */ 1N/A#
endif /* _FFR_MEMSTAT */ 1N/A#
endif /* _FFR_MSG_ACCEPT */ 1N/A#
endif /* _FFR_QUEUE_RUN_PARANOIA */ 1N/A#
endif /* _FFR_EIGHT_BIT_ADDR_OK */ 1N/A#
endif /* _FFR_ADDR_TYPE_MODES */ 1N/A#
endif /* _FFR_BADRCPT_SHUTDOWN */ 1N/A ** Options with suboptions are responsible for taking care 1N/A ** of sticky-ness (e.g., that a command line setting is kept 1N/A ** when the suboptions are parsed since each suboption must be 1N/A ** sticky, not the root option. 1N/A** SETCLASS -- set a string into a class 1N/A** class -- the class to put the string in. 1N/A** str -- the string to enter 1N/A** puts the word into the symbol table. 1N/A** MAKEMAPENTRY -- create a map entry 1N/A** line -- the config file line 1N/A** A pointer to the map that has been created. 1N/A** NULL if there was a syntax error. 1N/A** Enters the map into the dictionary. 1N/A syserr(
"readcf: config K line: no map name");
1N/A /* look up the class */ 1N/A** STRTORWSET -- convert string to rewriting set number 1N/A** p -- the pointer to the string to decode. 1N/A** endp -- if set, store the trailing delimiter here. 1N/A** stabmode -- ST_ENTER to create this entry, ST_FIND if 1N/A** it must already exist. 1N/A** The appropriate ruleset number. 1N/A** -1 if it is not valid (error already printed) 1N/A syserr(
"invalid ruleset name: \"%.20s\"", p);
1N/A /* no valid characters */ 1N/A syserr(
"invalid ruleset name: \"%.20s\"", q);
1N/A syserr(
"bad ruleset definition \"%s\" (number required after `=')", q);
1N/A syserr(
"bad ruleset number %d in \"%s\" (%d max)",
1N/A syserr(
"%s: too many named rulesets (%d max)",
1N/A syserr(
"%s: ruleset changed value (old %d, new %d)",
1N/A** SETTIMEOUT -- set an individual timeout 1N/A** name -- the name of the timeout. 1N/A** val -- the value of the timeout. 1N/A** sticky -- if set, don't let other setoptions override 1N/A/* set if Timeout sub-option is stuck */ 1N/A ** See if this option is preset for us. 1N/A#
endif /* STARTTLS */ 1N/A** INITTIMEOUTS -- parse and set timeout values 1N/A** val -- a pointer to the values. If NULL, do initial 1N/A** sticky -- if set, don't let other setoptions override 1N/A** this suboption value. 1N/A** Initializes the TimeOuts structure 1N/A#
else /* IDENTPROTO */ 1N/A#
endif /* IDENTPROTO */ 1N/A#
endif /* STARTTLS */ 1N/A for (p =
val; *p !=
'\0' && *p !=
','; p++)
1N/A /* old syntax -- set everything */