Defend against bad data from gethostbyaddr(). Fixes bug #619
[exim.git] / doc / doc-src / spec.src
index 0819e718bf0eead16012ff97edd711b4c26c7ea3..dd768568996b52447cad1d43cff8ec8d49bfbcd9 100644 (file)
@@ -1,4 +1,4 @@
-. $Cambridge: exim/doc/doc-src/spec.src,v 1.4 2005/01/26 14:52:08 ph10 Exp $
+. $Cambridge: exim/doc/doc-src/spec.src,v 1.8 2005/02/17 11:58:25 ph10 Exp $
 .
 .set version "4.50"
 .set previousversion "4.40"
 .
 .set version "4.50"
 .set previousversion "4.40"
@@ -477,12 +477,15 @@ tips, and know-how for the benefit of others.
 
 .section Mailing lists
 .index mailing lists||for Exim users
 
 .section Mailing lists
 .index mailing lists||for Exim users
-The following are the two main Exim mailing lists:
+.em
+The following are the three main Exim mailing lists:
 .display rm
 .tabs 28
 $it{exim-users@@exim.org}          $t general discussion list
 .display rm
 .tabs 28
 $it{exim-users@@exim.org}          $t general discussion list
+$it{exim-dev@@exim.org}            $t discussion of bugs, enhancements, etc.
 $it{exim-announce@@exim.org}       $t moderated, low volume announcements list
 .endd
 $it{exim-announce@@exim.org}       $t moderated, low volume announcements list
 .endd
+.nem
 You can subscribe to these lists, change your existing subscriptions, and view
 or search the archives via the
 .if ~~html
 You can subscribe to these lists, change your existing subscriptions, and view
 or search the archives via the
 .if ~~html
@@ -3276,9 +3279,11 @@ name of the run time configuration file that is in use.
 .em
 As part of its operation, \-bV-\ causes Exim to read and syntax check its 
 configuration file. However, this is a static check only. It cannot check
 .em
 As part of its operation, \-bV-\ causes Exim to read and syntax check its 
 configuration file. However, this is a static check only. It cannot check
-values that to be expanded. You cannot rely on \-bV-\ alone to discover (for 
-example) all the typos in the configuration; some realistic testing is needed.
-The \-bh-\ and \-N-\ options provide more dynamic testing facilities.
+values that are to be expanded. For example, although a misspelt ACL verb is
+detected, an error in the verb's arguments is not. You cannot rely on \-bV-\
+alone to discover (for example) all the typos in the configuration; some
+realistic testing is needed. The \-bh-\ and \-N-\ options provide more dynamic
+testing facilities.
 .nem
 
 
 .nem
 
 
@@ -5957,7 +5962,7 @@ whereas for \%nwildlsearch%\, no expansion takes place.
 Like \%lsearch%\, the testing is done case-insensitively. The following forms
 of wildcard are recognized:
 .numberpars "$*$"
 Like \%lsearch%\, the testing is done case-insensitively. The following forms
 of wildcard are recognized:
 .numberpars "$*$"
-The string may begin with an asterisk to mean `begins with'. For example:
+The string may begin with an asterisk to mean `ends with'. For example:
 .display asis
 *.a.b.c       data for anything.a.b.c
 *fish         data for anythingfish
 .display asis
 *.a.b.c       data for anything.a.b.c
 *fish         data for anythingfish
@@ -9633,9 +9638,14 @@ compilations of the same version of the program.
 
 .em
 .tempindent 0
 
 .em
 .tempindent 0
-\$demime@_$\\*xxx*\: Two variables whose names start with \$demime$\ are
-available when Exim is compiled with the content-scanning extension and the
-obsolete \demime\ condition. For details, see section ~~SECTdemimecond.
+\$demime@_errorlevel$\: This variable is available when Exim is compiled with
+the content-scanning extension and the obsolete \demime\ condition. For
+details, see section ~~SECTdemimecond.
+
+.tempindent 0
+\$demime@_reason$\: This variable is available when Exim is compiled with the
+content-scanning extension and the obsolete \demime\ condition. For details,
+see section ~~SECTdemimecond.
 .nem
 
 .index black list (DNS)
 .nem
 
 .index black list (DNS)
@@ -10037,10 +10047,9 @@ if no size was given. The value may not, of course, be truthful.
 
 .em
 .tempindent 0
 
 .em
 .tempindent 0
-\$mime@_$\\*xxx*\:
-A number of variables whose names start with \$mime$\ are available when Exim
-is compiled with the content-scanning extension. For details, see section
-~~SECTscanmimepart.
+\$mime@_$\\*xxx*\: A number of variables whose names start with \$mime$\ are
+available when Exim is compiled with the content-scanning extension. For
+details, see section ~~SECTscanmimepart.
 .nem
 
 .tempindent 0
 .nem
 
 .tempindent 0
@@ -10171,10 +10180,12 @@ authenticated. Thus, for example, if the protocol is set to `esmtpsa', the
 message was received over an encrypted SMTP connection and the client was
 successfully authenticated.
 
 message was received over an encrypted SMTP connection and the client was
 successfully authenticated.
 
-Exim also uses the protocol name `smtps' for the rare situation where the 
-client initially used \\EHLO\\, set up an encrypted connection using
-\\STARTTLS\\, and then used \\HELO\\ afterwards to initiate the encrypted 
-session.
+Exim uses the protocol name `smtps' for the case when encryption is
+automatically set up on connection without the use of \\STARTTLS\\ (see
+\tls@_on@_connect@_ports\), and the client uses \\HELO\\ to initiate the
+encrypted SMTP session. The name `smtps' is also used for the rare situation
+where the client initially uses \\EHLO\\, sets up an encrypted connection using
+\\STARTTLS\\, and then uses \\HELO\\ afterwards.
 
 The \-oMr-\ option provides a way of specifying a custom protocol name for 
 messages that are injected locally by trusted callers. This is commonly used to 
 
 The \-oMr-\ option provides a way of specifying a custom protocol name for 
 messages that are injected locally by trusted callers. This is commonly used to 
