Yet another DBM library, called &'tdb'&, is available from
&url(https://sourceforge.net/projects/tdb/files/). It has its own interface, and also
operates on a single file.
+.next
+.new
+It is possible to use sqlite3 (&url(https://www.sqlite.org/index.html))
+for the DBM library.
+.wen
.endlist
.cindex "USE_DB"
.code
USE_DB=yes
.endd
-Similarly, for gdbm you set USE_GDBM, and for tdb you set USE_TDB. An
-error is diagnosed if you set more than one of these.
+Similarly, for gdbm you set USE_GDBM, for tdb you set USE_TDB,
+and for sqlite3 you set USE_SQLITE.
+An error is diagnosed if you set more than one of these.
You can set USE_NDBM if needed to override an operating system default.
At the lowest level, the build-time configuration sets none of these options,
.code
DBMLIB = -ldb
DBMLIB = -ltdb
+DBMLIB = -lsqlite3
DBMLIB = -lgdbm -lgdbm_compat
.endd
The last of those was for a Linux having GDBM provide emulated NDBM facilities.
suppressing this for special cases.
Policy checks on the contents of local messages can be enforced by means of
-the non-SMTP ACL. See chapter &<<CHAPACL>>& for details.
+the non-SMTP ACL. See section &<<SECnonSMTP>>& for details.
.cindex "return code" "for &%-bm%&"
The return code is zero if the message is successfully accepted. Otherwise, the
provoked if the terminating dot is missing. A further message may then follow.
As for other local message submissions, the contents of incoming batch SMTP
-messages can be checked using the non-SMTP ACL (see chapter &<<CHAPACL>>&).
+messages can be checked using the non-SMTP ACL (see section &<<SECnonSMTP>>&).
Unqualified addresses are automatically qualified using &%qualify_domain%& and
&%qualify_recipient%&, as appropriate, unless the &%-bnq%& option is used.
The &%-R%& option makes it straightforward to initiate delivery of all messages
to a given domain after a host has been down for some time. When the SMTP
-command ETRN is accepted by its ACL (see chapter &<<CHAPACL>>&), its default
+command ETRN is accepted by its ACL (see section &<<SECTETRN>>&), its default
effect is to run Exim with the &%-R%& option, but it can be configured to run
an arbitrary command instead.
.cindex "dsearch lookup type"
The given file must be an absolute directory path; this is searched for an entry
whose name is the key by calling the &[lstat()]& function.
-The key may not contain any forward slash characters.
+.new
+Unless the options (below) permit a path,
+.wen
+the key may not contain any forward slash characters.
If &[lstat()]& succeeds then so does the lookup.
.cindex "tainted data" "dsearch result"
The result is regarded as untainted.
separated by a comma. Options, if present, are a comma-separated list having
each element starting with a tag name and an equals.
-Two options are supported, for the return value and for filtering match
+Three options are supported, for the return value and for filtering match
candidates.
The "ret" option requests an alternate result value of
the entire path for the entry. Example:
${lookup {passwd} dsearch,ret=full {/etc}}
.endd
The default result is just the requested entry.
+
The "filter" option requests that only directory entries of a given type
are matched. The match value is one of "file", "dir" or "subdir" (the latter
not matching "." or ".."). Example:
The default matching is for any entry type, including directories
and symlinks.
+The "key" option relaxes the restriction that only a simple path component can
+be searched for, to permit a sequence of path components. Example:
+.code
+${lookup {foo/bar} dsearch,key=path {/etc}}
+.endd
+If this option is used, a ".." component in the key is specifically disallowed.
+The default operation is that the key may only be a single path component.
+
An example of how this
lookup can be used to support virtual domains is given in section
&<<SECTvirtualdomains>>&.
anything (for example, setting a field to the value it already has), the result
is zero because no rows are affected.
+.new
+To get an encryted connection, use a Mysql option file with the required
+parameters for the connection.
+.wen
+
.subsection "Special PostgreSQL features" SECID74
PostgreSQL lookups can also use Unix domain socket connections to the database.
.cindex "&%utf8_localpart_from_alabel%& expansion item"
These convert EAI mail name components between UTF-8 and a-label forms.
For information on internationalisation support see &<<SECTi18nMTA>>&.
+
+
+.new
+.vitem &*${xtextd:*&<&'string'&>&*}*&
+.cindex "text forcing in strings"
+.cindex "string" "xtext decoding"
+.cindex "xtext"
+.cindex "&%xtextd%& expansion item"
+This performs xtext decoding of the string (per RFC 3461 section 4).
+.wen
+
+
+
.endlist
.row &%acl_smtp_rcpt%& "ACL for RCPT"
.row &%acl_smtp_starttls%& "ACL for STARTTLS"
.row &%acl_smtp_vrfy%& "ACL for VRFY"
+.row &%acl_smtp_wellknown%& "ACL for WELLKNOWN"
.row &%av_scanner%& "specify virus scanner"
.row &%check_rfc2047_length%& "check length of RFC 2047 &""encoded &&&
words""&"
.row &%prdr_enable%& "advertise PRDR to all hosts"
.row &%smtputf8_advertise_hosts%& "advertise SMTPUTF8 to these hosts"
.row &%tls_advertise_hosts%& "advertise TLS to these hosts"
+.row &%wellknown_advertise_hosts%& "advertise WELLKNOWN to these hosts"
.endtable
.cindex "&ACL;" "for non-SMTP messages"
.cindex "non-SMTP messages" "ACLs for"
This option defines the ACL that is run when a non-SMTP message has been
-read and is on the point of being accepted. See chapter &<<CHAPACL>>& for
+read and is on the point of being accepted. See section &<<SECnonSMTP>>& for
further details.
.option acl_not_smtp_mime main string&!! unset
.cindex "&ACL;" "at start of non-SMTP message"
.cindex "non-SMTP messages" "ACLs for"
This option defines the ACL that is run before Exim starts reading a
-non-SMTP message. See chapter &<<CHAPACL>>& for further details.
+non-SMTP message. See section &<<SECnonSMTP>>& for further details.
.option acl_smtp_auth main string&!! unset
.cindex "&ACL;" "setting up for SMTP commands"
.cindex "AUTH" "ACL for"
This option defines the ACL that is run when an SMTP AUTH command is
-received. See chapter &<<CHAPACL>>& for further details.
+received.
+See chapter &<<CHAPACL>>& for general information on ACLs, and chapter
+&<<CHAPSMTPAUTH>>& for details of authentication.
.option acl_smtp_connect main string&!! unset
.cindex "&ACL;" "on SMTP connection"
This option defines the ACL that is run when an SMTP connection is received.
-See chapter &<<CHAPACL>>& for further details.
+See section &<<SECconnectACL>>& for further details.
.option acl_smtp_data main string&!! unset
.cindex "DATA" "ACL for"
This option defines the ACL that is run after an SMTP DATA command has been
processed and the message itself has been received, but before the final
-acknowledgment is sent. See chapter &<<CHAPACL>>& for further details.
+acknowledgment is sent. See section &<<SECdataACLS>>& for further details.
.option acl_smtp_data_prdr main string&!! accept
.cindex "PRDR" "ACL for"
if the PRDR feature has been negotiated,
is run for each recipient after an SMTP DATA command has been
processed and the message itself has been received, but before the
-acknowledgment is sent. See chapter &<<CHAPACL>>& for further details.
+acknowledgment is sent. See section &<<SECTPRDRACL>>& for further details.
.option acl_smtp_dkim main string&!! unset
.cindex DKIM "ACL for"
.cindex "EHLO" "ACL for"
.cindex "HELO" "ACL for"
This option defines the ACL that is run when an SMTP EHLO or HELO
-command is received. See chapter &<<CHAPACL>>& for further details.
+command is received. See section &<<SECheloACL>>& for further details.
.option acl_smtp_mail main string&!! unset
.option acl_smtp_mailauth main string&!! unset
.cindex "AUTH" "on MAIL command"
This option defines the ACL that is run when there is an AUTH parameter on
-a MAIL command. See chapter &<<CHAPACL>>& for details of ACLs, and chapter
+a MAIL command.
+See chapter &<<CHAPACL>>& for general information on ACLs, and chapter
&<<CHAPSMTPAUTH>>& for details of authentication.
.option acl_smtp_mime main string&!! unset
.cindex "not-QUIT, ACL for"
This option defines the ACL that is run when an SMTP session
ends without a QUIT command being received.
-See chapter &<<CHAPACL>>& for further details.
+See section &<<SECTNOTQUITACL>>& for further details.
.option acl_smtp_predata main string&!! unset
This option defines the ACL that is run when an SMTP DATA command is
.option acl_smtp_rcpt main string&!! unset
.cindex "RCPT" "ACL for"
This option defines the ACL that is run when an SMTP RCPT command is
-received. See chapter &<<CHAPACL>>& for further details.
+received. See section &<<SECTQUITACL>>& for further details.
.option acl_smtp_starttls main string&!! unset
.cindex "STARTTLS, ACL for"
This option defines the ACL that is run when an SMTP VRFY command is
received. See chapter &<<CHAPACL>>& for further details.
+.new
+.option acl_smtp_wellknown main string&!! unset
+.cindex "WELLKNOWN, ACL for"
+This option defines the ACL that is run when an SMTP WELLKNOWN command is
+received. See section &<<SECTWELLKNOWNACL>>& for further details.
+.wen
+
.option add_environment main "string list" empty
.cindex "environment" "set values"
This option adds individual environment variables that the
the limit for RCPT commands set by the &%recipients_max%& option (if it is set)
and the limit for MAIL commands set by the &%smtp_accept_max_per_connection%&
option.
-,wen
+.wen
.option local_from_check main boolean true
.cindex "&'Sender:'& header line" "disabling addition of"
See also &%bounce_message_file%&.
+.new
+.option wellknown_advertise_hosts main boolean unset
+.cindex WELLKNOWN advertisement
+.cindex "ESMTP extensions" WELLKNOWN
+This option enables the advertising of the SMTP WELLKNOWN extension.
+See also the &%acl_smtp_wellknown%& ACL (&<<SECTWELLKNOWNACL>>&).
+.wen
+
.option write_rejectlog main boolean true
.cindex "reject log" "disabling"
If this option is set false, Exim no longer writes anything to the reject log.
.cindex "RCPT" "ACL for"
.cindex "STARTTLS, ACL for"
.cindex "VRFY" "ACL for"
+.cindex "WELLKNOWN" "ACL for"
.cindex "SMTP" "connection, ACL for"
.cindex "non-SMTP messages" "ACLs for"
.cindex "MIME content scanning" "ACL for"
.irow &%acl_smtp_rcpt%& "ACL for RCPT"
.irow &%acl_smtp_starttls%& "ACL for STARTTLS"
.irow &%acl_smtp_vrfy%& "ACL for VRFY"
+.irow &%acl_smtp_wellknown%& "ACL for WELLKNOWN"
.endtable
For example, if you set
testing as possible at RCPT time.
-.subsection "The non-SMTP ACLs" SECID190
+.subsection "The non-SMTP ACLs" SECnonSMTP
.cindex "non-SMTP messages" "ACLs for"
The non-SMTP ACLs apply to all non-interactive incoming messages, that is, they
apply to batched SMTP as well as to non-SMTP messages. (Batched SMTP is not
temporary error for these kinds of message.
-.subsection "The SMTP connect ACL" SECID191
+.subsection "The SMTP connect ACL" SECconnectACL
.cindex "SMTP" "connection, ACL for"
.oindex &%smtp_banner%&
The ACL test specified by &%acl_smtp_connect%& happens at the start of an SMTP
any TLS startup attempt and without any SMTP response being transmitted.
-.subsection "The EHLO/HELO ACL" SECID192
+.subsection "The EHLO/HELO ACL" SECheloACL
.cindex "EHLO" "ACL for"
.cindex "HELO" "ACL for"
The ACL test specified by &%acl_smtp_helo%& happens when the client issues an
an EHLO response.
-.subsection "The DATA ACLs" SECID193
+.subsection "The DATA ACLs" SECdataACLS
.cindex "DATA" "ACLs for"
Two ACLs are associated with the DATA command, because it is two-stage
command, with two responses being sent to the client.
If the ACL is not defined, processing completes as if
the feature was not requested by the client.
+.new
+.subsection "The SMTP WELLKNOWN ACL" SECTWELLKNOWNACL
+.cindex "WELLKNOWN" "ACL for"
+.oindex "&%acl_smtp_wellknown%&"
+The &%acl_smtp_wellknown%& ACL is available only when Exim is compiled
+with WELLKNOWN support enabled.
+
+The ACL determines the response to an SMTP WELLKNOWN command, using the normal
+accept/defer/deny verbs for the response code,
+and a new &"control=wellknown"& modifier.
+This modifier takes a single option, separated by a '/'
+character, which must be the name of a file containing the response
+cleartext. The modifier is expanded before use in the usual way before
+it is used. The configuration is responsible for picking a suitable file
+to return and, most importantly, not returning any unexpected file.
+The argument for the SMTP verb will be available in the &$smtp_command_argument$&
+variable and can be used for building the file path.
+If the file path given in the modifier is empty or inacessible, the control will
+fail.
+
+For example:
+.code
+ check_wellknown:
+ accept control = wellknown/\
+ ${lookup {${xtextd:$smtp_command_argument}} \
+ dsearch,key=path,filter=file,ret=full \
+ {$spooldir/wellknown.d}}
+.endd
+File content will be encoded in &"xtext"& form, and line-wrapping
+for line-length limitation will be done before transmission.
+A response summary line will be prepended, with the (pre-encoding) file size.
+
+The above example uses the expansion operator ${xtextd:<coded-string>}
+which is needed to decode the xtext-encoded key from the SMTP verb.
+
+Under the util directory there is a "mailtest" utility which can be used
+to test/retrieve WELLKNOWN items. Syntax is
+.code
+ mailtest -h host.example.com -w security.txt
+.endd
+
+WELLKNOWN is a ESMTP extension providing access to extended
+information about the server. It is modelled on the webserver
+facilities documented in RFC 8615 and can be used for a security.txt
+file and could be used for ACME handshaking (RFC 8555).
+
+Exim will advertise WELLKNOWN support in the EHLO response
+.oindex &%wellknown_advertise_hosts%&
+(conditional on a new option &%wellknown_advertise_hosts%&)
+and service WELLKNOWN smtp verbs having a single parameter
+giving a key for an item of "site-wide metadata".
+The verb and key are separated by whitespace,
+and the key is xtext-encoded (per RFC 3461 section 4).
+.wen
+
+
.subsection "The QUIT ACL" SECTQUITACL
.cindex "QUIT, ACL for"
The ACL for the SMTP QUIT command is anomalous, in that the outcome of the ACL
&%acl_smtp_mime%&, &%acl_smtp_predata%&, and &%acl_smtp_starttls%&, the action
when the ACL is not defined is &"accept"&.
-For the others (&%acl_smtp_etrn%&, &%acl_smtp_expn%&, &%acl_smtp_rcpt%&, and
-&%acl_smtp_vrfy%&), the action when the ACL is not defined is &"deny"&.
-This means that &%acl_smtp_rcpt%& must be defined in order to receive any
-messages over an SMTP connection. For an example, see the ACL in the default
-configuration file.
-
+For the others (&%acl_smtp_etrn%&, &%acl_smtp_expn%&, &%acl_smtp_rcpt%&,
+&%acl_smtp_vrfy%&
+.new
+and &%acl_smtp_wellknown%&),
+.wen
+the action when the ACL
+is not defined is &"deny"&. This means that &%acl_smtp_rcpt%& must be
+defined in order to receive any messages over an SMTP connection.
+For an example, see the ACL in the default configuration file.
This control enables conversion of UTF-8 in message envelope addresses
to a-label form.
For details see section &<<SECTi18nMTA>>&.
+
+.new
+.vitem &*control&~=&~wellknown*&
+This control sets up a response data file for a WELLKNOWN SMTP command.
+It may only be used in an ACL servicing that command.
+For details see section &<<SECTWELLKNOWNACL>>&.
+.wen
.endlist vlist
JH/30 Bug 3029: Avoid feeding Resent-From: to DMARC.
JH/31 Bug 3027: For -bh / -bhc tests change to using the compressed form of
- ipv6 addresses for the sender. Previously the uncompressed form was
- used, and if used in textual form this would result in behavior difference
+ ipv6 addresses for the sender. Previously the uncompressed form was used,
+ and if used in textual form this would result in behavior difference
versus non-bh.
+JH/32 Bug 3096: MAIL before HELO/EHLO, where required by hosts_require_helo, is
+ now classed as a protocol error and subject to smtp_max_synprot_errors.
+
+JH/33 Bug 2994: A subdir dsearch lookup should permit a directory name that starts
+ ".." and has following characters.
+
Exim version 4.97
-----------------
6. A dns:fail event.
+ 7. The dsearch lookup supports search for a sub-path.
+
+ 8. Include mailtest utility for simple connection checking.
+
+ 9. Add SMTP WELLKNOWN extension.
+
+ 10. Sqlite3 can be used for the hints databases (vs. DBD, NDB, GBDM, TDB).
+ Add "USE_SQLITE = y" and "DBMLIB = -lsqlite3" in Local/Makefile, to override
+ the settings done in the OS/Makefile-<platform> file.
+
Version 4.97
------------
$proxy_external_address, $proxy_external_port have the proxy "outside" values
$sender_host_address, $sender_host_port have the remot client values
+
+
+
--------------------------------------------------------------
End of file
--------------------------------------------------------------
--- /dev/null
+Internet Draft
+
+Stream: Independent Submission
+Category:
+Date: 2024/05/26
+Author: J.Harris
+Author: B.Quatermass
+
+--
+
+ Mailmaint Working Group J. Harris
+ Internet Draft Independent
+ Category: Experimental B. Quatermass
+ Independent
+ May 2024
+
+The WELLKNOWN SMTP Service Extension
+
+Abstract
+--------
+
+This document defines a WELLKNOWN extension for the Simple Mail Transfer Protocol
+(SMTP). The extension provides the means for an SMTP server to inform a client
+of information relating to the server which is intended to be public.
+
+Status of this Memo
+-------------------
+
+This document is published for examination, experimental implementation, and
+evaluation.
+
+This document defines an Experimental Protocol for the Internet community.
+
+This is a contribution to the RFC Series, independently of any other RFC
+stream. The RFC Editor has chosen to publish this document at its discretion
+and makes no statement about its value for implementation or deployment.
+
+1. Introduction
+---------------
+
+The Simple Mail Transfer Protocol [SMTP] provides the ability to transfer email
+messages from a sending system to a recieving one.
+
+Senders may on occasion wish to discover additional information, not directly
+related to a specific email message, about the receiving system. An example
+is a contact point for discussing problems in communications.
+
+The WELLKNOWN extension provides a means for delivering such information, by an
+SMTP server on request from an SMTP client.
+
+2. The WELLKNOWN SMTP Extension
+------------------------------
+
+The extension mechanism for SMTP is defined in Section 2.2 of the current SMTP
+specification [RFC5321a].
+
+The name of the extension is WELLKNOWN. Servers implementing this extension
+advertise a WELLKNOWN as a keyword in the response to EHLO. The keyword has no
+parameters.
+
+A new SMTP verb, "WELLKNOWN" is defined.
+
+3. The WELLNOWN verb
+--------------------
+
+The format for the WELLKNOWN verb is:
+
+ WELLKNOWN <request-key>
+
+The <request-key> parameter identifies the specific type of information being
+requested. It is separated from the verb by whitespace, and is xtext-encoded
+per RFC 3461 Section 4 [RFC3461].
+
+After the client gives the WELLKNOWN command, the server responds with one of
+the 2xx, 4xx or 5xx response codes.
+
+A success response MUST be a 250 response code, and MUST be multi-line.
+
+The first line of a success response will be a response summary; the following
+lines are the information data requested, xtext-encoded [RFC3461]. The encoded
+information data MAY be split over multiple response lines.
+
+A response summary MAY be empty. In this case the first line of the response
+will be only "250-".
+
+A response summary MAY contain a size parameter, giving the number of bytes
+of data. This parameter is expressed as "SIZE=" followed by a decimal number.
+The size value does not include the xtext-encoding overheader, the "250-" or
+"250 " response code prefixing each line, nor the CR,LF bytes between lines.
+
+4. Example
+----------
+
+S: 220 ESMTP spoken here
+
+C: EHLO test
+
+S: 250-Hi there, mate
+S: 250-SIZE
+S: 250-LIMITS
+S: 250-8BITMIME
+S: 250-PIPELINING
+S: 250-WELLKNOWN
+S: 250 HELP
+
+C: WELLKNOWN security.txt
+
+S: 250-SIZE=285
+S: 250-Contact:+20mailto:security@example.com+0A
+S: 250-+0A
+S: 250-Canonical:+20https://www.example.com/.well-known/security.txt+0A
+S: 250-Canonical:+20mailserver://mx1.example.com/WELLKNOWN/security.txt+0A
+S: 250-Canonical:+20mailserver://mx2.example.com/WELLKNOWN/security.txt+0A
+S: 250-+0A
+S: 250-Preferred-Languages:+20en+0A
+S: 250-+0A
+S: 250-Expires:+202025-02-01T00:00:00.000Z+0A
+S: 250 +0A
+
+C: QUIT
+
+S: 221
+
+
+5. Use Cases
+------------
+
+5.1 security.txt
+---
+It is common for a website to provide public-access information via the HTTP
+protocol. One such item, a "security.txt" file, is descibed in RFC 9116.
+
+The WELLKNOWN extension provides a method for publishing similar information
+for an SMTP host, without the need to operate an HTTP server.
+
+It is RECOMMENDED that the request-key for this usage be "security.txt".
+
+5.2 ACME handshake
+---
+ACME [RFC8555] provides for obtaining a certificate, needed for encrpted
+communications using TLS. It defines handshake methods using the DNS and using
+HTTP, for verifying ownership of the domain being certified.
+
+The WELLKNOWN extension provides a method for operating a similar handshake,
+without the need to operate an HTTP server or manipulate the DNS.
# optional, Local/* files at the front of this file, to create Makefile in the
# build directory.
#
-# Copyright (c) The Exim Maintainers 1995 - 2023
+# Copyright (c) The Exim Maintainers 1995 - 2024
# SPDX-License-Identifier: GPL-2.0-or-later
SHELL = $(MAKE_SHELL)
/* Exim: OS-specific C header file for FreeBSD */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 - 2021 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
/* Exim: OS-specific C header file for Linux */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2020 */
-/* Copyright (c) The Exim Maintainers 2021 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
* Exim Monitor *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2021 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim Monitor *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2009 */
-/* Copyright (c) The Exim Maintainers 2021 - 2022 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim Monitor *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainters 2021 - 2022 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim Monitor *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim Monitor *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 - 2021 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
# Script to build links for all the exim source files from the system-
# specific build directory. It should be run from within that directory.
#
-# Copyright (c) The Exim Maintainers 1995 - 2023
+# Copyright (c) The Exim Maintainers 1995 - 2024
# SPDX-License-Identifier: GPL-2.0-or-later
test ! -d ../src && \
##################################################
# The Exim mail transport agent #
##################################################
-# Copyright (c) The Exim Maintainers 2022 - 2023
+# Copyright (c) The Exim Maintainers 2022 - 2024
# SPDX-License-Identifier: GPL-2.0-or-later
# This is the template for Exim's main build-time configuration file. It
# compile the Exim monitor utility. Exim itself does not use X11.
# Another area of variability between systems is the type and location of the
-# DBM library package. Exim has support for ndbm, gdbm, tdb, and Berkeley DB.
+# DBM library package. Exim has support for ndbm, gdbm, tdb, Berkeley DB and
+# sqlite3.
# By default the code assumes ndbm; this often works with gdbm or DB, provided
# they are correctly installed, via their compatibility interfaces. However,
# Exim can also be configured to use the native calls for Berkeley DB (obsolete
# using only native facilities.
# SUPPORT_SRS=yes
+# Uncomment the following to remove support for the ESMTP extension "WELLKNOWN"
+# DISABLE_WELLKNOWN=yes
+
#------------------------------------------------------------------------------
# Compiling Exim with experimental features. These are documented in
# USE_DB = yes
# DBMLIB = -ldb
+# sqlite
+# USE_SQLITE = yes
+# DBMLIB = -lsqlite3
+
#------------------------------------------------------------------------------
# Although Exim is normally a setuid program, owned by root, it refuses to run
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#endif
-/* ACL condition and modifier codes - keep in step with the table that
-follows.
-down. */
+/* ACL condition and modifier codes */
enum { ACLC_ACL,
ACLC_ADD_HEADER,
ACLC_SPF_GUESS,
#endif
ACLC_UDPSEND,
- ACLC_VERIFY };
+ ACLC_VERIFY,
+};
/* ACL conditions/modifiers: "delay", "control", "continue", "endpass",
"message", "log_message", "log_reject_target", "logwrite", "queue" and "set" are
[ACLC_ACL] = { US"acl", FALSE, FALSE, 0 },
[ACLC_ADD_HEADER] = { US"add_header", TRUE, TRUE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_MAIL | ACL_BIT_RCPT |
ACL_BIT_PREDATA | ACL_BIT_DATA |
#ifndef DISABLE_PRDR
#ifdef EXPERIMENTAL_DCC
[ACLC_DCC] = { US"dcc", TRUE, FALSE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_DATA |
# ifndef DISABLE_PRDR
ACL_BIT_PRDR |
#ifndef DISABLE_DKIM
[ACLC_DKIM_SIGNER] = { US"dkim_signers", TRUE, FALSE, (unsigned int) ~ACL_BIT_DKIM },
[ACLC_DKIM_STATUS] = { US"dkim_status", TRUE, FALSE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_DKIM | ACL_BIT_DATA | ACL_BIT_MIME
# ifndef DISABLE_PRDR
| ACL_BIT_PRDR
[ACLC_DNSLISTS] = { US"dnslists", TRUE, FALSE, 0 },
[ACLC_DOMAINS] = { US"domains", FALSE, FALSE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_RCPT | ACL_BIT_VRFY
#ifndef DISABLE_PRDR
|ACL_BIT_PRDR
ACL_BIT_NOTSMTP | ACL_BIT_NOTSMTP_START,
},
[ACLC_LOCAL_PARTS] = { US"local_parts", FALSE, FALSE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_RCPT | ACL_BIT_VRFY
#ifndef DISABLE_PRDR
| ACL_BIT_PRDR
#ifdef WITH_CONTENT_SCAN
[ACLC_MALWARE] = { US"malware", TRUE, FALSE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_DATA |
# ifndef DISABLE_PRDR
ACL_BIT_PRDR |
#ifdef WITH_CONTENT_SCAN
[ACLC_REGEX] = { US"regex", TRUE, FALSE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_DATA |
# ifndef DISABLE_PRDR
ACL_BIT_PRDR |
#endif
[ACLC_REMOVE_HEADER] = { US"remove_header", TRUE, TRUE,
- (unsigned int)
+ (unsigned)
~(ACL_BIT_MAIL|ACL_BIT_RCPT |
ACL_BIT_PREDATA | ACL_BIT_DATA |
#ifndef DISABLE_PRDR
#ifdef WITH_CONTENT_SCAN
[ACLC_SPAM] = { US"spam", TRUE, FALSE,
- (unsigned int) ~(ACL_BIT_DATA |
+ (unsigned) ~(ACL_BIT_DATA |
# ifndef DISABLE_PRDR
ACL_BIT_PRDR |
# endif
#ifndef MACRO_PREDEF
-/* Return values from decode_control(); used as index so keep in step
-with the controls_list table that follows! */
+/* Return values from decode_control() */
enum {
CONTROL_AUTH_UNADVERTISED,
#ifdef SUPPORT_I18N
CONTROL_UTF8_DOWNCONVERT,
#endif
+#ifndef DISABLE_WELLKNOWN
+ CONTROL_WELLKNOWN,
+#endif
};
#ifdef SUPPORT_I18N
[CONTROL_UTF8_DOWNCONVERT] =
{ US"utf8_downconvert", TRUE, (unsigned) ~(ACL_BIT_RCPT | ACL_BIT_VRFY)
- }
+ },
+#endif
+#ifndef DISABLE_WELLKNOWN
+[CONTROL_WELLKNOWN] =
+ { US"wellknown", TRUE, (unsigned) ~ACL_BIT_WELLKNOWN
+ },
#endif
};
{
*error = string_sprintf("\"=\" missing after ACL \"%s\" %s", name,
conditions[cond->type].is_modifier ? US"modifier" : US"condition");
- return FALSE;;
+ return FALSE;
}
Uskip_whitespace(&s);
cond->arg = taint ? string_copy_taint(s, GET_TAINTED) : string_copy(s);
+#ifndef DISABLE_WELLKNOWN
+/*************************************************
+* The "wellknown" ACL modifier *
+*************************************************/
+
+/* Called by acl_check_condition() below.
+
+Retrieve the given file and encode content as xtext.
+Prefix with a summary line giving the length of plaintext.
+Leave a global pointer to the whole, for output by
+the smtp verb handler code (smtp_in.c).
+
+Arguments:
+ arg the option string for wellknown=
+ log_msgptr for error messages
+
+Returns: OK/FAIL
+*/
+
+static int
+wellknown_process(const uschar * arg, uschar ** log_msgptr)
+{
+struct stat statbuf;
+FILE * rf;
+gstring * g;
+
+wellknown_response = NULL;
+if (f.no_multiline_responses) return FAIL;
+
+/* Check for file existence */
+
+if (!*arg) return FAIL;
+if (Ustat(arg, &statbuf) != 0)
+ { *log_msgptr = US"stat"; goto fail; }
+
+/*XXX perhaps refuse to serve a group- or world-writeable file? */
+
+if (!(rf = Ufopen(arg, "r")))
+ { *log_msgptr = US"open"; goto fail; }
+
+/* Set up summary line for output */
+
+g = string_fmt_append(NULL, "SIZE=%lu\n", (long) statbuf.st_size);
+
+#define LINE_LIM 75
+for (int n = 0, ch; (ch = fgetc(rf)) != EOF; )
+ {
+ /* Xtext-encode, adding output linebreaks for input linebreaks
+ or when the line gets long enough */
+
+ if (ch == '\n')
+ { g = string_fmt_append(g, "+%02X", ch); n = LINE_LIM; }
+ else if (ch < 33 || ch > 126 || ch == '+' || ch == '=')
+ { g = string_fmt_append(g, "+%02X", ch); n += 3; }
+ else
+ { g = string_fmt_append(g, "%c", ch); n++; }
+
+ if (n >= LINE_LIM)
+ { g = string_catn(g, US"\n", 1); n = 0; }
+ }
+#undef LINE_LIM
+
+gstring_release_unused(g);
+wellknown_response = string_from_gstring(g);
+return OK;
+
+fail:
+ *log_msgptr = string_sprintf("wellknown: failed to %s file \"%s\": %s",
+ *log_msgptr, arg, strerror(errno));
+ return FAIL;
+}
+#endif
+
+
/*************************************************
* Handle conditions/modifiers on an ACL item *
*************************************************/
case ACLC_CONTROL:
{
- const uschar *p = NULL;
+ const uschar * p = NULL;
control_type = decode_control(arg, &p, where, log_msgptr);
/* Check if this control makes sense at this time */
return ERROR;
}
+ /*XXX ought to sort these, just for sanity */
switch(control_type)
{
case CONTROL_AUTH_UNADVERTISED:
break;
}
return ERROR;
-#endif
+#endif /*I18N*/
+#ifndef DISABLE_WELLKNOWN
+ case CONTROL_WELLKNOWN:
+ rc = *p == '/' ? wellknown_process(p+1, log_msgptr) : FAIL;
+ break;
+#endif
}
break;
}
* Exim - an Internet mail transport agent *
*************************************************/
/* Experimental ARC support for Exim
+ Copyright (c) The Exim Maintainers 2021 - 2024
Copyright (c) Jeremy Harris 2018 - 2020
- Copyright (c) The Exim Maintainers 2021 - 2023
License: GPL
SPDX-License-Identifier: GPL-2.0-or-later
*/
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
- * Copyright (c) The Exim Maintainers 2006 - 2023
+ * Copyright (c) The Exim Maintainers 2006 - 2024
* Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2023 */
+/* Copyright (c) The Exim Maintainers 2023 - 2024 */
/* Copyright (c) Jeremy Harris 2019-2020 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2024 */
/* Copyright (c) Jeremy Harris 1995 - 2020 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2022 */
+/* Copyright (c) The Exim Maintainers 2022 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* End of xtextencode.c */
+/* vi: aw ai sw=2
+*/
char *data;
} save_item;
-static const char *db_opts[] = { "", "USE_DB", "USE_GDBM", "USE_TDB", "USE_NDBM" };
+static const char *db_opts[] = { "", "USE_DB", "USE_GDBM", "USE_TDB", "USE_NDBM", "USE_SQLITE" };
static int have_ipv6 = 0;
static int have_iconv = 0;
{
if (use_which_db_in_local_makefile)
{
- printf("*** Only one of USE_DB, USE_GDBM, or USE_TDB should be "
+ printf("*** Only one of USE_DB, USE_GDBM, USE_SQLITE or USE_TDB should be "
"defined in Local/Makefile\n");
exit(1);
}
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2018 - 2023 */
+/* Copyright (c) The Exim Maintainers 2018 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
#define DISABLE_QUEUE_RAMP
#define DISABLE_TLS
#define DISABLE_TLS_RESUME
+#define DISABLE_WELLKNOWN
#define ENABLE_DISABLE_FSYNC
#define USE_OPENSSL
#define USE_READLINE
#define USE_TCP_WRAPPERS
+#define USE_SQLITE
#define USE_TDB
#define WHITELIST_D_MACROS
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* For speed, interpret a decimal number inline here */
else
{
- uschar *s = expanded;
+ uschar * s = expanded;
while (isdigit(*s))
max_for_this_host = max_for_this_host * 10 + *s++ - '0';
if (*s)
}
}
-/* If we have fewer connections than max_for_this_host, we can skip the tedious
-per host_address checks. Note that at this stage smtp_accept_count contains the
-count of *other* connections, not including this one. */
+/* If we have fewer total connections than max_for_this_host, we can skip the
+tedious per host_address checks. Note that at this stage smtp_accept_count
+contains the count of *other* connections, not including this one. */
if (max_for_this_host > 0 && smtp_accept_count >= max_for_this_host)
{
smtp_slots[i] = empty_smtp_slot;
if (--smtp_accept_count < 0) smtp_accept_count = 0;
DEBUG(D_any) debug_printf("%d SMTP accept process%s now running\n",
- smtp_accept_count, (smtp_accept_count == 1)? "" : "es");
+ smtp_accept_count, smtp_accept_count == 1 ? "" : "es");
break;
}
if (i < smtp_accept_max) continue; /* Found an accepting process */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
different DBM files. This module does not contain code for reading DBM files
for (e.g.) alias expansion. That is all contained within the general search
functions. As Exim now has support for several DBM interfaces, all the relevant
-functions are called as macros.
+functions are called as inlinable functions from an included file.
All the data in Exim's database is in the nature of *hints*. Therefore it
doesn't matter if it gets destroyed by accident. These functions are not
DBM files themselves were never completely successful.) Since callers may in
general want to do more than one read or write while holding the lock, there
are separate open and close functions. However, the calling modules should
-arrange to hold the locks for the bare minimum of time. */
+arrange to hold the locks for the bare minimum of time.
+
+API:
+ dbfn_open
+ dbfn_close
+ dbfn_read_with_length
+ dbfn_read_enforce_length
+ dbfn_write
+ dbfn_delete
+ dbfn_scan unused; ifdeffout out
+
+Users:
+ ACL ratelimit & seen conditions
+ delivery retry handling
+ delivery serialization
+ TLS session resumption
+ peer capability cache
+ callout & quota cache
+*/
On success, dbblock is returned. This contains the dbm pointer and
the fd of the locked lock file.
-
-There are some calls that use O_RDWR|O_CREAT for the flags. Having discovered
-this in December 2005, I'm not sure if this is correct or not, but for the
-moment I haven't changed them.
*/
open_db *
-dbfn_open(uschar *name, int flags, open_db *dbblock, BOOL lof, BOOL panic)
+dbfn_open(const uschar * name, int flags, open_db * dbblock,
+ BOOL lof, BOOL panic)
{
int rc, save_errno;
-BOOL read_only = flags == O_RDONLY;
+BOOL read_only = flags & O_RDONLY;
flock_t lock_data;
uschar dirname[PATHLEN], filename[PATHLEN];
it easy to pin this down, there are now debug statements on either side of the
open call. */
+flags &= O_RDONLY | O_RDWR;
snprintf(CS filename, sizeof(filename), "%s/%s", dirname, name);
priv_drop_temp(exim_uid, exim_gid);
debug_printf_indent("opened hints database %s: flags=%s\n", filename,
flags == O_RDONLY ? "O_RDONLY"
: flags == O_RDWR ? "O_RDWR"
- : flags == (O_RDWR|O_CREAT) ? "O_RDWR|O_CREAT"
: "??");
/* Pass back the block containing the opened database handle and the open fd
exim_datum_data_set(&key_datum, key_copy);
exim_datum_size_set(&key_datum, klen);
-if (!exim_dbget(dbblock->dbptr, &key_datum, &result_datum)) return NULL;
+if (!exim_dbget(dbblock->dbptr, &key_datum, &result_datum))
+ {
+ DEBUG(D_hints_lookup) debug_printf_indent("dbfn_read: null return\n");
+ return NULL;
+ }
/* Assume the data store could have been tainted. Properly, we should
store the taint status with the data. */
dlen = exim_datum_size_get(&result_datum);
yield = store_get(dlen, GET_TAINTED);
memcpy(yield, exim_datum_data_get(&result_datum), dlen);
+DEBUG(D_hints_lookup) debug_printf_indent("dbfn_read: size %u return\n", dlen);
if (length) *length = dlen;
exim_datum_free(&result_datum); /* Some DBM libs require freeing */
memcpy(key_copy, key, klen);
gptr->time_stamp = time(NULL);
-DEBUG(D_hints_lookup) debug_printf_indent("dbfn_write: key=%s\n", key);
+DEBUG(D_hints_lookup)
+ debug_printf_indent("dbfn_write: key=%s datalen %d\n", key, length);
exim_datum_init(&key_datum); /* Some DBM libraries require the datum */
exim_datum_init(&value_datum); /* to be cleared before use. */
+#ifdef notdef
+/* XXX This appears to be unused. There's a separate implementation
+in dbutils.c for dumpdb and fixdb, using the same underlying support.
+*/
+
/*************************************************
* Scan the keys of a database file *
*************************************************/
if (!yield) exim_dbdelete_cursor(*cursor);
return yield;
}
+#endif
void dbfn_close(open_db *);
int dbfn_delete(open_db *, const uschar *);
-open_db *dbfn_open(uschar *, int, open_db *, BOOL, BOOL);
+open_db *dbfn_open(const uschar *, int, open_db *, BOOL, BOOL);
void *dbfn_read_with_length(open_db *, const uschar *, int *);
void *dbfn_read_enforce_length(open_db *, const uschar *, size_t);
uschar *dbfn_scan(open_db *, BOOL, EXIM_CURSOR **);
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
*/
BOOL
-directory_make(const uschar *parent, const uschar *name,
+directory_make(const uschar * parent, const uschar * name,
int mode, BOOL panic)
{
BOOL use_chown = parent == spool_directory && geteuid() == root_uid;
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge, 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2022 - 2023 */
+/* Copyright (c) The Exim Maintainers 2022 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
/* DMARC support.
- Copyright (c) The Exim Maintainers 2019 - 2023
+ Copyright (c) The Exim Maintainers 2019 - 2024
Copyright (c) Todd Lyons <tlyons@exim.org> 2012 - 2014
License: GPL */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
not_good:
{
+#ifndef DISABLE_EVENTS
const uschar * s = NULL;
BOOL save_flag = f.search_find_defer;
uschar * save_serr = search_error_message;
/*XXX what other state could an expansion in the eventhandler mess up? */
search_error_message = save_serr;
f.search_find_defer = save_flag;
+#endif /*EVENTS*/
return rc;
}
}
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
static gstring *
show_db_version(gstring * g)
{
+g = string_cat(g, US"Hints DB:\n");
#ifdef DB_VERSION_STRING
DEBUG(D_any)
{
- g = string_fmt_append(g, "Library version: BDB: Compile: %s\n", DB_VERSION_STRING);
- g = string_fmt_append(g, " Runtime: %s\n",
+ g = string_fmt_append(g, " Library version: BDB: Compile: %s\n", DB_VERSION_STRING);
+ g = string_fmt_append(g, " Runtime: %s\n",
db_version(NULL, NULL, NULL));
}
else
- g = string_fmt_append(g, "Berkeley DB: %s\n", DB_VERSION_STRING);
+ g = string_fmt_append(g, " Berkeley DB: %s\n", DB_VERSION_STRING);
#elif defined(BTREEVERSION) && defined(HASHVERSION)
# ifdef USE_DB
- g = string_cat(g, US"Probably Berkeley DB version 1.8x (native mode)\n");
+ g = string_cat(g, US" Probably Berkeley DB version 1.8x (native mode)\n");
# else
- g = string_cat(g, US"Probably Berkeley DB version 1.8x (compatibility mode)\n");
+ g = string_cat(g, US" Probably Berkeley DB version 1.8x (compatibility mode)\n");
# endif
#elif defined(_DBM_RDONLY) || defined(dbm_dirfno)
-g = string_cat(g, US"Probably ndbm\n");
+g = string_cat(g, US" Probably ndbm\n");
+#elif defined(USE_SQLITE)
+g = string_cat(g, US" Using sqlite3\n");
#elif defined(USE_TDB)
-g = string_cat(g, US"Using tdb\n");
+g = string_cat(g, US" Using tdb\n");
#else
# ifdef USE_GDBM
- g = string_cat(g, US"Probably GDBM (native mode)\n");
+g = string_cat(g, US" Probably GDBM (native mode)\n");
# else
- g = string_cat(g, US"Probably GDBM (compatibility mode)\n");
+g = string_cat(g, US" Probably GDBM (compatibility mode)\n");
# endif
#endif
return g;
#ifndef DISABLE_ESMTP_LIMITS
g = string_cat(g, US" ESMTP_Limits");
#endif
+#ifndef DISABLE_WELLKNOWN
+ g = string_cat(g, US" ESMTP_Wellknown");
+#endif
#ifndef DISABLE_EVENT
g = string_cat(g, US" Event");
#endif
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2021 - 2022 */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "local_scan.h"
#include "path_max.h"
#include "macros.h"
+#include "blob.h"
#include "hintsdb.h"
#include "hintsdb_structs.h"
#include "structs.h"
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
*/
open_db *
-dbfn_open(uschar *name, int flags, open_db *dbblock, BOOL lof, BOOL panic)
+dbfn_open(const uschar * name, int flags, open_db * dbblock,
+ BOOL lof, BOOL panic)
{
int rc;
struct flock lock_data;
-BOOL read_only = flags == O_RDONLY;
+BOOL read_only = (flags & (O_WRONLY|O_RDWR)) == O_RDONLY;
uschar * dirname, * filename;
/* The first thing to do is to open a separate file on which to lock. This
ensures that Exim has exclusive use of the database before it even tries to
-open it. If there is a database, there should be a lock file in existence. */
+open it. If there is a database, there should be a lock file in existence;
+if no lockfile we infer there is no database and error out. We open the
+lockfile using the r/w mode requested for the DB, users lacking permission
+for the DB access mode will error out here. */
-#ifdef COMPILE_UTILITY
if ( asprintf(CSS &dirname, "%s/db", spool_directory) < 0
|| asprintf(CSS &filename, "%s/%s.lockfile", dirname, name) < 0)
return NULL;
-#else
-dirname = string_sprintf("%s/db", spool_directory);
-filename = string_sprintf("%s/%s.lockfile", dirname, name);
-#endif
-dbblock->lockfd = Uopen(filename, flags, 0);
-if (dbblock->lockfd < 0)
+if ((dbblock->lockfd = Uopen(filename, flags, 0)) < 0)
{
printf("** Failed to open database lock file %s: %s\n", filename,
strerror(errno));
if (rc < 0)
{
printf("** Failed to get %s lock for %s: %s",
- flags & O_WRONLY ? "write" : "read",
+ read_only ? "read" : "write",
filename,
errno == ETIMEDOUT ? "timed out" : strerror(errno));
(void)close(dbblock->lockfd);
/* At this point we have an opened and locked separate lock file, that is,
exclusive access to the database, so we can go ahead and open it. */
-#ifdef COMPILE_UTILITY
if (asprintf(CSS &filename, "%s/%s", dirname, name) < 0) return NULL;
-#else
-filename = string_sprintf("%s/%s", dirname, name);
-#endif
-dbblock->dbptr = exim_dbopen(filename, dirname, flags, 0);
-if (!dbblock->dbptr)
+if (flags & O_RDWR) flags |= O_CREAT;
+
+if (!(dbblock->dbptr = exim_dbopen(filename, dirname, flags, 0)))
{
printf("** Failed to open DBM file %s for %s:\n %s%s\n", filename,
read_only? "reading" : "writing", strerror(errno),
cursor a pointer to a pointer to a cursor anchor, for those dbm libraries
that use the notion of a cursor
-Returns: the next record from the file, or
+Returns: the next *key* (nul-terminated) from the file, or
NULL if there are no more
*/
#endif /* EXIM_TIDYDB */
/* End of exim_dbutil.c */
+/* vi: aw ai sw=2
+*/
#! /bin/sh
-# Copyright (c) The Exim Maintainers 2023
+# Copyright (c) The Exim Maintainers 2023 - 2024
# Copyright (c) University of Cambridge, 1995 - 2007
# See the file NOTICE for conditions of use and distribution.
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
US"strlen",
US"substr",
US"uc",
- US"utf8clean" };
+ US"utf8clean",
+ US"xtextd",
+ };
enum {
EOP_ADDRESS = nelem(op_table_underscore),
EOP_STRLEN,
EOP_SUBSTR,
EOP_UC,
- EOP_UTF8CLEAN };
+ EOP_UTF8CLEAN,
+ EOP_XTEXTD,
+ };
/* Table of condition names, and corresponding switch numbers. The names must
case EOP_LC:
{
- int count = 0;
- uschar *t = sub - 1;
- while (*(++t) != 0) { *t = tolower(*t); count++; }
- yield = string_catn(yield, sub, count);
+ uschar * t = sub - 1;
+ while (*++t) *t = tolower(*t);
+ yield = string_catn(yield, sub, t-sub);
break;
}
+ {
+ uschar * s = sub;
+ }
case EOP_UC:
{
- int count = 0;
- uschar *t = sub - 1;
- while (*(++t) != 0) { *t = toupper(*t); count++; }
- yield = string_catn(yield, sub, count);
+ uschar * t = sub - 1;
+ while (*++t) *t = toupper(*t);
+ yield = string_catn(yield, sub, t-sub);
break;
}
}
else
yield = string_cat(yield, sub);
- break;
}
/* quote_lookuptype does lookup-specific quoting */
}
yield = string_cat(yield, sub);
- break;
}
+ break;
- /* rx quote sticks in \ before any non-alphameric character so that
- the insertion works in a regular expression. */
+ /* rx quote sticks in \ before any non-alphameric character so that
+ the insertion works in a regular expression. */
- case EOP_RXQUOTE:
+ case EOP_RXQUOTE:
+ {
+ uschar *t = sub - 1;
+ while (*(++t) != 0)
{
- uschar *t = sub - 1;
- while (*(++t) != 0)
- {
- if (!isalnum(*t))
- yield = string_catn(yield, US"\\", 1);
- yield = string_catn(yield, t, 1);
- }
- break;
+ if (!isalnum(*t))
+ yield = string_catn(yield, US"\\", 1);
+ yield = string_catn(yield, t, 1);
}
+ break;
+ }
- /* RFC 2047 encodes, assuming headers_charset (default ISO 8859-1) as
- prescribed by the RFC, if there are characters that need to be encoded */
+ /* RFC 2047 encodes, assuming headers_charset (default ISO 8859-1) as
+ prescribed by the RFC, if there are characters that need to be encoded */
- case EOP_RFC2047:
- yield = string_cat(yield,
- parse_quote_2047(sub, Ustrlen(sub), headers_charset,
- FALSE));
- break;
+ case EOP_RFC2047:
+ yield = string_cat(yield,
+ parse_quote_2047(sub, Ustrlen(sub), headers_charset,
+ FALSE));
+ break;
- /* RFC 2047 decode */
+ /* RFC 2047 decode */
- case EOP_RFC2047D:
+ case EOP_RFC2047D:
+ {
+ int len;
+ uschar *error;
+ uschar *decoded = rfc2047_decode(sub, check_rfc2047_length,
+ headers_charset, '?', &len, &error);
+ if (error)
{
- int len;
- uschar *error;
- uschar *decoded = rfc2047_decode(sub, check_rfc2047_length,
- headers_charset, '?', &len, &error);
- if (error)
- {
- expand_string_message = error;
- goto EXPAND_FAILED;
- }
- yield = string_catn(yield, decoded, len);
- break;
+ expand_string_message = error;
+ goto EXPAND_FAILED;
}
+ yield = string_catn(yield, decoded, len);
+ break;
+ }
- /* from_utf8 converts UTF-8 to 8859-1, turning non-existent chars into
- underscores */
+ /* from_utf8 converts UTF-8 to 8859-1, turning non-existent chars into
+ underscores */
- case EOP_FROM_UTF8:
+ case EOP_FROM_UTF8:
+ {
+ uschar * buff = store_get(4, sub);
+ while (*sub)
{
- uschar * buff = store_get(4, sub);
- while (*sub)
- {
- int c;
- GETUTF8INC(c, sub);
- if (c > 255) c = '_';
- buff[0] = c;
- yield = string_catn(yield, buff, 1);
- }
- break;
+ int c;
+ GETUTF8INC(c, sub);
+ if (c > 255) c = '_';
+ buff[0] = c;
+ yield = string_catn(yield, buff, 1);
}
+ break;
+ }
- /* replace illegal UTF-8 sequences by replacement character */
+ /* replace illegal UTF-8 sequences by replacement character */
- #define UTF8_REPLACEMENT_CHAR US"?"
+ #define UTF8_REPLACEMENT_CHAR US"?"
+
+ case EOP_UTF8CLEAN:
+ {
+ int seq_len = 0, index = 0, bytes_left = 0, complete;
+ u_long codepoint = (u_long)-1;
+ uschar seq_buff[4]; /* accumulate utf-8 here */
- case EOP_UTF8CLEAN:
+ /* Manually track tainting, as we deal in individual chars below */
+
+ if (!yield)
+ yield = string_get_tainted(Ustrlen(sub), sub);
+ else if (!yield->s || !yield->ptr)
{
- int seq_len = 0, index = 0, bytes_left = 0, complete;
- u_long codepoint = (u_long)-1;
- uschar seq_buff[4]; /* accumulate utf-8 here */
+ yield->s = store_get(yield->size = Ustrlen(sub), sub);
+ gstring_reset(yield);
+ }
+ else if (is_incompatible(yield->s, sub))
+ gstring_rebuffer(yield, sub);
- /* Manually track tainting, as we deal in individual chars below */
+ /* Check the UTF-8, byte-by-byte */
+
+ while (*sub)
+ {
+ complete = 0;
+ uschar c = *sub++;
- if (!yield)
- yield = string_get_tainted(Ustrlen(sub), sub);
- else if (!yield->s || !yield->ptr)
+ if (bytes_left)
{
- yield->s = store_get(yield->size = Ustrlen(sub), sub);
- gstring_reset(yield);
+ if ((c & 0xc0) != 0x80)
+ /* wrong continuation byte; invalidate all bytes */
+ complete = 1; /* error */
+ else
+ {
+ codepoint = (codepoint << 6) | (c & 0x3f);
+ seq_buff[index++] = c;
+ if (--bytes_left == 0) /* codepoint complete */
+ if(codepoint > 0x10FFFF) /* is it too large? */
+ complete = -1; /* error (RFC3629 limit) */
+ else if ( (codepoint & 0x1FF800 ) == 0xD800 ) /* surrogate */
+ /* A UTF-16 surrogate (which should be one of a pair that
+ encode a Unicode codepoint that is outside the Basic
+ Multilingual Plane). Error, not UTF8.
+ RFC2279.2 is slightly unclear on this, but
+ https://unicodebook.readthedocs.io/issues.html#strict-utf8-decoder
+ says "Surrogates characters are also invalid in UTF-8:
+ characters in U+D800—U+DFFF have to be rejected." */
+ complete = -1;
+ else
+ { /* finished; output utf-8 sequence */
+ yield = string_catn(yield, seq_buff, seq_len);
+ index = 0;
+ }
+ }
}
- else if (is_incompatible(yield->s, sub))
- gstring_rebuffer(yield, sub);
-
- /* Check the UTF-8, byte-by-byte */
-
- while (*sub)
+ else /* no bytes left: new sequence */
{
- complete = 0;
- uschar c = *sub++;
-
- if (bytes_left)
+ if (!(c & 0x80)) /* 1-byte sequence, US-ASCII, keep it */
{
- if ((c & 0xc0) != 0x80)
- /* wrong continuation byte; invalidate all bytes */
- complete = 1; /* error */
+ yield = string_catn(yield, &c, 1);
+ continue;
+ }
+ if ((c & 0xe0) == 0xc0) /* 2-byte sequence */
+ if (c == 0xc0 || c == 0xc1) /* 0xc0 and 0xc1 are illegal */
+ complete = -1;
else
{
- codepoint = (codepoint << 6) | (c & 0x3f);
- seq_buff[index++] = c;
- if (--bytes_left == 0) /* codepoint complete */
- if(codepoint > 0x10FFFF) /* is it too large? */
- complete = -1; /* error (RFC3629 limit) */
- else if ( (codepoint & 0x1FF800 ) == 0xD800 ) /* surrogate */
- /* A UTF-16 surrogate (which should be one of a pair that
- encode a Unicode codepoint that is outside the Basic
- Multilingual Plane). Error, not UTF8.
- RFC2279.2 is slightly unclear on this, but
- https://unicodebook.readthedocs.io/issues.html#strict-utf8-decoder
- says "Surrogates characters are also invalid in UTF-8:
- characters in U+D800—U+DFFF have to be rejected." */
- complete = -1;
- else
- { /* finished; output utf-8 sequence */
- yield = string_catn(yield, seq_buff, seq_len);
- index = 0;
- }
+ bytes_left = 1;
+ codepoint = c & 0x1f;
}
+ else if ((c & 0xf0) == 0xe0) /* 3-byte sequence */
+ {
+ bytes_left = 2;
+ codepoint = c & 0x0f;
}
- else /* no bytes left: new sequence */
+ else if ((c & 0xf8) == 0xf0) /* 4-byte sequence */
{
- if (!(c & 0x80)) /* 1-byte sequence, US-ASCII, keep it */
- {
- yield = string_catn(yield, &c, 1);
- continue;
- }
- if ((c & 0xe0) == 0xc0) /* 2-byte sequence */
- if (c == 0xc0 || c == 0xc1) /* 0xc0 and 0xc1 are illegal */
- complete = -1;
- else
- {
- bytes_left = 1;
- codepoint = c & 0x1f;
- }
- else if ((c & 0xf0) == 0xe0) /* 3-byte sequence */
- {
- bytes_left = 2;
- codepoint = c & 0x0f;
- }
- else if ((c & 0xf8) == 0xf0) /* 4-byte sequence */
- {
- bytes_left = 3;
- codepoint = c & 0x07;
- }
- else /* invalid or too long (RFC3629 allows only 4 bytes) */
- complete = -1;
+ bytes_left = 3;
+ codepoint = c & 0x07;
+ }
+ else /* invalid or too long (RFC3629 allows only 4 bytes) */
+ complete = -1;
- seq_buff[index++] = c;
- seq_len = bytes_left + 1;
- } /* if(bytes_left) */
+ seq_buff[index++] = c;
+ seq_len = bytes_left + 1;
+ } /* if(bytes_left) */
- if (complete != 0)
- {
- bytes_left = index = 0;
- yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1);
- }
- if ((complete == 1) && ((c & 0x80) == 0))
- /* ASCII character follows incomplete sequence */
- yield = string_catn(yield, &c, 1);
+ if (complete != 0)
+ {
+ bytes_left = index = 0;
+ yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1);
}
- /* If given a sequence truncated mid-character, we also want to report ?
- Eg, ${length_1:フィル} is one byte, not one character, so we expect
- ${utf8clean:${length_1:フィル}} to yield '?' */
+ if ((complete == 1) && ((c & 0x80) == 0))
+ /* ASCII character follows incomplete sequence */
+ yield = string_catn(yield, &c, 1);
+ }
+ /* If given a sequence truncated mid-character, we also want to report ?
+ Eg, ${length_1:フィル} is one byte, not one character, so we expect
+ ${utf8clean:${length_1:フィル}} to yield '?' */
- if (bytes_left != 0)
- yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1);
+ if (bytes_left != 0)
+ yield = string_catn(yield, UTF8_REPLACEMENT_CHAR, 1);
- break;
- }
+ break;
+ }
#ifdef SUPPORT_I18N
- case EOP_UTF8_DOMAIN_TO_ALABEL:
+ case EOP_UTF8_DOMAIN_TO_ALABEL:
+ {
+ uschar * error = NULL;
+ uschar * s = string_domain_utf8_to_alabel(sub, &error);
+ if (error)
{
- uschar * error = NULL;
- uschar * s = string_domain_utf8_to_alabel(sub, &error);
- if (error)
- {
- expand_string_message = string_sprintf(
- "error converting utf8 (%s) to alabel: %s",
- string_printing(sub), error);
- goto EXPAND_FAILED;
- }
- yield = string_cat(yield, s);
- break;
+ expand_string_message = string_sprintf(
+ "error converting utf8 (%s) to alabel: %s",
+ string_printing(sub), error);
+ goto EXPAND_FAILED;
}
+ yield = string_cat(yield, s);
+ break;
+ }
- case EOP_UTF8_DOMAIN_FROM_ALABEL:
+ case EOP_UTF8_DOMAIN_FROM_ALABEL:
+ {
+ uschar * error = NULL;
+ uschar * s = string_domain_alabel_to_utf8(sub, &error);
+ if (error)
{
- uschar * error = NULL;
- uschar * s = string_domain_alabel_to_utf8(sub, &error);
- if (error)
- {
- expand_string_message = string_sprintf(
- "error converting alabel (%s) to utf8: %s",
- string_printing(sub), error);
- goto EXPAND_FAILED;
- }
- yield = string_cat(yield, s);
- break;
+ expand_string_message = string_sprintf(
+ "error converting alabel (%s) to utf8: %s",
+ string_printing(sub), error);
+ goto EXPAND_FAILED;
}
+ yield = string_cat(yield, s);
+ break;
+ }
- case EOP_UTF8_LOCALPART_TO_ALABEL:
+ case EOP_UTF8_LOCALPART_TO_ALABEL:
+ {
+ uschar * error = NULL;
+ uschar * s = string_localpart_utf8_to_alabel(sub, &error);
+ if (error)
{
- uschar * error = NULL;
- uschar * s = string_localpart_utf8_to_alabel(sub, &error);
- if (error)
- {
- expand_string_message = string_sprintf(
- "error converting utf8 (%s) to alabel: %s",
- string_printing(sub), error);
- goto EXPAND_FAILED;
- }
- yield = string_cat(yield, s);
- DEBUG(D_expand) debug_printf_indent("yield: '%Y'\n", yield);
- break;
+ expand_string_message = string_sprintf(
+ "error converting utf8 (%s) to alabel: %s",
+ string_printing(sub), error);
+ goto EXPAND_FAILED;
}
+ yield = string_cat(yield, s);
+ DEBUG(D_expand) debug_printf_indent("yield: '%Y'\n", yield);
+ break;
+ }
- case EOP_UTF8_LOCALPART_FROM_ALABEL:
+ case EOP_UTF8_LOCALPART_FROM_ALABEL:
+ {
+ uschar * error = NULL;
+ uschar * s = string_localpart_alabel_to_utf8(sub, &error);
+ if (error)
{
- uschar * error = NULL;
- uschar * s = string_localpart_alabel_to_utf8(sub, &error);
- if (error)
- {
- expand_string_message = string_sprintf(
- "error converting alabel (%s) to utf8: %s",
- string_printing(sub), error);
- goto EXPAND_FAILED;
- }
- yield = string_cat(yield, s);
- break;
+ expand_string_message = string_sprintf(
+ "error converting alabel (%s) to utf8: %s",
+ string_printing(sub), error);
+ goto EXPAND_FAILED;
}
+ yield = string_cat(yield, s);
+ break;
+ }
#endif /* EXPERIMENTAL_INTERNATIONAL */
- /* escape turns all non-printing characters into escape sequences. */
+ /* escape turns all non-printing characters into escape sequences. */
- case EOP_ESCAPE:
- {
- const uschar * t = string_printing(sub);
- yield = string_cat(yield, t);
- break;
- }
+ case EOP_ESCAPE:
+ {
+ const uschar * t = string_printing(sub);
+ yield = string_cat(yield, t);
+ break;
+ }
- case EOP_ESCAPE8BIT:
- {
- uschar c;
+ case EOP_ESCAPE8BIT:
+ {
+ uschar c;
- for (const uschar * s = sub; (c = *s); s++)
- yield = c < 127 && c != '\\'
- ? string_catn(yield, s, 1)
- : string_fmt_append(yield, "\\%03o", c);
- break;
- }
+ for (const uschar * s = sub; (c = *s); s++)
+ yield = c < 127 && c != '\\'
+ ? string_catn(yield, s, 1)
+ : string_fmt_append(yield, "\\%03o", c);
+ break;
+ }
- /* Handle numeric expression evaluation */
+ /* Handle numeric expression evaluation */
- case EOP_EVAL:
- case EOP_EVAL10:
+ case EOP_EVAL:
+ case EOP_EVAL10:
+ {
+ uschar *save_sub = sub;
+ uschar *error = NULL;
+ int_eximarith_t n = eval_expr(&sub, (c == EOP_EVAL10), &error, FALSE);
+ if (error)
{
- uschar *save_sub = sub;
- uschar *error = NULL;
- int_eximarith_t n = eval_expr(&sub, (c == EOP_EVAL10), &error, FALSE);
- if (error)
- {
- expand_string_message = string_sprintf("error in expression "
- "evaluation: %s (after processing \"%.*s\")", error,
- (int)(sub-save_sub), save_sub);
- goto EXPAND_FAILED;
- }
- yield = string_fmt_append(yield, PR_EXIM_ARITH, n);
- break;
+ expand_string_message = string_sprintf("error in expression "
+ "evaluation: %s (after processing \"%.*s\")", error,
+ (int)(sub-save_sub), save_sub);
+ goto EXPAND_FAILED;
}
+ yield = string_fmt_append(yield, PR_EXIM_ARITH, n);
+ break;
+ }
- /* Handle time period formatting */
+ /* Handle time period formatting */
- case EOP_TIME_EVAL:
+ case EOP_TIME_EVAL:
+ {
+ int n = readconf_readtime(sub, 0, FALSE);
+ if (n < 0)
{
- int n = readconf_readtime(sub, 0, FALSE);
- if (n < 0)
- {
- expand_string_message = string_sprintf("string \"%s\" is not an "
- "Exim time interval in \"%s\" operator", sub, name);
- goto EXPAND_FAILED;
- }
- yield = string_fmt_append(yield, "%d", n);
- break;
+ expand_string_message = string_sprintf("string \"%s\" is not an "
+ "Exim time interval in \"%s\" operator", sub, name);
+ goto EXPAND_FAILED;
}
+ yield = string_fmt_append(yield, "%d", n);
+ break;
+ }
- case EOP_TIME_INTERVAL:
+ case EOP_TIME_INTERVAL:
+ {
+ int n;
+ uschar *t = read_number(&n, sub);
+ if (*t != 0) /* Not A Number*/
{
- int n;
- uschar *t = read_number(&n, sub);
- if (*t != 0) /* Not A Number*/
- {
- expand_string_message = string_sprintf("string \"%s\" is not a "
- "positive number in \"%s\" operator", sub, name);
- goto EXPAND_FAILED;
- }
- t = readconf_printtime(n);
- yield = string_cat(yield, t);
- break;
+ expand_string_message = string_sprintf("string \"%s\" is not a "
+ "positive number in \"%s\" operator", sub, name);
+ goto EXPAND_FAILED;
}
+ t = readconf_printtime(n);
+ yield = string_cat(yield, t);
+ break;
+ }
- /* Convert string to base64 encoding */
+ /* Convert string to base64 encoding */
- case EOP_STR2B64:
- case EOP_BASE64:
- {
+ case EOP_STR2B64:
+ case EOP_BASE64:
+ {
#ifndef DISABLE_TLS
- uschar * s = vp && *(void **)vp->value
- ? tls_cert_der_b64(*(void **)vp->value)
- : b64encode(CUS sub, Ustrlen(sub));
+ uschar * s = vp && *(void **)vp->value
+ ? tls_cert_der_b64(*(void **)vp->value)
+ : b64encode(CUS sub, Ustrlen(sub));
#else
- uschar * s = b64encode(CUS sub, Ustrlen(sub));
+ uschar * s = b64encode(CUS sub, Ustrlen(sub));
#endif
- yield = string_cat(yield, s);
- break;
- }
+ yield = string_cat(yield, s);
+ break;
+ }
- case EOP_BASE64D:
+ case EOP_BASE64D:
+ {
+ uschar * s;
+ int len = b64decode(sub, &s, sub);
+ if (len < 0)
{
- uschar * s;
- int len = b64decode(sub, &s, sub);
- if (len < 0)
- {
- expand_string_message = string_sprintf("string \"%s\" is not "
- "well-formed for \"%s\" operator", sub, name);
- goto EXPAND_FAILED;
- }
- yield = string_cat(yield, s);
- break;
+ expand_string_message = string_sprintf("string \"%s\" is not "
+ "well-formed for \"%s\" operator", sub, name);
+ goto EXPAND_FAILED;
}
+ yield = string_cat(yield, s);
+ break;
+ }
- /* strlen returns the length of the string */
+ /* strlen returns the length of the string */
- case EOP_STRLEN:
- yield = string_fmt_append(yield, "%d", Ustrlen(sub));
- break;
+ case EOP_STRLEN:
+ yield = string_fmt_append(yield, "%d", Ustrlen(sub));
+ break;
+
+ /* length_n or l_n takes just the first n characters or the whole string,
+ whichever is the shorter;
+
+ substr_m_n, and s_m_n take n characters from offset m; negative m take
+ from the end; l_n is synonymous with s_0_n. If n is omitted in substr it
+ takes the rest, either to the right or to the left.
+
+ hash_n or h_n makes a hash of length n from the string, yielding n
+ characters from the set a-z; hash_n_m makes a hash of length n, but
+ uses m characters from the set a-zA-Z0-9.
+
+ nhash_n returns a single number between 0 and n-1 (in text form), while
+ nhash_n_m returns a div/mod hash as two numbers "a/b". The first lies
+ between 0 and n-1 and the second between 0 and m-1. */
+
+ case EOP_LENGTH:
+ case EOP_L:
+ case EOP_SUBSTR:
+ case EOP_S:
+ case EOP_HASH:
+ case EOP_H:
+ case EOP_NHASH:
+ case EOP_NH:
+ {
+ int sign = 1;
+ int value1 = 0;
+ int value2 = -1;
+ int *pn;
+ int len;
+ uschar *ret;
- /* length_n or l_n takes just the first n characters or the whole string,
- whichever is the shorter;
-
- substr_m_n, and s_m_n take n characters from offset m; negative m take
- from the end; l_n is synonymous with s_0_n. If n is omitted in substr it
- takes the rest, either to the right or to the left.
-
- hash_n or h_n makes a hash of length n from the string, yielding n
- characters from the set a-z; hash_n_m makes a hash of length n, but
- uses m characters from the set a-zA-Z0-9.
-
- nhash_n returns a single number between 0 and n-1 (in text form), while
- nhash_n_m returns a div/mod hash as two numbers "a/b". The first lies
- between 0 and n-1 and the second between 0 and m-1. */
-
- case EOP_LENGTH:
- case EOP_L:
- case EOP_SUBSTR:
- case EOP_S:
- case EOP_HASH:
- case EOP_H:
- case EOP_NHASH:
- case EOP_NH:
+ if (!arg)
{
- int sign = 1;
- int value1 = 0;
- int value2 = -1;
- int *pn;
- int len;
- uschar *ret;
+ expand_string_message = string_sprintf("missing values after %s",
+ name);
+ goto EXPAND_FAILED;
+ }
- if (!arg)
- {
- expand_string_message = string_sprintf("missing values after %s",
- name);
- goto EXPAND_FAILED;
- }
+ /* "length" has only one argument, effectively being synonymous with
+ substr_0_n. */
- /* "length" has only one argument, effectively being synonymous with
- substr_0_n. */
+ if (c == EOP_LENGTH || c == EOP_L)
+ {
+ pn = &value2;
+ value2 = 0;
+ }
- if (c == EOP_LENGTH || c == EOP_L)
+ /* The others have one or two arguments; for "substr" the first may be
+ negative. The second being negative means "not supplied". */
+
+ else
+ {
+ pn = &value1;
+ if (name[0] == 's' && *arg == '-') { sign = -1; arg++; }
+ }
+
+ /* Read up to two numbers, separated by underscores */
+
+ ret = arg;
+ while (*arg != 0)
+ {
+ if (arg != ret && *arg == '_' && pn == &value1)
{
pn = &value2;
value2 = 0;
+ if (arg[1] != 0) arg++;
}
-
- /* The others have one or two arguments; for "substr" the first may be
- negative. The second being negative means "not supplied". */
-
- else
+ else if (!isdigit(*arg))
{
- pn = &value1;
- if (name[0] == 's' && *arg == '-') { sign = -1; arg++; }
+ expand_string_message =
+ string_sprintf("non-digit after underscore in \"%s\"", name);
+ goto EXPAND_FAILED;
}
+ else *pn = (*pn)*10 + *arg++ - '0';
+ }
+ value1 *= sign;
- /* Read up to two numbers, separated by underscores */
-
- ret = arg;
- while (*arg != 0)
- {
- if (arg != ret && *arg == '_' && pn == &value1)
- {
- pn = &value2;
- value2 = 0;
- if (arg[1] != 0) arg++;
- }
- else if (!isdigit(*arg))
- {
- expand_string_message =
- string_sprintf("non-digit after underscore in \"%s\"", name);
- goto EXPAND_FAILED;
- }
- else *pn = (*pn)*10 + *arg++ - '0';
- }
- value1 *= sign;
+ /* Perform the required operation */
- /* Perform the required operation */
+ ret = c == EOP_HASH || c == EOP_H
+ ? compute_hash(sub, value1, value2, &len)
+ : c == EOP_NHASH || c == EOP_NH
+ ? compute_nhash(sub, value1, value2, &len)
+ : extract_substr(sub, value1, value2, &len);
+ if (!ret) goto EXPAND_FAILED;
- ret = c == EOP_HASH || c == EOP_H
- ? compute_hash(sub, value1, value2, &len)
- : c == EOP_NHASH || c == EOP_NH
- ? compute_nhash(sub, value1, value2, &len)
- : extract_substr(sub, value1, value2, &len);
- if (!ret) goto EXPAND_FAILED;
+ yield = string_catn(yield, ret, len);
+ break;
+ }
- yield = string_catn(yield, ret, len);
- break;
- }
+ /* Stat a path */
- /* Stat a path */
+ case EOP_STAT:
+ {
+ uschar smode[12];
+ uschar **modetable[3];
+ mode_t mode;
+ struct stat st;
- case EOP_STAT:
+ if (expand_forbid & RDO_EXISTS)
{
- uschar smode[12];
- uschar **modetable[3];
- mode_t mode;
- struct stat st;
+ expand_string_message = US"Use of the stat() expansion is not permitted";
+ goto EXPAND_FAILED;
+ }
- if (expand_forbid & RDO_EXISTS)
- {
- expand_string_message = US"Use of the stat() expansion is not permitted";
- goto EXPAND_FAILED;
- }
+ if (stat(CS sub, &st) < 0)
+ {
+ expand_string_message = string_sprintf("stat(%s) failed: %s",
+ sub, strerror(errno));
+ goto EXPAND_FAILED;
+ }
+ mode = st.st_mode;
+ switch (mode & S_IFMT)
+ {
+ case S_IFIFO: smode[0] = 'p'; break;
+ case S_IFCHR: smode[0] = 'c'; break;
+ case S_IFDIR: smode[0] = 'd'; break;
+ case S_IFBLK: smode[0] = 'b'; break;
+ case S_IFREG: smode[0] = '-'; break;
+ default: smode[0] = '?'; break;
+ }
- if (stat(CS sub, &st) < 0)
- {
- expand_string_message = string_sprintf("stat(%s) failed: %s",
- sub, strerror(errno));
- goto EXPAND_FAILED;
- }
- mode = st.st_mode;
- switch (mode & S_IFMT)
- {
- case S_IFIFO: smode[0] = 'p'; break;
- case S_IFCHR: smode[0] = 'c'; break;
- case S_IFDIR: smode[0] = 'd'; break;
- case S_IFBLK: smode[0] = 'b'; break;
- case S_IFREG: smode[0] = '-'; break;
- default: smode[0] = '?'; break;
- }
+ modetable[0] = ((mode & 01000) == 0)? mtable_normal : mtable_sticky;
+ modetable[1] = ((mode & 02000) == 0)? mtable_normal : mtable_setid;
+ modetable[2] = ((mode & 04000) == 0)? mtable_normal : mtable_setid;
- modetable[0] = ((mode & 01000) == 0)? mtable_normal : mtable_sticky;
- modetable[1] = ((mode & 02000) == 0)? mtable_normal : mtable_setid;
- modetable[2] = ((mode & 04000) == 0)? mtable_normal : mtable_setid;
+ for (int i = 0; i < 3; i++)
+ {
+ memcpy(CS(smode + 7 - i*3), CS(modetable[i][mode & 7]), 3);
+ mode >>= 3;
+ }
- for (int i = 0; i < 3; i++)
- {
- memcpy(CS(smode + 7 - i*3), CS(modetable[i][mode & 7]), 3);
- mode >>= 3;
- }
+ smode[10] = 0;
+ yield = string_fmt_append(yield,
+ "mode=%04lo smode=%s inode=%ld device=%ld links=%ld "
+ "uid=%ld gid=%ld size=" OFF_T_FMT " atime=%ld mtime=%ld ctime=%ld",
+ (long)(st.st_mode & 077777), smode, (long)st.st_ino,
+ (long)st.st_dev, (long)st.st_nlink, (long)st.st_uid,
+ (long)st.st_gid, st.st_size, (long)st.st_atime,
+ (long)st.st_mtime, (long)st.st_ctime);
+ break;
+ }
- smode[10] = 0;
- yield = string_fmt_append(yield,
- "mode=%04lo smode=%s inode=%ld device=%ld links=%ld "
- "uid=%ld gid=%ld size=" OFF_T_FMT " atime=%ld mtime=%ld ctime=%ld",
- (long)(st.st_mode & 077777), smode, (long)st.st_ino,
- (long)st.st_dev, (long)st.st_nlink, (long)st.st_uid,
- (long)st.st_gid, st.st_size, (long)st.st_atime,
- (long)st.st_mtime, (long)st.st_ctime);
- break;
- }
+ /* vaguely random number less than N */
- /* vaguely random number less than N */
+ case EOP_RANDINT:
+ {
+ int_eximarith_t max = expanded_string_integer(sub, TRUE);
- case EOP_RANDINT:
- {
- int_eximarith_t max = expanded_string_integer(sub, TRUE);
+ if (expand_string_message)
+ goto EXPAND_FAILED;
+ yield = string_fmt_append(yield, "%d", vaguely_random_number((int)max));
+ break;
+ }
- if (expand_string_message)
- goto EXPAND_FAILED;
- yield = string_fmt_append(yield, "%d", vaguely_random_number((int)max));
- break;
- }
+ /* Reverse IP, including IPv6 to dotted-nibble */
- /* Reverse IP, including IPv6 to dotted-nibble */
+ case EOP_REVERSE_IP:
+ {
+ int family, maskptr;
+ uschar reversed[128];
- case EOP_REVERSE_IP:
+ family = string_is_ip_address(sub, &maskptr);
+ if (family == 0)
{
- int family, maskptr;
- uschar reversed[128];
-
- family = string_is_ip_address(sub, &maskptr);
- if (family == 0)
- {
- expand_string_message = string_sprintf(
- "reverse_ip() not given an IP address [%s]", sub);
- goto EXPAND_FAILED;
- }
- invert_address(reversed, sub);
- yield = string_cat(yield, reversed);
- break;
+ expand_string_message = string_sprintf(
+ "reverse_ip() not given an IP address [%s]", sub);
+ goto EXPAND_FAILED;
}
+ invert_address(reversed, sub);
+ yield = string_cat(yield, reversed);
+ break;
+ }
- /* Unknown operator */
+ case EOP_XTEXTD:
+ {
+ uschar * s;
+ int len = auth_xtextdecode(sub, &s);
+ yield = string_catn(yield, s, len);
+ break;
+ }
- default:
- expand_string_message =
- string_sprintf("unknown expansion operator \"%s\"", name);
- goto EXPAND_FAILED;
- } /* EOP_* switch */
+ /* Unknown operator */
+ default:
+ expand_string_message =
+ string_sprintf("unknown expansion operator \"%s\"", name);
+ goto EXPAND_FAILED;
+ } /* EOP_* switch */
- DEBUG(D_expand)
+ DEBUG(D_expand)
{
const uschar * res = string_from_gstring(yield);
const uschar * s = res + expansion_start;
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2021 - 2022 */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2009 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
uschar *acl_smtp_rcpt = NULL;
uschar *acl_smtp_starttls = NULL;
uschar *acl_smtp_vrfy = NULL;
-#ifdef EXPERIMENTAL_WELLKNOWN
+#ifndef DISABLE_WELLKNOWN
uschar *acl_smtp_wellknown = NULL;
#endif
[ACL_WHERE_QUIT] = US"QUIT",
[ACL_WHERE_STARTTLS] = US"STARTTLS",
[ACL_WHERE_VRFY] = US"VRFY",
+#ifndef DISABLE_WELLKNOWN
+ [ACL_WHERE_WELLKNOWN] = US"WELLKNOWN",
+#endif
[ACL_WHERE_DELIVERY] = US"delivery",
[ACL_WHERE_UNKNOWN] = US"unknown"
};
[ACL_WHERE_EXPN] = US"550",
[ACL_WHERE_HELO] = US"550",
[ACL_WHERE_STARTTLS] = US"550",
+#ifndef DISABLE_WELLKNOWN
+ [ACL_WHERE_WELLKNOWN] =US"550",
+#endif
[ACL_WHERE_VRFY] = US"252",
};
#endif
uschar *hosts_treat_as_local = NULL;
uschar *hosts_require_helo = US"*";
-#ifdef EXPERIMENTAL_WELLKNOWN
-uschar *hosts_wellknown = NULL;
-#endif
#ifdef EXPERIMENTAL_XCLIENT
uschar *hosts_xclient = NULL;
#endif
const uschar *warnmsg_delay = NULL;
const uschar *warnmsg_recipients = NULL;
+#ifndef DISABLE_WELLKNOWN
+uschar *wellknown_advertise_hosts = NULL;
+uschar *wellknown_response = NULL;
+#endif
+
/* End of globals.c */
/* vi: aw ai sw=2
*/
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
extern uschar *acl_smtp_rcpt; /* ACL run for RCPT */
extern uschar *acl_smtp_starttls; /* ACL run for STARTTLS */
extern uschar *acl_smtp_vrfy; /* ACL run for VRFY */
+#ifndef DISABLE_WELLKNOWN
+extern uschar *acl_smtp_wellknown; /* ACL run for WELLKNOWN */
+#endif
extern tree_node *acl_var_c; /* ACL connection variables */
extern tree_node *acl_var_m; /* ACL message variables */
extern uschar *acl_verify_message; /* User message for verify failure */
extern int warning_count; /* Delay warnings sent for this msg */
+#ifndef DISABLE_WELLKNOWN
+extern uschar *wellknown_advertise_hosts;/* Allow WELLKNOWN command for specified hosts */
+extern uschar *wellknown_response; /* SMTP response for WELLKNOWN verb */
+#endif
+
/* End of globals.h */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
For convenience, the definitions of the structures used in the various hints
databases are also kept in this file, which is used by the maintenance
-utilities as well as the main Exim binary. */
+utilities as well as the main Exim binary.
+
+A key/value store is supported (only). Keys are strings; values arbitrary
+binary blobs.
+
+The API is:
+ Functions:
+ exim_dbopen O_RDONLY/O_RDWR, optionally OR'd with O_CREAT
+ exim_dbclose
+ exim_dbget
+ exim_dbput
+ exim_dbputb (non-overwriting put)
+ exim_dbdel
+ exim_dbcreate_cursor
+ exim_dbscan (get, and bump cursor)
+ exim_dbdelete_cursor
+ exim_datum_init
+ exim_datum_size_get/set
+ exim_datum_data_get/set
+ exim_datum_free
+ Defines:
+ EXIM_DB access handle
+ EXIM_CURSOR datatype for cursor
+ EXIM_DATUM datatype for "value"
+ EXIM_DBTYPE text for logging & debuug
+
+Selection of the shim layer implementation, and backend, is by #defines.
+
+The users of this API are:
+ hintsdb interface dbfn.c
+ hintsdb utilities exim_dbutil.c and exim_dbmvuild.c
+ dbmdb lookup lookups/dbmdb,c
+ autoreply transport transports/autoreply.c
+
+Note that the dbmdb lookup use, bypassing the dbfn.c layer,
+means that no file-locking is done.
+XXX This feels like a layering violation; I don't see it commented on
+anywhere.
+
+Future: consider re-architecting to support caching of the open-handle
+for hintsdb uses (the dbmdb use gets that already). This would need APIs
+for transaction locks. Perhaps merge the implementation with the lookups
+layer, in some way, for the open-handle caching (since that manages closes
+required by Exim's process transisitions)?
+*/
#ifndef HINTSDB_H
#define HINTSDB_H
-#if defined(USE_TDB)
+#ifdef USE_SQLITE
+# if defined(USE_DB) || defined(USE_GDBM) || defined(USE_TDB)
+# error USE_SQLITE conflict with alternate definition
+# endif
+
+/* ********************* sqlite3 interface ************************ */
+
+# include <sqlite3.h>
+
+/* Basic DB type */
+# define EXIM_DB sqlite3
+
+# define EXIM_CURSOR int
+
+# /* The datum type used for queries */
+# define EXIM_DATUM blob
+
+/* Some text for messages */
+# define EXIM_DBTYPE "sqlite3"
+
+# /* Access functions */
+
+/* EXIM_DBOPEN - return pointer to an EXIM_DB, NULL if failed */
+static inline EXIM_DB *
+exim_dbopen__(const uschar * name, const uschar * dirname, int flags,
+ unsigned mode)
+{
+EXIM_DB * dbp;
+int ret, sflags = flags & O_RDWR ? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY;
+if (flags & O_CREAT) sflags |= SQLITE_OPEN_CREATE;
+if ((ret = sqlite3_open_v2(CCS name, &dbp, sflags, NULL)) == SQLITE_OK)
+ {
+ sqlite3_busy_timeout(dbp, 5000);
+ if (flags & O_CREAT)
+ ret == sqlite3_exec(dbp,
+ "CREATE TABLE IF NOT EXISTS tbl (ky TEXT PRIMARY KEY, dat BLOB);",
+ NULL, NULL, NULL);
+ }
+//else
+// fprintf(stderr, "sqlite3_open_v2: %s\n", sqlite3_errmsg(dbp));
+return ret == SQLITE_OK ? dbp : NULL;
+}
+
+/* EXIM_DBGET - returns TRUE if successful, FALSE otherwise */
+/* note we alloc'n'copy - the caller need not do so */
+/* result has a NUL appended, but the length is as per the DB */
+
+static inline BOOL
+exim_dbget__(EXIM_DB * dbp, const uschar * s, EXIM_DATUM * res)
+{
+sqlite3_stmt * statement;
+int ret;
+
+res->len = (size_t) -1;
+/* fprintf(stderr, "exim_dbget__(%s)\n", s); */
+if ((ret = sqlite3_prepare_v2(dbp, CCS s, -1, &statement, NULL)) != SQLITE_OK)
+ {
+/* fprintf(stderr, "prepare fail: %s\n", sqlite3_errmsg(dbp)); */
+ return FALSE;
+ }
+if (sqlite3_step(statement) != SQLITE_ROW)
+ {
+/* fprintf(stderr, "step fail: %s\n", sqlite3_errmsg(dbp)); */
+ sqlite3_finalize(statement);
+ return FALSE;
+ }
+
+res->len = sqlite3_column_bytes(statement, 0);
+res->data = store_get(res->len + 1, GET_TAINTED);
+memcpy(res->data, sqlite3_column_blob(statement, 0), res->len);
+res->data[res->len] = '\0';
+/* fprintf(stderr, "res %d bytes: '%.*s'\n", (int)res->len, (int)res->len, res->data); */
+sqlite3_finalize(statement);
+return TRUE;
+}
-# if defined(USE_DB) || defined(USE_GDBM)
+static inline BOOL
+exim_dbget(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * res)
+{
+# define FMT "SELECT dat FROM tbl WHERE ky = '%.*s';"
+uschar * qry;
+int i;
+BOOL ret;
+
+# ifdef COMPILE_UTILITY
+/* fprintf(stderr, "exim_dbget(k len %d '%.*s')\n", (int)key->len, (int)key->len, key->data); */
+qry = malloc(i = snprintf(NULL, 0, FMT, (int) key->len, key->data));
+snprintf(CS qry, i, FMT, (int) key->len, key->data);
+ret = exim_dbget__(dbp, qry, res);
+free(qry);
+# else
+/* fprintf(stderr, "exim_dbget(k len %d '%.*s')\n", (int)key->len, (int)key->len, key->data); */
+qry = string_sprintf(FMT, (int) key->len, key->data);
+ret = exim_dbget__(dbp, qry, res);
+# endif
+
+return ret;
+# undef FMT
+}
+
+/**/
+# define EXIM_DBPUTB_OK 0
+# define EXIM_DBPUTB_DUP (-1)
+
+static inline int
+exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * alt)
+{
+# define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
+uschar * hex = store_get(data->len * 2, data->data), * qry;
+int res;
+
+for (const uschar * s = data->data, * t = s + data->len; s < t; s++)
+ sprintf(CS hex + 2 * (s - data->data), "%02X", *s);
+
+# ifdef COMPILE_UTILITY
+res = snprintf(NULL, 0, FMT,
+ alt, (int) key->len, key->data, (int)data->len * 2, hex);
+qry = malloc(res);
+snprintf(CS qry, res, FMT, alt, (int) key->len, key->data, (int)data->len * 2, hex);
+/* fprintf(stderr, "exim_s_dbp(%s)\n", qry); */
+res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
+free(qry);
+# else
+qry = string_sprintf(FMT, alt, (int) key->len, key->data, (int)data->len * 2, hex);
+/* fprintf(stderr, "exim_s_dbp(%s)\n", qry); */
+res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
+/* fprintf(stderr, "exim_s_dbp res %d\n", res); */
+# endif
+
+if (res != SQLITE_OK)
+ fprintf(stderr, "sqlite3_exec: %s\n", sqlite3_errmsg(dbp));
+
+return res == SQLITE_OK ? EXIM_DBPUTB_OK : EXIM_DBPUTB_DUP;
+# undef FMT
+}
+
+/* EXIM_DBPUT - returns nothing useful, assumes replace mode */
+
+static inline int
+exim_dbput(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data)
+{
+/* fprintf(stderr, "exim_dbput()\n"); */
+(void) exim_s_dbp(dbp, key, data, US"REPLACE");
+return 0;
+}
+
+/* EXIM_DBPUTB - non-overwriting for use by dbmbuild */
+
+/* Returns from EXIM_DBPUTB */
+
+static inline int
+exim_dbputb(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data)
+{
+return exim_s_dbp(dbp, key, data, US"ABORT");
+}
+
+/* EXIM_DBDEL */
+static inline int
+exim_dbdel(EXIM_DB * dbp, EXIM_DATUM * key)
+{
+# define FMT "DELETE FROM tbl WHERE ky = '%.*s';"
+uschar * qry;
+int res;
+
+# ifdef COMPILE_UTILITY
+res = snprintf(NULL, 0, FMT, (int) key->len, key->data);
+qry = malloc(res);
+snprintf(CS qry, res, FMT, (int) key->len, key->data);
+res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
+free(qry);
+# else
+qry = string_sprintf(FMT, (int) key->len, key->data);
+res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
+# endif
+
+return res;
+# undef FMT
+}
+
+
+/* EXIM_DBCREATE_CURSOR - initialize for scanning operation */
+/* Cursors are inefficiently emulated by repeating searches */
+
+static inline EXIM_CURSOR *
+exim_dbcreate_cursor(EXIM_DB * dbp)
+{
+EXIM_CURSOR * c = store_malloc(sizeof(int));
+*c = 0;
+return c;
+}
+
+/* EXIM_DBSCAN */
+/* Note that we return the (next) key, not the record value */
+static inline BOOL
+exim_dbscan(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * res, BOOL first,
+ EXIM_CURSOR * cursor)
+{
+# define FMT "SELECT ky FROM tbl ORDER BY ky LIMIT 1 OFFSET %d;"
+uschar * qry;
+int i;
+BOOL ret;
+
+# ifdef COMPILE_UTILITY
+qry = malloc(i = snprintf(NULL, 0, FMT, *cursor));
+snprintf(CS qry, i, FMT, *cursor);
+/* fprintf(stderr, "exim_dbscan(%s)\n", qry); */
+ret = exim_dbget__(dbp, qry, key);
+free(qry);
+/* fprintf(stderr, "exim_dbscan ret %c\n", ret ? 'T':'F'); */
+# else
+qry = string_sprintf(FMT, *cursor);
+/* fprintf(stderr, "exim_dbscan(%s)\n", qry); */
+ret = exim_dbget__(dbp, qry, key);
+/* fprintf(stderr, "exim_dbscan ret %c\n", ret ? 'T':'F'); */
+# endif
+if (ret) *cursor = *cursor + 1;
+return ret;
+# undef FMT
+}
+
+/* EXIM_DBDELETE_CURSOR - terminate scanning operation. */
+static inline void
+exim_dbdelete_cursor(EXIM_CURSOR * cursor)
+{ store_free(cursor); }
+
+
+/* EXIM_DBCLOSE */
+static void
+exim_dbclose__(EXIM_DB * db)
+{ sqlite3_close(db); }
+
+
+/* Datum access */
+
+static uschar *
+exim_datum_data_get(EXIM_DATUM * dp)
+{ return US dp->data; }
+static void
+exim_datum_data_set(EXIM_DATUM * dp, void * s)
+{ dp->data = s; }
+
+static unsigned
+exim_datum_size_get(EXIM_DATUM * dp)
+{ return dp->len; }
+static void
+exim_datum_size_set(EXIM_DATUM * dp, unsigned n)
+{ dp->len = n; }
+
+
+
+static inline void
+exim_datum_init(EXIM_DATUM * dp)
+{ dp->data = NULL; } /* compiler quietening */
+
+/* No free needed for a datum */
+
+static inline void
+exim_datum_free(EXIM_DATUM * dp)
+{ }
+
+/* size limit */
+
+# define EXIM_DB_RLIMIT 150
+
+
+
+
+
+
+#elif defined(USE_TDB)
+
+# if defined(USE_DB) || defined(USE_GDBM) || defined(USE_SQLITE)
# error USE_TDB conflict with alternate definition
# endif
#elif defined USE_DB
-# if defined(USE_TDB) || defined(USE_GDBM)
+# if defined(USE_TDB) || defined(USE_GDBM) || defined(USE_SQLITE)
# error USE_DB conflict with alternate definition
# endif
{
dbp->app_private = b;
if (b->open(b, NULL, CS name, NULL,
- flags == O_RDONLY ? DB_UNKNOWN : DB_HASH,
- flags == O_RDONLY ? DB_RDONLY : DB_CREATE,
+ flags & O_CREAT ? DB_HASH : DB_UNKNOWN,
+ flags & O_CREAT ? DB_CREATE
+ : flags & (O_WRONLY|O_RDWR) ? 0 : DB_RDONLY,
mode) == 0
)
return dbp;
return db_create(&dbp, NULL, 0) == 0
&& ( dbp->set_errcall(dbp, dbfn_bdb_error_callback),
dbp->open(dbp, CS name, NULL,
- flags == O_RDONLY ? DB_UNKNOWN : DB_HASH,
- flags == O_RDONLY ? DB_RDONLY : DB_CREATE,
+ flags & O_CREAT ? DB_HASH : DB_UNKNOWN,
+ flags & O_CREAT ? DB_CREATE
+ : flags & (O_WRONLY|O_RDWR) ? 0 : DB_RDONLY,
mode)
) == 0
? dbp : NULL;
/********************* gdbm interface definitions **********************/
#elif defined USE_GDBM
-/*XXX TODO: exim's locfile not needed */
+/*XXX TODO: exim's lockfile not needed? */
-# if defined(USE_TDB) || defined(USE_DB)
+# if defined(USE_TDB) || defined(USE_DB) || defined(USE_SQLITE)
# error USE_GDBM conflict with alternate definition
# endif
dbp->lkey.dptr = NULL;
dbp->gdbm = gdbm_open(CS name, 0,
flags & O_CREAT ? GDBM_WRCREAT
- : flags & (O_RDWR|O_WRONLY) ? GDBM_WRITER
- : GDBM_READER,
+ : flags & (O_RDWR|O_WRONLY) ? GDBM_WRITER : GDBM_READER,
mode, 0);
if (dbp->gdbm) return dbp;
free(dbp);
-/* If none of USE_DB, USG_GDBM, or USE_TDB are set, the default is the NDBM
-interface (which seems to be a wrapper for GDBM) */
+/* If none of USE_DB, USG_GDBM, USE_SQLITE or USE_TDB are set,
+the default is the NDBM interface (which seems to be a wrapper for GDBM) */
/********************* ndbm interface definitions **********************/
#endif /* whole file */
/* End of hintsdb.h */
+/* vi: aw ai sw=2
+*/
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 - 2021 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2020 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
{
int rc;
-#if defined(USE_DB) || defined(USE_TDB) || defined(USE_GDBM)
+#if defined(USE_DB) || defined(USE_TDB) || defined(USE_GDBM) || defined(USE_SQLITE)
rc = lf_check_file(-1, filename, S_IFREG, modemask, owners, owngroups,
"dbm", errmsg);
#else
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2015 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#define FILTER_FILE BIT(2)
#define FILTER_DIR BIT(3)
#define FILTER_SUBDIR BIT(4)
+#define ALLOW_PATH BIT(5)
/* See local README for interface description. We use lstat() instead of
scanning the directory, as it is hopefully faster to let the OS do the scanning
uschar * filename;
unsigned flags = 0;
-if (Ustrchr(keystring, '/') != 0)
- {
- *errmsg = string_sprintf("key for dsearch lookup contains a slash: %s",
- keystring);
- return DEFER;
- }
-
if (opts)
{
int sep = ',';
else if (Ustrcmp(ele, "subdir") == 0)
flags |= FILTER_TYPE | FILTER_SUBDIR; /* like dir but not "." or ".." */
}
+ else if (Ustrcmp(ele, "key=path") == 0)
+ flags |= ALLOW_PATH;
+ }
+
+if (flags & ALLOW_PATH)
+ {
+ if (Ustrstr(keystring, "/../") != NULL || Ustrstr(keystring, "/./"))
+ {
+ *errmsg = string_sprintf(
+ "key for dsearch lookup contains bad component: %s", keystring);
+ return DEFER;
+ }
+ }
+else if (Ustrchr(keystring, '/') != NULL)
+ {
+ *errmsg = string_sprintf("key for dsearch lookup contains a slash: %s",
+ keystring);
+ return DEFER;
}
filename = string_sprintf("%s/%s", dirname, keystring);
&& S_ISDIR(statbuf.st_mode)
&& ( flags & FILTER_DIR
|| keystring[0] != '.'
- || keystring[1] && keystring[1] != '.'
+ || keystring[1] && (keystring[1] != '.' || keystring[2])
) ) ) )
{
/* Since the filename exists in the filesystem, we can return a
lookup_module_info dsearch_lookup_module_info = { LOOKUP_MODULE_INFO_MAGIC, _lookup_list, 1 };
/* End of lookups/dsearch.c */
+/* vi: aw ai sw=2
+*/
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2015 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
*errmsg = US"absolute file name expected for \"sqlite\" lookup";
else if ((ret = sqlite3_open(CCS filename, &db)) != 0)
{
- *errmsg = (void *)sqlite3_errmsg(db);
+ *errmsg = string_copy(US sqlite3_errmsg(db));
sqlite3_close(db);
db = NULL;
DEBUG(D_lookup) debug_printf_indent("Error opening database: %s\n", *errmsg);
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) Jeremy Harris 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef DISABLE_TLS_RESUME
builtin_macro_create(US"_HAVE_TLS_RESUME");
#endif
+#ifndef DISABLE_WELLKNOWN
+ builtin_macro_create(US"_HAVE_WELLKNOWN");
+#endif
#ifdef EXPERIMENTAL_XCLIENT
builtin_macro_create(US"_HAVE_XCLIENT");
#endif
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
SCH_EHLO, SCH_ETRN, SCH_EXPN, SCH_HELO,
SCH_HELP, SCH_MAIL, SCH_NOOP, SCH_QUIT, SCH_RCPT, SCH_RSET, SCH_STARTTLS,
SCH_VRFY,
+#ifndef DISABLE_WELLKNOWN
+ SCH_WELLKNOWN,
+#endif
#ifdef EXPERIMENTAL_XCLIENT
SCH_XCLIENT,
#endif
ACL_WHERE_NOTQUIT,
ACL_WHERE_QUIT,
ACL_WHERE_STARTTLS,
+#ifndef DISABLE_WELLKNOWN
+ ACL_WHERE_WELLKNOWN,
+#endif
ACL_WHERE_VRFY,
ACL_WHERE_DELIVERY,
#define ACL_BIT_QUIT BIT(ACL_WHERE_QUIT)
#define ACL_BIT_STARTTLS BIT(ACL_WHERE_STARTTLS)
#define ACL_BIT_VRFY BIT(ACL_WHERE_VRFY)
+#ifndef DISABLE_WELLKNOWN
+# define ACL_BIT_WELLKNOWN BIT(ACL_WHERE_WELLKNOWN)
+#endif
#define ACL_BIT_DELIVERY BIT(ACL_WHERE_DELIVERY)
#define ACL_BIT_UNKNOWN BIT(ACL_WHERE_UNKNOWN)
DEBUG(D_expand) debug_printf("try option " name "\n");
/* End of macros.h */
+/* vi: aw ai sw=2
+*/
*************************************************/
/*
- * Copyright (c) The Exim Maintainers 2015 - 2023
+ * Copyright (c) The Exim Maintainers 2015 - 2024
* Copyright (c) Tom Kistner <tom@duncanthrax.net> 2003 - 2015
* License: GPL
* SPDX-License-Identifier: GPL-2.0-or-later
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2021 - 2023 */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* PDKIM - a RFC4871 (DKIM) implementation
*
- * Copyright (c) The Exim Maintainers 2021 - 2023
+ * Copyright (c) The Exim Maintainers 2021 - 2024
* Copyright (C) 2016 - 2020 Jeremy Harris <jgh@exim.org>
* Copyright (C) 2009 - 2016 Tom Kistner <tom@duncanthrax.net>
* SPDX-License-Identifier: GPL-2.0-or-later
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim maintainers 2020 - 2022 */
+/* Copyright (c) The Exim maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
{ "acl_smtp_starttls", opt_stringptr, {&acl_smtp_starttls} },
#endif
{ "acl_smtp_vrfy", opt_stringptr, {&acl_smtp_vrfy} },
+#ifndef DISABLE_WELLKNOWN
+ { "acl_smtp_wellknown", opt_stringptr, {&acl_smtp_wellknown} },
+#endif
{ "add_environment", opt_stringptr, {&add_environment} },
{ "admin_groups", opt_gidlist, {&admin_groups} },
{ "allow_domain_literals", opt_bool, {&allow_domain_literals} },
{ "uucp_from_pattern", opt_stringptr, {&uucp_from_pattern} },
{ "uucp_from_sender", opt_stringptr, {&uucp_from_sender} },
{ "warn_message_file", opt_stringptr, {&warn_message_file} },
+#ifndef DISABLE_WELLKNOWN
+ { "wellknown_advertise_hosts",opt_stringptr, {&wellknown_advertise_hosts} },
+#endif
{ "write_rejectlog", opt_bool, {&write_rejectlog} },
};
*************************************************/
/*
- * Copyright (c) The Exim Maintainers 2016 - 2023
+ * Copyright (c) The Exim Maintainers 2016 - 2024
* Copyright (c) Tom Kistner <tom@duncanthrax.net> 2003-2015
* License: GPL
* SPDX-License-Identifier: GPL-2.0-or-later
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2021 - 2023 */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 - 2021 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2024 */
/* Copyright (c) University of Cambridge 1995 - 2009 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2024 */
/* Copyright (c) University of Cambridge 1995 - 2015 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2021 - 2022 */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2009 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2015 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* These commands need not be synchronized when pipelining */
MAIL_CMD, RCPT_CMD, RSET_CMD,
+#ifndef DISABLE_WELLKNOWN
+ WELLKNOWN_CMD,
+#endif
/* This is a dummy to identify the non-sync commands when not pipelining */
/* These are specials that don't correspond to actual commands */
EOF_CMD, OTHER_CMD, BADARG_CMD, BADCHAR_CMD, BADSYN_CMD,
- TOO_MANY_NONMAIL_CMD };
+ TOO_MANY_NONMAIL_CMD
+};
/* This is a convenience macro for adding the identity of an SMTP command
{ "etrn", sizeof("etrn")-1, ETRN_CMD, TRUE, FALSE },
{ "vrfy", sizeof("vrfy")-1, VRFY_CMD, TRUE, FALSE },
{ "expn", sizeof("expn")-1, EXPN_CMD, TRUE, FALSE },
- { "help", sizeof("help")-1, HELP_CMD, TRUE, FALSE }
+ { "help", sizeof("help")-1, HELP_CMD, TRUE, FALSE },
+#ifndef DISABLE_WELLKNOWN
+ { "wellknown", sizeof("wellknown")-1, WELLKNOWN_CMD, TRUE, FALSE },
+#endif
};
/* This list of names is used for performing the smtp_no_mail logging action. */
[SCH_RSET] = US"RSET",
[SCH_STARTTLS] = US"STARTTLS",
[SCH_VRFY] = US"VRFY",
+#ifndef DISABLE_WELLKNOWN
+ [SCH_WELLKNOWN] = US"WELLKNOWN",
+#endif
#ifdef EXPERIMENTAL_XCLIENT
[SCH_XCLIENT] = US"XCLIENT",
#endif
case HELP_CMD:
case NOOP_CMD:
case ETRN_CMD:
-#ifdef EXPERIMENTAL_WELLKNOWN
+#ifndef DISABLE_WELLKNOWN
case WELLKNOWN_CMD:
#endif
bsmtp_transaction_linecount = receive_linecount;
{
if (log_reject_target)
{
+#ifdef DISABLE_TLS
+ uschar * tls = NULL;
+#else
gstring * g = s_tlslog(NULL);
uschar * tls = string_from_gstring(g);
-
+#endif
log_write(L_connection_reject,
log_reject_target, "%s%s%s dropped by %s%s%s",
LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
We only handle pipelining these responses as far as nonfinal/final groups,
not the whole MAIL/RCPT/DATA response set. */
-for (;;)
- {
- uschar *nl = Ustrchr(msg, '\n');
- if (!nl)
+for (uschar * nl;;)
+ if (!(nl = Ustrchr(msg, '\n')))
{
smtp_printf("%.3s%c%.*s%s\r\n", !final, code, final ? ' ':'-', esclen, esc, msg);
return;
msg = nl + 1;
Uskip_whitespace(&msg);
}
- }
}
smtp_message_code(&smtp_code, &codelen, &user_msg, &log_msg,
where != ACL_WHERE_VRFY);
-/* We used to have sender_address here; however, there was a bug that was not
+/* Get info for logging.
+We used to have sender_address here; however, there was a bug that was not
updating sender_address after a rewrite during a verify. When this bug was
fixed, sender_address at this point became the rewritten address. I'm not sure
this is what should be logged, so I've changed to logging the unrewritten
{
uschar * s = smtp_cmd_data;
Uskip_nonwhite(&s);
- lim = s - smtp_cmd_data; /* atop after method */
+ lim = s - smtp_cmd_data; /* stop after method */
}
what = string_sprintf("%s %.*s", acl_wherenames[where], lim, place);
}
*/
static void
-smtp_user_msg(uschar *code, uschar *user_msg)
+smtp_user_msg(uschar * code, uschar * user_msg)
{
int len = 3;
smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
}
+#ifndef DISABLE_WELLKNOWN
+static int
+smtp_wellknown_handler(void)
+{
+if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
+ {
+ GET_OPTION("acl_smtp_wellknown");
+ if (acl_smtp_wellknown)
+ {
+ uschar * user_msg = NULL, * log_msg;
+ int rc;
+
+ if ((rc = acl_check(ACL_WHERE_WELLKNOWN, NULL, acl_smtp_wellknown,
+ &user_msg, &log_msg)) != OK)
+ return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, rc, user_msg, log_msg);
+ else if (!wellknown_response)
+ return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, ERROR, user_msg, log_msg);
+ smtp_user_msg(US"250", wellknown_response);
+ return 0;
+ }
+ }
+
+smtp_printf("554 not permitted\r\n", SP_NO_MORE);
+log_write(0, LOG_MAIN|LOG_REJECT, "rejected \"%s\" from %s",
+ smtp_cmd_buffer, sender_helo_name, host_and_ident(FALSE));
+return 0;
+}
+#endif
+
+
static int
expand_mailmax(const uschar * s)
{
void (*oldsignal)(int);
pid_t pid;
int start, end, sender_domain, recipient_domain;
- int rc;
- int c;
- uschar *orcpt = NULL;
+ int rc, c;
+ uschar * orcpt = NULL;
int dsn_flags;
gstring * g;
chunking_state = CHUNKING_OFFERED;
}
+#ifndef DISABLE_TLS
/* Advertise TLS (Transport Level Security) aka SSL (Secure Socket Layer)
if it has been included in the binary, and the host matches
tls_advertise_hosts. We must *not* advertise if we are already in a
secure connection. */
-#ifndef DISABLE_TLS
if (tls_in.active.sock < 0 &&
verify_check_host(&tls_advertise_hosts) != FAIL)
{
fl.smtputf8_advertised = TRUE;
}
#endif
+#ifndef DISABLE_WELLKNOWN
+ if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
+ {
+ g = string_catn(g, smtp_code, 3);
+ g = string_catn(g, US"-WELLKNOWN\r\n", 12);
+ }
+#endif
/* Finish off the multiline reply with one that is always available. */
toomany = FALSE;
break; /* HELO/EHLO */
+#ifndef DISABLE_WELLKNOWN
+ case WELLKNOWN_CMD:
+ HAD(SCH_WELLKNOWN);
+ smtp_mailcmd_count++;
+ smtp_wellknown_handler();
+ break;
+#endif
+
#ifdef EXPERIMENTAL_XCLIENT
case XCLIENT_CMD:
{
if ( fl.helo_verify_required
|| verify_check_host(&hosts_require_helo) == OK)
{
- smtp_printf("503 HELO or EHLO required\r\n", SP_NO_MORE);
log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL from %s: no "
"HELO/EHLO given", host_and_ident(FALSE));
+ done = synprot_error(L_smtp_protocol_error, 503, NULL,
+ US"HELO or EHLO required");
break;
}
else if (smtp_mailcmd_max < 0)
if (acl_smtp_etrn) smtp_printf(" ETRN", SP_MORE);
if (acl_smtp_expn) smtp_printf(" EXPN", SP_MORE);
if (acl_smtp_vrfy) smtp_printf(" VRFY", SP_MORE);
+#ifndef DISABLE_WELLKNOWN
+ if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
+ smtp_printf(" WELLKNOWN", SP_MORE);
+#endif
#ifdef EXPERIMENTAL_XCLIENT
if (proxy_session || verify_check_host(&hosts_xclient) != FAIL)
smtp_printf(" XCLIENT", SP_MORE);
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
*************************************************/
/* SPF support.
- Copyright (c) The Exim Maintainers 2015 - 2023
+ Copyright (c) The Exim Maintainers 2015 - 2024
Copyright (c) Tom Kistner <tom@duncanthrax.net> 2004 - 2014
License: GPL
SPDX-License-Identifier: GPL-2.0-or-later
* Exim - an Internet mail transport agent *
*************************************************/
-/* Experimental SPF support.
- Copyright (c) The Exim Maintainers 2016 - 2022
+/* SPF support.
+ Copyright (c) The Exim Maintainers 2016 - 2024
Copyright (c) Tom Kistner <tom@duncanthrax.net> 2004
License: GPL
SPDX-License-Identifier: GPL-2.0-or-later
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim maintainers 2019 - 2023 */
+/* Copyright (c) The Exim maintainers 2019 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* Copyright (c) Phil Pennock 2012 */
/* See the file NOTICE for conditions of use and distribution. */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2019 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim maintainers 2020 - 2023 */
+/* Copyright (c) The Exim maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2020 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim maintainers 2020 - 2023 */
+/* Copyright (c) The Exim maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
+/* Copyright (c) The Exim Maintainers 1995 - 2024 */
/* Copyright (c) Andrew Colin Kissa <andrew@topdog.za.net> 2016 */
/* Copyright (c) University of Cambridge 2016 */
-/* Copyright (c) The Exim Maintainers 1995 - 2021 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
}
/*XXX EXPERIMENTAL_ESMTP_LIMITS ? */
-# ifndef DISABLE_TLS_RESUME
+# if !defined(DISABLE_TLS) && !defined(DISABLE_TLS_RESUME)
GET_OPTION("host_name_extract");
s = ((smtp_transport_options_block *)sx->conn_args.ob)->host_name_extract;
if (!s) s = HNE_DEFAULT;
}
}
#endif
-#ifndef DISABLE_TLS_RESUME
+#if !defined(DISABLE_TLS) && !defined(DISABLE_TLS_RESUME)
GET_OPTION("host_name_extract");
if (!(s = ob->host_name_extract)) s = HNE_DEFAULT;
ehlo_response_lbserver(sx, s);
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2021 - 2022 */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) Jeremy Harris 2015 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2021 - 2023 */
+/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2015 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2023 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
Otherwise the value is ccache_accept, ccache_reject, or ccache_reject_mfnull. */
if (dom_rec->result != ccache_unknown)
- if (!(dbm_file = dbfn_open(US"callout", O_RDWR|O_CREAT, &dbblock, FALSE, TRUE)))
+ if (!(dbm_file = dbfn_open(US"callout", O_RDWR, &dbblock, FALSE, TRUE)))
{
HDEBUG(D_verify) debug_printf_indent("callout cache: not available\n");
}
if (done && addr_rec->result != ccache_unknown)
{
if (!dbm_file)
- dbm_file = dbfn_open(US"callout", O_RDWR|O_CREAT, &dbblock, FALSE, TRUE);
+ dbm_file = dbfn_open(US"callout", O_RDWR, &dbblock, FALSE, TRUE);
if (!dbm_file)
{
HDEBUG(D_verify) debug_printf_indent("no callout cache available\n");
if (!pos_cache && !neg_cache)
return;
-if (!(dbm_file = dbfn_open(US"callout", O_RDWR|O_CREAT, &dbblock, FALSE, TRUE)))
+if (!(dbm_file = dbfn_open(US"callout", O_RDWR, &dbblock, FALSE, TRUE)))
{
HDEBUG(D_verify) debug_printf_indent("quota cache: not available\n");
return;
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2023 */
+/* Copyright (c) The Exim Maintainers 2023 - 2024 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
--- /dev/null
+#!/usr/bin/perl
+#
+###############################################################
+###############################################################
+
+use strict;
+
+use Net::SMTP;
+#use IO::Socket::SSL qw( SSL_ERROR );
+use Net::Domain qw(hostfqdn);
+use Getopt::Long qw(:config default bundling no_ignore_case auto_version);
+use Pod::Usage;
+use Net::Cmd;
+use Data::Dumper;
+
+our @ISA = qw(Net::Cmd);
+
+###############################################################
+###############################################################
+
+my ($smtp,$optsin,$opt,$mess,$rcpt,@headers,$finished_header,$ofh);
+$main::VERSION = '1.2.2';
+
+$optsin = {
+ 'body|b' => \&optset,
+ 'debug|d' => \&optset,
+ 'ehlo|helo|m=s' => \&optset,
+ 'rcptto|recipient|r=s' => \&optset,
+ 'host|h=s' => \&optset,
+ 'from822|u=s' => \&optset,
+ 'vrfy|v' => \&optset,
+ 'expn|e' => \&optset,
+ 'mailfrom|from821|from|f=s' => \&optset,
+ 'port|p=i' => \&optset,
+ 'wellknown|w=s' => \&optset,
+ 'output|W=s' => \&optset,
+ 'include_options|O' => \&optset,
+ 'include_headers|H' => \&optset,
+ 'bounce|B' => \&optset,
+ 'tls|S' => \&optset,
+ 'nostarttls|s' => \&optset,
+ 'stricttls|strict_tls' => \&optset,
+ 'sslargs|tlsargs=s' => \&optset,
+ 'verbose' => \&optset,
+ 'help' => \&optset,
+ 'man' => \&optset,
+};
+map { my $t = $_; $t =~ s/\|.*//; $opt->{$t} = undef; } keys %$optsin;
+GetOptions( %$optsin ) or pod2usage(2);
+pod2usage(1) if $opt->{'help'};
+pod2usage(-exitval => 0, -verbose => 2) if $opt->{'man'};
+
+print _Dumper($opt, 'Options')
+ if $opt->{'debug'};
+
+###############################################################
+###############################################################
+##
+## parameter checking
+##
+###############################################################
+###############################################################
+
+bail( 1, "Host(--host) must be provided" )
+ if !$opt->{'host'};
+
+$opt->{'port'} = $opt->{'tls'} ? 465 : 25
+ if ! $opt->{'port'};
+
+if (!$opt->{'ehlo'})
+{
+ $opt->{'ehlo'} = hostfqdn();
+ fret( "Machine set to $opt->{'ehlo'}" ) if $opt->{'debug'};
+}
+if (!$opt->{'mailfrom'} && !$opt->{'bounce'})
+{
+ $opt->{'mailfrom'} = $ENV{USER}. "@". $opt->{'ehlo'};
+ fret( "MAIL FROM set to $opt->{'mailfrom'}" ) if $opt->{'debug'};
+}
+if (!$opt->{'from822'})
+{
+ $opt->{'from822'} = $opt->{'mailfrom'};
+ fret( "From: set to $opt->{'from822'}" ) if $opt->{'debug'};
+}
+if ($opt->{'bounce'})
+{
+ $opt->{'mailfrom'} = "";
+ $opt->{'from822'} = 'mailer-daemon@'. hostfqdn();
+ fret( "MAIL FROM set to $opt->{'mailfrom'}", "From: set to $opt->{'from822'}" ) if $opt->{'debug'};
+}
+
+bail( 1, "EXPN or VRFY cannot be used without a recipient" )
+ if ($opt->{'expn'} || $opt->{'vrfy'}) && ! $opt->{'rcptto'};
+
+bail( 1, "Either a recipient or well-known resource must be specified" )
+ if ! $opt->{'wellknown'} && ! $opt->{'rcptto'};
+
+bail( 1, "Only one of recipient or well-known resource can be specified" )
+ if $opt->{'wellknown'} && $opt->{'rcptto'};
+
+if ( $opt->{'sslargs'} )
+{
+ my @p = split /[=,]/, $opt->{'sslargs'};
+ $opt->{'sslparams'} = \@p;
+}
+else
+{
+ $opt->{'sslparams'} = [ 'SSL_verify_mode', $opt->{'stricttls'} ? 1 : 0 ];
+}
+fret( _Dumper( $opt->{'sslparams'}, 'sslparams' ) )
+ if $opt->{'debug'} && ( $opt->{'tls'} || ! $opt->{'nostarttls'} );
+
+###############################################################
+###############################################################
+##
+## parameter checking complete. now onto operations
+##
+##
+###############################################################
+###############################################################
+
+
+
+$smtp= Net::SMTP->new( $opt->{'host'},
+ Hello => $opt->{'ehlo'},
+ Debug => $opt->{'debug'},
+ ( $opt->{'tls'} ? ( 'SSL' => $opt->{'sslargs'} || 1 ) : () ),
+ Port => $opt->{'port'},
+ );
+bail( 1, "Connection Failed: $@" )
+ if !$smtp;
+
+if (!$opt->{'nostarttls'})
+{
+ bail( $smtp, 1, "Failed to STARTTLS - $@" )
+ if ! $smtp->starttls( @{$opt->{'sslparams'}} );
+
+ fret( $smtp->message() )
+ if $opt->{'verbose'};
+}
+
+if ($opt->{'wellknown'})
+{
+ bail( $smtp, 1, "Server does not support WELLKNOWN" )
+ if ! $smtp->supports('WELLKNOWN');
+
+ my $e_wk = encode_xtext( $opt->{'wellknown'} );
+
+ bail( $smtp, 1, "Failed to WELLKNOWN - $e_wk", $smtp->message() )
+ if ! ( $smtp->command( 'WELLKNOWN', $e_wk )->response() == CMD_OK );
+
+ fret( "Protocol violation. Code was OK, but not 250", $smtp->code. " - ". $smtp->message )
+ if $smtp->code ne '250';
+
+ $mess = $smtp->message;
+ my ($info,$size);
+ ($info,$mess) = split( /\n/, $mess, 2 );
+ $info =~ /size=(\d+)/i;
+ $size = $1 + 0;
+ $mess = decode_xtext( $mess );
+ fret( "Size mismatch on wellknown fetch", "Expected: ". $size, "Received: ". length($mess) )
+ if length($mess) != $size;
+
+ if ( $opt->{'output'} )
+ {
+ # Output to named file
+ #
+ bail( $smtp, 1, "Unable to open file $opt->{'output'} for WELLKNOWN output - $!" )
+ if ! ( $ofh = IO::File->new("> $opt->{'output'}") );
+
+ print $ofh $mess;
+ $ofh->close;
+ }
+ else
+ {
+ # might be hazardous, output via pager
+ print STDERR "$mess\n";
+ }
+}
+
+if ($opt->{'vrfy'})
+{
+ $smtp->verify($opt->{'vrfy'});
+ fret( $smtp->message() );
+}
+
+if ($opt->{'expn'})
+{
+ $smtp->expand($opt->{'expn'});
+ fret( $smtp->message() );
+}
+
+if ($opt->{'rcptto'})
+{
+ bail( $smtp, 1, "MAIL FROM $opt->{'mailfrom'} failed", $@ )
+ if ! $smtp->mail($opt->{'mailfrom'});
+
+ bail( $smtp, 1, "RCPT TO $opt->{'rcptto'} failed", $@ )
+ if ! $smtp->to($opt->{'rcptto'});
+
+ # handle any recipients on command line
+ while( $rcpt = shift @ARGV )
+ {
+ last if $rcpt eq '--';
+ fret( "RCPT TO $rcpt failed", $@ )
+ if ! $smtp->to($rcpt);
+ }
+
+ bail( $smtp, 1, "Unable to set data mode", @_ )
+ if ! $smtp->data();
+
+ if ($opt->{'body'})
+ {
+ push @headers, "Subject: Test Message\n";
+ $smtp->datasend("From: $opt->{'from822'}\n");
+ $smtp->datasend("To: $opt->{'rcptto'}\n");
+ $smtp->datasend("Subject: Test Message\n");
+ $smtp->datasend("\n");
+ $smtp->datasend("This is a test message\n");
+ $smtp->datasend("generated with mailtest\n");
+ }else
+ {
+ while(<>)
+ {
+ if($finished_header==0)
+ {
+ if (length($_)<=1)
+ {
+ $finished_header = 1;
+ }else
+ {
+ push @headers," ".$_;
+ }
+ }
+ $smtp->datasend("$_");
+ }
+ }
+ if($opt->{'include_headers'} && @headers)
+ {
+ $smtp->datasend("\n Copy of headers follow....\n");
+ foreach(@headers)
+ {
+ $smtp->datasend("$_");
+ }
+ $smtp->datasend("\n");
+ }
+ if($opt->{'include_options'})
+ {
+ $smtp->datasend("\n Copy of options follow....\n");
+ $smtp->datasend(" SMTP HOST $opt->{'host'}\n");
+ $smtp->datasend(" HELO $opt->{'ehlo'}\n");
+ $smtp->datasend(" MAIL FROM: $opt->{'mailfrom'}\n");
+ $smtp->datasend(" RCPT TO: $opt->{'rcptto'}\n\n");
+ }
+ fret( "dataend failed", $@ )
+ if ! $smtp->dataend();
+}
+$smtp->quit();
+
+exit;
+
+##############################################################
+##############################################################
+
+sub
+optset
+{
+ my $n = shift;
+ my $v = shift;
+ #print STDERR "Setting $n to $v\n";
+ $opt->{$n->{'name'}} = $v;
+}
+
+sub
+decode_xtext
+{
+ my $mess = shift;
+ $mess =~ s/[\n\r]//g;
+ $mess =~ s/\+([0-9a-fA-F]{2})/chr(hex($1))/ge;
+ return $mess;
+}
+
+sub
+encode_xtext
+{
+ my $mess = shift;
+ $mess =~ s/([^!-*,-<>-~])/'+'.uc(unpack('H*', $1))/eg;
+ return $mess;
+}
+
+sub
+_Dumper
+{
+ return Data::Dumper->Dump( [$_[0]], [$_[1] || 'VAR1'] );
+}
+
+sub
+fret
+{
+ map { print STDERR $_,"\n"; } @_;
+}
+
+sub
+bail
+{
+ shift->quit
+ if ref($_[0]);
+ my $rc = shift;
+ fret( @_ );
+ exit $rc;
+}
+
+##############################################################
+##############################################################
+
+__END__
+
+=head1 NAME
+
+mailtest - Simple SMTP sending for diagnostics
+
+=head1 SYNOPSIS
+
+mailtest --host host.example.com --rcptto recipient@example.com [ send_options ... ] [ additional recipients ...]
+
+
+Options:
+ --help
+ brief help message
+ --debug
+ enable debugging
+
+ --host host
+ host to connect to
+ --rcptto recipient
+ recipient for message
+
+ --helo machine
+ machine name for EHLO
+
+ --vrfy request VRFY of recipient
+ --expn request EXPN of recipient
+
+ --mailfrom from
+ use as MAIL FROM value
+ --from822 from
+ content From:
+
+ --port port
+ port to connect to
+
+ --body generate body
+ --include_options
+ include Options in body
+ --include_headers
+ include generated headers in body
+
+ --tls perform TLS on connect
+ --nostarttls do no attempt STARTTLS
+ --stricttls Enable strict verification on TLS connection
+
+ --tlsargs arg=value[,arg=value]
+ Explicitly define TLS options.
+
+ --bounce sending as bounce (<>)
+
+ --wellknown path
+ well-known path
+ --output file
+ Output file to receive well-known data
+
+=head1 OPTIONS
+
+=over 8
+
+
+=item B<--help>
+
+Print a brief help message and exits.
+
+=item B<-d, --debug>
+
+Enables debugging, outpus additional information whilst processing requests.
+
+=item B<-h, --host>=I<host>
+
+Specifies the host to connect to. Must be specified and must be IP-resolvable.
+
+=item B<-m, --ehlo>=I<machine>
+
+Specified the machine name to use as the B<EHLO> value. Defaults to the fully-qualified name of the host running the command.
+
+=item B<-r, --rcptto>=I<recipient>
+
+Specifies the recipient of message. This is used as the B<RCPT TO> value.
+
+=item B<-v, --vrfy>
+
+Uses the I<recipient> parameter for the value in a B<VRFY> request. This disables the sending of an email.
+
+=item B<-e, --expn>
+
+Uses the I<recipient> parameter for the value in an B<EXPN> request. This disables the sending of an email.
+
+=item B<-f, --mailfrom>=I<from_address>
+
+Specified the value to use in the B<MAIL FROM> command. Defaults to the current username at the FQDN of the machine B<-m> unless the B<-B> option is used.
+
+=item B<-u, --from822>=I<from_user>
+
+Specified the value to use in the message headers. Defaults to the B<-f> I<from_address> value unless the B<-B> option is used.
+
+=item B<-B, --bounce>
+
+Replace the B<--mailfrom> I<from_address> with B<\<\>> and the B<--from833> I<from_user> with B<mailer-daemon@host> where the host is the value of B<--ehlo> I<machine>
+
+=item B<-p, --port>=I<port>
+
+Specified the port to connect to on the specified host. Defaults to port 25 unless B<-S> is given in which case it defaults to 465.
+
+=item B<-S, --tls>
+
+Specifies that TLS be used directly on the connection prior to any SMTP commands. Changes the connection port to 465 unless it has been explicitly provided. Disables any attempts at B<STARTTLS>.
+
+=item B<-s, --nostarttls>
+
+Disables attempting STARTTLS if offered. Disabled by use of B<-S>.
+
+=item B<--stricttls>
+
+Enables strict verification of the TLS connection. Sets the underlying SSL option B<SSL_verify_mode> to 1/SSL_VERIFY_PEER rather than 0/SSL_VERIFY_NONE. Since the aim of this tool is to test the SMTP protocol behaviour and not the TLS behaviour the decision was made to default the B<SSL_verify_mode> to 0/SSL_VERIFY_NONE.
+
+=item B<--sslargs>=argname=argvalue[,argname=argvalue...]
+
+Allow full control over underlying SSL options. Overrides B<--stricttls>. See the documentation for B<IO::Socket::SSL> for further details.
+
+ --sslargs SSL_verifycn_name=certname.example.com
+
+=item B<-b, --body>
+
+Generate a body for the message being sent.
+
+=item B<-O, --include-options>
+
+Include details of options used in the message body.
+
+=item B<-H, --include-headers>
+
+Include a copy of the generated headers in the message body.
+
+=item B<-w, --wellknown>=I<well-known-path>
+
+Provides the path value for a B<WELLKNOWN> command.
+
+=item B<-W, --output>=I<output_file>
+
+Provides the output file where the B<WELLKNOWN> data should be stored.
+
+=back
+
+=head1 DESCRIPTION
+
+B<mailtest> is a simple utility for testing SMTP connections.
+It is designed to debug endpoints and not for full email generation.
+
+It support a number of basic operations, SEND, VRFY, EXPN, WELLKNOWN.
+
+=head1 COMPATIBILITY
+
+C<mailtest> only requires modules that should be in all normal distributions.
+
+=head1 AUTHOR
+
+Bernard Quatermass <bernardq@exim.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is Copyright (c) 2008,2020,2024 by Bernard Quatermass.
+
+
+=cut
+
+###############################################################
+# vi: sw=4 et
+# End of File
+###############################################################
--- /dev/null
+line 1
+line 2
+last line
--- /dev/null
+line 1
+line 2
+last line
--- /dev/null
+# Exim test configuration 0637
+
+HVH=
+
+.include DIR/aux-var/std_conf_prefix
+
+primary_hostname = myhost.test.ex
+
+# ----- Main settings -----
+
+# ----- ACL -----
+
+# End
--- /dev/null
+# Exim test configuration 4040
+
+SERVER=
+OPT=
+
+.include DIR/aux-var/std_conf_prefix
+
+primary_hostname = myhost.test.ex
+
+# ----- Main settings -----
+
+wellknown_advertise_hosts = 127.0.0.1
+acl_smtp_wellknown = check_wellknown
+
+# ----- ACL -----
+
+begin acl
+
+check_wellknown:
+ accept
+ logwrite = [$sender_host_address] $smtp_command
+ condition = ${if == {${received_port}}{PORT_D}}
+ set acl_c_wellknown = ${lookup {${xtextd:$smtp_command_argument}} \
+ dsearch,ret=full,filter=fileOPT \
+ {DIR/aux-fixed/TESTNUM}}
+ logwrite = [$sender_host_address] -> '$acl_c_wellknown'
+ control = wellknown/$acl_c_wellknown
+
+# End
--- /dev/null
+
+******** SERVER ********
+1999-03-02 09:44:33 exim x.yz daemon started: pid=p1234, no queue runs, listening for SMTP on port PORT_D
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 SMTP call from [127.0.0.1] dropped: too many syntax or protocol errors (last command was "mail from:<u4@cus.cam.ac.uk>", C=MAIL,MAIL,MAIL,MAIL)
--- /dev/null
+
+******** SERVER ********
+1999-03-02 09:44:33 exim x.yz daemon started: pid=p1234, no queue runs, listening for SMTP on port PORT_D port PORT_D2
+1999-03-02 09:44:33 [127.0.0.1] WELLKNOWN acme-response
+1999-03-02 09:44:33 [127.0.0.1] -> 'TESTSUITE/aux-fixed/4040/acme-response'
+1999-03-02 09:44:33 [127.0.0.1] WELLKNOWN acme-response
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN acme-response
+1999-03-02 09:44:33 [127.0.0.1] WELLKNOWN badfile
+1999-03-02 09:44:33 [127.0.0.1] -> ''
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN badfile
+1999-03-02 09:44:33 exim x.yz daemon started: pid=p1235, no queue runs, listening for SMTP on port PORT_D port PORT_D2
+1999-03-02 09:44:33 [127.0.0.1] WELLKNOWN acme-response
+1999-03-02 09:44:33 [127.0.0.1] -> 'TESTSUITE/aux-fixed/4040/acme-response'
+1999-03-02 09:44:33 [127.0.0.1] WELLKNOWN sub/acme-response
+1999-03-02 09:44:33 [127.0.0.1] -> 'TESTSUITE/aux-fixed/4040/sub/acme-response'
+1999-03-02 09:44:33 [127.0.0.1] WELLKNOWN sub/badfile
+1999-03-02 09:44:33 [127.0.0.1] -> ''
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN sub/badfile
+1999-03-02 09:44:33 [127.0.0.1] WELLKNOWN ../badfile
+1999-03-02 09:44:33 [127.0.0.1] -> ''
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN ../badfile
--- /dev/null
+
+******** SERVER ********
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 rejected MAIL from [127.0.0.1]: no HELO/EHLO given
+1999-03-02 09:44:33 SMTP call from [127.0.0.1] dropped: too many syntax or protocol errors (last command was "mail from:<u4@cus.cam.ac.uk>", C=MAIL,MAIL,MAIL,MAIL)
--- /dev/null
+
+******** SERVER ********
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN acme-response
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN badfile
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN sub/badfile
+1999-03-02 09:44:33 H=(test) [127.0.0.1] rejected WELLKNOWN ../badfile
# We use env, because in some environments of our build farm
# the Perl 5.010 interpreter is only reachable via $PATH
+# Copyright (c) The Exim Maintainers 2024
+# SPDX-License-Identifier: GPL-2.0-or-later
+
###############################################################################
# This is the controlling script for the "new" test suite for Exim. It should #
# be possible to export this suite for running on a wide variety of hosts, in #
my ($parm_ipv4, $parm_ipv6, $parm_ipv6_stripped);
my $parm_hostname;
+# Convenience for regex'
+# for tighter, see https://metacpan.org/dist/IO-Socket-IP/source/lib/IO/Socket/IP.pm#L37
+my $re_ipv4 = qr/\d{1,3}(?:\.\d{1,3}){3}/;
+my $re_6g = qr/[[:xdigit:]]{1,4}/;
+my $re_6s = qr/${re_6g}:/;
+my $re_ipv6 = qr/${re_6s}{0,7}${re_6g}(?:::${re_6s}{0,5}${re_6g})?/;
+my $re_ip = qr/(?:${re_ipv4}|${re_ipv6})/;
+
###############################################################################
###############################################################################
s/TLS error on connection \(gnutls_handshake\): Error in the pull function\./a TLS session is required but an attempt to start TLS failed/g;
# (replace old with new, hoping that old only happens in one situation)
- s/TLS error on connection to \d{1,3}(.\d{1,3}){3} \[\d{1,3}(.\d{1,3}){3}\] \(gnutls_handshake\): A TLS packet with unexpected length was received./a TLS session is required for ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4], but an attempt to start TLS failed/g;
+ s/TLS error on connection to ${re_ipv4} \[${re_ipv4}\] \(gnutls_handshake\): A TLS packet with unexpected length was received./a TLS session is required for ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4], but an attempt to start TLS failed/g;
s/TLS error on connection from \[127.0.0.1\] \(recv\): A TLS packet with unexpected length was received./TLS error on connection from [127.0.0.1] (recv): The TLS connection was non-properly terminated./g;
# signature algorithm names
s/\(port=(\d+)/"(port=" . new_value($1, "%s", \$next_port)/e;
# This handles "connection from" and the like, when the port is given
- if (!/listening for SMTP on/ && !/Connecting to/ && !/=>/ && !/->/
- && !/\*>/&& !/==/ && !/\*\*/ && !/Connection refused/ && !/in response to/
- && !/T(?:ransport)?:/)
- {
- s/\[([a-z\d:]+|\d+(?:\.\d+){3})\]:(\d+)/"[".$1."]:".new_value($2,"%s",\$next_port)/ie;
- }
+ s/(\[${re_ip}\]:)(\d+)/$1.new_value($2,"%s",\$next_port)/ie
+ unless ( /listening for SMTP on/ || /Connecting to/
+ || /[=*-]>/ || /==/ || /\*\*/
+ || /Connection refused/ || /in response to/
+ || /T(?:ransport)?:/
+ );
# Port in host address in spool file output from -Mvh
s/^(--?host_address) (.*[:.])\d+$/$1 ${2}9999/;
# because they will be different in different binaries.
next if /^$time_pid?
- (?: Berkeley\ DB:\s
- | Probably\ (?:Berkeley\ DB|ndbm|GDBM)
- | Using\ tdb
+ (?: .*\sBerkeley\ DB
+ | \sProbably\ (?:Berkeley\ DB|ndbm|GDBM)
+ | \sUsing\ (?:tdb|sqlite3)
| Authenticators:
| Lookups(?:\(built-in\))?:
| Support\ for:
# We invoke Exim with -D, so we hit this new message as of Exim 4.73:
next if /^macros_trusted overridden to true by whitelisting/;
+ # Hints-db writes seem to have variable sizes for values
+ s/ dbfn_write: key=.+ datalen \K\d+$/NNN/;
+
# We have to omit the localhost ::1 address so that all is well in
# the IPv4-only case.
if (/looked up these IP addresses/);
next if /name=localhost address=::1/;
- # drop pdkim debugging header
+ # DKIM: Not all builds include
next if /^DKIM( <<<<<<<<<<<<<<<<<<<<<<<<<<<<<+|: no signatures)$/;
+ next if /try option acl_smtp_dkim$/;
# Some platforms have TIOCOUT, some do not
next if /\d+ bytes remain in socket output buffer$/;
# DISABLE_OCSP
next if /in hosts_requ(est|ire)_ocsp\? (no|yes)/;
+ # WELLKNOWN
+ next if / in wellknown_advertise_hosts\?/;
+
# SUPPORT_PROXY
next if /host in hosts_proxy\?/;
next if / in limits_advertise_hosts?\? no \(matched "!\*"\)/;
# Experimental_XCLIENT
- next if / in hosts_xclient?\? no \(option unset\)/;
+ next if / in hosts_xclient\? no \(option unset\)/;
+
+ # Experimental_WELLKNOWN
+ next if / in hosts_wellknown\? no \(option unset\)/;
# TCP Fast Open
next if /^(ppppp )?setsockopt FASTOPEN: Network Error/;
sub check_running_dovecot
{
-system('dovecot --version >/dev/null');
+system('dovecot --version >/dev/null 2>&1');
if ($? == 0)
{
print "Dovecot appears to be available\n";
}
elsif (/^Support for: (.*)/)
- {
+ { # Compile-time features - exim -bV
print;
@temp = split /(\s+)/, $1;
push(@temp, ' ');
if (!defined $parm_malware{$1}) { $wantthis = 0; last; }
}
elsif (/^(not )?feature (.*)$/)
- {
+ { #a macro name, or lack thereof - -bP macros
# move to a subroutine?
my $eximinfo = "$parm_exim -C $parm_cwd/test-config -DDIR=$parm_cwd -bP macro $2";
--- /dev/null
+# mail before ehlo
+exim -bd -DSERVER=server -oX PORT_D
+****
+client 127.0.0.1 PORT_D
+??? 220
+mail from:<u1@cus.cam.ac.uk>
+??? 503 HELO or EHLO required
+mail from:<u2@cus.cam.ac.uk>
+??? 503
+mail from:<u3@cus.cam.ac.uk>
+??? 503
+mail from:<u4@cus.cam.ac.uk>
+??? 503-
+??? 503 Too many
+???*
+****
+killdaemon
+no_stderr_check
fail,subdir(..):${lookup{..} dsearch,filter=subdir {DIR/aux-fixed}{$value}{FAIL}}
fail,subdir(.) :${lookup{.} dsearch,filter=subdir {DIR/aux-fixed}{$value}{FAIL}}
fail,subdir(f) :${lookup{TESTNUM.tst} dsearch,filter=subdir {DIR/aux-fixed}{$value}{FAIL}}
+ok,subdir(..d) :${lookup{..subdir} dsearch,filter=subdir {DIR/aux-fixed/TESTNUM.dir}{$value}{FAIL}}
+fail.path: ${lookup{TESTNUM.dir/regfile} dsearch {DIR/aux-fixed}{$value}{FAIL}}
+ok.path: ${lookup{TESTNUM.dir/regfile} dsearch,key=path {DIR/aux-fixed}{$value}{FAIL}}
cachelayer tests
fail: ${lookup{test-data} dsearch {DIR/} {$value}{FAIL}}
--- /dev/null
+# ESMTP WELLNOWN server response
+#
+# when WELLKNOWN leaves EXPERIMENTAL, add standalone tests
+# for ${xtextd:str} to 0002
+#
+#
+exim -DSERVER=server -bd -oX PORT_D:PORT_D2
+****
+#
+client 127.0.0.1 PORT_D
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250-WELLKNOWN
+??? 250 HELP
+WELLKNOWN acme-response
+??? 250-SIZE
+??? 250-
+??? 250-
+??? 250
+QUIT
+??? 221
+****
+#
+# not advertised conditional on hosts_wellknown
+client HOSTIPV4 PORT_D
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250 HELP
+QUIT
+??? 221
+****
+#
+# deny by acl
+client 127.0.0.1 PORT_D2
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250-WELLKNOWN
+??? 250 HELP
+WELLKNOWN acme-response
+??? 550
+QUIT
+??? 221
+****
+#
+# nonexistent file
+client 127.0.0.1 PORT_D
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250-WELLKNOWN
+??? 250 HELP
+WELLKNOWN badfile
+??? 550
+QUIT
+??? 221
+****
+#
+killdaemon
+#
+exim -DSERVER=server -DOPT=,key=path -bd -oX PORT_D:PORT_D2
+****
+#
+# dsearch with key=path permission
+# basic good file
+client 127.0.0.1 PORT_D
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250-WELLKNOWN
+??? 250 HELP
+WELLKNOWN acme-response
+??? 250-SIZE
+??? 250-
+??? 250-
+??? 250
+QUIT
+??? 221
+****
+#
+# subdir/good file
+client 127.0.0.1 PORT_D
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250-WELLKNOWN
+??? 250 HELP
+WELLKNOWN sub/acme-response
+??? 250-SIZE
+??? 250-
+??? 250-
+??? 250
+QUIT
+??? 221
+****
+#
+# nonexistent file
+client 127.0.0.1 PORT_D
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250-WELLKNOWN
+??? 250 HELP
+WELLKNOWN sub/badfile
+??? 550
+QUIT
+??? 221
+****
+#
+# dotdot trap
+client 127.0.0.1 PORT_D
+??? 220
+EHLO test
+??? 250-
+??? 250-SIZE
+??? 250-LIMITS
+??? 250-8BITMIME
+??? 250-PIPELINING
+??? 250-WELLKNOWN
+??? 250 HELP
+WELLKNOWN ../badfile
+??? 550
+QUIT
+??? 221
+****
+#
+killdaemon
--- /dev/null
+support ESMTP_Wellknown
Exim version x.yz ....
+Hints DB:
environment after trimming:
USER=CALLER
configuration file is TESTSUITE/test-config
╰─────result: protected:░░
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
USER=CALLER
configuration file is TESTSUITE/test-config
\_____result: protected:
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
USER=CALLER
configuration file is TESTSUITE/test-config
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
1999-03-02 09:44:33 no host name found for IP address V4NET.11.12.13
Exim version x.yz ....
+Hints DB:
environment after trimming:
USER=CALLER
configuration file is TESTSUITE/test-config
╰──(tainted)
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1239
configuration file is TESTSUITE/test-config
>>> end of ACL "check_data": DENY
LOG: 10HmbD-000000005vi-0000 H=(test) [V4NET.0.0.0] F=<> rejected after DATA: reply_address=<>
Exim version x.yz ....
+Hints DB:
changed uid/gid: -C, -D, -be or -bf forces real uid
uid=CALLER_UID gid=CALLER_GID pid=p1240
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
1999-03-02 09:44:33 ACL "warn" with "message" setting found in a non-message (EHLO or HELO) ACL: cannot specify header lines here: message ignored
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= ok@test3 H=[10.9.8.8] U=CALLER P=smtp S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
>>> host in ignore_fromline_hosts? no (option unset)
LOG: 10HmaY-000000005vi-0000 <= myfriend@there.test.ex H=(exim.test.ex) [V4NET.11.12.13] P=esmtp S=sss
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host ten-1.test.ex [V4NET.0.0.1] MX=5 dnssec=no
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host myhost.test.ex [V4NET.10.10.10]
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host myhost.test.ex [V4NET.10.10.10]
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=2 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
>>> end of ACL "check_recipient": ACCEPT
LOG: SMTP data timeout (message abandoned) on connection from (test) [V4NET.0.0.1] F=<userx@test.ex> D=qqs
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
environment after trimming:
>>> end of ACL "check_recipient": DENY
LOG: H=ten-1.test.ex (test) [V4NET.0.0.1] F=<userx@cam.ac.uk> rejected RCPT <userx@cam.ac.uk>: relay not permitted
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
host ten-3.test.ex [V4NET.0.0.3] MX=7 dnssec=no
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
host ten-3.test.ex [V4NET.0.0.3] MX=7 dnssec=no
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host ten-1.test.ex [V4NET.0.0.1] MX=5 dnssec=no
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host myhost.test.ex [V4NET.10.10.10]
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host myhost.test.ex [V4NET.10.10.10]
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
no more routers
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=2 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
failuphost router forced address failure
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=2 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=1 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=1 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=2 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=1 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Completed
>>>>>>>>>>>>>>>> Exim pid=p1239 (qrun-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
End queue run: pid=p1234 -qq
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
LOG: MAIN
** a@test.ex F=<CALLER@test.ex> R=client T=send_to_server H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after pipelined MAIL FROM:<CALLER@test.ex>: 550 NO
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
End queue run: pid=p1235 -qq
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
LOG: MAIN
** b@test.ex F=<CALLER@test.ex> R=client T=send_to_server H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<b@test.ex>: 550 Unknown
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Completed
>>>>>>>>>>>>>>>> Exim pid=p1250 (qrun-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
c.domain in "a.domain"? no (end of list)
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
Writing spool header file: TESTSUITE/spool//input//hdr.10HmbJ-000000005vi-0000
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "CALLER": cache not available
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
seeking password data for user "CALLER": cache not available
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "root": cache not available
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
seeking password data for user "root": cache not available
changed uid/gid: post-delivery tidying
uid=EXIM_UID gid=EXIM_GID pid=p1235
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1237
seeking password data for user "root": cache not available
LOG: MAIN
<= <> R=10HmaY-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1238
seeking password data for user "root": cache not available
>>>>>>>>>>>>>>>> Exim pid=p1235 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1240
seeking password data for user "root": cache not available
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1241
seeking password data for user "root": cache not available
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from (test) [1.2.3.4] D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from (test) [V4NET.9.8.7] D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
transport: <none>
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>> list element: @[]
>>> rhubarb.custard in helo_lookup_domains? no (end of list)
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "CALLER": cache not available
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
seeking password data for user "CALLER": cache not available
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@the.local.host.name U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1235 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@the.local.host.name U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
created log directory TESTSUITE/spool/log
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Completed
>>>>>>>>>>>>>>>> Exim pid=p1235 (qrun-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Completed
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1238 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
End queue run: pid=p1234
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
End queue run: pid=p1235
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
LOG: MAIN
Completed
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -N -odi -Mc 10HmaY-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
** d3@myhost.test.ex R=ut4 T=ut4 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<d3@myhost.test.ex>: 550 hard error
locking TESTSUITE/spool/db/retry.lockfile
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= <> R=10HmaX-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
f3@myhost.test.ex <f3@myhost.test.ex>: error ignored
log writing disabled
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= <> R=10HmaX-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1239 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1241 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1242 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1243 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1244 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1245 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1246 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1247 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1248 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1249 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1250 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1251 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1252 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1253 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1254 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1255 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1256 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1257 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1258 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1259 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1260 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1237 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
End queue run: pid=p1234 -qf
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
defer_aaaa@myhost.test.ex
locking TESTSUITE/spool/db/retry.lockfile
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= <> R=10HmaX-000000005vi-0000 U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "CALLER": cache not available
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
** userx@test.ex R=r1: forced fail
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= <> R=10HmaX-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "CALLER": cache not available
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
seeking password data for user "CALLER": cache not available
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1236
seeking password data for user "CALLER": cache not available
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaY-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1238
seeking password data for user "CALLER": cache not available
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
x@y in "*"? yes (matched "*")
retry for R:x@y = * 0 0
dbfn_read: key=R:x@y
+ dbfn_read: null return
failing_interval=ttt message_age=ttt
Writing retry data for R:x@y
first failed=dddd last try=dddd next try=+1 expired=1
errno=-44 more_errno=dd,A H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<x@y>: 451 Temporary error
- dbfn_write: key=R:x@y
+ dbfn_write: key=R:x@y datalen NNN
*@V4NET.0.0.0 in "*"?
list element: *
address match test: subject=*@V4NET.0.0.0 pattern=*
*@V4NET.0.0.0 in "*"? yes (matched "*")
retry for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S (y) = * 0 0
dbfn_read: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
+ dbfn_read: null return
failing_interval=ttt message_age=ttt
on queue longer than maximum retry
Writing retry data for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
first failed=dddd last try=dddd next try=+0 expired=0
errno=dd more_errno=dd,A Network Error
- dbfn_write: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
+ dbfn_write: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S datalen NNN
timed out: all retries expired
LOG: MAIN
** x@y: retry timeout exceeded
end of retry processing
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xd7715ced -MCd bounce-message -odi -odi -t -oem -oi -f <> -E10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xd7715ced -MCd local-accept-delivery -odi -Mc 10HmaY-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1237
configuration file is TESTSUITE/test-config
Considering: CALLER@myhost.test.ex
unique = CALLER@myhost.test.ex
dbfn_read: key=R:myhost.test.ex
+ dbfn_read: null return
dbfn_read: key=R:CALLER@myhost.test.ex
+ dbfn_read: null return
dbfn_read: key=R:CALLER@myhost.test.ex:<>
+ dbfn_read: null return
no domain retry record
no address retry record
CALLER@myhost.test.ex: queued for routing
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1235 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1238 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
returned from EXIM_DBOPEN: 0xAAAAAAAA
opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR
dbfn_read: key=remote
+ dbfn_read: size 40 return
callout cache: found domain record for remote
dbfn_read: key=qq@remote
+ dbfn_read: null return
callout cache: no address record found for qq@remote
EXIM_DBCLOSE(0xAAAAAAAA)
closed hints database and lockfile
cmdlog: '220:EHLO:250:MAIL:250:RCPT:550:QUIT:250'
locking TESTSUITE/spool/db/callout.lockfile
locked TESTSUITE/spool/db/callout.lockfile
- EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR|O_CREAT
+ EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_write: key=remote
+ opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR
+ dbfn_write: key=remote datalen NNN
wrote callout cache domain record for remote:
result=1 postmaster=0 random=0
- dbfn_write: key=qq@remote
+ dbfn_write: key=qq@remote datalen NNN
wrote negative callout cache address record for qq@remote
EXIM_DBCLOSE(0xAAAAAAAA)
closed hints database and lockfile
returned from EXIM_DBOPEN: 0xAAAAAAAA
opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR
dbfn_read: key=remote
+ dbfn_read: size 40 return
callout cache: found domain record for remote
dbfn_read: key=qq@remote
+ dbfn_read: size 16 return
callout cache: found address record for qq@remote
callout cache: address record is negative
EXIM_DBCLOSE(0xAAAAAAAA)
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
environment after trimming:
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715dfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
environment after trimming:
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -N -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
### _data from a multi-step expansion
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -N -odi -Mc 10HmaY-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1238
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
taking data from address
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd autoreply -odi -odi -t -oem -oi -f <> -E10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaY-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1239
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
** x@uppercase.test.ex R=r1 T=t1 H=uppercase.test.ex [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<x@UpperCase.test.ex>: 550 Unknown
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= <> R=10HmaX-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>> accept: condition test succeeded in ACL "mail"
>>> end of ACL "mail": ACCEPT
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
returned from EXIM_DBOPEN: 0xAAAAAAAA
opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR
dbfn_read: key=y
+ dbfn_read: null return
callout cache: no domain record found for y
dbfn_read: key=x@y
+ dbfn_read: null return
callout cache: no address record found for x@y
EXIM_DBCLOSE(0xAAAAAAAA)
closed hints database and lockfile
cmdlog: '220:EHLO:250:MAIL:250:RCPT:250:QUIT:220'
locking TESTSUITE/spool/db/callout.lockfile
locked TESTSUITE/spool/db/callout.lockfile
- EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR|O_CREAT
+ EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_write: key=y
+ opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR
+ dbfn_write: key=y datalen NNN
wrote callout cache domain record for y:
result=1 postmaster=0 random=0
- dbfn_write: key=x@y
+ dbfn_write: key=x@y datalen NNN
wrote positive callout cache address record for x@y
EXIM_DBCLOSE(0xAAAAAAAA)
closed hints database and lockfile
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
returned from EXIM_DBOPEN: 0xAAAAAAAA
opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR
dbfn_read: key=y
+ dbfn_read: size 40 return
callout cache: found domain record for y
dbfn_read: key=x@y
+ dbfn_read: size 16 return
callout cache: found address record for x@y
callout cache: address record is positive
EXIM_DBCLOSE(0xAAAAAAAA)
******** SERVER ********
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1238 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1239
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
search_open: lsearch "TESTSUITE/aux-fixed/0437.ls"
search_find: file="TESTSUITE/aux-fixed/0437.ls"
key="spool" partial=-1 affix=NULL starflags=0 opts=NULL
******** SERVER ********
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "CALLER": cache not available
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
exim: bad -f address "abc@somewhere.": domain is malformed (trailing dot not allowed)
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
seeking password data for user "CALLER": cache not available
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
seeking password data for user "CALLER": cache not available
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1239
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
** userx@test.ex R=r1 T=t1 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<userx@test.ex>: 550 NO
set_process_info: pppp tidying up after delivering 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= <> R=10HmaX-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: smtp_connection MAIN
Exim version x.yz ....
+Hints DB:
changed uid/gid: -C, -D, -be or -bf forces real uid
uid=CALLER_UID gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "CALLER": cache not available
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
seeking password data for user "CALLER": cache not available
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
created log directory TESTSUITE/spool/log
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
>>>>>>>>>>>>>>>> Exim pid=p1239 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
>>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
LOG: MAIN
** userx@myhost.test.ex: retry timeout exceeded
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= <> R=10HmaX-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
End queue run: pid=p1234 -qf
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
LOG: MAIN
** userx@myhost.test.ex: retry timeout exceeded
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= <> R=10HmaZ-000000005vi-0000 U=EXIMUSER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1236 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
>>>>>>>>>>>>>>>> Exim pid=p1235 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
end of retry processing
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1239 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1241 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1242 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1243 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1244 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1245 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1246 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1247 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1248 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1249 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1250 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1251 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1252 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1253 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1254 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1255 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1256 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1257 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1258 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1259 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1260 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
******** SERVER ********
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1235 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1237 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
01:01:01 p1237 LOG: smtp_connection MAIN
01:01:01 p1237 SMTP connection from (test.ex) [127.0.0.1] D=qqs closed by QUIT
01:01:01 p1239 Exim version x.yz uid=EXIM_UID gid=EXIM_GID pid=p1239 D=fff9ffff
+01:01:01 p1239 Hints DB:
01:01:01 p1239 macros_trusted overridden to true by whitelisting
01:01:01 p1239 changed uid/gid: forcing real = effective
01:01:01 p1239 uid=uuuu gid=EXIM_GID pid=p1239
******** SERVER ********
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
p1235 ␉id░10HmaX-000000005vi-0000↩
p1235 ␉for░dest_1@test.ex
p1235 ╰──(tainted)
-p1235 try option acl_smtp_dkim
p1235 try option acl_smtp_data
p1235 ╭considering: ${tod_full}
p1235 ├───expanded: ${tod_full}
p1236 ␉id░10HmaY-000000005vi-0000↩
p1236 ␉for░dest_2@test.ex
p1236 ╰──(tainted)
-p1236 try option acl_smtp_dkim
p1236 try option acl_smtp_data
p1236 ╭considering: ${tod_full}
p1236 ├───expanded: ${tod_full}
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= fred@myhost.test.ex U=root P=local-smtp S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=q.qqqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= fred@myhost.test.ex U=root P=local-smtp S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=q.qqqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= fred@myhost.test.ex U=root P=local-smtp S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=q.qqqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= fred@myhost.test.ex U=root P=local-smtp S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
SMTP connection from root D=q.qqqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
<= fred@myhost.test.ex U=root P=local-smtp S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
writing neg-cache entry for v6.test.ex-A-xxxx, ttl 3000
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
******** SERVER ********
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1238 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1239
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1239 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1240
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1240 (daemon) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1241
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Completed
>>>>>>>>>>>>>>>> Exim pid=p1245 (qrun-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Completed
>>>>>>>>>>>>>>>> Exim pid=p1246 (continued-transport) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
End queue run: pid=p1234 -qqf
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Completed
>>>>>>>>>>>>>>>> Exim pid=p1252 (qrun-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Completed
>>>>>>>>>>>>>>>> Exim pid=p1253 (continued-transport) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
End queue run: pid=p1235 -qqf
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Completed
>>>>>>>>>>>>>>>> Exim pid=p1259 (qrun-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Completed
>>>>>>>>>>>>>>>> Exim pid=p1260 (continued-transport) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: smtp_connection MAIN
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: smtp_connection MAIN
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
search_tidyup called
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
seeking password data for user "CALLER": cache not available
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
******** SERVER ********
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DOPT=y -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1239
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1241 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1242 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1243 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
### wait for db startup, set password on the root user
### create testdb and extra users
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
close MYSQL connection: 127.0.0.1:PORT_N/test/root
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
01:01:01 p1235 Exim version x.yz uid=CALLER_UID gid=CALLER_GID pid=p1235 D=fff9ffff
+01:01:01 p1235 Hints DB:
01:01:01 p1235 macros_trusted overridden to true by whitelisting
01:01:01 p1235 changed uid/gid: forcing real = effective
01:01:01 p1235 uid=uuuu gid=CALLER_GID pid=p1235
01:01:01 p1235 close MYSQL connection: 127.0.0.1:PORT_N/test/root
01:01:01 p1235 >>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1237
configuration file is TESTSUITE/test-config
WARNING: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
close PGSQL connection: localhost:PORT_N/test/CALLER
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1236
configuration file is TESTSUITE/test-config
close PGSQL connection: localhost:PORT_N/test/CALLER
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
1999-03-02 09:44:33 this is a warning at TESTSUITE/aux-fixed/3000.pl line 25.
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: -C, -D, -be or -bf forces real uid
uid=CALLER_UID gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
>>> host in chunking_advertise_hosts?
>>> host in chunking_advertise_hosts? no (end of list)
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
seeking password data for user "CALLER": cache not available
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@the.local.host.name U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
DNS lookup of a-aa.test.ex (A/AAAA) requested AD, but got AA
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
DNS faked the AD bit (got AA and matched with dns_trust_aa (test.ex in *))
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
1999-03-02 09:44:33 10HmaX-000000005vi-0000 == userx@myhost.test.ex R=localuser T=maildir_tagged_appendfile defer (-1): Expansion of "${if eq{0}{1}{rhubarb}" (maildir_tag for maildir_tagged_appendfile transport) failed: syntax error in "if" item - "fail" expected
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@myhost.test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1237
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaY-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1238
configuration file is TESTSUITE/test-config
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1240
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaZ-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1241
configuration file is TESTSUITE/test-config
userx@test.ex in "*"? yes (matched "*")
retry for T:userx@test.ex = * 0 0
dbfn_read: key=T:userx@test.ex
+ dbfn_read: null return
failing_interval=ttt message_age=ttt
Writing retry data for T:userx@test.ex
first failed=dddd last try=dddd next try=+86400 expired=0
errno=-22 more_errno=dd mailbox is full (MTA-imposed quota exceeded while writing to tmp/MAILDIR.myhost.test.ex)
- dbfn_write: key=T:userx@test.ex
+ dbfn_write: key=T:userx@test.ex datalen NNN
EXIM_DBCLOSE(0xAAAAAAAA)
closed hints database and lockfile
end of retry processing
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1243
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmbA-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1244
configuration file is TESTSUITE/test-config
Considering: userx@test.ex
unique = userx@test.ex
dbfn_read: key=R:test.ex
+ dbfn_read: null return
dbfn_read: key=R:userx@test.ex
+ dbfn_read: null return
dbfn_read: key=R:userx@test.ex:<CALLER@test.ex>
+ dbfn_read: null return
no domain retry record
no address retry record
userx@test.ex: queued for routing
returned from EXIM_DBOPEN: 0xAAAAAAAA
opened hints database TESTSUITE/spool/db/retry: flags=O_RDONLY
dbfn_read: key=T:userx@test.ex
+ dbfn_read: size 154 return
retry record exists: age=ttt (max 1w)
time to retry = tttt expired = 0
EXIM_DBCLOSE(0xAAAAAAAA)
userx@test.ex in "*"? yes (matched "*")
retry for T:userx@test.ex = * 0 0
dbfn_read: key=T:userx@test.ex
+ dbfn_read: size 154 return
failing_interval=ttt message_age=ttt
Writing retry data for T:userx@test.ex
first failed=dddd last try=dddd next try=+86400 expired=0
errno=-22 more_errno=dd mailbox is full (MTA-imposed quota exceeded while writing to tmp/MAILDIR.myhost.test.ex)
- dbfn_write: key=T:userx@test.ex
+ dbfn_write: key=T:userx@test.ex datalen NNN
EXIM_DBCLOSE(0xAAAAAAAA)
closed hints database and lockfile
end of retry processing
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=CALLER_GID pid=p1234
configuration file is TESTSUITE/test-config
search_tidyup called
exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-000000005vi-0000
Exim version x.yz ....
+Hints DB:
changed uid/gid: forcing real = effective
uid=uuuu gid=EXIM_GID pid=p1235
configuration file is TESTSUITE/test-config
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
created log directory TESTSUITE/spool/log
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
>>>>>>>>>>>>>>>> Exim pid=p1235 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
LOG: MAIN
<= CALLER@test.ex U=CALLER P=local S=sss
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
trusted user
admin user
LOG: MAIN
remote host address is the local host: some.host (while routing <"ACCEPT hosts=localhost lookup=byname"@some.host>)
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
no more routers
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=2 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
q router forced address failure
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=2 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
message: bad command yield: ERROR cannot route this one (ERROR)
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=1 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
message: cannot route this one (DEFER)
>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=1 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host ten-1.test.ex [V4NET.0.0.1]
>>>>>>>>>>>>>>>> Exim pid=p1238 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
host 127.0.0.1 [127.0.0.1]
>>>>>>>>>>>>>>>> Exim pid=p1239 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
message: cannot route this one (FREEZE)
>>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=1 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
dropping to exim gid; retaining priv uid
transport: null
>>>>>>>>>>>>>>>> Exim pid=p1241 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
configuration file is TESTSUITE/test-config
admin user
host in hosts_connection_nolog? no (option unset)
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
╰──(tainted)
----------- start cutthrough headers send -----------
----------- done cutthrough headers send ------------
-try option acl_smtp_dkim
try option acl_smtp_data
╭considering: ${tod_full}
├───expanded: ${tod_full}
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
╰──(tainted)
----------- start cutthrough headers send -----------
----------- done cutthrough headers send ------------
-try option acl_smtp_dkim
try option acl_smtp_data
╭considering: ${tod_full}
├───expanded: ${tod_full}
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
╰──(tainted)
----------- start cutthrough headers send -----------
----------- done cutthrough headers send ------------
-try option acl_smtp_dkim
try option acl_smtp_data
╭considering: ${tod_full}
├───expanded: ${tod_full}
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
╰──(tainted)
----------- start cutthrough headers send -----------
----------- done cutthrough headers send ------------
-try option acl_smtp_dkim
try option acl_smtp_data
╭considering: ${tod_full}
├───expanded: ${tod_full}
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
╰──(tainted)
----------- start cutthrough headers send -----------
----------- done cutthrough headers send ------------
-try option acl_smtp_dkim
try option acl_smtp_data
╭considering: ${tod_full}
├───expanded: ${tod_full}
SMTP connection from CALLER D=qqs closed by QUIT
>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
+Hints DB:
environment after trimming:
PATH=<munged>
adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
╰──(tainted)
----------- start cutthrough headers send -----------
----------- done cutthrough headers send ------------
-try option acl_smtp_dkim
try option acl_smtp_data
╭considering: ${tod_full}
├───expanded: ${tod_full}
--- /dev/null
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> mail from:<u1@cus.cam.ac.uk>
+??? 503 HELO or EHLO required
+<<< 503 HELO or EHLO required
+>>> mail from:<u2@cus.cam.ac.uk>
+??? 503
+<<< 503 HELO or EHLO required
+>>> mail from:<u3@cus.cam.ac.uk>
+??? 503
+<<< 503 HELO or EHLO required
+>>> mail from:<u4@cus.cam.ac.uk>
+??? 503-
+<<< 503-HELO or EHLO required
+??? 503 Too many
+<<< 503 Too many syntax or protocol errors
+???*
+Expected EOF read
+End of script
> fail,subdir(..):FAIL
> fail,subdir(.) :FAIL
> fail,subdir(f) :FAIL
+> ok,subdir(..d) :..subdir
+> Failed: lookup of "2500.dir/regfile" gave DEFER: key for dsearch lookup contains a slash: 2500.dir/regfile
+> ok.path: 2500.dir/regfile
>
> cachelayer tests
> fail: FAIL
--- /dev/null
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [127.0.0.1]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250-WELLKNOWN
+<<< 250-WELLKNOWN
+??? 250 HELP
+<<< 250 HELP
+>>> WELLKNOWN acme-response
+??? 250-SIZE
+<<< 250-SIZE=24
+??? 250-
+<<< 250-line+201+0A
+??? 250-
+<<< 250-line+202+0A
+??? 250
+<<< 250 last+20line+0A
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to ip4.ip4.ip4.ip4 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [ip4.ip4.ip4.ip4]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250 HELP
+<<< 250 HELP
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to 127.0.0.1 port 1226 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [127.0.0.1]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250-WELLKNOWN
+<<< 250-WELLKNOWN
+??? 250 HELP
+<<< 250 HELP
+>>> WELLKNOWN acme-response
+??? 550
+<<< 550 Administrative prohibition
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [127.0.0.1]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250-WELLKNOWN
+<<< 250-WELLKNOWN
+??? 250 HELP
+<<< 250 HELP
+>>> WELLKNOWN badfile
+??? 550
+<<< 550 Administrative prohibition
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [127.0.0.1]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250-WELLKNOWN
+<<< 250-WELLKNOWN
+??? 250 HELP
+<<< 250 HELP
+>>> WELLKNOWN acme-response
+??? 250-SIZE
+<<< 250-SIZE=24
+??? 250-
+<<< 250-line+201+0A
+??? 250-
+<<< 250-line+202+0A
+??? 250
+<<< 250 last+20line+0A
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [127.0.0.1]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250-WELLKNOWN
+<<< 250-WELLKNOWN
+??? 250 HELP
+<<< 250 HELP
+>>> WELLKNOWN sub/acme-response
+??? 250-SIZE
+<<< 250-SIZE=24
+??? 250-
+<<< 250-line+201+0A
+??? 250-
+<<< 250-line+202+0A
+??? 250
+<<< 250 last+20line+0A
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [127.0.0.1]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250-WELLKNOWN
+<<< 250-WELLKNOWN
+??? 250 HELP
+<<< 250 HELP
+>>> WELLKNOWN sub/badfile
+??? 550
+<<< 550 Administrative prohibition
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO test
+??? 250-
+<<< 250-myhost.test.ex Hello test [127.0.0.1]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-LIMITS
+<<< 250-LIMITS MAILMAX=1000 RCPTMAX=50000
+??? 250-8BITMIME
+<<< 250-8BITMIME
+??? 250-PIPELINING
+<<< 250-PIPELINING
+??? 250-WELLKNOWN
+<<< 250-WELLKNOWN
+??? 250 HELP
+<<< 250 HELP
+>>> WELLKNOWN ../badfile
+??? 550
+<<< 550 Administrative prohibition
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script