@@ -10673,21 +10684,29 @@ terminating newline.
 
 .em
 .section Use of standard output and error by Perl
 
 .em
 .section Use of standard output and error by Perl
+.index Perl||standard output and error
 You should not write to the standard error or output streams from within your 
 You should not write to the standard error or output streams from within your 
-Perl code, as it is not defined how these are set up. In versions of Exim up to 
-at least 4.50, it is possible for the standard output or error to refer to the 
-SMTP connection during message reception. Writing to this stream is likely to 
-cause chaos. Something may be done about this in later releases.
-
-Unfortunately, the Perl \warn\ statment writes to the standard error stream, 
-and this may be embedded in Perl modules that you use, but over which you have 
-no control. One way round this is to ensure that the following Perl magic is 
-obeyed before \warn\ is used:
-.display asis
-$SIG{__WARN__} = sub { Exim::log_write($_[0]) };
-.endd
-This causes the output of the \warn\ statement to be written to Exim's log 
-file.
+Perl code, as it is not defined how these are set up. In versions of Exim  
+before 4.50, it is possible for the standard output or error to refer to the 
+SMTP connection during message reception via the daemon. Writing to this stream
+is certain to cause chaos. From Exim 4.50 onwards, the standard output and
+error streams are connected to \(/dev/null)\ in the daemon. The chaos is 
+avoided, but the output is lost.
+
+.index Perl||\warn\, use of
+The Perl \warn\ statement writes to the standard error stream by default. Calls 
+to \warn\ may be embedded in Perl modules that you use, but over which you have
+no control. When Exim starts up the Perl interpreter, it arranges for output
+from the \warn\ statement to be written to the Exim main log. You can change 
+this by including appropriate Perl magic somewhere in your Perl code. For 
+example, to discard \warn\ output completely, you need this:
+.display asis
+$SIG{__WARN__} = sub { };
+.endd
+Whenever a \warn\ is obeyed, the anonymous subroutine is called. In this 
+example, the code for the subroutine is empty, so it does nothing, but you can
+include any Perl code that you like. The text of the \warn\ message is passed
+as the first subroutine argument.
 .nem
 
 
 .nem
 
 
@@ -10841,15 +10860,17 @@ value of \daemon@_smtp@_ports\ is no longer relevant in this example.)
 
 
 .em
 
 
 .em
-.section Support for the obsolete SSMTP protocol
+.section Support for the obsolete SSMTP (or SMTPS) protocol
 .rset SECTsupobssmt "~~chapter.~~section"
 .index ssmtp protocol
 .rset SECTsupobssmt "~~chapter.~~section"
 .index ssmtp protocol
+.index smtps protocol
 .index SMTP||ssmtp protocol
 .index SMTP||ssmtp protocol
-Exim supports the obsolete SSMTP protocol that was used before the \\STARTTLS\\ 
-command was standardized for SMTP. Some legacy clients still use this protocol.
-If the \tls@_on@_connect@_ports\ option is set to a list of port numbers, 
-connections to those ports must use SSMTP. The most common use of this option
-is expected to be
+.index SMTP||smtps protocol
+Exim supports the obsolete SSMTP protocol (also known as SMTPS) that was used
+before the \\STARTTLS\\ command was standardized for SMTP. Some legacy clients
+still use this protocol. If the \tls@_on@_connect@_ports\ option is set to a
+list of port numbers, connections to those ports must use SSMTP. The most
+common use of this option is expected to be
 .display asis
 tls_on_connect_ports = 465
 .endd
 .display asis
 tls_on_connect_ports = 465
 .endd
@@ -11208,7 +11229,7 @@ listed in more than one group.
 \tls@_dhparam\                          $t$rm{DH parameters for server}
 .newline
 .em
 \tls@_dhparam\                          $t$rm{DH parameters for server}
 .newline
 .em
-\tls@_on@_connect@_ports\               $t$rm{specify SSMTP ports}
+\tls@_on@_connect@_ports\               $t$rm{specify SSMTP (SMTPS) ports}
 .nem
 .newline
 \tls@_privatekey\                       $t$rm{location of server private key}
 .nem
 .newline
 \tls@_privatekey\                       $t$rm{location of server private key}
@@ -11399,17 +11420,17 @@ Consequently, this option is turned off by default.
 This option defines the ACL that is run when a non-SMTP message is on the point
 of being accepted. See chapter ~~CHAPACL for further details.
 
 This option defines the ACL that is run when a non-SMTP message is on the point
 of being accepted. See chapter ~~CHAPACL for further details.
 
-.index ~~ACL||on SMTP connection
-.conf acl@_smtp@_connect string$**$ unset
-This option defines the ACL that is run when an SMTP connection is received.
-See chapter ~~CHAPACL for further details.
-
 .index ~~ACL||setting up for SMTP commands
 .index \\AUTH\\||ACL for
 .conf acl@_smtp@_auth string$**$ unset
 This option defines the ACL that is run when an SMTP \\AUTH\\ command is
 received. See chapter ~~CHAPACL for further details.
 
 .index ~~ACL||setting up for SMTP commands
 .index \\AUTH\\||ACL for
 .conf acl@_smtp@_auth string$**$ unset
 This option defines the ACL that is run when an SMTP \\AUTH\\ command is
 received. See chapter ~~CHAPACL for further details.
 
+.index ~~ACL||on SMTP connection
+.conf acl@_smtp@_connect string$**$ unset
+This option defines the ACL that is run when an SMTP connection is received.
+See chapter ~~CHAPACL for further details.
+
 .index \\DATA\\, ACL for
 .conf acl@_smtp@_data string$**$ unset
 This option defines the ACL that is run after an SMTP \\DATA\\ command has been
 .index \\DATA\\, ACL for
 .conf acl@_smtp@_data string$**$ unset
 This option defines the ACL that is run after an SMTP \\DATA\\ command has been
@@ -12803,13 +12824,18 @@ override; they are accepted, but ignored.
 .index queue runner||processing messages in order
 If this option is set, queue runs happen in order of message arrival instead of
 in an arbitrary order. For this to happen, a complete list of the entire queue
 .index queue runner||processing messages in order
 If this option is set, queue runs happen in order of message arrival instead of
 in an arbitrary order. For this to happen, a complete list of the entire queue
-must be set up before the deliveries start. When the queue is all in a single
-directory (the default), this happens anyway, but if \split@_spool@_directory\
-is set it does not -- for delivery in random order, the sub-directories are
-processed one at a time (in random order), to avoid setting up one huge list.
-Thus, setting \queue@_run@_in@_order\ with \split@_spool@_directory\ may
-degrade performance when the queue is large. In most situations,
-\queue@_run@_in@_order\ should not be set.
+must be set up before the deliveries start. When the queue is all held in a
+single directory (the default),
+.em
+a single list is created for both the ordered and the non-ordered cases.
+However, if \split@_spool@_directory\ is set, a single list is not created when
+\queue@_run@_in@_order\ is false. In this case, the sub-directories are
+processed one at a time (in a random order), and this avoids setting up one
+huge list for the whole queue. Thus, setting \queue@_run@_in@_order\ with
+\split@_spool@_directory\ may degrade performance when the queue is large,
+because of the extra work in setting up the single, large list. In most
+situations, \queue@_run@_in@_order\ should not be set.
+.nem
 
 .conf queue@_run@_max integer 5
 .index queue runner||maximum number of
 
 .conf queue@_run@_max integer 5
 .index queue runner||maximum number of
@@ -13154,6 +13180,7 @@ expanded and used instead of the value of \$primary@_hostname$\ in SMTP
 responses. For example, it is used as domain name in the response to an
 incoming \\HELO\\ or \\EHLO\\ command. 
 .em
 responses. For example, it is used as domain name in the response to an
 incoming \\HELO\\ or \\EHLO\\ command. 
 .em
+It is also used in \\HELO\\ commands for callout verification.
 The active hostname is placed in the \$smtp__active__hostname$\ variable, which 
 is saved with any messages that are received. It is therefore available for use 
 in routers and transports when the message is later delivered.
 The active hostname is placed in the \$smtp__active__hostname$\ variable, which 
 is saved with any messages that are received. It is therefore available for use 
 in routers and transports when the message is later delivered.
@@ -13631,10 +13658,10 @@ ignored. See section ~~SECTopenvsgnu for further details.
 
 .em
 .conf tls@_on@_connect@_ports "string list" unset
 
 .em
 .conf tls@_on@_connect@_ports "string list" unset
-This option specifies a list of incoming SSMTP ports that should operate the 
-obsolete SSMTP protocol, where a TLS session is immediately set up without 
-waiting for the client to issue a \\STARTTLS\\ command. For further details,
-see section ~~SECTsupobssmt.
+This option specifies a list of incoming SSMTP (aka SMTPS) ports that should
+operate the obsolete SSMTP (SMTPS) protocol, where a TLS session is immediately
+set up without waiting for the client to issue a \\STARTTLS\\ command. For
+further details, see section ~~SECTsupobssmt.
 .nem
 
 .conf tls@_privatekey string$**$ unset
 .nem
 
 .conf tls@_privatekey string$**$ unset
@@ -16105,12 +16132,20 @@ text associated with the failure. For example, an alias file might contain:
 X.Employee:  :fail: Gone away, no forwarding address
 .endd
 In the case of an address that is being verified from an ACL or as the subject
 X.Employee:  :fail: Gone away, no forwarding address
 .endd
 In the case of an address that is being verified from an ACL or as the subject
-of a \\VRFY\\ command, the text is included in the SMTP error response by
-default. In an ACL, an explicitly provided message overrides the default, but
-the default message is available in the variable \$acl@_verify@_message$\ and
-can therefore be included in a custom message if this is desired. Exim sends a
-451 SMTP code for a :::defer::, and 550 for :::fail::. In non-SMTP cases the
-text is included in the error message that Exim generates.
+of a 
+.index \\VRFY\\||error text, display of
+\\VRFY\\ command, the text is included in the SMTP error response by
+default. 
+.em
+.index \\EXPN\\||error text, display of
+The text is not included in the response to an \\EXPN\\ command.
+.nem
+
+In an ACL, an explicitly provided message overrides the default, but the
+default message is available in the variable \$acl@_verify@_message$\ and can
+therefore be included in a custom message if this is desired. Exim sends a 451
+SMTP code for a :::defer::, and 550 for :::fail::. In non-SMTP cases the text
+is included in the error message that Exim generates.
 
 
 
 
 
 
@@ -18790,10 +18825,18 @@ If this option is set, and the command returns any output, and also ends with a
 return code that is neither zero nor one of the return codes listed in
 \temp@_errors\ (that is, the delivery failed), the first line of output is
 written to the main log.
 return code that is neither zero nor one of the return codes listed in
 \temp@_errors\ (that is, the delivery failed), the first line of output is
 written to the main log.
+.em
+This option and \log@_output\ are mutually exclusive. Only one of them may be 
+set.
+.nem
 
 .conf log@_output boolean false
 If this option is set and the command returns any output, the first line of
 output is written to the main log, whatever the return code.
 
 .conf log@_output boolean false
 If this option is set and the command returns any output, the first line of
 output is written to the main log, whatever the return code.
+.em
+This option and \log@_fail@_output\ are mutually exclusive. Only one of them
+may be set.
+.nem
 
 .conf max@_output integer 20K
 This specifies the maximum amount of output that the command may produce on its
 
 .conf max@_output integer 20K
 This specifies the maximum amount of output that the command may produce on its
@@ -18858,6 +18901,10 @@ return code other than zero or one of the codes listed in \temp@_errors\ (that
 is, the delivery failed), the output is returned in the bounce message.
 However, if the message has a null sender (that is, it is itself a bounce
 message), output from the command is discarded.
 is, the delivery failed), the output is returned in the bounce message.
 However, if the message has a null sender (that is, it is itself a bounce
 message), output from the command is discarded.
+.em
+This option and \return@_output\ are mutually exclusive. Only one of them may
+be set.
+.nem
 
 .conf return@_output boolean false
 If this option is true, and the command produced any output, the delivery is
 
 .conf return@_output boolean false
 If this option is true, and the command produced any output, the delivery is
@@ -18866,6 +18913,10 @@ is returned in the bounce message. Otherwise, the output is just discarded.
 However, if the message has a null sender (that is, it is a bounce message),
 output from the command is always discarded, whatever the setting of this
 option.
 However, if the message has a null sender (that is, it is a bounce message),
 output from the command is always discarded, whatever the setting of this
 option.
+.em
+This option and \return@_fail@_output\ are mutually exclusive. Only one of them
+may be set.
+.nem
 
 .conf temp@_errors "string list" "see below"
 .index \%pipe%\ transport||temporary failure
 
 .conf temp@_errors "string list" "see below"
 .index \%pipe%\ transport||temporary failure
@@ -21202,6 +21253,8 @@ The \%cyrus@_sasl%\ authenticator provides server support for the Cyrus SASL
 library implementation of the RFC 2222 (`Simple Authentication and Security
 Layer'). This library supports a number of authentication mechanisms, including
 PLAIN and LOGIN, but also several others that Exim does not support directly.
 library implementation of the RFC 2222 (`Simple Authentication and Security
 Layer'). This library supports a number of authentication mechanisms, including
 PLAIN and LOGIN, but also several others that Exim does not support directly.
+In particular, there is support for Kerberos authentication.
+
 The \%cyrus@_sasl%\ authenticator provides a gatewaying mechanism directly to
 the Cyrus interface, so if your Cyrus library can do, for example, CRAM-MD5,
 then so can the \%cyrus@_sasl%\ authenticator. By default it uses the public
 The \%cyrus@_sasl%\ authenticator provides a gatewaying mechanism directly to
 the Cyrus interface, so if your Cyrus library can do, for example, CRAM-MD5,
 then so can the \%cyrus@_sasl%\ authenticator. By default it uses the public
@@ -21397,14 +21450,16 @@ in order to get TLS to work.
 
 
 .em
 
 
 .em
-.section Support for the legacy `ssmtp' protocol
+.section Support for the legacy `ssmtp' (aka `smtps') protocol
 .index ssmtp protocol
 .index ssmtp protocol
+.index smtps protocol
 .index SMTP||ssmtp protocol
 .index SMTP||ssmtp protocol
+.index SMTP||smtps protocol
 Early implementations of encrypted SMTP used a different TCP port from normal
 SMTP, and expected an encryption negotiation to start immediately, instead of 
 waiting for a \\STARTTLS\\ command from the client using the standard SMTP 
 Early implementations of encrypted SMTP used a different TCP port from normal
 SMTP, and expected an encryption negotiation to start immediately, instead of 
 waiting for a \\STARTTLS\\ command from the client using the standard SMTP 
-port. The protocol was called `ssmtp' and port 465 was allocated for this
-purpose. 
+port. The protocol was called `ssmtp' or `smtps', and port 465 was allocated
+for this purpose.
 
 This approach was abandoned when encrypted SMTP was standardised, but there are
 still some legacy clients that use it. Exim supports these clients by means of
 
 This approach was abandoned when encrypted SMTP was standardised, but there are
 still some legacy clients that use it. Exim supports these clients by means of
@@ -22236,6 +22291,7 @@ sender address in the ACL that is run for a \\VRFY\\ command.
 .section ACL verbs
 The ACL verbs are as follows:
 .numberpars $.
 .section ACL verbs
 The ACL verbs are as follows:
 .numberpars $.
+.index \accept\, ACL verb
 \accept\: If all the conditions are met, the ACL returns `accept'. If any of
 the conditions are not met, what happens depends on whether \endpass\ appears
 among the conditions (for syntax see below). If the failing condition is before
 \accept\: If all the conditions are met, the ACL returns `accept'. If any of
 the conditions are not met, what happens depends on whether \endpass\ appears
 among the conditions (for syntax see below). If the failing condition is before
@@ -22252,6 +22308,7 @@ to the next statement. If it does match, the recipient is verified, and the
 command is accepted if verification succeeds. However, if verification fails,
 the ACL yields `deny', because the failing condition is after \endpass\.
 .nextp
 command is accepted if verification succeeds. However, if verification fails,
 the ACL yields `deny', because the failing condition is after \endpass\.
 .nextp
+.index \defer\, ACL verb
 \defer\: If all the conditions are met, the ACL returns `defer' which, in an
 SMTP session, causes a 4\*xx*\ response to be given. For a non-SMTP ACL,
 \defer\ is the same as \deny\, because there is no way of sending a temporary
 \defer\: If all the conditions are met, the ACL returns `defer' which, in an
 SMTP session, causes a 4\*xx*\ response to be given. For a non-SMTP ACL,
 \defer\ is the same as \deny\, because there is no way of sending a temporary
@@ -22259,6 +22316,7 @@ error. For a \\RCPT\\ command, \defer\ is much the same as using a
 \%redirect%\ router and \":defer:"\ while verifying, but the \defer\ verb can
 be used in any ACL, and even for a recipient it might be a simpler approach.
 .nextp
 \%redirect%\ router and \":defer:"\ while verifying, but the \defer\ verb can
 be used in any ACL, and even for a recipient it might be a simpler approach.
 .nextp
+.index \deny\, ACL verb
 \deny\: If all the conditions are met, the ACL returns `deny'. If any of the
 conditions are not met, control is passed to the next ACL statement. For
 example,
 \deny\: If all the conditions are met, the ACL returns `deny'. If any of the
 conditions are not met, control is passed to the next ACL statement. For
 example,
@@ -22267,6 +22325,7 @@ deny dnslists = blackholes.mail-abuse.org
 .endd
 rejects commands from hosts that are on a DNS black list.
 .nextp
 .endd
 rejects commands from hosts that are on a DNS black list.
 .nextp
+.index \discard\, ACL verb
 \discard\: This verb behaves like \accept\, except that it returns `discard'
 from the ACL instead of `accept'. It is permitted only on ACLs that are
 concerned with receiving messages, and it causes recipients to be discarded.
 \discard\: This verb behaves like \accept\, except that it returns `discard'
 from the ACL instead of `accept'. It is permitted only on ACLs that are
 concerned with receiving messages, and it causes recipients to be discarded.
@@ -22279,6 +22338,7 @@ message's recipients are discarded. Recipients that are discarded before
 \\DATA\\ do not appear in the log line when the \log@_recipients\ log selector
 is set.
 .nextp
 \\DATA\\ do not appear in the log line when the \log@_recipients\ log selector
 is set.
 .nextp
+.index \drop\, ACL verb
 \drop\: This verb behaves like \deny\, except that an SMTP connection is
 forcibly closed after the 5\*xx*\ error message has been sent. For example:
 .display asis
 \drop\: This verb behaves like \deny\, except that an SMTP connection is
 forcibly closed after the 5\*xx*\ error message has been sent. For example:
 .display asis
@@ -22291,6 +22351,7 @@ drop   message   = I don't take more than 20 RCPTs
 There is no difference between \deny\ and \drop\ for the connect-time ACL. The
 connection is always dropped after sending a 550 response.
 .nextp
 There is no difference between \deny\ and \drop\ for the connect-time ACL. The
 connection is always dropped after sending a 550 response.
 .nextp
+.index \require\, ACL verb
 \require\: If all the conditions are met, control is passed to the next ACL
 statement. If any of the conditions are not met, the ACL returns `deny'. For
 example, when checking a \\RCPT\\ command,
 \require\: If all the conditions are met, control is passed to the next ACL
 statement. If any of the conditions are not met, the ACL returns `deny'. For
 example, when checking a \\RCPT\\ command,
@@ -22300,6 +22361,7 @@ require verify = sender
 passes control to subsequent statements only if the message's sender can be
 verified. Otherwise, it rejects the command.
 .nextp
 passes control to subsequent statements only if the message's sender can be
 verified. Otherwise, it rejects the command.
 .nextp
+.index \warn\, ACL verb
 \warn\: If all the conditions are met, a header line is added to an incoming
 message and/or a line is written to Exim's main log. In all cases, control
 passes to the next ACL statement. The text of the added header line and the log
 \warn\: If all the conditions are met, a header line is added to an incoming
 message and/or a line is written to Exim's main log. In all cases, control
 passes to the next ACL statement. The text of the added header line and the log
@@ -22447,6 +22509,7 @@ The ACL modifiers are as follows:
 .startitems
 
 .item "control = <<text>>"
 .startitems
 
 .item "control = <<text>>"
+.index \control\, ACL modifier
 .em
 This modifier affects the subsequent processing of the SMTP connection or of an
 incoming message that is accepted. The effect of the first type of control
 .em
 This modifier affects the subsequent processing of the SMTP connection or of an
 incoming message that is accepted. The effect of the first type of control
@@ -22501,6 +22564,7 @@ require  control = no_multiline_response
 .endp
 
 .item "delay = <<time>>"
 .endp
 
 .item "delay = <<time>>"
+.index \delay\, ACL modifier
 .index \-bh-\ option
 This modifier causes Exim to wait for the time interval before proceeding. The
 time is given in the usual Exim notation. This modifier may appear in any ACL.
 .index \-bh-\ option
 This modifier causes Exim to wait for the time interval before proceeding. The
 time is given in the usual Exim notation. This modifier may appear in any ACL.
@@ -22530,12 +22594,14 @@ accept  ...
 .endd
 
 .item endpass
 .endd
 
 .item endpass
+.index \endpass\, ACL modifier
 This modifier, which has no argument, is recognized only in \accept\
 statements. It marks the boundary between the conditions whose failure causes
 control to pass to the next statement, and the conditions whose failure causes
 the ACL to return `deny'. See the description of \accept\ above.
 
 .item "log@_message = <<text>>"
 This modifier, which has no argument, is recognized only in \accept\
 statements. It marks the boundary between the conditions whose failure causes
 control to pass to the next statement, and the conditions whose failure causes
 the ACL to return `deny'. See the description of \accept\ above.
 
 .item "log@_message = <<text>>"
+.index \log@_message\, ACL modifier
 This modifier sets up a message that is used as part of the log message if the
 ACL denies access or a \warn\ statement's conditions are true. For example:
 .display asis
 This modifier sets up a message that is used as part of the log message if the
 ACL denies access or a \warn\ statement's conditions are true. For example:
 .display asis
@@ -22571,6 +22637,7 @@ both \log@_message\ and \message\, a default built-in message is used for
 logging rejections.
 
 .item "logwrite = <<text>>"
 logging rejections.
 
 .item "logwrite = <<text>>"
+.index \logwrite\, ACL modifier
 .index log||in ACL, immediate
 This modifier writes a message to a log file as soon as it is encountered when
 processing an ACL. (Compare \log@_message\, which, except in the case of
 .index log||in ACL, immediate
 This modifier writes a message to a log file as soon as it is encountered when
 processing an ACL. (Compare \log@_message\, which, except in the case of
@@ -22591,6 +22658,7 @@ logwrite = :panic: text for panic log only
 .endd
 
 .item "message = <<text>>"
 .endd
 
 .item "message = <<text>>"
+.index \message\, ACL modifier
 This modifier sets up a text string that is expanded and used as an error
 message if the current statement causes the ACL to deny access. The expansion
 happens at the time Exim decides that access is to be denied, not at the time
 This modifier sets up a text string that is expanded and used as an error
 message if the current statement causes the ACL to deny access. The expansion
 happens at the time Exim decides that access is to be denied, not at the time
@@ -22618,6 +22686,7 @@ routers to be passed back as part of the SMTP response, you should either not
 use a \message\ modifier, or make use of \$acl@_verify@_message$\.
 
 .item "set <<acl@_name>> = <<value>>"
 use a \message\ modifier, or make use of \$acl@_verify@_message$\.
 
 .item "set <<acl@_name>> = <<value>>"
+.index \set\, ACL modifier
 This modifier puts a value into one of the ACL variables (see section
 ~~SECTaclvariables).
 
 This modifier puts a value into one of the ACL variables (see section
 ~~SECTaclvariables).
 
@@ -22627,7 +22696,7 @@ This modifier puts a value into one of the ACL variables (see section
 .em
 .section Use of the control modifier
 .rset SECTcontrols "~~chapter.~~section"
 .em
 .section Use of the control modifier
 .rset SECTcontrols "~~chapter.~~section"
-.index \control\ modifier
+.index \control\, ACL modifier
 The \control\ modifier supports the following settings:
 
 .startitems
 The \control\ modifier supports the following settings:
 
 .startitems
@@ -22783,6 +22852,8 @@ the same SMTP connection.
 .rset SECTaddheadwarn "~~chapter.~~section"
 .index header lines||adding in an ACL
 .index header lines||position of added lines
 .rset SECTaddheadwarn "~~chapter.~~section"
 .index header lines||adding in an ACL
 .index header lines||position of added lines
+.index \warn\, ACL verb
+.index \message\, ACL modifier
 The \message\ modifier can be used on a \warn\ statement to add an extra header
 line to an incoming message, as in this example:
 .display asis
 The \message\ modifier can be used on a \warn\ statement to add an extra header
 line to an incoming message, as in this example:
 .display asis
@@ -22859,6 +22930,7 @@ The conditions are as follows:
 .item "acl = <<name of acl or ACL string or file name >>"
 .index ~~ACL||nested
 .index ~~ACL||indirect
 .item "acl = <<name of acl or ACL string or file name >>"
 .index ~~ACL||nested
 .index ~~ACL||indirect
+.index \acl\, ACL condition
 The possible values of the argument are the same as for the
 \acl@_smtp@_$it{xxx}\ options. The named or inline ACL is run. If it returns
 `accept' the condition is true; if it returns `deny' the condition is false. If
 The possible values of the argument are the same as for the
 \acl@_smtp@_$it{xxx}\ options. The named or inline ACL is run. If it returns
 `accept' the condition is true; if it returns `deny' the condition is false. If
@@ -22880,6 +22952,7 @@ circumstances. For example, different ACLs can be used to handle \\RCPT\\
 commands for different local users or different local domains.
 
 .item "authenticated = <<string list>>"
 commands for different local users or different local domains.
 
 .item "authenticated = <<string list>>"
+.index \authenticated\, ACL condition
 .index authentication||ACL checking
 .index ~~ACL||testing for authentication
 If the SMTP connection is not authenticated, the condition is false. Otherwise,
 .index authentication||ACL checking
 .index ~~ACL||testing for authentication
 If the SMTP connection is not authenticated, the condition is false. Otherwise,
@@ -22890,6 +22963,7 @@ authenticated = *
 .endd
 
 .item "condition = <<string>>"
 .endd
 
 .item "condition = <<string>>"
+.index \condition\, ACL condition
 .index customizing||ACL condition
 .index ~~ACL||customized test
 .index ~~ACL||testing, customized
 .index customizing||ACL condition
 .index ~~ACL||customized test
 .index ~~ACL||testing, customized
@@ -22902,6 +22976,7 @@ values, some error is assumed to have occured, and the ACL returns `defer'.
 
 .em
 .item "decode = <<location>>"
 
 .em
 .item "decode = <<location>>"
+.index \decode\, ACL condition
 This condition is available only when Exim is compiled with the
 content-scanning extension, and it is allowed only the the ACL defined by
 \acl@_smtp@_mime\. It causes the current MIME part to be decoded into a file.
 This condition is available only when Exim is compiled with the
 content-scanning extension, and it is allowed only the the ACL defined by
 \acl@_smtp@_mime\. It causes the current MIME part to be decoded into a file.
@@ -22910,6 +22985,7 @@ For details, see chapter ~~CHAPexiscan.
 
 
 .item "dnslists = <<list of domain names and other data>>"
 
 
 .item "dnslists = <<list of domain names and other data>>"
+.index \dnslists\, ACL condition
 .index DNS list||in ACL
 .index black list (DNS)
 .index ~~ACL||testing a DNS list
 .index DNS list||in ACL
 .index black list (DNS)
 .index ~~ACL||testing a DNS list
@@ -22920,6 +22996,7 @@ There are too many different variants of this condition to describe briefly
 here. See sections ~~SECTmorednslists--~~SECTmorednslistslast for details.
 
 .item "domains = <<domain list>>"
 here. See sections ~~SECTmorednslists--~~SECTmorednslistslast for details.
 
 .item "domains = <<domain list>>"
+.index \domains\, ACL condition
 .index domain||ACL checking
 .index ~~ACL||testing a recipient domain
 This condition is relevant only after a \\RCPT\\ command. It checks that the
 .index domain||ACL checking
 .index ~~ACL||testing a recipient domain
 This condition is relevant only after a \\RCPT\\ command. It checks that the
@@ -22929,6 +23006,7 @@ succeeds with a lookup, the result of the lookup is placed in \$domain@_data$\
 until the next \domains\ test.
 
 .item "encrypted = <<string list>>"
 until the next \domains\ test.
 
 .item "encrypted = <<string list>>"
+.index \encrypted\, ACL condition
 .index encryption||checking in an ACL
 .index ~~ACL||testing for encryption
 If the SMTP connection is not encrypted, the condition is false. Otherwise, the
 .index encryption||checking in an ACL
 .index ~~ACL||testing for encryption
 If the SMTP connection is not encrypted, the condition is false. Otherwise, the
@@ -22939,6 +23017,7 @@ encrypted = *
 .endd
 
 .item "hosts = << host list>>"
 .endd
 
 .item "hosts = << host list>>"
+.index \hosts\, ACL condition
 .index host||ACL checking
 .index ~~ACL||testing the client host
 This condition tests that the calling host matches the host list. If you have
 .index host||ACL checking
 .index ~~ACL||testing the client host
 This condition tests that the calling host matches the host list. If you have
@@ -22974,6 +23053,7 @@ deny  hosts = net-lsearch;/some/file
 which gives a custom error message for each denied host.
 
 .item "local@_parts = <<local part list>>"
 which gives a custom error message for each denied host.
 
 .item "local@_parts = <<local part list>>"
+.index \local@_parts\, ACL condition
 .index local part||ACL checking
 .index ~~ACL||testing a local part
 This condition is relevant only after a \\RCPT\\ command. It checks that the
 .index local part||ACL checking
 .index ~~ACL||testing a local part
 This condition is relevant only after a \\RCPT\\ command. It checks that the
@@ -22985,6 +23065,7 @@ the result of the lookup is placed in \$local@_part@_data$\ until the next
 
 .em
 .item "malware = <<option>>"
 
 .em
 .item "malware = <<option>>"
+.index \malware\, ACL condition
 .index ~~ACL||virus scanning
 .index ~~ACL||scanning for viruses
 This condition is available only when Exim is compiled with the
 .index ~~ACL||virus scanning
 .index ~~ACL||scanning for viruses
 This condition is available only when Exim is compiled with the
@@ -22995,6 +23076,7 @@ viruses. For details, see chapter ~~CHAPexiscan.
 
 .em
 .item "mime@_regex = <<list of regular expressions>>"
 
 .em
 .item "mime@_regex = <<list of regular expressions>>"
+.index \mime@_regex\, ACL condition
 .index ~~ACL||testing by regex matching
 This condition is available only when Exim is compiled with the
 content-scanning extension, and it is allowed only the the ACL defined by
 .index ~~ACL||testing by regex matching
 This condition is available only when Exim is compiled with the
 content-scanning extension, and it is allowed only the the ACL defined by
@@ -23004,6 +23086,7 @@ with any of the regular expressions. For details, see chapter ~~CHAPexiscan.
 
 
 .item "recipients = <<address list>>"
 
 
 .item "recipients = <<address list>>"
+.index \recipients\, ACL condition
 .index recipient||ACL checking
 .index ~~ACL||testing a recipient
 This condition is relevant only after a \\RCPT\\ command. It checks the entire
 .index recipient||ACL checking
 .index ~~ACL||testing a recipient
 This condition is relevant only after a \\RCPT\\ command. It checks the entire
@@ -23012,6 +23095,7 @@ recipient address against a list of recipients.
 
 .em
 .item "regex = <<list of regular expressions>>"
 
 .em
 .item "regex = <<list of regular expressions>>"
+.index \regex\, ACL condition
 .index ~~ACL||testing by regex matching
 This condition is available only when Exim is compiled with the
 content-scanning extension. It causes the incoming message to be scanned
 .index ~~ACL||testing by regex matching
 This condition is available only when Exim is compiled with the
 content-scanning extension. It causes the incoming message to be scanned
@@ -23021,6 +23105,7 @@ for a match with any of the regular expressions. For details, see chapter
 
 
 .item "sender@_domains = <<domain list>>"
 
 
 .item "sender@_domains = <<domain list>>"
+.index \sender@_domains\, ACL condition
 .index sender||ACL checking
 .index ~~ACL||testing a sender domain
 This condition tests the domain of the sender of the message against the given
 .index sender||ACL checking
 .index ~~ACL||testing a sender domain
 This condition tests the domain of the sender of the message against the given
@@ -23033,6 +23118,7 @@ ACL for a \\RCPT\\ command, the recipient's domain (which is in \$domain$\) can
 be used to influence the sender checking.
 
 .item "senders = <<address list>>"
 be used to influence the sender checking.
 
 .item "senders = <<address list>>"
+.index \senders\, ACL condition
 .index sender||ACL checking
 .index ~~ACL||testing a sender
 This condition tests the sender of the message against the given list. To test
 .index sender||ACL checking
 .index ~~ACL||testing a sender
 This condition tests the sender of the message against the given list. To test
@@ -23044,6 +23130,7 @@ senders = :
 
 .em
 .item "spam = <<username>>"
 
 .em
 .item "spam = <<username>>"
+.index \spam\, ACL condition
 .index ~~ACL||scanning for spam
 This condition is available only when Exim is compiled with the
 content-scanning extension. It causes the incoming message to be scanned by
 .index ~~ACL||scanning for spam
 This condition is available only when Exim is compiled with the
 content-scanning extension. It causes the incoming message to be scanned by
@@ -23052,6 +23139,7 @@ SpamAssassin. For details, see chapter ~~CHAPexiscan.
 
 
 .item "verify = certificate"
 
 
 .item "verify = certificate"
+.index \verify\, ACL condition
 .index TLS||client certificate verification
 .index certificate||verification of client
 .index ~~ACL||certificate verification
 .index TLS||client certificate verification
 .index certificate||verification of client
 .index ~~ACL||certificate verification
@@ -23062,6 +23150,7 @@ server requests a certificate only if the client matches \tls@_verify@_hosts\
 or \tls@_try@_verify@_hosts\ (see chapter ~~CHAPTLS).
 
 .item "verify = header@_sender/<<options>>"
 or \tls@_try@_verify@_hosts\ (see chapter ~~CHAPTLS).
 
 .item "verify = header@_sender/<<options>>"
+.index \verify\, ACL condition
 .index ~~ACL||verifying sender in the header
 .index header lines||verifying the sender in
 .index sender||verifying in header
 .index ~~ACL||verifying sender in the header
 .index header lines||verifying the sender in
 .index sender||verifying in header
@@ -23089,6 +23178,7 @@ deny    senders = :
 .endd
 
 .item "verify = header@_syntax"
 .endd
 
 .item "verify = header@_syntax"
+.index \verify\, ACL condition
 .index ~~ACL||verifying header syntax
 .index header lines||verifying syntax
 .index verifying||header syntax
 .index ~~ACL||verifying header syntax
 .index header lines||verifying syntax
 .index verifying||header syntax
@@ -23110,6 +23200,7 @@ To: @
 and this condition can be used to reject such messages.
 
 .item "verify = helo"
 and this condition can be used to reject such messages.
 
 .item "verify = helo"
+.index \verify\, ACL condition
 .index ~~ACL||verifying HELO/EHLO
 .index \\HELO\\||verifying
 .index \\EHLO\\||verifying
 .index ~~ACL||verifying HELO/EHLO
 .index \\HELO\\||verifying
 .index \\EHLO\\||verifying
@@ -23122,6 +23213,7 @@ commands does not happen by default. See the description of the
 to request it.
 
 .item "verify = recipient/<<options>>"
 to request it.
 
 .item "verify = recipient/<<options>>"
+.index \verify\, ACL condition
 .index ~~ACL||verifying recipient
 .index recipient||verifying
 .index verifying||recipient
 .index ~~ACL||verifying recipient
 .index recipient||verifying
 .index verifying||recipient
@@ -23136,6 +23228,7 @@ the value for the child address.
 
 
 .item "verify = reverse@_host@_lookup"
 
 
 .item "verify = reverse@_host@_lookup"
+.index \verify\, ACL condition
 .index ~~ACL||verifying host reverse lookup
 .index host||verifying reverse lookup
 This condition ensures that a verified host name has been looked up from the IP
 .index ~~ACL||verifying host reverse lookup
 .index host||verifying reverse lookup
 This condition ensures that a verified host name has been looked up from the IP
@@ -23150,6 +23243,7 @@ is no client host involved), it always succeeds.
 
 
 .item "verify = sender/<<options>>"
 
 
 .item "verify = sender/<<options>>"
+.index \verify\, ACL condition
 .index ~~ACL||verifying sender
 .index sender||verifying
 .index verifying||sender
 .index ~~ACL||verifying sender
 .index sender||verifying
 .index verifying||sender
@@ -23168,7 +23262,8 @@ Details of verification are given later, starting at section
 ~~SECTaddressverification. Exim caches the result of sender verification, to
 avoid doing it more than once per message.
 
 ~~SECTaddressverification. Exim caches the result of sender verification, to
 avoid doing it more than once per message.
 
-.item "verify = sender=address/<<options>>"
+.item "verify = sender=<<address>>/<<options>>"
+.index \verify\, ACL condition
 This is a variation of the previous option, in which a modified address is
 verified as a sender.
 
 This is a variation of the previous option, in which a modified address is
 verified as a sender.
 
@@ -24161,7 +24256,7 @@ contributing the code for this scanner.
 .index virus scanners||command line interface
 \cmdline\: This is the keyword for the generic command line scanner interface.
 It can be used to attach virus scanners that are invoked from the shell. This
 .index virus scanners||command line interface
 \cmdline\: This is the keyword for the generic command line scanner interface.
 It can be used to attach virus scanners that are invoked from the shell. This
-scanner type takes 3 mantadory options:
+scanner type takes 3 mandatory options:
 .numberpars
 The full path and name of the scanner binary, with all command line options,
 and a placeholder (%s) for the directory to scan.
 .numberpars
 The full path and name of the scanner binary, with all command line options,
 and a placeholder (%s) for the directory to scan.