From: Wietse Venema
Date: Sun, 27 Mar 2005 05:00:00 +0000 (-0500)
Subject: postfix-2.3-20050327
X-Git-Tag: v2.3-RC1~91
X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da30144878cbd2abdc021baea00ffead3cfed140;p=thirdparty%2Fpostfix.git
postfix-2.3-20050327
---
diff --git a/postfix/.indent.pro b/postfix/.indent.pro
index 7b958be89..06d5e2538 100644
--- a/postfix/.indent.pro
+++ b/postfix/.indent.pro
@@ -20,6 +20,7 @@
-TCFG_PARSER
-TCIDR_MATCH
-TCLEANUP_STATE
+-TCLEANUP_STAT_DETAIL
-TCLIENT_LIST
-TCLNT_STREAM
-TCONFIG_BOOL_FN_TABLE
@@ -76,6 +77,8 @@
-TDNS_REPLY
-TDNS_RR
-TDOMAIN_LIST
+-TDSN_SPLIT
+-TDSN_VSTRING
-TEXPAND_ATTR
-TFILE
-TFORWARD_INFO
@@ -194,7 +197,7 @@
-TSSL_SESSION
-TSTRING_LIST
-TSTRING_TABLE
--TSYS_EXITS_TABLE
+-TSYS_EXITS_DETAIL
-TTLS_PRNG_SEED_INFO
-TTLS_PRNG_SRC
-TTLS_SCACHE
diff --git a/postfix/ENHANCED_STATUS_README b/postfix/ENHANCED_STATUS_README
new file mode 100644
index 000000000..73451f377
--- /dev/null
+++ b/postfix/ENHANCED_STATUS_README
@@ -0,0 +1,61 @@
+Postfix enhanced status code implementation notes
+=================================================
+
+Enhanced status code support is implemented in stages. In the first
+stage, the goal is to minimize code changes (it's several hundred
+pages of context diffs already). For this reason, the pre-existing
+status variables (success, defer, etc.) are not updated atomically
+with the enhanced status code; instead, enhanced status codes are
+updated separately. This means one has to be careful when making
+updates to the code, so that things won't go out of sync.
+
+Specific issues that one should be aware of:
+
+- In the SMTP client, either update the enhanced status code and
+text whenever smtp_errno or resp->code are updated, or place an
+explicit comment that no update is needed.
+
+- In the SMTP client, don't worry about the first enhanced status
+digit when reporting failure to look up or connect to a host. For
+convenience, the SMTP client top-level code automatically changes
+it into '4' or '5' as appropriate.
+
+- The above two points also apply to the LMTP client; this delivery
+agent is on life support until its functionality is merged with the
+SMTP client.
+
+- In the SMTP server, don't worry about the first enhanced status
+digit when a restriction rejects access. For convenience, the
+smtpd_check_reject() routine automatically changes it into '4' or
+'5' as appropriate.
+
+- The pipe, local and virtual delivery agents never update the
+diagnostic text without also updating the enhanced status code. The
+main chore here is to choose appropriate enhanced status codes.
+
+- Don't rely on the system errno value after calling a routine that
+updates the enhanced status code upon failure. Use the enhanced
+status code (and diagnostic text) instead. Currently there are two
+exceptions to this rule: mail_copy() for historical reasons may or
+may not return explicit error reports (fixing this requires that
+pipe_command() be restructured); and the maildir delivery routines
+log a helpful warning when delivery fails with EACCES. This just
+happens to work because maildir needs no file locking.
+
+- Some low-level support routines update the diagnostic text but
+not the enhanced status code. To identify these, search for functions
+that are called with why->vstring as output parameter, and make
+sure that the caller updates the enhanced status code in all
+appropriate cases.
+
+- Avoid passing around strings that combine enhanced status code
+and diagnostic text, because the compiler can't help to enforce
+consistency. Currently there are two exceptions to this rule: the
+cleanup server status reply, and the delivery agent status reply.
+Once these protocols are updated we can remove the dns_prepend()
+routine.
+
+- The bounce/defer/sent modules will catch the cases where an
+enhanced status code does not match the reject/defer/success status.
+These discrepancies are logged as a warning, and the enhanced status
+code is replaced by a generic one.
diff --git a/postfix/HISTORY b/postfix/HISTORY
index 1a4ff531d..7cc78da8e 100644
--- a/postfix/HISTORY
+++ b/postfix/HISTORY
@@ -10485,6 +10485,62 @@ Apologies for any names omitted.
Bugfix: when is included, read is a reserved
identifier. File: smtpstone/smtp-source.c.
+20050321-27
+
+ Support for RFC 1893 enhanced status codes. See also the
+ ENHANCED_STATUS_README file for background.
+
+ New module to pass around (status code + text) instead of
+ just text. File: Files: global/dsn_util.c.
+
+ Status-related lookup tables now have an extra column for
+ enhanced status codes. Files: global/sys_exits.c,
+ global/cleanup_strerror.c.
+
+ Incompatible change: centralized mapping of errno values
+ to delivery status codes after failed delivery to mailbox,
+ maildir, or file. Error codes EACCES, EAGAIN, ESTALE are
+ 4.2.0 temporary errors, ENOSPC is a 4.3.0 temporary error,
+ EDQUOT and EFBIG are 5.2.2 hard errors, and everything else
+ is a 5.2.0 hard error. This means that local(8) will bounce
+ less mail, while virtual(8) will defer less mail. File:
+ global/mbox_open.c.
+
+20050324
+
+ Workaround: gcc -W (version 3.4.2 [FreeBSD] 20040728) no
+ longer warns about missing return statements. What a time
+ waste.
+
+ Workaround: gcc -E (version 3.4.2 [FreeBSD] 20040728) output
+ has changed, causing too much "make depend" output.
+
+20050325
+
+ Bugfix: when bouncing mail that was submitted with Postfix
+ sendmail, the cleanup daemon ignored the reason specified
+ in header/body_checks, and always produced a generic reason.
+ File: cleanup/cleanup_api.c.
+
+ Workaround: don't announce pipelining support when the
+ smtp-sink test program is configured to fail specific
+ commands with -r or -f (the fix is to build a proper SMTP
+ state engine into the smtp-sink test program). File:
+ smtpstone/smtp-sink.c.
+
+20050326
+
+ Update: more PCRE error codes. File: util/dict_pcre.c.
+
+20050327
+
+ Bugfix: the SMTP client did not ask the queue manager to
+ reduce destination concurrency after a "lost connection"
+ or "connection timed out" errror. File: smtp/smtp_trouble.c.
+
+ Workaround: FreeBSD has incompatibly changed the output
+ format from "od", breaking regression test portability.
+
Open problems:
Med: disable header address rewriting after XCLIENT?
@@ -10521,8 +10577,8 @@ Open problems:
really try all the possibilities that one might expect to
be tried. For now, this gotcha is documented in access(5).
- Med: the TLS certificate verification depth parameters
- never worked.
+ Med: the TLS certificate verification depth parameters never
+ worked.
Med: eliminate the tls_info data structure.
@@ -10533,8 +10589,8 @@ Open problems:
Low: make mail_addr_find() lookup configurable.
- Low: update events.c so that 1-second timer requests do
- not suffer from rounding errors. This is needed for 1-second
+ Low: update events.c so that 1-second timer requests do not
+ suffer from rounding errors. This is needed for 1-second
SMTP session caching time limits. A 1-second interval would
become arbitrarily short when an event is scheduled just
before the current second rolls over.
@@ -10596,8 +10652,8 @@ Open problems:
Low: all table lookups should consistently use internalized
(unquoted) or externalized (quoted) forms as lookup keys.
- smtpd, qmgr, local, etc. use unquoted address forms as
- keys. cleanup uses quoted forms.
+ smtpd, qmgr, local, etc. use unquoted address forms as keys.
+ cleanup uses quoted forms.
Low: have a configurable list of errno values for mailbox
or maildir delivery that result in deferral rather than
@@ -10606,9 +10662,9 @@ Open problems:
Low: after reorganizing configuration parameters, add flags
to all parameters whose value can be read from file.
- Medium: need in-process caching for map lookups. LDAP
- servers seem to need this in particular. Need a way to
- expire cached results that are too old.
+ Medium: need in-process caching for map lookups. LDAP servers
+ seem to need this in particular. Need a way to expire cached
+ results that are too old.
Low: generic showq protocol, to allow for more intelligent
processing than just mailq. Maybe marry this with postsuper.
diff --git a/postfix/README_FILES/DB_README b/postfix/README_FILES/DB_README
index 2f2638fd3..3d2236971 100644
--- a/postfix/README_FILES/DB_README
+++ b/postfix/README_FILES/DB_README
@@ -44,12 +44,19 @@ To build Postfix after you installed the Berkeley DB from http://
www.sleepycat.com/, use something like:
% make tidy
- % make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB.3.1/include" \
- AUXLIBS="-L/usr/local/BerkeleyDB.3.1/lib -ldb"
+ % make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+ AUXLIBS="-L/usr/local/BerkeleyDB/lib -ldb"
% make
-The exact pathnames depend on the DB version that you installed. For example,
-Berkeley DB version 2 installs in /usr/local/BerkeleyDB.
+Solaris needs this:
+
+ % make tidy
+ % make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+ AUXLIBS="-R/usr/local/BerkeleyDB/lib -L/usr/local/BerkeleyDB/lib -ldb"
+ % make
+
+The exact pathnames depend on the Berkeley DB version, and on how it was
+installed.
Warning: the file format produced by Berkeley DB version 1 is not compatible
with that of versions 2 and 3 (versions 2 and 3 have the same format). If you
diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES
index e5df96359..63b26e4a5 100644
--- a/postfix/RELEASE_NOTES
+++ b/postfix/RELEASE_NOTES
@@ -13,3 +13,36 @@ specifies the release date of a stable release or snapshot release.
See RELEASE_NOTES-2.2 for changes introduced during the development
of Postfix version 2.2.
+
+Incompatible changes with snapshot 20050327
+===========================================
+
+local(8) and virtual(8) now handle the same errors in the same way.
+This means that local(8) will defer some mail that it older versions
+would bounce, and that virtual(8) will bounce some mail that older
+versions would defer.
+
+Specifically, error codes EACCES, EAGAIN, ESTALE are soft (4.2.0)
+errors, ENOSPC is a soft (4.3.0) error, EDQUOT and EFBIG are hard
+(5.2.2) errors, and everything else is a hard (5.2.0) error.
+
+Major changes with snapshot 20050327
+====================================
+
+This release introduces support for RFC 1893 enhanced status codes.
+For example, status code "5.1.1" means "recipient unknown". Postfix
+recognizes enhanced status codes in remote server replies, and
+generates enhanced status codes when it responds to mail delivery
+requests. This improves the communication with mail clients that
+hide error messages from users.
+
+You can, but don't have to, specify RFC 1893 enhanced status codes
+in Postfix access maps or header/body_checks. Example:
+
+ REJECT 5.7.1 You can't go here from there
+
+(5.7.1 means "no authorization, message refused"). Enhanced status
+code support is also available in RBL reply templates.
+
+If you do specify an enhanced status code, Postfix will automatically
+change the first digit into a '4' or '5' as appropriate.
diff --git a/postfix/conf/access b/postfix/conf/access
index a424ea598..112b13664 100644
--- a/postfix/conf/access
+++ b/postfix/conf/access
@@ -1,4 +1,4 @@
-# ACCESS(5) ACCESS(5)
+# ACCESS(5) ACCESS(5)
#
# NAME
# access - Postfix access table format
@@ -167,6 +167,12 @@
# tion schemes.
#
# REJECT ACTIONS
+# Postfix version 2.3 and later support enhanced status
+# codes. When no code is specified at the beginning of the
+# text below, Postfix inserts a default enhanced status code
+# of "5.7.1" in the case of reject actions, and "4.7.1" in
+# the case of defer actions.
+#
# 4NN text
#
# 5NN text
@@ -297,8 +303,8 @@
# user@ and domain constituent parts, nor is user+foo broken
# up into user and foo.
#
-# Patterns are applied in the order as specified in the
-# table, until a pattern is found that matches the search
+# Patterns are applied in the order as specified in the ta-
+# ble, until a pattern is found that matches the search
# string.
#
# Actions are the same as with indexed file lookups, with
@@ -308,9 +314,9 @@
# TCP-BASED TABLES
# This section describes how the table lookups change when
# lookups are directed to a TCP-based server. For a descrip-
-# tion of the TCP client/server lookup protocol, see
-# tcp_table(5). This feature is not available up to and
-# including Postfix version 2.2.
+# tion of the TCP client/server lookup protocol, see tcp_ta-
+# ble(5). This feature is not available up to and including
+# Postfix version 2.2.
#
# Each lookup operation uses the entire query string once.
# Depending on the application, that string is an entire
@@ -367,4 +373,4 @@
# P.O. Box 704
# Yorktown Heights, NY 10598, USA
#
-# ACCESS(5)
+# ACCESS(5)
diff --git a/postfix/conf/header_checks b/postfix/conf/header_checks
index 14b7d6f3c..b48bac2e2 100644
--- a/postfix/conf/header_checks
+++ b/postfix/conf/header_checks
@@ -1,4 +1,4 @@
-# HEADER_CHECKS(5) HEADER_CHECKS(5)
+# HEADER_CHECKS(5) HEADER_CHECKS(5)
#
# NAME
# header_checks - Postfix built-in header/body inspection
@@ -243,27 +243,32 @@
# body_checks inspection of the current message and
# affects all recipients.
#
+# Postfix version 2.3 and later support enhanced sta-
+# tus codes. When no code is specified at the begin-
+# ning of optional text..., Postfix inserts a default
+# enhanced status code of "5.7.1".
+#
# WARN optional text...
-# Log a warning with the optional text... (or log a
-# generic message) and inspect the next input line.
+# Log a warning with the optional text... (or log a
+# generic message) and inspect the next input line.
# This action is useful for debugging and for testing
# a pattern before applying more drastic actions.
#
# BUGS
-# Many people overlook the main limitations of header and
-# body_checks rules. These rules operate on one logical
-# message header or one body line at a time, and a decision
-# made for one line is not carried over to the next line.
+# Many people overlook the main limitations of header and
+# body_checks rules. These rules operate on one logical
+# message header or one body line at a time, and a decision
+# made for one line is not carried over to the next line.
# If text in the message body is encoded (RFC 2045) then the
-# rules have to specified for the encoded form. Likewise,
+# rules have to specified for the encoded form. Likewise,
# when message headers are encoded (RFC 2047) then the rules
# need to be specified for the encoded form.
#
-# Message headers added by the cleanup(8) daemon itself are
+# Message headers added by the cleanup(8) daemon itself are
# excluded from inspection. Examples of such message headers
# are From:, To:, Message-ID:, Date:.
#
-# Message headers deleted by the cleanup(8) daemon will be
+# Message headers deleted by the cleanup(8) daemon will be
# examined before they are deleted. Examples are: Bcc:, Con-
# tent-Length:, Return-Path:.
#
@@ -271,11 +276,11 @@
# body_checks
# Lookup tables with content filter rules for message
# body lines. These filters see one physical line at
-# a time, in chunks of at most $line_length_limit
+# a time, in chunks of at most $line_length_limit
# bytes.
#
# body_checks_size_limit
-# The amount of content per message body segment
+# The amount of content per message body segment
# (attachment) that is subjected to $body_checks fil-
# tering.
#
@@ -285,32 +290,32 @@
#
# nested_header_checks (default: $header_checks)
# Lookup tables with content filter rules for message
-# header lines: respectively, these are applied to
-# the initial message headers (not including MIME
-# headers), to the MIME headers anywhere in the mes-
-# sage, and to the initial headers of attached mes-
+# header lines: respectively, these are applied to
+# the initial message headers (not including MIME
+# headers), to the MIME headers anywhere in the mes-
+# sage, and to the initial headers of attached mes-
# sages.
#
-# Note: these filters see one logical message header
-# at a time, even when a message header spans multi-
-# ple lines. Message headers that are longer than
+# Note: these filters see one logical message header
+# at a time, even when a message header spans multi-
+# ple lines. Message headers that are longer than
# $header_size_limit characters are truncated.
#
# disable_mime_input_processing
-# While receiving mail, give no special treatment to
-# MIME related message headers; all text after the
+# While receiving mail, give no special treatment to
+# MIME related message headers; all text after the
# initial message headers is considered to be part of
-# the message body. This means that header_checks is
-# applied to all the initial message headers, and
+# the message body. This means that header_checks is
+# applied to all the initial message headers, and
# that body_checks is applied to the remainder of the
# message.
#
-# Note: when used in this manner, body_checks will
-# process a multi-line message header one line at a
+# Note: when used in this manner, body_checks will
+# process a multi-line message header one line at a
# time.
#
# EXAMPLES
-# Header pattern to block attachments with bad file name
+# Header pattern to block attachments with bad file name
# extensions.
#
# /etc/postfix/main.cf:
@@ -342,7 +347,7 @@
# RFC 2047, message header encoding for non-ASCII text
#
# README FILES
-# Use "postconf readme_directory" or "postconf html_direc-
+# Use "postconf readme_directory" or "postconf html_direc-
# tory" to locate this information.
# DATABASE_README, Postfix lookup table overview
# CONTENT_INSPECTION_README, Postfix content inspection overview
@@ -350,7 +355,7 @@
# BACKSCATTER_README, blocking returned forged mail
#
# LICENSE
-# The Secure Mailer license must be distributed with this
+# The Secure Mailer license must be distributed with this
# software.
#
# AUTHOR(S)
@@ -359,4 +364,4 @@
# P.O. Box 704
# Yorktown Heights, NY 10598, USA
#
-# HEADER_CHECKS(5)
+# HEADER_CHECKS(5)
diff --git a/postfix/html/DB_README.html b/postfix/html/DB_README.html
index 514590933..3c803d077 100644
--- a/postfix/html/DB_README.html
+++ b/postfix/html/DB_README.html
@@ -72,15 +72,25 @@ falling apart.
% make tidy
-% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB.3.1/include" \
- AUXLIBS="-L/usr/local/BerkeleyDB.3.1/lib -ldb"
+% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+ AUXLIBS="-L/usr/local/BerkeleyDB/lib -ldb"
% make
- The exact pathnames depend on the DB version that you installed.
-For example, Berkeley DB version 2 installs in /usr/local/BerkeleyDB.
-
+ Solaris needs this:
+
+
+
+% make tidy
+% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+ AUXLIBS="-R/usr/local/BerkeleyDB/lib -L/usr/local/BerkeleyDB/lib -ldb"
+% make
+
+
+
+ The exact pathnames depend on the Berkeley DB version, and on
+how it was installed.
Warning: the file format produced by Berkeley DB version 1 is
not compatible with that of versions 2 and 3 (versions 2 and 3 have
diff --git a/postfix/html/access.5.html b/postfix/html/access.5.html
index efed8c1b9..0405bb40d 100644
--- a/postfix/html/access.5.html
+++ b/postfix/html/access.5.html
@@ -173,6 +173,12 @@ ACCESS(5) ACCESS(5)
tion schemes.
REJECT ACTIONS
+ Postfix version 2.3 and later support enhanced status
+ codes. When no code is specified at the beginning of the
+ text below, Postfix inserts a default enhanced status code
+ of "5.7.1" in the case of reject actions, and "4.7.1" in
+ the case of defer actions.
+
4NN text
5NN text
diff --git a/postfix/html/discard.8.html b/postfix/html/discard.8.html
index 61b2f5494..29a314943 100644
--- a/postfix/html/discard.8.html
+++ b/postfix/html/discard.8.html
@@ -17,13 +17,14 @@ DISCARD(8) DISCARD(8)
requests from the queue manager. Each request specifies a
queue file, a sender address, a domain or host name that
is treated as the reason for discarding the mail, and
- recipient information. This program expects to be run
- from the master(8) process manager.
-
- The discard(8) delivery agent pretends to deliver all
- recipients in the delivery request, logs the "next-hop"
- domain or host information as the reason for discarding
- the mail, updates the queue file and marks recipients as
+ recipient information. The reason may be prefixed with an
+ RFC 1893-compatible detail code. This program expects to
+ be run from the master(8) process manager.
+
+ The discard(8) delivery agent pretends to deliver all
+ recipients in the delivery request, logs the "next-hop"
+ domain or host information as the reason for discarding
+ the mail, updates the queue file and marks recipients as
finished or informs the queue manager that delivery should
be tried again at a later time.
@@ -31,8 +32,8 @@ DISCARD(8) DISCARD(8)
appropriate.
SECURITY
- The discard(8) mailer is not security-sensitive. It does
- not talk to the network, and can be run chrooted at fixed
+ The discard(8) mailer is not security-sensitive. It does
+ not talk to the network, and can be run chrooted at fixed
low privilege.
STANDARDS
@@ -41,25 +42,25 @@ DISCARD(8) DISCARD(8)
DIAGNOSTICS
Problems and transactions are logged to syslogd(8).
- Depending on the setting of the notify_classes parameter,
- the postmaster is notified of bounces and of other trou-
+ Depending on the setting of the notify_classes parameter,
+ the postmaster is notified of bounces and of other trou-
ble.
CONFIGURATION PARAMETERS
- Changes to main.cf are picked up automatically as dis-
- card(8) processes run for only a limited amount of time.
+ Changes to main.cf are picked up automatically as dis-
+ card(8) processes run for only a limited amount of time.
Use the command "postfix reload" to speed up a change.
- The text below provides only a parameter summary. See
+ The text below provides only a parameter summary. See
postconf(5) for more details including examples.
config_directory (see 'postconf -d' output)
- The default location of the Postfix main.cf and
+ The default location of the Postfix main.cf and
master.cf configuration files.
daemon_timeout (18000s)
- How much time a Postfix daemon process may take to
- handle a request before it is terminated by a
+ How much time a Postfix daemon process may take to
+ handle a request before it is terminated by a
built-in watchdog timer.
double_bounce_sender (double-bounce)
@@ -71,32 +72,32 @@ DISCARD(8) DISCARD(8)
over an internal communication channel.
max_idle (100s)
- The maximum amount of time that an idle Postfix
- daemon process waits for the next service request
+ The maximum amount of time that an idle Postfix
+ daemon process waits for the next service request
before exiting.
max_use (100)
- The maximal number of connection requests before a
+ The maximal number of connection requests before a
Postfix daemon process terminates.
process_id (read-only)
- The process ID of a Postfix command or daemon
+ The process ID of a Postfix command or daemon
process.
process_name (read-only)
- The process name of a Postfix command or daemon
+ The process name of a Postfix command or daemon
process.
queue_directory (see 'postconf -d' output)
- The location of the Postfix top-level queue direc-
+ The location of the Postfix top-level queue direc-
tory.
syslog_facility (mail)
The syslog facility of Postfix logging.
syslog_name (postfix)
- The mail system name that is prepended to the
- process name in syslog records, so that "smtpd"
+ The mail system name that is prepended to the
+ process name in syslog records, so that "smtpd"
becomes, for example, "postfix/smtpd".
SEE ALSO
@@ -109,7 +110,7 @@ DISCARD(8) DISCARD(8)
syslogd(8), system logging
LICENSE
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
HISTORY
diff --git a/postfix/html/error.8.html b/postfix/html/error.8.html
index 9dfadec5e..cc17b3488 100644
--- a/postfix/html/error.8.html
+++ b/postfix/html/error.8.html
@@ -17,22 +17,23 @@ ERROR(8) ERROR(8)
requests from the queue manager. Each request specifies a
queue file, a sender address, a domain or host name that
is treated as the reason for non-delivery, and recipient
- information. This program expects to be run from the mas-
- ter(8) process manager.
+ information. The reason may be prefixed with an RFC
+ 1893-compatible detail code. This program expects to be
+ run from the master(8) process manager.
- The error(8) delivery agent bounces all recipients in the
- delivery request using the "next-hop" domain or host
- information as the reason for non-delivery, updates the
+ The error(8) delivery agent bounces all recipients in the
+ delivery request using the "next-hop" domain or host
+ information as the reason for non-delivery, updates the
queue file and marks recipients as finished or informs the
- queue manager that delivery should be tried again at a
+ queue manager that delivery should be tried again at a
later time.
- Delivery status reports are sent to the bounce(8),
+ Delivery status reports are sent to the bounce(8),
defer(8) or trace(8) daemon as appropriate.
SECURITY
The error(8) mailer is not security-sensitive. It does not
- talk to the network, and can be run chrooted at fixed low
+ talk to the network, and can be run chrooted at fixed low
privilege.
STANDARDS
@@ -41,35 +42,35 @@ ERROR(8) ERROR(8)
DIAGNOSTICS
Problems and transactions are logged to syslogd(8).
- Depending on the setting of the notify_classes parameter,
- the postmaster is notified of bounces and of other trou-
+ Depending on the setting of the notify_classes parameter,
+ the postmaster is notified of bounces and of other trou-
ble.
CONFIGURATION PARAMETERS
Changes to main.cf are picked up automatically as error(8)
- processes run for only a limited amount of time. Use the
+ processes run for only a limited amount of time. Use the
command "postfix reload" to speed up a change.
- The text below provides only a parameter summary. See
+ The text below provides only a parameter summary. See
postconf(5) for more details including examples.
2bounce_notice_recipient (postmaster)
- The recipient of undeliverable mail that cannot be
+ The recipient of undeliverable mail that cannot be
returned to the sender.
bounce_notice_recipient (postmaster)
- The recipient of postmaster notifications with the
+ The recipient of postmaster notifications with the
message headers of mail that Postfix did not
- deliver and of SMTP conversation transcripts of
+ deliver and of SMTP conversation transcripts of
mail that Postfix did not receive.
config_directory (see 'postconf -d' output)
- The default location of the Postfix main.cf and
+ The default location of the Postfix main.cf and
master.cf configuration files.
daemon_timeout (18000s)
- How much time a Postfix daemon process may take to
- handle a request before it is terminated by a
+ How much time a Postfix daemon process may take to
+ handle a request before it is terminated by a
built-in watchdog timer.
double_bounce_sender (double-bounce)
@@ -81,36 +82,36 @@ ERROR(8) ERROR(8)
over an internal communication channel.
max_idle (100s)
- The maximum amount of time that an idle Postfix
- daemon process waits for the next service request
+ The maximum amount of time that an idle Postfix
+ daemon process waits for the next service request
before exiting.
max_use (100)
- The maximal number of connection requests before a
+ The maximal number of connection requests before a
Postfix daemon process terminates.
notify_classes (resource, software)
- The list of error classes that are reported to the
+ The list of error classes that are reported to the
postmaster.
process_id (read-only)
- The process ID of a Postfix command or daemon
+ The process ID of a Postfix command or daemon
process.
process_name (read-only)
- The process name of a Postfix command or daemon
+ The process name of a Postfix command or daemon
process.
queue_directory (see 'postconf -d' output)
- The location of the Postfix top-level queue direc-
+ The location of the Postfix top-level queue direc-
tory.
syslog_facility (mail)
The syslog facility of Postfix logging.
syslog_name (postfix)
- The mail system name that is prepended to the
- process name in syslog records, so that "smtpd"
+ The mail system name that is prepended to the
+ process name in syslog records, so that "smtpd"
becomes, for example, "postfix/smtpd".
SEE ALSO
@@ -123,7 +124,7 @@ ERROR(8) ERROR(8)
syslogd(8), system logging
LICENSE
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
AUTHOR(S)
diff --git a/postfix/html/header_checks.5.html b/postfix/html/header_checks.5.html
index 9354d3b25..d372a9019 100644
--- a/postfix/html/header_checks.5.html
+++ b/postfix/html/header_checks.5.html
@@ -249,27 +249,32 @@ HEADER_CHECKS(5) HEADER_CHECKS(5)
body_checks inspection of the current message and
affects all recipients.
+ Postfix version 2.3 and later support enhanced sta-
+ tus codes. When no code is specified at the begin-
+ ning of optional text..., Postfix inserts a default
+ enhanced status code of "5.7.1".
+
WARN optional text...
- Log a warning with the optional text... (or log a
- generic message) and inspect the next input line.
+ Log a warning with the optional text... (or log a
+ generic message) and inspect the next input line.
This action is useful for debugging and for testing
a pattern before applying more drastic actions.
BUGS
- Many people overlook the main limitations of header and
- body_checks rules. These rules operate on one logical
- message header or one body line at a time, and a decision
- made for one line is not carried over to the next line.
+ Many people overlook the main limitations of header and
+ body_checks rules. These rules operate on one logical
+ message header or one body line at a time, and a decision
+ made for one line is not carried over to the next line.
If text in the message body is encoded (RFC 2045) then the
- rules have to specified for the encoded form. Likewise,
+ rules have to specified for the encoded form. Likewise,
when message headers are encoded (RFC 2047) then the rules
need to be specified for the encoded form.
- Message headers added by the cleanup(8) daemon itself are
+ Message headers added by the cleanup(8) daemon itself are
excluded from inspection. Examples of such message headers
are From:, To:, Message-ID:, Date:.
- Message headers deleted by the cleanup(8) daemon will be
+ Message headers deleted by the cleanup(8) daemon will be
examined before they are deleted. Examples are: Bcc:, Con-
tent-Length:, Return-Path:.
@@ -277,11 +282,11 @@ HEADER_CHECKS(5) HEADER_CHECKS(5)
body_checks
Lookup tables with content filter rules for message
body lines. These filters see one physical line at
- a time, in chunks of at most $line_length_limit
+ a time, in chunks of at most $line_length_limit
bytes.
body_checks_size_limit
- The amount of content per message body segment
+ The amount of content per message body segment
(attachment) that is subjected to $body_checks fil-
tering.
@@ -291,32 +296,32 @@ HEADER_CHECKS(5) HEADER_CHECKS(5)
nested_header_checks (default: $header_checks)
Lookup tables with content filter rules for message
- header lines: respectively, these are applied to
- the initial message headers (not including MIME
- headers), to the MIME headers anywhere in the mes-
- sage, and to the initial headers of attached mes-
+ header lines: respectively, these are applied to
+ the initial message headers (not including MIME
+ headers), to the MIME headers anywhere in the mes-
+ sage, and to the initial headers of attached mes-
sages.
- Note: these filters see one logical message header
- at a time, even when a message header spans multi-
- ple lines. Message headers that are longer than
+ Note: these filters see one logical message header
+ at a time, even when a message header spans multi-
+ ple lines. Message headers that are longer than
$header_size_limit characters are truncated.
disable_mime_input_processing
- While receiving mail, give no special treatment to
- MIME related message headers; all text after the
+ While receiving mail, give no special treatment to
+ MIME related message headers; all text after the
initial message headers is considered to be part of
- the message body. This means that header_checks is
- applied to all the initial message headers, and
+ the message body. This means that header_checks is
+ applied to all the initial message headers, and
that body_checks is applied to the remainder of the
message.
- Note: when used in this manner, body_checks will
- process a multi-line message header one line at a
+ Note: when used in this manner, body_checks will
+ process a multi-line message header one line at a
time.
EXAMPLES
- Header pattern to block attachments with bad file name
+ Header pattern to block attachments with bad file name
extensions.
/etc/postfix/main.cf:
@@ -354,7 +359,7 @@ HEADER_CHECKS(5) HEADER_CHECKS(5)
BACKSCATTER_README, blocking returned forged mail
LICENSE
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
AUTHOR(S)
diff --git a/postfix/html/lmtp.8.html b/postfix/html/lmtp.8.html
index 3ba0eddd4..2a36548b9 100644
--- a/postfix/html/lmtp.8.html
+++ b/postfix/html/lmtp.8.html
@@ -63,6 +63,7 @@ LMTP(8) LMTP(8)
RFC 1652 (8bit-MIME transport)
RFC 1870 (Message Size Declaration)
RFC 2033 (LMTP protocol)
+ RFC 2034 (Enhanced Error Codes)
RFC 2554 (AUTH command)
RFC 2821 (SMTP protocol)
RFC 2920 (SMTP Pipelining)
diff --git a/postfix/html/smtp-sink.1.html b/postfix/html/smtp-sink.1.html
index 7e977c7a8..cedecd4b3 100644
--- a/postfix/html/smtp-sink.1.html
+++ b/postfix/html/smtp-sink.1.html
@@ -44,7 +44,7 @@ SMTP-SINK(1) SMTP-SINK(1)
-f command,command,...
Reject the specified commands with a hard (5xx)
- error code.
+ error code. This option implies -p.
-F Disable XFORWARD support.
@@ -71,7 +71,7 @@ SMTP-SINK(1) SMTP-SINK(1)
-r command,command,...
Reject the specified commands with a soft (4xx)
- error code.
+ error code. This option implies -p.
-s command,command,...
Log the named commands to syslogd. Examples of
diff --git a/postfix/html/smtp.8.html b/postfix/html/smtp.8.html
index 95c51c2a9..6d2f13dc8 100644
--- a/postfix/html/smtp.8.html
+++ b/postfix/html/smtp.8.html
@@ -56,6 +56,7 @@ SMTP(8) SMTP(8)
RFC 1652 (8bit-MIME transport)
RFC 1870 (Message Size Declaration)
RFC 2045 (MIME: Format of Internet Message Bodies)
+ RFC 2034 (Enhanced Error Codes)
RFC 2046 (MIME: Media Types)
RFC 2554 (AUTH command)
RFC 2821 (SMTP protocol)
diff --git a/postfix/html/smtpd.8.html b/postfix/html/smtpd.8.html
index a6362559e..7eedc495c 100644
--- a/postfix/html/smtpd.8.html
+++ b/postfix/html/smtpd.8.html
@@ -43,6 +43,7 @@ SMTPD(8) SMTPD(8)
RFC 1869 (SMTP service extensions)
RFC 1870 (Message Size Declaration)
RFC 1985 (ETRN command)
+ RFC 2034 (Enhanced Error Codes)
RFC 2554 (AUTH command)
RFC 2821 (SMTP protocol)
RFC 2920 (SMTP Pipelining)
diff --git a/postfix/man/man1/smtp-sink.1 b/postfix/man/man1/smtp-sink.1
index e2b845449..c24833afb 100644
--- a/postfix/man/man1/smtp-sink.1
+++ b/postfix/man/man1/smtp-sink.1
@@ -44,6 +44,7 @@ Disable XCLIENT support.
Do not announce ESMTP support.
.IP "\fB-f \fIcommand,command,...\fR"
Reject the specified commands with a hard (5xx) error code.
+This option implies \fB-p\fR.
.IP \fB-F\fR
Disable XFORWARD support.
.IP "\fB-h\fI hostname\fR"
@@ -63,6 +64,7 @@ Disconnect (without replying) after receiving one of the
specified commands.
.IP "\fB-r \fIcommand,command,...\fR"
Reject the specified commands with a soft (4xx) error code.
+This option implies \fB-p\fR.
.IP "\fB-s \fIcommand,command,...\fR"
Log the named commands to syslogd.
Examples of commands that can be logged are HELO, EHLO, LHLO, MAIL,
diff --git a/postfix/man/man5/access.5 b/postfix/man/man5/access.5
index 7f9cfb821..00d336bc7 100644
--- a/postfix/man/man5/access.5
+++ b/postfix/man/man5/access.5
@@ -165,6 +165,11 @@ generated by address-based relay authorization schemes.
.nf
.ad
.fi
+Postfix version 2.3 and later support enhanced status codes.
+When no code is specified at the beginning of the \fItext\fR
+below, Postfix inserts a default enhanced status code of "5.7.1"
+in the case of reject actions, and "4.7.1" in the case of
+defer actions.
.IP "\fB4\fINN text\fR"
.IP "\fB5\fINN text\fR"
Reject the address etc. that matches the pattern, and respond with
diff --git a/postfix/man/man5/header_checks.5 b/postfix/man/man5/header_checks.5
index 71a48372d..bd794663d 100644
--- a/postfix/man/man5/header_checks.5
+++ b/postfix/man/man5/header_checks.5
@@ -227,6 +227,11 @@ message.
.sp
Note: this action disables further header or body_checks inspection
of the current message and affects all recipients.
+.sp
+Postfix version 2.3 and later support enhanced status codes.
+When no code is specified at the beginning of \fIoptional
+text...\fR, Postfix inserts a default enhanced status code of
+"5.7.1".
.IP "\fBWARN \fIoptional text...\fR
Log a warning with the \fIoptional text...\fR (or log a
generic message) and inspect the next input line. This
diff --git a/postfix/man/man8/discard.8 b/postfix/man/man8/discard.8
index 19be8c370..215ee975d 100644
--- a/postfix/man/man8/discard.8
+++ b/postfix/man/man8/discard.8
@@ -17,6 +17,7 @@ delivery requests from
the queue manager. Each request specifies a queue file, a sender
address, a domain or host name that is treated as the reason for
discarding the mail, and recipient information.
+The reason may be prefixed with an RFC 1893-compatible detail code.
This program expects to be run from the \fBmaster\fR(8) process
manager.
diff --git a/postfix/man/man8/error.8 b/postfix/man/man8/error.8
index 45df13163..a0f0b996f 100644
--- a/postfix/man/man8/error.8
+++ b/postfix/man/man8/error.8
@@ -17,6 +17,7 @@ requests from
the queue manager. Each request specifies a queue file, a sender
address, a domain or host name that is treated as the reason for
non-delivery, and recipient information.
+The reason may be prefixed with an RFC 1893-compatible detail code.
This program expects to be run from the \fBmaster\fR(8) process
manager.
diff --git a/postfix/man/man8/lmtp.8 b/postfix/man/man8/lmtp.8
index 725338f25..13077bd88 100644
--- a/postfix/man/man8/lmtp.8
+++ b/postfix/man/man8/lmtp.8
@@ -60,6 +60,7 @@ RFC 1651 (SMTP service extensions)
RFC 1652 (8bit-MIME transport)
RFC 1870 (Message Size Declaration)
RFC 2033 (LMTP protocol)
+RFC 2034 (Enhanced Error Codes)
RFC 2554 (AUTH command)
RFC 2821 (SMTP protocol)
RFC 2920 (SMTP Pipelining)
diff --git a/postfix/man/man8/smtp.8 b/postfix/man/man8/smtp.8
index 136b509a8..8cbc7ca51 100644
--- a/postfix/man/man8/smtp.8
+++ b/postfix/man/man8/smtp.8
@@ -57,6 +57,7 @@ RFC 1651 (SMTP service extensions)
RFC 1652 (8bit-MIME transport)
RFC 1870 (Message Size Declaration)
RFC 2045 (MIME: Format of Internet Message Bodies)
+RFC 2034 (Enhanced Error Codes)
RFC 2046 (MIME: Media Types)
RFC 2554 (AUTH command)
RFC 2821 (SMTP protocol)
diff --git a/postfix/man/man8/smtpd.8 b/postfix/man/man8/smtpd.8
index 1a5b2b35a..f6fb56d4e 100644
--- a/postfix/man/man8/smtpd.8
+++ b/postfix/man/man8/smtpd.8
@@ -46,6 +46,7 @@ RFC 1652 (8bit-MIME transport)
RFC 1869 (SMTP service extensions)
RFC 1870 (Message Size Declaration)
RFC 1985 (ETRN command)
+RFC 2034 (Enhanced Error Codes)
RFC 2554 (AUTH command)
RFC 2821 (SMTP protocol)
RFC 2920 (SMTP Pipelining)
diff --git a/postfix/proto/DB_README.html b/postfix/proto/DB_README.html
index 886789887..505cbba8c 100644
--- a/postfix/proto/DB_README.html
+++ b/postfix/proto/DB_README.html
@@ -72,15 +72,25 @@ http://www.sleepycat.com/, use something like:
% make tidy
-% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB.3.1/include" \
- AUXLIBS="-L/usr/local/BerkeleyDB.3.1/lib -ldb"
+% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+ AUXLIBS="-L/usr/local/BerkeleyDB/lib -ldb"
% make
- The exact pathnames depend on the DB version that you installed.
-For example, Berkeley DB version 2 installs in /usr/local/BerkeleyDB.
-
+ Solaris needs this:
+
+
+
+% make tidy
+% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+ AUXLIBS="-R/usr/local/BerkeleyDB/lib -L/usr/local/BerkeleyDB/lib -ldb"
+% make
+
+
+
+ The exact pathnames depend on the Berkeley DB version, and on
+how it was installed.
Warning: the file format produced by Berkeley DB version 1 is
not compatible with that of versions 2 and 3 (versions 2 and 3 have
diff --git a/postfix/proto/access b/postfix/proto/access
index 405ba1f3f..783786fdf 100644
--- a/postfix/proto/access
+++ b/postfix/proto/access
@@ -147,6 +147,11 @@
# REJECT ACTIONS
# .ad
# .fi
+# Postfix version 2.3 and later support enhanced status codes.
+# When no code is specified at the beginning of the \fItext\fR
+# below, Postfix inserts a default enhanced status code of "5.7.1"
+# in the case of reject actions, and "4.7.1" in the case of
+# defer actions.
# .IP "\fB4\fINN text\fR"
# .IP "\fB5\fINN text\fR"
# Reject the address etc. that matches the pattern, and respond with
diff --git a/postfix/proto/header_checks b/postfix/proto/header_checks
index 289acac25..51220d4e6 100644
--- a/postfix/proto/header_checks
+++ b/postfix/proto/header_checks
@@ -213,6 +213,11 @@
# .sp
# Note: this action disables further header or body_checks inspection
# of the current message and affects all recipients.
+# .sp
+# Postfix version 2.3 and later support enhanced status codes.
+# When no code is specified at the beginning of \fIoptional
+# text...\fR, Postfix inserts a default enhanced status code of
+# "5.7.1".
# .IP "\fBWARN \fIoptional text...\fR
# Log a warning with the \fIoptional text...\fR (or log a
# generic message) and inspect the next input line. This
diff --git a/postfix/src/anvil/Makefile.in b/postfix/src/anvil/Makefile.in
index 5e4035fb1..5ff109e3a 100644
--- a/postfix/src/anvil/Makefile.in
+++ b/postfix/src/anvil/Makefile.in
@@ -47,26 +47,27 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-anvil.o: anvil.c
-anvil.o: ../../include/sys_defs.h
-anvil.o: ../../include/msg.h
-anvil.o: ../../include/mymalloc.h
-anvil.o: ../../include/htable.h
-anvil.o: ../../include/stringops.h
-anvil.o: ../../include/vstring.h
-anvil.o: ../../include/vbuf.h
+anvil.o: ../../include/anvil_clnt.h
+anvil.o: ../../include/attr.h
+anvil.o: ../../include/attr_clnt.h
anvil.o: ../../include/events.h
+anvil.o: ../../include/htable.h
+anvil.o: ../../include/iostuff.h
anvil.o: ../../include/mail_conf.h
anvil.o: ../../include/mail_params.h
anvil.o: ../../include/mail_proto.h
-anvil.o: ../../include/vstream.h
-anvil.o: ../../include/iostuff.h
-anvil.o: ../../include/attr.h
-anvil.o: ../../include/anvil_clnt.h
-anvil.o: ../../include/attr_clnt.h
anvil.o: ../../include/mail_server.h
+anvil.o: ../../include/msg.h
+anvil.o: ../../include/mymalloc.h
+anvil.o: ../../include/stringops.h
+anvil.o: ../../include/sys_defs.h
+anvil.o: ../../include/vbuf.h
+anvil.o: ../../include/vstream.h
+anvil.o: ../../include/vstring.h
+anvil.o: anvil.c
diff --git a/postfix/src/bounce/Makefile.in b/postfix/src/bounce/Makefile.in
index 7c802a6da..1d89b537b 100644
--- a/postfix/src/bounce/Makefile.in
+++ b/postfix/src/bounce/Makefile.in
@@ -52,172 +52,173 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-bounce.o: bounce.c
-bounce.o: ../../include/sys_defs.h
-bounce.o: ../../include/msg.h
-bounce.o: ../../include/vstring.h
-bounce.o: ../../include/vbuf.h
-bounce.o: ../../include/vstream.h
-bounce.o: ../../include/stringops.h
-bounce.o: ../../include/mail_proto.h
-bounce.o: ../../include/iostuff.h
bounce.o: ../../include/attr.h
-bounce.o: ../../include/mail_queue.h
-bounce.o: ../../include/mail_params.h
-bounce.o: ../../include/mail_conf.h
bounce.o: ../../include/bounce.h
+bounce.o: ../../include/bounce_log.h
bounce.o: ../../include/deliver_request.h
-bounce.o: ../../include/recipient_list.h
+bounce.o: ../../include/iostuff.h
bounce.o: ../../include/mail_addr.h
+bounce.o: ../../include/mail_conf.h
+bounce.o: ../../include/mail_params.h
+bounce.o: ../../include/mail_proto.h
+bounce.o: ../../include/mail_queue.h
bounce.o: ../../include/mail_server.h
+bounce.o: ../../include/msg.h
+bounce.o: ../../include/recipient_list.h
+bounce.o: ../../include/stringops.h
+bounce.o: ../../include/sys_defs.h
+bounce.o: ../../include/vbuf.h
+bounce.o: ../../include/vstream.h
+bounce.o: ../../include/vstring.h
+bounce.o: bounce.c
bounce.o: bounce_service.h
-bounce.o: ../../include/bounce_log.h
-bounce_append_service.o: bounce_append_service.c
-bounce_append_service.o: ../../include/sys_defs.h
-bounce_append_service.o: ../../include/msg.h
-bounce_append_service.o: ../../include/vstring.h
-bounce_append_service.o: ../../include/vbuf.h
-bounce_append_service.o: ../../include/vstream.h
-bounce_append_service.o: ../../include/stringops.h
+bounce_append_service.o: ../../include/attr.h
+bounce_append_service.o: ../../include/bounce_log.h
+bounce_append_service.o: ../../include/deliver_flock.h
+bounce_append_service.o: ../../include/iostuff.h
bounce_append_service.o: ../../include/mail_params.h
+bounce_append_service.o: ../../include/mail_proto.h
bounce_append_service.o: ../../include/mail_queue.h
+bounce_append_service.o: ../../include/msg.h
+bounce_append_service.o: ../../include/myflock.h
bounce_append_service.o: ../../include/quote_822_local.h
bounce_append_service.o: ../../include/quote_flags.h
-bounce_append_service.o: ../../include/deliver_flock.h
-bounce_append_service.o: ../../include/myflock.h
-bounce_append_service.o: ../../include/mail_proto.h
-bounce_append_service.o: ../../include/iostuff.h
-bounce_append_service.o: ../../include/attr.h
+bounce_append_service.o: ../../include/stringops.h
+bounce_append_service.o: ../../include/sys_defs.h
+bounce_append_service.o: ../../include/vbuf.h
+bounce_append_service.o: ../../include/vstream.h
+bounce_append_service.o: ../../include/vstring.h
+bounce_append_service.o: bounce_append_service.c
bounce_append_service.o: bounce_service.h
-bounce_append_service.o: ../../include/bounce_log.h
-bounce_cleanup.o: bounce_cleanup.c
-bounce_cleanup.o: ../../include/sys_defs.h
+bounce_cleanup.o: ../../include/bounce_log.h
+bounce_cleanup.o: ../../include/mail_queue.h
bounce_cleanup.o: ../../include/msg.h
bounce_cleanup.o: ../../include/mymalloc.h
-bounce_cleanup.o: ../../include/vstring.h
+bounce_cleanup.o: ../../include/sys_defs.h
bounce_cleanup.o: ../../include/vbuf.h
-bounce_cleanup.o: ../../include/mail_queue.h
bounce_cleanup.o: ../../include/vstream.h
+bounce_cleanup.o: ../../include/vstring.h
+bounce_cleanup.o: bounce_cleanup.c
bounce_cleanup.o: bounce_service.h
-bounce_cleanup.o: ../../include/bounce_log.h
-bounce_notify_service.o: bounce_notify_service.c
-bounce_notify_service.o: ../../include/sys_defs.h
-bounce_notify_service.o: ../../include/msg.h
-bounce_notify_service.o: ../../include/vstream.h
-bounce_notify_service.o: ../../include/vbuf.h
-bounce_notify_service.o: ../../include/name_mask.h
-bounce_notify_service.o: ../../include/mail_params.h
-bounce_notify_service.o: ../../include/mail_queue.h
-bounce_notify_service.o: ../../include/vstring.h
-bounce_notify_service.o: ../../include/post_mail.h
+bounce_notify_service.o: ../../include/bounce.h
+bounce_notify_service.o: ../../include/bounce_log.h
bounce_notify_service.o: ../../include/cleanup_user.h
+bounce_notify_service.o: ../../include/deliver_request.h
bounce_notify_service.o: ../../include/mail_addr.h
bounce_notify_service.o: ../../include/mail_error.h
-bounce_notify_service.o: ../../include/bounce.h
-bounce_notify_service.o: ../../include/deliver_request.h
+bounce_notify_service.o: ../../include/mail_params.h
+bounce_notify_service.o: ../../include/mail_queue.h
+bounce_notify_service.o: ../../include/msg.h
+bounce_notify_service.o: ../../include/name_mask.h
+bounce_notify_service.o: ../../include/post_mail.h
bounce_notify_service.o: ../../include/recipient_list.h
+bounce_notify_service.o: ../../include/sys_defs.h
+bounce_notify_service.o: ../../include/vbuf.h
+bounce_notify_service.o: ../../include/vstream.h
+bounce_notify_service.o: ../../include/vstring.h
+bounce_notify_service.o: bounce_notify_service.c
bounce_notify_service.o: bounce_service.h
-bounce_notify_service.o: ../../include/bounce_log.h
-bounce_notify_util.o: bounce_notify_util.c
-bounce_notify_util.o: ../../include/sys_defs.h
-bounce_notify_util.o: ../../include/msg.h
-bounce_notify_util.o: ../../include/mymalloc.h
+bounce_notify_util.o: ../../include/attr.h
+bounce_notify_util.o: ../../include/bounce_log.h
+bounce_notify_util.o: ../../include/cleanup_user.h
+bounce_notify_util.o: ../../include/deliver_completed.h
bounce_notify_util.o: ../../include/events.h
-bounce_notify_util.o: ../../include/vstring.h
-bounce_notify_util.o: ../../include/vbuf.h
-bounce_notify_util.o: ../../include/vstream.h
+bounce_notify_util.o: ../../include/iostuff.h
+bounce_notify_util.o: ../../include/is_header.h
+bounce_notify_util.o: ../../include/lex_822.h
bounce_notify_util.o: ../../include/line_wrap.h
-bounce_notify_util.o: ../../include/stringops.h
-bounce_notify_util.o: ../../include/xtext.h
-bounce_notify_util.o: ../../include/myflock.h
+bounce_notify_util.o: ../../include/mail_addr.h
+bounce_notify_util.o: ../../include/mail_date.h
+bounce_notify_util.o: ../../include/mail_error.h
+bounce_notify_util.o: ../../include/mail_params.h
+bounce_notify_util.o: ../../include/mail_proto.h
bounce_notify_util.o: ../../include/mail_queue.h
+bounce_notify_util.o: ../../include/msg.h
+bounce_notify_util.o: ../../include/myflock.h
+bounce_notify_util.o: ../../include/mymalloc.h
+bounce_notify_util.o: ../../include/name_mask.h
+bounce_notify_util.o: ../../include/post_mail.h
bounce_notify_util.o: ../../include/quote_822_local.h
bounce_notify_util.o: ../../include/quote_flags.h
-bounce_notify_util.o: ../../include/mail_params.h
-bounce_notify_util.o: ../../include/is_header.h
-bounce_notify_util.o: ../../include/record.h
bounce_notify_util.o: ../../include/rec_type.h
-bounce_notify_util.o: ../../include/post_mail.h
-bounce_notify_util.o: ../../include/cleanup_user.h
-bounce_notify_util.o: ../../include/mail_addr.h
-bounce_notify_util.o: ../../include/mail_error.h
-bounce_notify_util.o: ../../include/name_mask.h
-bounce_notify_util.o: ../../include/bounce_log.h
-bounce_notify_util.o: ../../include/mail_date.h
-bounce_notify_util.o: ../../include/mail_proto.h
-bounce_notify_util.o: ../../include/iostuff.h
-bounce_notify_util.o: ../../include/attr.h
-bounce_notify_util.o: ../../include/lex_822.h
-bounce_notify_util.o: ../../include/deliver_completed.h
+bounce_notify_util.o: ../../include/record.h
+bounce_notify_util.o: ../../include/stringops.h
+bounce_notify_util.o: ../../include/sys_defs.h
+bounce_notify_util.o: ../../include/vbuf.h
+bounce_notify_util.o: ../../include/vstream.h
+bounce_notify_util.o: ../../include/vstring.h
+bounce_notify_util.o: ../../include/xtext.h
+bounce_notify_util.o: bounce_notify_util.c
bounce_notify_util.o: bounce_service.h
-bounce_notify_verp.o: bounce_notify_verp.c
-bounce_notify_verp.o: ../../include/sys_defs.h
-bounce_notify_verp.o: ../../include/msg.h
-bounce_notify_verp.o: ../../include/vstream.h
-bounce_notify_verp.o: ../../include/vbuf.h
-bounce_notify_verp.o: ../../include/name_mask.h
-bounce_notify_verp.o: ../../include/mail_params.h
-bounce_notify_verp.o: ../../include/mail_queue.h
-bounce_notify_verp.o: ../../include/vstring.h
-bounce_notify_verp.o: ../../include/post_mail.h
+bounce_notify_verp.o: ../../include/bounce.h
+bounce_notify_verp.o: ../../include/bounce_log.h
bounce_notify_verp.o: ../../include/cleanup_user.h
+bounce_notify_verp.o: ../../include/deliver_request.h
bounce_notify_verp.o: ../../include/mail_addr.h
bounce_notify_verp.o: ../../include/mail_error.h
-bounce_notify_verp.o: ../../include/verp_sender.h
-bounce_notify_verp.o: ../../include/bounce.h
-bounce_notify_verp.o: ../../include/deliver_request.h
+bounce_notify_verp.o: ../../include/mail_params.h
+bounce_notify_verp.o: ../../include/mail_queue.h
+bounce_notify_verp.o: ../../include/msg.h
+bounce_notify_verp.o: ../../include/name_mask.h
+bounce_notify_verp.o: ../../include/post_mail.h
bounce_notify_verp.o: ../../include/recipient_list.h
+bounce_notify_verp.o: ../../include/sys_defs.h
+bounce_notify_verp.o: ../../include/vbuf.h
+bounce_notify_verp.o: ../../include/verp_sender.h
+bounce_notify_verp.o: ../../include/vstream.h
+bounce_notify_verp.o: ../../include/vstring.h
+bounce_notify_verp.o: bounce_notify_verp.c
bounce_notify_verp.o: bounce_service.h
-bounce_notify_verp.o: ../../include/bounce_log.h
-bounce_one_service.o: bounce_one_service.c
-bounce_one_service.o: ../../include/sys_defs.h
-bounce_one_service.o: ../../include/msg.h
-bounce_one_service.o: ../../include/vstream.h
-bounce_one_service.o: ../../include/vbuf.h
-bounce_one_service.o: ../../include/name_mask.h
-bounce_one_service.o: ../../include/mail_params.h
-bounce_one_service.o: ../../include/post_mail.h
+bounce_one_service.o: ../../include/bounce.h
+bounce_one_service.o: ../../include/bounce_log.h
bounce_one_service.o: ../../include/cleanup_user.h
+bounce_one_service.o: ../../include/deliver_request.h
bounce_one_service.o: ../../include/mail_addr.h
bounce_one_service.o: ../../include/mail_error.h
-bounce_one_service.o: ../../include/bounce.h
-bounce_one_service.o: ../../include/deliver_request.h
-bounce_one_service.o: ../../include/vstring.h
+bounce_one_service.o: ../../include/mail_params.h
+bounce_one_service.o: ../../include/msg.h
+bounce_one_service.o: ../../include/name_mask.h
+bounce_one_service.o: ../../include/post_mail.h
bounce_one_service.o: ../../include/recipient_list.h
+bounce_one_service.o: ../../include/sys_defs.h
+bounce_one_service.o: ../../include/vbuf.h
+bounce_one_service.o: ../../include/vstream.h
+bounce_one_service.o: ../../include/vstring.h
+bounce_one_service.o: bounce_one_service.c
bounce_one_service.o: bounce_service.h
-bounce_one_service.o: ../../include/bounce_log.h
-bounce_trace_service.o: bounce_trace_service.c
-bounce_trace_service.o: ../../include/sys_defs.h
-bounce_trace_service.o: ../../include/msg.h
-bounce_trace_service.o: ../../include/vstream.h
-bounce_trace_service.o: ../../include/vbuf.h
-bounce_trace_service.o: ../../include/mail_params.h
-bounce_trace_service.o: ../../include/mail_queue.h
-bounce_trace_service.o: ../../include/vstring.h
-bounce_trace_service.o: ../../include/post_mail.h
+bounce_trace_service.o: ../../include/bounce_log.h
bounce_trace_service.o: ../../include/cleanup_user.h
bounce_trace_service.o: ../../include/mail_addr.h
bounce_trace_service.o: ../../include/mail_error.h
+bounce_trace_service.o: ../../include/mail_params.h
+bounce_trace_service.o: ../../include/mail_queue.h
+bounce_trace_service.o: ../../include/msg.h
bounce_trace_service.o: ../../include/name_mask.h
+bounce_trace_service.o: ../../include/post_mail.h
+bounce_trace_service.o: ../../include/sys_defs.h
+bounce_trace_service.o: ../../include/vbuf.h
+bounce_trace_service.o: ../../include/vstream.h
+bounce_trace_service.o: ../../include/vstring.h
bounce_trace_service.o: bounce_service.h
-bounce_trace_service.o: ../../include/bounce_log.h
-bounce_warn_service.o: bounce_warn_service.c
-bounce_warn_service.o: ../../include/sys_defs.h
-bounce_warn_service.o: ../../include/msg.h
-bounce_warn_service.o: ../../include/vstream.h
-bounce_warn_service.o: ../../include/vbuf.h
-bounce_warn_service.o: ../../include/name_mask.h
-bounce_warn_service.o: ../../include/mail_params.h
-bounce_warn_service.o: ../../include/mail_queue.h
-bounce_warn_service.o: ../../include/vstring.h
-bounce_warn_service.o: ../../include/post_mail.h
+bounce_trace_service.o: bounce_trace_service.c
+bounce_warn_service.o: ../../include/bounce_log.h
bounce_warn_service.o: ../../include/cleanup_user.h
bounce_warn_service.o: ../../include/mail_addr.h
bounce_warn_service.o: ../../include/mail_error.h
+bounce_warn_service.o: ../../include/mail_params.h
+bounce_warn_service.o: ../../include/mail_queue.h
+bounce_warn_service.o: ../../include/msg.h
+bounce_warn_service.o: ../../include/name_mask.h
+bounce_warn_service.o: ../../include/post_mail.h
+bounce_warn_service.o: ../../include/sys_defs.h
+bounce_warn_service.o: ../../include/vbuf.h
+bounce_warn_service.o: ../../include/vstream.h
+bounce_warn_service.o: ../../include/vstring.h
bounce_warn_service.o: bounce_service.h
-bounce_warn_service.o: ../../include/bounce_log.h
+bounce_warn_service.o: bounce_warn_service.c
diff --git a/postfix/src/bounce/bounce_append_service.c b/postfix/src/bounce/bounce_append_service.c
index a72b92c95..69970cea6 100644
--- a/postfix/src/bounce/bounce_append_service.c
+++ b/postfix/src/bounce/bounce_append_service.c
@@ -6,12 +6,14 @@
/* SYNOPSIS
/* #include "bounce_service.h"
/*
-/* int bounce_append_service(flags, queue_id, orig_rcpt, recipient,
-/* status, action, why)
+/* int bounce_append_service(flags, service, queue_id, orig_rcpt,
+/* recipient, offset, status, action, why)
/* int flags;
+/* char *service;
/* char *queue_id;
/* char *orig_rcpt;
/* char *recipient;
+/* long offset;
/* char *status;
/* char *action;
/* char *why;
diff --git a/postfix/src/cleanup/Makefile.in b/postfix/src/cleanup/Makefile.in
index 233baab16..66212f8e5 100644
--- a/postfix/src/cleanup/Makefile.in
+++ b/postfix/src/cleanup/Makefile.in
@@ -76,428 +76,431 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-cleanup.o: cleanup.c
-cleanup.o: ../../include/sys_defs.h
-cleanup.o: ../../include/msg.h
-cleanup.o: ../../include/vstring.h
-cleanup.o: ../../include/vbuf.h
-cleanup.o: ../../include/dict.h
-cleanup.o: ../../include/vstream.h
cleanup.o: ../../include/argv.h
-cleanup.o: ../../include/mail_conf.h
+cleanup.o: ../../include/attr.h
+cleanup.o: ../../include/been_here.h
cleanup.o: ../../include/cleanup_user.h
-cleanup.o: ../../include/mail_proto.h
+cleanup.o: ../../include/dict.h
+cleanup.o: ../../include/header_opts.h
+cleanup.o: ../../include/htable.h
cleanup.o: ../../include/iostuff.h
-cleanup.o: ../../include/attr.h
+cleanup.o: ../../include/mail_conf.h
cleanup.o: ../../include/mail_params.h
-cleanup.o: ../../include/record.h
-cleanup.o: ../../include/rec_type.h
+cleanup.o: ../../include/mail_proto.h
cleanup.o: ../../include/mail_server.h
-cleanup.o: cleanup.h
-cleanup.o: ../../include/nvtable.h
-cleanup.o: ../../include/htable.h
-cleanup.o: ../../include/mymalloc.h
-cleanup.o: ../../include/maps.h
-cleanup.o: ../../include/tok822.h
-cleanup.o: ../../include/resolve_clnt.h
-cleanup.o: ../../include/been_here.h
cleanup.o: ../../include/mail_stream.h
-cleanup.o: ../../include/mime_state.h
-cleanup.o: ../../include/header_opts.h
-cleanup.o: ../../include/string_list.h
+cleanup.o: ../../include/maps.h
cleanup.o: ../../include/match_list.h
cleanup.o: ../../include/match_ops.h
-cleanup_addr.o: cleanup_addr.c
-cleanup_addr.o: ../../include/sys_defs.h
-cleanup_addr.o: ../../include/msg.h
-cleanup_addr.o: ../../include/vstring.h
-cleanup_addr.o: ../../include/vbuf.h
-cleanup_addr.o: ../../include/vstream.h
-cleanup_addr.o: ../../include/mymalloc.h
-cleanup_addr.o: ../../include/stringops.h
-cleanup_addr.o: ../../include/rec_type.h
+cleanup.o: ../../include/mime_state.h
+cleanup.o: ../../include/msg.h
+cleanup.o: ../../include/mymalloc.h
+cleanup.o: ../../include/nvtable.h
+cleanup.o: ../../include/rec_type.h
+cleanup.o: ../../include/record.h
+cleanup.o: ../../include/resolve_clnt.h
+cleanup.o: ../../include/string_list.h
+cleanup.o: ../../include/sys_defs.h
+cleanup.o: ../../include/tok822.h
+cleanup.o: ../../include/vbuf.h
+cleanup.o: ../../include/vstream.h
+cleanup.o: ../../include/vstring.h
+cleanup.o: cleanup.c
+cleanup.o: cleanup.h
+cleanup_addr.o: ../../include/argv.h
+cleanup_addr.o: ../../include/attr.h
+cleanup_addr.o: ../../include/been_here.h
+cleanup_addr.o: ../../include/canon_addr.h
cleanup_addr.o: ../../include/cleanup_user.h
-cleanup_addr.o: ../../include/mail_params.h
+cleanup_addr.o: ../../include/dict.h
cleanup_addr.o: ../../include/ext_prop.h
+cleanup_addr.o: ../../include/header_opts.h
+cleanup_addr.o: ../../include/htable.h
+cleanup_addr.o: ../../include/iostuff.h
cleanup_addr.o: ../../include/mail_addr.h
-cleanup_addr.o: ../../include/canon_addr.h
cleanup_addr.o: ../../include/mail_addr_find.h
-cleanup_addr.o: ../../include/maps.h
-cleanup_addr.o: ../../include/dict.h
-cleanup_addr.o: ../../include/argv.h
+cleanup_addr.o: ../../include/mail_conf.h
+cleanup_addr.o: ../../include/mail_params.h
cleanup_addr.o: ../../include/mail_proto.h
-cleanup_addr.o: ../../include/iostuff.h
-cleanup_addr.o: ../../include/attr.h
-cleanup_addr.o: cleanup.h
-cleanup_addr.o: ../../include/nvtable.h
-cleanup_addr.o: ../../include/htable.h
-cleanup_addr.o: ../../include/tok822.h
-cleanup_addr.o: ../../include/resolve_clnt.h
-cleanup_addr.o: ../../include/been_here.h
cleanup_addr.o: ../../include/mail_stream.h
-cleanup_addr.o: ../../include/mail_conf.h
-cleanup_addr.o: ../../include/mime_state.h
-cleanup_addr.o: ../../include/header_opts.h
-cleanup_addr.o: ../../include/string_list.h
+cleanup_addr.o: ../../include/maps.h
cleanup_addr.o: ../../include/match_list.h
cleanup_addr.o: ../../include/match_ops.h
-cleanup_api.o: cleanup_api.c
-cleanup_api.o: ../../include/sys_defs.h
-cleanup_api.o: ../../include/msg.h
-cleanup_api.o: ../../include/vstring.h
-cleanup_api.o: ../../include/vbuf.h
-cleanup_api.o: ../../include/mymalloc.h
-cleanup_api.o: ../../include/cleanup_user.h
-cleanup_api.o: ../../include/mail_queue.h
-cleanup_api.o: ../../include/vstream.h
-cleanup_api.o: ../../include/mail_proto.h
-cleanup_api.o: ../../include/iostuff.h
+cleanup_addr.o: ../../include/mime_state.h
+cleanup_addr.o: ../../include/msg.h
+cleanup_addr.o: ../../include/mymalloc.h
+cleanup_addr.o: ../../include/nvtable.h
+cleanup_addr.o: ../../include/rec_type.h
+cleanup_addr.o: ../../include/resolve_clnt.h
+cleanup_addr.o: ../../include/string_list.h
+cleanup_addr.o: ../../include/stringops.h
+cleanup_addr.o: ../../include/sys_defs.h
+cleanup_addr.o: ../../include/tok822.h
+cleanup_addr.o: ../../include/vbuf.h
+cleanup_addr.o: ../../include/vstream.h
+cleanup_addr.o: ../../include/vstring.h
+cleanup_addr.o: cleanup.h
+cleanup_addr.o: cleanup_addr.c
+cleanup_api.o: ../../include/argv.h
cleanup_api.o: ../../include/attr.h
+cleanup_api.o: ../../include/been_here.h
cleanup_api.o: ../../include/bounce.h
+cleanup_api.o: ../../include/cleanup_user.h
cleanup_api.o: ../../include/deliver_request.h
-cleanup_api.o: ../../include/recipient_list.h
-cleanup_api.o: ../../include/mail_params.h
-cleanup_api.o: ../../include/mail_stream.h
+cleanup_api.o: ../../include/dict.h
+cleanup_api.o: ../../include/dsn_util.h
+cleanup_api.o: ../../include/header_opts.h
cleanup_api.o: ../../include/hold_message.h
-cleanup_api.o: cleanup.h
-cleanup_api.o: ../../include/argv.h
-cleanup_api.o: ../../include/nvtable.h
cleanup_api.o: ../../include/htable.h
-cleanup_api.o: ../../include/maps.h
-cleanup_api.o: ../../include/dict.h
-cleanup_api.o: ../../include/tok822.h
-cleanup_api.o: ../../include/resolve_clnt.h
-cleanup_api.o: ../../include/been_here.h
+cleanup_api.o: ../../include/iostuff.h
cleanup_api.o: ../../include/mail_conf.h
-cleanup_api.o: ../../include/mime_state.h
-cleanup_api.o: ../../include/header_opts.h
-cleanup_api.o: ../../include/string_list.h
+cleanup_api.o: ../../include/mail_params.h
+cleanup_api.o: ../../include/mail_proto.h
+cleanup_api.o: ../../include/mail_queue.h
+cleanup_api.o: ../../include/mail_stream.h
+cleanup_api.o: ../../include/maps.h
cleanup_api.o: ../../include/match_list.h
cleanup_api.o: ../../include/match_ops.h
-cleanup_envelope.o: cleanup_envelope.c
-cleanup_envelope.o: ../../include/sys_defs.h
-cleanup_envelope.o: ../../include/msg.h
-cleanup_envelope.o: ../../include/vstring.h
-cleanup_envelope.o: ../../include/vbuf.h
-cleanup_envelope.o: ../../include/vstream.h
-cleanup_envelope.o: ../../include/mymalloc.h
-cleanup_envelope.o: ../../include/stringops.h
-cleanup_envelope.o: ../../include/nvtable.h
-cleanup_envelope.o: ../../include/htable.h
-cleanup_envelope.o: ../../include/record.h
-cleanup_envelope.o: ../../include/rec_type.h
+cleanup_api.o: ../../include/mime_state.h
+cleanup_api.o: ../../include/msg.h
+cleanup_api.o: ../../include/mymalloc.h
+cleanup_api.o: ../../include/nvtable.h
+cleanup_api.o: ../../include/recipient_list.h
+cleanup_api.o: ../../include/resolve_clnt.h
+cleanup_api.o: ../../include/string_list.h
+cleanup_api.o: ../../include/sys_defs.h
+cleanup_api.o: ../../include/tok822.h
+cleanup_api.o: ../../include/vbuf.h
+cleanup_api.o: ../../include/vstream.h
+cleanup_api.o: ../../include/vstring.h
+cleanup_api.o: cleanup.h
+cleanup_api.o: cleanup_api.c
+cleanup_envelope.o: ../../include/argv.h
+cleanup_envelope.o: ../../include/attr.h
+cleanup_envelope.o: ../../include/been_here.h
cleanup_envelope.o: ../../include/cleanup_user.h
-cleanup_envelope.o: ../../include/qmgr_user.h
+cleanup_envelope.o: ../../include/dict.h
+cleanup_envelope.o: ../../include/header_opts.h
+cleanup_envelope.o: ../../include/htable.h
+cleanup_envelope.o: ../../include/iostuff.h
+cleanup_envelope.o: ../../include/mail_conf.h
cleanup_envelope.o: ../../include/mail_params.h
-cleanup_envelope.o: ../../include/verp_sender.h
cleanup_envelope.o: ../../include/mail_proto.h
-cleanup_envelope.o: ../../include/iostuff.h
-cleanup_envelope.o: ../../include/attr.h
-cleanup_envelope.o: cleanup.h
-cleanup_envelope.o: ../../include/argv.h
-cleanup_envelope.o: ../../include/maps.h
-cleanup_envelope.o: ../../include/dict.h
-cleanup_envelope.o: ../../include/tok822.h
-cleanup_envelope.o: ../../include/resolve_clnt.h
-cleanup_envelope.o: ../../include/been_here.h
cleanup_envelope.o: ../../include/mail_stream.h
-cleanup_envelope.o: ../../include/mail_conf.h
-cleanup_envelope.o: ../../include/mime_state.h
-cleanup_envelope.o: ../../include/header_opts.h
-cleanup_envelope.o: ../../include/string_list.h
+cleanup_envelope.o: ../../include/maps.h
cleanup_envelope.o: ../../include/match_list.h
cleanup_envelope.o: ../../include/match_ops.h
-cleanup_extracted.o: cleanup_extracted.c
-cleanup_extracted.o: ../../include/sys_defs.h
+cleanup_envelope.o: ../../include/mime_state.h
+cleanup_envelope.o: ../../include/msg.h
+cleanup_envelope.o: ../../include/mymalloc.h
+cleanup_envelope.o: ../../include/nvtable.h
+cleanup_envelope.o: ../../include/qmgr_user.h
+cleanup_envelope.o: ../../include/rec_type.h
+cleanup_envelope.o: ../../include/record.h
+cleanup_envelope.o: ../../include/resolve_clnt.h
+cleanup_envelope.o: ../../include/string_list.h
+cleanup_envelope.o: ../../include/stringops.h
+cleanup_envelope.o: ../../include/sys_defs.h
+cleanup_envelope.o: ../../include/tok822.h
+cleanup_envelope.o: ../../include/vbuf.h
+cleanup_envelope.o: ../../include/verp_sender.h
+cleanup_envelope.o: ../../include/vstream.h
+cleanup_envelope.o: ../../include/vstring.h
+cleanup_envelope.o: cleanup.h
+cleanup_envelope.o: cleanup_envelope.c
+cleanup_extracted.o: ../../include/argv.h
+cleanup_extracted.o: ../../include/attr.h
+cleanup_extracted.o: ../../include/been_here.h
+cleanup_extracted.o: ../../include/cleanup_user.h
+cleanup_extracted.o: ../../include/dict.h
+cleanup_extracted.o: ../../include/header_opts.h
+cleanup_extracted.o: ../../include/htable.h
+cleanup_extracted.o: ../../include/iostuff.h
+cleanup_extracted.o: ../../include/mail_conf.h
+cleanup_extracted.o: ../../include/mail_params.h
+cleanup_extracted.o: ../../include/mail_proto.h
+cleanup_extracted.o: ../../include/mail_stream.h
+cleanup_extracted.o: ../../include/maps.h
+cleanup_extracted.o: ../../include/match_list.h
+cleanup_extracted.o: ../../include/match_ops.h
+cleanup_extracted.o: ../../include/mime_state.h
cleanup_extracted.o: ../../include/msg.h
-cleanup_extracted.o: ../../include/vstring.h
-cleanup_extracted.o: ../../include/vbuf.h
-cleanup_extracted.o: ../../include/vstream.h
cleanup_extracted.o: ../../include/mymalloc.h
cleanup_extracted.o: ../../include/nvtable.h
-cleanup_extracted.o: ../../include/htable.h
-cleanup_extracted.o: ../../include/cleanup_user.h
cleanup_extracted.o: ../../include/qmgr_user.h
-cleanup_extracted.o: ../../include/record.h
cleanup_extracted.o: ../../include/rec_type.h
-cleanup_extracted.o: ../../include/mail_params.h
-cleanup_extracted.o: ../../include/mail_proto.h
-cleanup_extracted.o: ../../include/iostuff.h
-cleanup_extracted.o: ../../include/attr.h
-cleanup_extracted.o: cleanup.h
-cleanup_extracted.o: ../../include/argv.h
-cleanup_extracted.o: ../../include/maps.h
-cleanup_extracted.o: ../../include/dict.h
-cleanup_extracted.o: ../../include/tok822.h
+cleanup_extracted.o: ../../include/record.h
cleanup_extracted.o: ../../include/resolve_clnt.h
-cleanup_extracted.o: ../../include/been_here.h
-cleanup_extracted.o: ../../include/mail_stream.h
-cleanup_extracted.o: ../../include/mail_conf.h
-cleanup_extracted.o: ../../include/mime_state.h
-cleanup_extracted.o: ../../include/header_opts.h
cleanup_extracted.o: ../../include/string_list.h
-cleanup_extracted.o: ../../include/match_list.h
-cleanup_extracted.o: ../../include/match_ops.h
-cleanup_init.o: cleanup_init.c
-cleanup_init.o: ../../include/sys_defs.h
-cleanup_init.o: ../../include/msg.h
-cleanup_init.o: ../../include/iostuff.h
-cleanup_init.o: ../../include/name_mask.h
-cleanup_init.o: ../../include/mail_addr.h
-cleanup_init.o: ../../include/mail_params.h
-cleanup_init.o: ../../include/ext_prop.h
-cleanup_init.o: ../../include/flush_clnt.h
-cleanup_init.o: cleanup.h
-cleanup_init.o: ../../include/vstring.h
-cleanup_init.o: ../../include/vbuf.h
-cleanup_init.o: ../../include/vstream.h
+cleanup_extracted.o: ../../include/sys_defs.h
+cleanup_extracted.o: ../../include/tok822.h
+cleanup_extracted.o: ../../include/vbuf.h
+cleanup_extracted.o: ../../include/vstream.h
+cleanup_extracted.o: ../../include/vstring.h
+cleanup_extracted.o: cleanup.h
+cleanup_extracted.o: cleanup_extracted.c
cleanup_init.o: ../../include/argv.h
-cleanup_init.o: ../../include/nvtable.h
-cleanup_init.o: ../../include/htable.h
-cleanup_init.o: ../../include/mymalloc.h
-cleanup_init.o: ../../include/maps.h
-cleanup_init.o: ../../include/dict.h
-cleanup_init.o: ../../include/tok822.h
-cleanup_init.o: ../../include/resolve_clnt.h
cleanup_init.o: ../../include/been_here.h
-cleanup_init.o: ../../include/mail_stream.h
-cleanup_init.o: ../../include/mail_conf.h
-cleanup_init.o: ../../include/mime_state.h
+cleanup_init.o: ../../include/dict.h
+cleanup_init.o: ../../include/ext_prop.h
+cleanup_init.o: ../../include/flush_clnt.h
cleanup_init.o: ../../include/header_opts.h
-cleanup_init.o: ../../include/string_list.h
+cleanup_init.o: ../../include/htable.h
+cleanup_init.o: ../../include/iostuff.h
+cleanup_init.o: ../../include/mail_addr.h
+cleanup_init.o: ../../include/mail_conf.h
+cleanup_init.o: ../../include/mail_params.h
+cleanup_init.o: ../../include/mail_stream.h
+cleanup_init.o: ../../include/maps.h
cleanup_init.o: ../../include/match_list.h
cleanup_init.o: ../../include/match_ops.h
-cleanup_map11.o: cleanup_map11.c
-cleanup_map11.o: ../../include/sys_defs.h
-cleanup_map11.o: ../../include/msg.h
-cleanup_map11.o: ../../include/vstring.h
-cleanup_map11.o: ../../include/vbuf.h
-cleanup_map11.o: ../../include/dict.h
-cleanup_map11.o: ../../include/vstream.h
+cleanup_init.o: ../../include/mime_state.h
+cleanup_init.o: ../../include/msg.h
+cleanup_init.o: ../../include/mymalloc.h
+cleanup_init.o: ../../include/name_mask.h
+cleanup_init.o: ../../include/nvtable.h
+cleanup_init.o: ../../include/resolve_clnt.h
+cleanup_init.o: ../../include/string_list.h
+cleanup_init.o: ../../include/sys_defs.h
+cleanup_init.o: ../../include/tok822.h
+cleanup_init.o: ../../include/vbuf.h
+cleanup_init.o: ../../include/vstream.h
+cleanup_init.o: ../../include/vstring.h
+cleanup_init.o: cleanup.h
+cleanup_init.o: cleanup_init.c
cleanup_map11.o: ../../include/argv.h
-cleanup_map11.o: ../../include/mymalloc.h
+cleanup_map11.o: ../../include/been_here.h
cleanup_map11.o: ../../include/cleanup_user.h
+cleanup_map11.o: ../../include/dict.h
+cleanup_map11.o: ../../include/header_opts.h
+cleanup_map11.o: ../../include/htable.h
cleanup_map11.o: ../../include/mail_addr_map.h
+cleanup_map11.o: ../../include/mail_conf.h
+cleanup_map11.o: ../../include/mail_stream.h
cleanup_map11.o: ../../include/maps.h
+cleanup_map11.o: ../../include/match_list.h
+cleanup_map11.o: ../../include/match_ops.h
+cleanup_map11.o: ../../include/mime_state.h
+cleanup_map11.o: ../../include/msg.h
+cleanup_map11.o: ../../include/mymalloc.h
+cleanup_map11.o: ../../include/nvtable.h
cleanup_map11.o: ../../include/quote_822_local.h
cleanup_map11.o: ../../include/quote_flags.h
-cleanup_map11.o: cleanup.h
-cleanup_map11.o: ../../include/nvtable.h
-cleanup_map11.o: ../../include/htable.h
-cleanup_map11.o: ../../include/tok822.h
cleanup_map11.o: ../../include/resolve_clnt.h
-cleanup_map11.o: ../../include/been_here.h
-cleanup_map11.o: ../../include/mail_stream.h
-cleanup_map11.o: ../../include/mail_conf.h
-cleanup_map11.o: ../../include/mime_state.h
-cleanup_map11.o: ../../include/header_opts.h
cleanup_map11.o: ../../include/string_list.h
-cleanup_map11.o: ../../include/match_list.h
-cleanup_map11.o: ../../include/match_ops.h
-cleanup_map1n.o: cleanup_map1n.c
-cleanup_map1n.o: ../../include/sys_defs.h
-cleanup_map1n.o: ../../include/mymalloc.h
-cleanup_map1n.o: ../../include/msg.h
+cleanup_map11.o: ../../include/sys_defs.h
+cleanup_map11.o: ../../include/tok822.h
+cleanup_map11.o: ../../include/vbuf.h
+cleanup_map11.o: ../../include/vstream.h
+cleanup_map11.o: ../../include/vstring.h
+cleanup_map11.o: cleanup.h
+cleanup_map11.o: cleanup_map11.c
cleanup_map1n.o: ../../include/argv.h
-cleanup_map1n.o: ../../include/vstring.h
-cleanup_map1n.o: ../../include/vbuf.h
+cleanup_map1n.o: ../../include/been_here.h
+cleanup_map1n.o: ../../include/cleanup_user.h
cleanup_map1n.o: ../../include/dict.h
-cleanup_map1n.o: ../../include/vstream.h
-cleanup_map1n.o: ../../include/mail_params.h
+cleanup_map1n.o: ../../include/header_opts.h
+cleanup_map1n.o: ../../include/htable.h
cleanup_map1n.o: ../../include/mail_addr_map.h
+cleanup_map1n.o: ../../include/mail_conf.h
+cleanup_map1n.o: ../../include/mail_params.h
+cleanup_map1n.o: ../../include/mail_stream.h
cleanup_map1n.o: ../../include/maps.h
-cleanup_map1n.o: ../../include/cleanup_user.h
+cleanup_map1n.o: ../../include/match_list.h
+cleanup_map1n.o: ../../include/match_ops.h
+cleanup_map1n.o: ../../include/mime_state.h
+cleanup_map1n.o: ../../include/msg.h
+cleanup_map1n.o: ../../include/mymalloc.h
+cleanup_map1n.o: ../../include/nvtable.h
cleanup_map1n.o: ../../include/quote_822_local.h
cleanup_map1n.o: ../../include/quote_flags.h
-cleanup_map1n.o: ../../include/been_here.h
-cleanup_map1n.o: cleanup.h
-cleanup_map1n.o: ../../include/nvtable.h
-cleanup_map1n.o: ../../include/htable.h
-cleanup_map1n.o: ../../include/tok822.h
cleanup_map1n.o: ../../include/resolve_clnt.h
-cleanup_map1n.o: ../../include/mail_stream.h
-cleanup_map1n.o: ../../include/mail_conf.h
-cleanup_map1n.o: ../../include/mime_state.h
-cleanup_map1n.o: ../../include/header_opts.h
cleanup_map1n.o: ../../include/string_list.h
-cleanup_map1n.o: ../../include/match_list.h
-cleanup_map1n.o: ../../include/match_ops.h
-cleanup_masquerade.o: cleanup_masquerade.c
-cleanup_masquerade.o: ../../include/sys_defs.h
-cleanup_masquerade.o: ../../include/msg.h
-cleanup_masquerade.o: ../../include/vstring.h
-cleanup_masquerade.o: ../../include/vbuf.h
+cleanup_map1n.o: ../../include/sys_defs.h
+cleanup_map1n.o: ../../include/tok822.h
+cleanup_map1n.o: ../../include/vbuf.h
+cleanup_map1n.o: ../../include/vstream.h
+cleanup_map1n.o: ../../include/vstring.h
+cleanup_map1n.o: cleanup.h
+cleanup_map1n.o: cleanup_map1n.c
cleanup_masquerade.o: ../../include/argv.h
+cleanup_masquerade.o: ../../include/been_here.h
+cleanup_masquerade.o: ../../include/dict.h
+cleanup_masquerade.o: ../../include/header_opts.h
cleanup_masquerade.o: ../../include/htable.h
-cleanup_masquerade.o: ../../include/mymalloc.h
-cleanup_masquerade.o: ../../include/stringops.h
+cleanup_masquerade.o: ../../include/mail_conf.h
cleanup_masquerade.o: ../../include/mail_params.h
-cleanup_masquerade.o: ../../include/tok822.h
-cleanup_masquerade.o: ../../include/resolve_clnt.h
-cleanup_masquerade.o: ../../include/quote_822_local.h
-cleanup_masquerade.o: ../../include/quote_flags.h
-cleanup_masquerade.o: cleanup.h
-cleanup_masquerade.o: ../../include/vstream.h
-cleanup_masquerade.o: ../../include/nvtable.h
-cleanup_masquerade.o: ../../include/maps.h
-cleanup_masquerade.o: ../../include/dict.h
-cleanup_masquerade.o: ../../include/been_here.h
cleanup_masquerade.o: ../../include/mail_stream.h
-cleanup_masquerade.o: ../../include/mail_conf.h
-cleanup_masquerade.o: ../../include/mime_state.h
-cleanup_masquerade.o: ../../include/header_opts.h
-cleanup_masquerade.o: ../../include/string_list.h
+cleanup_masquerade.o: ../../include/maps.h
cleanup_masquerade.o: ../../include/match_list.h
cleanup_masquerade.o: ../../include/match_ops.h
-cleanup_message.o: cleanup_message.c
-cleanup_message.o: ../../include/sys_defs.h
-cleanup_message.o: ../../include/msg.h
-cleanup_message.o: ../../include/vstring.h
-cleanup_message.o: ../../include/vbuf.h
-cleanup_message.o: ../../include/vstream.h
+cleanup_masquerade.o: ../../include/mime_state.h
+cleanup_masquerade.o: ../../include/msg.h
+cleanup_masquerade.o: ../../include/mymalloc.h
+cleanup_masquerade.o: ../../include/nvtable.h
+cleanup_masquerade.o: ../../include/quote_822_local.h
+cleanup_masquerade.o: ../../include/quote_flags.h
+cleanup_masquerade.o: ../../include/resolve_clnt.h
+cleanup_masquerade.o: ../../include/string_list.h
+cleanup_masquerade.o: ../../include/stringops.h
+cleanup_masquerade.o: ../../include/sys_defs.h
+cleanup_masquerade.o: ../../include/tok822.h
+cleanup_masquerade.o: ../../include/vbuf.h
+cleanup_masquerade.o: ../../include/vstream.h
+cleanup_masquerade.o: ../../include/vstring.h
+cleanup_masquerade.o: cleanup.h
+cleanup_masquerade.o: cleanup_masquerade.c
cleanup_message.o: ../../include/argv.h
-cleanup_message.o: ../../include/split_at.h
-cleanup_message.o: ../../include/mymalloc.h
-cleanup_message.o: ../../include/stringops.h
-cleanup_message.o: ../../include/nvtable.h
-cleanup_message.o: ../../include/htable.h
-cleanup_message.o: ../../include/record.h
-cleanup_message.o: ../../include/rec_type.h
+cleanup_message.o: ../../include/attr.h
+cleanup_message.o: ../../include/been_here.h
cleanup_message.o: ../../include/cleanup_user.h
-cleanup_message.o: ../../include/tok822.h
-cleanup_message.o: ../../include/resolve_clnt.h
-cleanup_message.o: ../../include/header_opts.h
-cleanup_message.o: ../../include/quote_822_local.h
-cleanup_message.o: ../../include/quote_flags.h
-cleanup_message.o: ../../include/mail_params.h
-cleanup_message.o: ../../include/mail_date.h
-cleanup_message.o: ../../include/mail_addr.h
-cleanup_message.o: ../../include/is_header.h
+cleanup_message.o: ../../include/dict.h
+cleanup_message.o: ../../include/dsn_util.h
cleanup_message.o: ../../include/ext_prop.h
-cleanup_message.o: ../../include/mail_proto.h
+cleanup_message.o: ../../include/header_opts.h
+cleanup_message.o: ../../include/htable.h
cleanup_message.o: ../../include/iostuff.h
-cleanup_message.o: ../../include/attr.h
-cleanup_message.o: ../../include/mime_state.h
+cleanup_message.o: ../../include/is_header.h
cleanup_message.o: ../../include/lex_822.h
-cleanup_message.o: cleanup.h
-cleanup_message.o: ../../include/maps.h
-cleanup_message.o: ../../include/dict.h
-cleanup_message.o: ../../include/been_here.h
-cleanup_message.o: ../../include/mail_stream.h
+cleanup_message.o: ../../include/mail_addr.h
cleanup_message.o: ../../include/mail_conf.h
-cleanup_message.o: ../../include/string_list.h
+cleanup_message.o: ../../include/mail_date.h
+cleanup_message.o: ../../include/mail_params.h
+cleanup_message.o: ../../include/mail_proto.h
+cleanup_message.o: ../../include/mail_stream.h
+cleanup_message.o: ../../include/maps.h
cleanup_message.o: ../../include/match_list.h
cleanup_message.o: ../../include/match_ops.h
-cleanup_out.o: cleanup_out.c
-cleanup_out.o: ../../include/sys_defs.h
-cleanup_out.o: ../../include/msg.h
-cleanup_out.o: ../../include/vstring.h
-cleanup_out.o: ../../include/vbuf.h
-cleanup_out.o: ../../include/vstream.h
-cleanup_out.o: ../../include/record.h
-cleanup_out.o: ../../include/rec_type.h
-cleanup_out.o: ../../include/cleanup_user.h
-cleanup_out.o: ../../include/mail_params.h
-cleanup_out.o: cleanup.h
+cleanup_message.o: ../../include/mime_state.h
+cleanup_message.o: ../../include/msg.h
+cleanup_message.o: ../../include/mymalloc.h
+cleanup_message.o: ../../include/nvtable.h
+cleanup_message.o: ../../include/quote_822_local.h
+cleanup_message.o: ../../include/quote_flags.h
+cleanup_message.o: ../../include/rec_type.h
+cleanup_message.o: ../../include/record.h
+cleanup_message.o: ../../include/resolve_clnt.h
+cleanup_message.o: ../../include/split_at.h
+cleanup_message.o: ../../include/string_list.h
+cleanup_message.o: ../../include/stringops.h
+cleanup_message.o: ../../include/sys_defs.h
+cleanup_message.o: ../../include/tok822.h
+cleanup_message.o: ../../include/vbuf.h
+cleanup_message.o: ../../include/vstream.h
+cleanup_message.o: ../../include/vstring.h
+cleanup_message.o: cleanup.h
+cleanup_message.o: cleanup_message.c
cleanup_out.o: ../../include/argv.h
-cleanup_out.o: ../../include/nvtable.h
-cleanup_out.o: ../../include/htable.h
-cleanup_out.o: ../../include/mymalloc.h
-cleanup_out.o: ../../include/maps.h
-cleanup_out.o: ../../include/dict.h
-cleanup_out.o: ../../include/tok822.h
-cleanup_out.o: ../../include/resolve_clnt.h
cleanup_out.o: ../../include/been_here.h
-cleanup_out.o: ../../include/mail_stream.h
-cleanup_out.o: ../../include/mail_conf.h
-cleanup_out.o: ../../include/mime_state.h
+cleanup_out.o: ../../include/cleanup_user.h
+cleanup_out.o: ../../include/dict.h
cleanup_out.o: ../../include/header_opts.h
-cleanup_out.o: ../../include/string_list.h
+cleanup_out.o: ../../include/htable.h
+cleanup_out.o: ../../include/mail_conf.h
+cleanup_out.o: ../../include/mail_params.h
+cleanup_out.o: ../../include/mail_stream.h
+cleanup_out.o: ../../include/maps.h
cleanup_out.o: ../../include/match_list.h
cleanup_out.o: ../../include/match_ops.h
-cleanup_out_recipient.o: cleanup_out_recipient.c
-cleanup_out_recipient.o: ../../include/sys_defs.h
+cleanup_out.o: ../../include/mime_state.h
+cleanup_out.o: ../../include/msg.h
+cleanup_out.o: ../../include/mymalloc.h
+cleanup_out.o: ../../include/nvtable.h
+cleanup_out.o: ../../include/rec_type.h
+cleanup_out.o: ../../include/record.h
+cleanup_out.o: ../../include/resolve_clnt.h
+cleanup_out.o: ../../include/string_list.h
+cleanup_out.o: ../../include/sys_defs.h
+cleanup_out.o: ../../include/tok822.h
+cleanup_out.o: ../../include/vbuf.h
+cleanup_out.o: ../../include/vstream.h
+cleanup_out.o: ../../include/vstring.h
+cleanup_out.o: cleanup.h
+cleanup_out.o: cleanup_out.c
cleanup_out_recipient.o: ../../include/argv.h
cleanup_out_recipient.o: ../../include/been_here.h
-cleanup_out_recipient.o: ../../include/mail_params.h
-cleanup_out_recipient.o: ../../include/rec_type.h
-cleanup_out_recipient.o: ../../include/ext_prop.h
cleanup_out_recipient.o: ../../include/cleanup_user.h
-cleanup_out_recipient.o: cleanup.h
-cleanup_out_recipient.o: ../../include/vstring.h
-cleanup_out_recipient.o: ../../include/vbuf.h
-cleanup_out_recipient.o: ../../include/vstream.h
-cleanup_out_recipient.o: ../../include/nvtable.h
-cleanup_out_recipient.o: ../../include/htable.h
-cleanup_out_recipient.o: ../../include/mymalloc.h
-cleanup_out_recipient.o: ../../include/maps.h
cleanup_out_recipient.o: ../../include/dict.h
-cleanup_out_recipient.o: ../../include/tok822.h
-cleanup_out_recipient.o: ../../include/resolve_clnt.h
-cleanup_out_recipient.o: ../../include/mail_stream.h
-cleanup_out_recipient.o: ../../include/mail_conf.h
-cleanup_out_recipient.o: ../../include/mime_state.h
+cleanup_out_recipient.o: ../../include/ext_prop.h
cleanup_out_recipient.o: ../../include/header_opts.h
-cleanup_out_recipient.o: ../../include/string_list.h
+cleanup_out_recipient.o: ../../include/htable.h
+cleanup_out_recipient.o: ../../include/mail_conf.h
+cleanup_out_recipient.o: ../../include/mail_params.h
+cleanup_out_recipient.o: ../../include/mail_stream.h
+cleanup_out_recipient.o: ../../include/maps.h
cleanup_out_recipient.o: ../../include/match_list.h
cleanup_out_recipient.o: ../../include/match_ops.h
-cleanup_rewrite.o: cleanup_rewrite.c
-cleanup_rewrite.o: ../../include/sys_defs.h
-cleanup_rewrite.o: ../../include/msg.h
-cleanup_rewrite.o: ../../include/vstring.h
-cleanup_rewrite.o: ../../include/vbuf.h
-cleanup_rewrite.o: ../../include/tok822.h
-cleanup_rewrite.o: ../../include/resolve_clnt.h
-cleanup_rewrite.o: ../../include/rewrite_clnt.h
-cleanup_rewrite.o: ../../include/mail_proto.h
-cleanup_rewrite.o: ../../include/vstream.h
-cleanup_rewrite.o: ../../include/iostuff.h
-cleanup_rewrite.o: ../../include/attr.h
-cleanup_rewrite.o: ../../include/quote_822_local.h
-cleanup_rewrite.o: ../../include/quote_flags.h
-cleanup_rewrite.o: cleanup.h
+cleanup_out_recipient.o: ../../include/mime_state.h
+cleanup_out_recipient.o: ../../include/mymalloc.h
+cleanup_out_recipient.o: ../../include/nvtable.h
+cleanup_out_recipient.o: ../../include/rec_type.h
+cleanup_out_recipient.o: ../../include/resolve_clnt.h
+cleanup_out_recipient.o: ../../include/string_list.h
+cleanup_out_recipient.o: ../../include/sys_defs.h
+cleanup_out_recipient.o: ../../include/tok822.h
+cleanup_out_recipient.o: ../../include/vbuf.h
+cleanup_out_recipient.o: ../../include/vstream.h
+cleanup_out_recipient.o: ../../include/vstring.h
+cleanup_out_recipient.o: cleanup.h
+cleanup_out_recipient.o: cleanup_out_recipient.c
cleanup_rewrite.o: ../../include/argv.h
-cleanup_rewrite.o: ../../include/nvtable.h
-cleanup_rewrite.o: ../../include/htable.h
-cleanup_rewrite.o: ../../include/mymalloc.h
-cleanup_rewrite.o: ../../include/maps.h
-cleanup_rewrite.o: ../../include/dict.h
+cleanup_rewrite.o: ../../include/attr.h
cleanup_rewrite.o: ../../include/been_here.h
-cleanup_rewrite.o: ../../include/mail_stream.h
-cleanup_rewrite.o: ../../include/mail_conf.h
-cleanup_rewrite.o: ../../include/mime_state.h
+cleanup_rewrite.o: ../../include/dict.h
cleanup_rewrite.o: ../../include/header_opts.h
-cleanup_rewrite.o: ../../include/string_list.h
+cleanup_rewrite.o: ../../include/htable.h
+cleanup_rewrite.o: ../../include/iostuff.h
+cleanup_rewrite.o: ../../include/mail_conf.h
+cleanup_rewrite.o: ../../include/mail_proto.h
+cleanup_rewrite.o: ../../include/mail_stream.h
+cleanup_rewrite.o: ../../include/maps.h
cleanup_rewrite.o: ../../include/match_list.h
cleanup_rewrite.o: ../../include/match_ops.h
-cleanup_state.o: cleanup_state.c
-cleanup_state.o: ../../include/sys_defs.h
-cleanup_state.o: ../../include/mymalloc.h
-cleanup_state.o: ../../include/vstring.h
-cleanup_state.o: ../../include/vbuf.h
-cleanup_state.o: ../../include/htable.h
+cleanup_rewrite.o: ../../include/mime_state.h
+cleanup_rewrite.o: ../../include/msg.h
+cleanup_rewrite.o: ../../include/mymalloc.h
+cleanup_rewrite.o: ../../include/nvtable.h
+cleanup_rewrite.o: ../../include/quote_822_local.h
+cleanup_rewrite.o: ../../include/quote_flags.h
+cleanup_rewrite.o: ../../include/resolve_clnt.h
+cleanup_rewrite.o: ../../include/rewrite_clnt.h
+cleanup_rewrite.o: ../../include/string_list.h
+cleanup_rewrite.o: ../../include/sys_defs.h
+cleanup_rewrite.o: ../../include/tok822.h
+cleanup_rewrite.o: ../../include/vbuf.h
+cleanup_rewrite.o: ../../include/vstream.h
+cleanup_rewrite.o: ../../include/vstring.h
+cleanup_rewrite.o: cleanup.h
+cleanup_rewrite.o: cleanup_rewrite.c
+cleanup_state.o: ../../include/argv.h
+cleanup_state.o: ../../include/attr.h
cleanup_state.o: ../../include/been_here.h
-cleanup_state.o: ../../include/mail_params.h
-cleanup_state.o: ../../include/mime_state.h
+cleanup_state.o: ../../include/dict.h
cleanup_state.o: ../../include/header_opts.h
-cleanup_state.o: ../../include/mail_proto.h
-cleanup_state.o: ../../include/vstream.h
+cleanup_state.o: ../../include/htable.h
cleanup_state.o: ../../include/iostuff.h
-cleanup_state.o: ../../include/attr.h
-cleanup_state.o: cleanup.h
-cleanup_state.o: ../../include/argv.h
-cleanup_state.o: ../../include/nvtable.h
-cleanup_state.o: ../../include/maps.h
-cleanup_state.o: ../../include/dict.h
-cleanup_state.o: ../../include/tok822.h
-cleanup_state.o: ../../include/resolve_clnt.h
-cleanup_state.o: ../../include/mail_stream.h
cleanup_state.o: ../../include/mail_conf.h
-cleanup_state.o: ../../include/string_list.h
+cleanup_state.o: ../../include/mail_params.h
+cleanup_state.o: ../../include/mail_proto.h
+cleanup_state.o: ../../include/mail_stream.h
+cleanup_state.o: ../../include/maps.h
cleanup_state.o: ../../include/match_list.h
cleanup_state.o: ../../include/match_ops.h
+cleanup_state.o: ../../include/mime_state.h
+cleanup_state.o: ../../include/mymalloc.h
+cleanup_state.o: ../../include/nvtable.h
+cleanup_state.o: ../../include/resolve_clnt.h
+cleanup_state.o: ../../include/string_list.h
+cleanup_state.o: ../../include/sys_defs.h
+cleanup_state.o: ../../include/tok822.h
+cleanup_state.o: ../../include/vbuf.h
+cleanup_state.o: ../../include/vstream.h
+cleanup_state.o: ../../include/vstring.h
+cleanup_state.o: cleanup.h
+cleanup_state.o: cleanup_state.c
diff --git a/postfix/src/cleanup/cleanup_api.c b/postfix/src/cleanup/cleanup_api.c
index 97ea3d7a0..fdceb52b3 100644
--- a/postfix/src/cleanup/cleanup_api.c
+++ b/postfix/src/cleanup/cleanup_api.c
@@ -106,6 +106,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -191,6 +192,8 @@ int cleanup_flush(CLEANUP_STATE *state)
char *junk;
int status;
char *encoding;
+ CLEANUP_STAT_DETAIL *detail = 0;
+DSN_SPLIT dp;
/*
* Raise these errors only if we examined all queue file records.
@@ -256,12 +259,17 @@ int cleanup_flush(CLEANUP_STATE *state)
if (state->errs != 0) {
if (CAN_BOUNCE()) {
+ if (state->reason)
+ dsn_split(&dp, "5.0.0", state->reason);
+ else
+ detail = cleanup_stat_detail(state->errs);
if (bounce_append(BOUNCE_FLAG_CLEAN, state->queue_id,
state->recip ? state->recip : "unknown",
state->recip ? state->recip : "unknown",
- (long) 0, "none", state->time,
- "%s", state->reason ? state->reason :
- cleanup_strerror(state->errs)) == 0
+ (long) 0, "none",
+ detail ? detail->dsn : dp.dsn,
+ state->time, "%s",
+ detail ? detail->text : dp.text) == 0
&& bounce_flush(BOUNCE_FLAG_CLEAN, state->queue_name,
state->queue_id,
(encoding = nvtable_find(state->attr, MAIL_ATTR_ENCODING)) ?
diff --git a/postfix/src/cleanup/cleanup_message.c b/postfix/src/cleanup/cleanup_message.c
index 0a77d4f3d..3819363cd 100644
--- a/postfix/src/cleanup/cleanup_message.c
+++ b/postfix/src/cleanup/cleanup_message.c
@@ -80,6 +80,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -301,6 +302,7 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
const char *optional_text = value + strcspn(value, " \t");
int command_len = optional_text - value;
VSTRING *bp;
+ CLEANUP_STAT_DETAIL *detail;
while (*optional_text && ISSPACE(*optional_text))
optional_text++;
@@ -310,9 +312,14 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
#define CLEANUP_ACT_DROP 0
if (STREQUAL(value, "REJECT", command_len)) {
- if (state->reason == 0)
- state->reason = mystrdup(*optional_text ? optional_text :
- cleanup_strerror(CLEANUP_STAT_CONT));
+ if (state->reason == 0) {
+ if (*optional_text) {
+ state->reason = dsn_prepend("5.7.1", optional_text);
+ } else {
+ detail = cleanup_stat_detail(CLEANUP_STAT_CONT);
+ state->reason = dsn_prepend(detail->dsn, detail->text);
+ }
+ }
state->errs |= CLEANUP_STAT_CONT;
state->flags &= ~CLEANUP_FLAG_FILTER;
cleanup_act_log(state, "reject", context, buf, state->reason);
@@ -371,7 +378,7 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
"need \"headername: headervalue\"",
optional_text, map_class);
return (CLEANUP_ACT_KEEP);
- }
+ }
/* XXX Impedance mismatch. */
bp = vstring_strcpy(vstring_alloc(100), optional_text);
cleanup_out_header(state, bp);
diff --git a/postfix/src/discard/Makefile.in b/postfix/src/discard/Makefile.in
index 9f87480a1..224cd90a7 100644
--- a/postfix/src/discard/Makefile.in
+++ b/postfix/src/discard/Makefile.in
@@ -47,21 +47,24 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-discard.o: discard.c
-discard.o: ../../include/sys_defs.h
-discard.o: ../../include/msg.h
-discard.o: ../../include/vstream.h
-discard.o: ../../include/vbuf.h
-discard.o: ../../include/deliver_request.h
-discard.o: ../../include/vstring.h
-discard.o: ../../include/recipient_list.h
-discard.o: ../../include/mail_queue.h
discard.o: ../../include/bounce.h
discard.o: ../../include/deliver_completed.h
+discard.o: ../../include/deliver_request.h
+discard.o: ../../include/dsn_util.h
discard.o: ../../include/flush_clnt.h
+discard.o: ../../include/mail_queue.h
discard.o: ../../include/mail_server.h
+discard.o: ../../include/msg.h
+discard.o: ../../include/recipient_list.h
+discard.o: ../../include/sent.h
+discard.o: ../../include/sys_defs.h
+discard.o: ../../include/vbuf.h
+discard.o: ../../include/vstream.h
+discard.o: ../../include/vstring.h
+discard.o: discard.c
diff --git a/postfix/src/discard/discard.c b/postfix/src/discard/discard.c
index 235367f06..d4f166d61 100644
--- a/postfix/src/discard/discard.c
+++ b/postfix/src/discard/discard.c
@@ -11,6 +11,7 @@
/* the queue manager. Each request specifies a queue file, a sender
/* address, a domain or host name that is treated as the reason for
/* discarding the mail, and recipient information.
+/* The reason may be prefixed with an RFC 1893-compatible detail code.
/* This program expects to be run from the \fBmaster\fR(8) process
/* manager.
/*
@@ -116,6 +117,7 @@
#include
#include
#include
+#include
/* Single server skeleton. */
@@ -131,6 +133,7 @@ static int deliver_message(DELIVER_REQUEST *request)
int status;
RECIPIENT *rcpt;
int nrcpt;
+ DSN_SPLIT dp;
if (msg_verbose)
msg_info("deliver_message: from %s", request->sender);
@@ -162,12 +165,14 @@ static int deliver_message(DELIVER_REQUEST *request)
*/
#define BOUNCE_FLAGS(request) DEL_REQ_TRACE_FLAGS(request->flags)
+ dsn_split(&dp, "2.0.0", request->nexthop);
for (nrcpt = 0; nrcpt < request->rcpt_list.len; nrcpt++) {
rcpt = request->rcpt_list.info + nrcpt;
if (rcpt->offset >= 0) {
status = sent(BOUNCE_FLAGS(request), request->queue_id,
- rcpt->orig_addr, rcpt->address, rcpt->offset, "none",
- request->arrival_time, "%s", request->nexthop);
+ rcpt->orig_addr, rcpt->address, rcpt->offset,
+ "none", dp.dsn, request->arrival_time,
+ "%s", dp.text);
if (status == 0 && (request->flags & DEL_REQ_FLAG_SUCCESS))
deliver_completed(src, rcpt->offset);
result |= status;
diff --git a/postfix/src/dns/Makefile.in b/postfix/src/dns/Makefile.in
index d18adf450..9b4573abc 100644
--- a/postfix/src/dns/Makefile.in
+++ b/postfix/src/dns/Makefile.in
@@ -105,87 +105,88 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-dns_lookup.o: dns_lookup.c
-dns_lookup.o: ../../include/sys_defs.h
-dns_lookup.o: ../../include/mymalloc.h
-dns_lookup.o: ../../include/vstring.h
-dns_lookup.o: ../../include/vbuf.h
dns_lookup.o: ../../include/msg.h
-dns_lookup.o: ../../include/valid_hostname.h
+dns_lookup.o: ../../include/myaddrinfo.h
+dns_lookup.o: ../../include/mymalloc.h
+dns_lookup.o: ../../include/sock_addr.h
dns_lookup.o: ../../include/stringops.h
+dns_lookup.o: ../../include/sys_defs.h
+dns_lookup.o: ../../include/valid_hostname.h
+dns_lookup.o: ../../include/vbuf.h
+dns_lookup.o: ../../include/vstring.h
dns_lookup.o: dns.h
-dns_lookup.o: ../../include/sock_addr.h
-dns_lookup.o: ../../include/myaddrinfo.h
-dns_rr.o: dns_rr.c
-dns_rr.o: ../../include/sys_defs.h
+dns_lookup.o: dns_lookup.c
dns_rr.o: ../../include/msg.h
+dns_rr.o: ../../include/myaddrinfo.h
dns_rr.o: ../../include/mymalloc.h
dns_rr.o: ../../include/myrand.h
-dns_rr.o: dns.h
-dns_rr.o: ../../include/vstring.h
-dns_rr.o: ../../include/vbuf.h
dns_rr.o: ../../include/sock_addr.h
-dns_rr.o: ../../include/myaddrinfo.h
-dns_rr_eq_sa.o: dns_rr_eq_sa.c
-dns_rr_eq_sa.o: ../../include/sys_defs.h
+dns_rr.o: ../../include/sys_defs.h
+dns_rr.o: ../../include/vbuf.h
+dns_rr.o: ../../include/vstring.h
+dns_rr.o: dns.h
+dns_rr.o: dns_rr.c
dns_rr_eq_sa.o: ../../include/msg.h
+dns_rr_eq_sa.o: ../../include/myaddrinfo.h
dns_rr_eq_sa.o: ../../include/sock_addr.h
-dns_rr_eq_sa.o: dns.h
-dns_rr_eq_sa.o: ../../include/vstring.h
+dns_rr_eq_sa.o: ../../include/sys_defs.h
dns_rr_eq_sa.o: ../../include/vbuf.h
-dns_rr_eq_sa.o: ../../include/myaddrinfo.h
-dns_rr_to_pa.o: dns_rr_to_pa.c
-dns_rr_to_pa.o: ../../include/sys_defs.h
+dns_rr_eq_sa.o: ../../include/vstring.h
+dns_rr_eq_sa.o: dns.h
+dns_rr_eq_sa.o: dns_rr_eq_sa.c
dns_rr_to_pa.o: ../../include/msg.h
-dns_rr_to_pa.o: dns.h
-dns_rr_to_pa.o: ../../include/vstring.h
-dns_rr_to_pa.o: ../../include/vbuf.h
-dns_rr_to_pa.o: ../../include/sock_addr.h
dns_rr_to_pa.o: ../../include/myaddrinfo.h
-dns_rr_to_sa.o: dns_rr_to_sa.c
-dns_rr_to_sa.o: ../../include/sys_defs.h
+dns_rr_to_pa.o: ../../include/sock_addr.h
+dns_rr_to_pa.o: ../../include/sys_defs.h
+dns_rr_to_pa.o: ../../include/vbuf.h
+dns_rr_to_pa.o: ../../include/vstring.h
+dns_rr_to_pa.o: dns.h
+dns_rr_to_pa.o: dns_rr_to_pa.c
dns_rr_to_sa.o: ../../include/msg.h
-dns_rr_to_sa.o: dns.h
-dns_rr_to_sa.o: ../../include/vstring.h
-dns_rr_to_sa.o: ../../include/vbuf.h
-dns_rr_to_sa.o: ../../include/sock_addr.h
dns_rr_to_sa.o: ../../include/myaddrinfo.h
-dns_sa_to_rr.o: dns_sa_to_rr.c
-dns_sa_to_rr.o: ../../include/sys_defs.h
+dns_rr_to_sa.o: ../../include/sock_addr.h
+dns_rr_to_sa.o: ../../include/sys_defs.h
+dns_rr_to_sa.o: ../../include/vbuf.h
+dns_rr_to_sa.o: ../../include/vstring.h
+dns_rr_to_sa.o: dns.h
+dns_rr_to_sa.o: dns_rr_to_sa.c
dns_sa_to_rr.o: ../../include/msg.h
-dns_sa_to_rr.o: dns.h
-dns_sa_to_rr.o: ../../include/vstring.h
-dns_sa_to_rr.o: ../../include/vbuf.h
-dns_sa_to_rr.o: ../../include/sock_addr.h
dns_sa_to_rr.o: ../../include/myaddrinfo.h
-dns_strerror.o: dns_strerror.c
+dns_sa_to_rr.o: ../../include/sock_addr.h
+dns_sa_to_rr.o: ../../include/sys_defs.h
+dns_sa_to_rr.o: ../../include/vbuf.h
+dns_sa_to_rr.o: ../../include/vstring.h
+dns_sa_to_rr.o: dns.h
+dns_sa_to_rr.o: dns_sa_to_rr.c
+dns_strerror.o: ../../include/myaddrinfo.h
+dns_strerror.o: ../../include/sock_addr.h
dns_strerror.o: ../../include/sys_defs.h
-dns_strerror.o: ../../include/vstring.h
dns_strerror.o: ../../include/vbuf.h
+dns_strerror.o: ../../include/vstring.h
dns_strerror.o: dns.h
-dns_strerror.o: ../../include/sock_addr.h
-dns_strerror.o: ../../include/myaddrinfo.h
-dns_strtype.o: dns_strtype.c
+dns_strerror.o: dns_strerror.c
+dns_strtype.o: ../../include/myaddrinfo.h
+dns_strtype.o: ../../include/sock_addr.h
dns_strtype.o: ../../include/sys_defs.h
-dns_strtype.o: ../../include/vstring.h
dns_strtype.o: ../../include/vbuf.h
+dns_strtype.o: ../../include/vstring.h
dns_strtype.o: dns.h
-dns_strtype.o: ../../include/sock_addr.h
-dns_strtype.o: ../../include/myaddrinfo.h
-test_dns_lookup.o: test_dns_lookup.c
-test_dns_lookup.o: ../../include/sys_defs.h
-test_dns_lookup.o: ../../include/vstring.h
-test_dns_lookup.o: ../../include/vbuf.h
+dns_strtype.o: dns_strtype.c
+test_dns_lookup.o: ../../include/argv.h
test_dns_lookup.o: ../../include/msg.h
test_dns_lookup.o: ../../include/msg_vstream.h
-test_dns_lookup.o: ../../include/vstream.h
+test_dns_lookup.o: ../../include/myaddrinfo.h
test_dns_lookup.o: ../../include/mymalloc.h
-test_dns_lookup.o: ../../include/argv.h
-test_dns_lookup.o: dns.h
test_dns_lookup.o: ../../include/sock_addr.h
-test_dns_lookup.o: ../../include/myaddrinfo.h
+test_dns_lookup.o: ../../include/sys_defs.h
+test_dns_lookup.o: ../../include/vbuf.h
+test_dns_lookup.o: ../../include/vstream.h
+test_dns_lookup.o: ../../include/vstring.h
+test_dns_lookup.o: dns.h
+test_dns_lookup.o: test_dns_lookup.c
diff --git a/postfix/src/error/Makefile.in b/postfix/src/error/Makefile.in
index 8bacb92b9..a9ccd8e1e 100644
--- a/postfix/src/error/Makefile.in
+++ b/postfix/src/error/Makefile.in
@@ -47,21 +47,23 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-error.o: error.c
-error.o: ../../include/sys_defs.h
-error.o: ../../include/msg.h
-error.o: ../../include/vstream.h
-error.o: ../../include/vbuf.h
-error.o: ../../include/deliver_request.h
-error.o: ../../include/vstring.h
-error.o: ../../include/recipient_list.h
-error.o: ../../include/mail_queue.h
error.o: ../../include/bounce.h
error.o: ../../include/deliver_completed.h
+error.o: ../../include/deliver_request.h
+error.o: ../../include/dsn_util.h
error.o: ../../include/flush_clnt.h
+error.o: ../../include/mail_queue.h
error.o: ../../include/mail_server.h
+error.o: ../../include/msg.h
+error.o: ../../include/recipient_list.h
+error.o: ../../include/sys_defs.h
+error.o: ../../include/vbuf.h
+error.o: ../../include/vstream.h
+error.o: ../../include/vstring.h
+error.o: error.c
diff --git a/postfix/src/error/error.c b/postfix/src/error/error.c
index 5166bf177..6fedb1748 100644
--- a/postfix/src/error/error.c
+++ b/postfix/src/error/error.c
@@ -11,6 +11,7 @@
/* the queue manager. Each request specifies a queue file, a sender
/* address, a domain or host name that is treated as the reason for
/* non-delivery, and recipient information.
+/* The reason may be prefixed with an RFC 1893-compatible detail code.
/* This program expects to be run from the \fBmaster\fR(8) process
/* manager.
/*
@@ -118,6 +119,7 @@
#include
#include
#include
+#include
/* Single server skeleton. */
@@ -133,6 +135,7 @@ static int deliver_message(DELIVER_REQUEST *request)
int status;
RECIPIENT *rcpt;
int nrcpt;
+ DSN_SPLIT dp;
if (msg_verbose)
msg_info("deliver_message: from %s", request->sender);
@@ -164,13 +167,15 @@ static int deliver_message(DELIVER_REQUEST *request)
*/
#define BOUNCE_FLAGS(request) DEL_REQ_TRACE_FLAGS(request->flags)
+ dsn_split(&dp, "5.0.0", request->nexthop);
for (nrcpt = 0; nrcpt < request->rcpt_list.len; nrcpt++) {
rcpt = request->rcpt_list.info + nrcpt;
if (rcpt->offset >= 0) {
status = bounce_append(BOUNCE_FLAGS(request), request->queue_id,
rcpt->orig_addr, rcpt->address,
- rcpt->offset, "none", request->arrival_time,
- "%s", request->nexthop);
+ rcpt->offset, "none", dp.dsn,
+ request->arrival_time,
+ "%s", dp.text);
if (status == 0)
deliver_completed(src, rcpt->offset);
result |= status;
diff --git a/postfix/src/flush/Makefile.in b/postfix/src/flush/Makefile.in
index 21603b9e8..a21128049 100644
--- a/postfix/src/flush/Makefile.in
+++ b/postfix/src/flush/Makefile.in
@@ -47,37 +47,38 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-flush.o: flush.c
-flush.o: ../../include/sys_defs.h
-flush.o: ../../include/msg.h
-flush.o: ../../include/events.h
-flush.o: ../../include/vstream.h
-flush.o: ../../include/vbuf.h
-flush.o: ../../include/vstring.h
-flush.o: ../../include/vstring_vstream.h
-flush.o: ../../include/myflock.h
-flush.o: ../../include/htable.h
-flush.o: ../../include/dict.h
flush.o: ../../include/argv.h
-flush.o: ../../include/scan_dir.h
-flush.o: ../../include/stringops.h
-flush.o: ../../include/mail_params.h
-flush.o: ../../include/mail_queue.h
-flush.o: ../../include/mail_proto.h
-flush.o: ../../include/iostuff.h
flush.o: ../../include/attr.h
-flush.o: ../../include/mail_flush.h
+flush.o: ../../include/dict.h
+flush.o: ../../include/domain_list.h
+flush.o: ../../include/events.h
flush.o: ../../include/flush_clnt.h
+flush.o: ../../include/htable.h
+flush.o: ../../include/iostuff.h
flush.o: ../../include/mail_conf.h
+flush.o: ../../include/mail_flush.h
+flush.o: ../../include/mail_params.h
+flush.o: ../../include/mail_proto.h
+flush.o: ../../include/mail_queue.h
flush.o: ../../include/mail_scan_dir.h
+flush.o: ../../include/mail_server.h
flush.o: ../../include/maps.h
-flush.o: ../../include/domain_list.h
flush.o: ../../include/match_list.h
flush.o: ../../include/match_ops.h
flush.o: ../../include/match_parent_style.h
-flush.o: ../../include/mail_server.h
+flush.o: ../../include/msg.h
+flush.o: ../../include/myflock.h
+flush.o: ../../include/scan_dir.h
+flush.o: ../../include/stringops.h
+flush.o: ../../include/sys_defs.h
+flush.o: ../../include/vbuf.h
+flush.o: ../../include/vstream.h
+flush.o: ../../include/vstring.h
+flush.o: ../../include/vstring_vstream.h
+flush.o: flush.c
diff --git a/postfix/src/fsstone/Makefile.in b/postfix/src/fsstone/Makefile.in
index a04617a03..39d22cc35 100644
--- a/postfix/src/fsstone/Makefile.in
+++ b/postfix/src/fsstone/Makefile.in
@@ -46,14 +46,9 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-fsstone.o: fsstone.c
-fsstone.o: ../../include/sys_defs.h
-fsstone.o: ../../include/msg.h
-fsstone.o: ../../include/msg_vstream.h
-fsstone.o: ../../include/vstream.h
-fsstone.o: ../../include/vbuf.h
diff --git a/postfix/src/global/Makefile.in b/postfix/src/global/Makefile.in
index e15cbca8b..e91b98f11 100644
--- a/postfix/src/global/Makefile.in
+++ b/postfix/src/global/Makefile.in
@@ -25,7 +25,7 @@ SRCS = abounce.c anvil_clnt.c been_here.c bounce.c bounce_log.c \
verify_clnt.c verp_sender.c virtual8_maps.c xtext.c scache_single.c \
scache_clnt.c scache_multi.c user_acl.c mkmap_cdb.c mkmap_sdbm.c \
ehlo_mask.c \
- wildcard_inet_addr.c valid_mailhost_addr.c
+ wildcard_inet_addr.c valid_mailhost_addr.c dsn_util.c
OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
clnt_stream.o debug_peer.o debug_process.o defer.o db_common.o \
@@ -52,7 +52,7 @@ OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
verify_clnt.o verp_sender.o virtual8_maps.o xtext.o scache_single.o \
scache_clnt.o scache_multi.o user_acl.o mkmap_cdb.o mkmap_sdbm.o \
ehlo_mask.o \
- wildcard_inet_addr.o valid_mailhost_addr.o
+ wildcard_inet_addr.o valid_mailhost_addr.o dsn_util.o
HDRS = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
canon_addr.h cfg_parser.h cleanup_user.h clnt_stream.h config.h \
debug_peer.h debug_process.h defer.h deliver_completed.h \
@@ -74,7 +74,7 @@ HDRS = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
string_list.h strip_addr.h sys_exits.h timed_ipc.h tok822.h \
trace.h verify.h verify_clnt.h verp_sender.h virtual8_maps.h \
xtext.h scache.h user_acl.h ehlo_mask.h db_common.h \
- wildcard_inet_addr.h valid_mailhost_addr.h
+ wildcard_inet_addr.h valid_mailhost_addr.h dsn_util.h
TESTSRC = rec2stream.c stream2rec.c recdump.c
DEFS = -I. -I$(INC_DIR) -D$(SYSTYPE)
CFLAGS = $(DEBUG) $(OPT) $(DEFS)
@@ -399,1221 +399,1191 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-abounce.o: abounce.c
-abounce.o: ../../include/sys_defs.h
+abounce.o: ../../include/attr.h
+abounce.o: ../../include/events.h
+abounce.o: ../../include/iostuff.h
abounce.o: ../../include/msg.h
abounce.o: ../../include/mymalloc.h
-abounce.o: ../../include/events.h
-abounce.o: ../../include/vstream.h
+abounce.o: ../../include/sys_defs.h
abounce.o: ../../include/vbuf.h
-abounce.o: mail_params.h
-abounce.o: mail_proto.h
-abounce.o: ../../include/iostuff.h
-abounce.o: ../../include/attr.h
+abounce.o: ../../include/vstream.h
+abounce.o: ../../include/vstring.h
+abounce.o: abounce.c
abounce.o: abounce.h
abounce.o: bounce.h
abounce.o: deliver_request.h
-abounce.o: ../../include/vstring.h
+abounce.o: mail_params.h
+abounce.o: mail_proto.h
abounce.o: recipient_list.h
-anvil_clnt.o: anvil_clnt.c
-anvil_clnt.o: ../../include/sys_defs.h
-anvil_clnt.o: ../../include/mymalloc.h
-anvil_clnt.o: ../../include/msg.h
-anvil_clnt.o: ../../include/attr_clnt.h
anvil_clnt.o: ../../include/attr.h
-anvil_clnt.o: ../../include/vstream.h
-anvil_clnt.o: ../../include/vbuf.h
+anvil_clnt.o: ../../include/attr_clnt.h
+anvil_clnt.o: ../../include/iostuff.h
+anvil_clnt.o: ../../include/msg.h
+anvil_clnt.o: ../../include/mymalloc.h
anvil_clnt.o: ../../include/stringops.h
+anvil_clnt.o: ../../include/sys_defs.h
+anvil_clnt.o: ../../include/vbuf.h
+anvil_clnt.o: ../../include/vstream.h
anvil_clnt.o: ../../include/vstring.h
-anvil_clnt.o: mail_proto.h
-anvil_clnt.o: ../../include/iostuff.h
-anvil_clnt.o: mail_params.h
+anvil_clnt.o: anvil_clnt.c
anvil_clnt.o: anvil_clnt.h
-been_here.o: been_here.c
-been_here.o: ../../include/sys_defs.h
+anvil_clnt.o: mail_params.h
+anvil_clnt.o: mail_proto.h
+been_here.o: ../../include/htable.h
been_here.o: ../../include/msg.h
been_here.o: ../../include/mymalloc.h
-been_here.o: ../../include/htable.h
-been_here.o: ../../include/vstring.h
-been_here.o: ../../include/vbuf.h
been_here.o: ../../include/stringops.h
+been_here.o: ../../include/sys_defs.h
+been_here.o: ../../include/vbuf.h
+been_here.o: ../../include/vstring.h
+been_here.o: been_here.c
been_here.o: been_here.h
-bounce.o: bounce.c
-bounce.o: ../../include/sys_defs.h
+bounce.o: ../../include/attr.h
+bounce.o: ../../include/iostuff.h
bounce.o: ../../include/msg.h
-bounce.o: ../../include/vstring.h
+bounce.o: ../../include/mymalloc.h
+bounce.o: ../../include/sys_defs.h
bounce.o: ../../include/vbuf.h
-bounce.o: mail_params.h
-bounce.o: mail_proto.h
bounce.o: ../../include/vstream.h
-bounce.o: ../../include/iostuff.h
-bounce.o: ../../include/attr.h
-bounce.o: log_adhoc.h
-bounce.o: verify.h
+bounce.o: ../../include/vstring.h
+bounce.o: bounce.c
+bounce.o: bounce.h
+bounce.o: defer.h
bounce.o: deliver_request.h
+bounce.o: dsn_util.h
+bounce.o: log_adhoc.h
+bounce.o: mail_params.h
+bounce.o: mail_proto.h
bounce.o: recipient_list.h
-bounce.o: defer.h
-bounce.o: bounce.h
bounce.o: trace.h
-bounce_log.o: bounce_log.c
-bounce_log.o: ../../include/sys_defs.h
+bounce.o: verify.h
+bounce_log.o: ../../include/attr.h
+bounce_log.o: ../../include/iostuff.h
bounce_log.o: ../../include/msg.h
bounce_log.o: ../../include/mymalloc.h
-bounce_log.o: ../../include/vstream.h
+bounce_log.o: ../../include/stringops.h
+bounce_log.o: ../../include/sys_defs.h
bounce_log.o: ../../include/vbuf.h
+bounce_log.o: ../../include/vstream.h
bounce_log.o: ../../include/vstring.h
bounce_log.o: ../../include/vstring_vstream.h
-bounce_log.o: ../../include/stringops.h
+bounce_log.o: bounce_log.c
+bounce_log.o: bounce_log.h
bounce_log.o: mail_params.h
bounce_log.o: mail_proto.h
-bounce_log.o: ../../include/iostuff.h
-bounce_log.o: ../../include/attr.h
bounce_log.o: mail_queue.h
-bounce_log.o: bounce_log.h
-canon_addr.o: canon_addr.c
+canon_addr.o: ../../include/attr.h
+canon_addr.o: ../../include/iostuff.h
+canon_addr.o: ../../include/mymalloc.h
canon_addr.o: ../../include/sys_defs.h
-canon_addr.o: ../../include/vstring.h
canon_addr.o: ../../include/vbuf.h
-canon_addr.o: ../../include/mymalloc.h
-canon_addr.o: rewrite_clnt.h
-canon_addr.o: mail_proto.h
canon_addr.o: ../../include/vstream.h
-canon_addr.o: ../../include/iostuff.h
-canon_addr.o: ../../include/attr.h
+canon_addr.o: ../../include/vstring.h
+canon_addr.o: canon_addr.c
canon_addr.o: canon_addr.h
-cfg_parser.o: cfg_parser.c
-cfg_parser.o: ../../include/sys_defs.h
+canon_addr.o: mail_proto.h
+canon_addr.o: rewrite_clnt.h
+cfg_parser.o: ../../include/argv.h
+cfg_parser.o: ../../include/dict.h
cfg_parser.o: ../../include/msg.h
cfg_parser.o: ../../include/mymalloc.h
-cfg_parser.o: ../../include/vstring.h
+cfg_parser.o: ../../include/sys_defs.h
cfg_parser.o: ../../include/vbuf.h
-cfg_parser.o: ../../include/dict.h
cfg_parser.o: ../../include/vstream.h
-cfg_parser.o: ../../include/argv.h
-cfg_parser.o: mail_conf.h
+cfg_parser.o: ../../include/vstring.h
+cfg_parser.o: cfg_parser.c
cfg_parser.o: cfg_parser.h
-cleanup_strerror.o: cleanup_strerror.c
+cfg_parser.o: mail_conf.h
+cleanup_strerror.o: ../../include/msg.h
cleanup_strerror.o: ../../include/sys_defs.h
-cleanup_strerror.o: ../../include/vstring.h
cleanup_strerror.o: ../../include/vbuf.h
+cleanup_strerror.o: ../../include/vstring.h
+cleanup_strerror.o: cleanup_strerror.c
cleanup_strerror.o: cleanup_user.h
-cleanup_strflags.o: cleanup_strflags.c
-cleanup_strflags.o: ../../include/sys_defs.h
cleanup_strflags.o: ../../include/msg.h
-cleanup_strflags.o: ../../include/vstring.h
+cleanup_strflags.o: ../../include/sys_defs.h
cleanup_strflags.o: ../../include/vbuf.h
+cleanup_strflags.o: ../../include/vstring.h
+cleanup_strflags.o: cleanup_strflags.c
cleanup_strflags.o: cleanup_user.h
-clnt_stream.o: clnt_stream.c
-clnt_stream.o: ../../include/sys_defs.h
+clnt_stream.o: ../../include/attr.h
+clnt_stream.o: ../../include/events.h
+clnt_stream.o: ../../include/iostuff.h
clnt_stream.o: ../../include/msg.h
clnt_stream.o: ../../include/mymalloc.h
-clnt_stream.o: ../../include/vstream.h
+clnt_stream.o: ../../include/sys_defs.h
clnt_stream.o: ../../include/vbuf.h
-clnt_stream.o: ../../include/events.h
-clnt_stream.o: ../../include/iostuff.h
-clnt_stream.o: mail_proto.h
-clnt_stream.o: ../../include/attr.h
-clnt_stream.o: mail_params.h
+clnt_stream.o: ../../include/vstream.h
+clnt_stream.o: clnt_stream.c
clnt_stream.o: clnt_stream.h
-db_common.o: db_common.c
-db_common.o: ../../include/sys_defs.h
-db_common.o: cfg_parser.h
+clnt_stream.o: mail_params.h
+clnt_stream.o: mail_proto.h
+db_common.o: ../../include/argv.h
+db_common.o: ../../include/dict.h
+db_common.o: ../../include/match_list.h
+db_common.o: ../../include/match_ops.h
+db_common.o: ../../include/msg.h
db_common.o: ../../include/mymalloc.h
-db_common.o: ../../include/vstring.h
+db_common.o: ../../include/sys_defs.h
db_common.o: ../../include/vbuf.h
-db_common.o: ../../include/msg.h
-db_common.o: ../../include/dict.h
db_common.o: ../../include/vstream.h
-db_common.o: ../../include/argv.h
+db_common.o: ../../include/vstring.h
+db_common.o: cfg_parser.h
+db_common.o: db_common.c
db_common.o: db_common.h
db_common.o: string_list.h
-db_common.o: ../../include/match_list.h
-db_common.o: ../../include/match_ops.h
-debug_peer.o: debug_peer.c
-debug_peer.o: ../../include/sys_defs.h
-debug_peer.o: ../../include/msg.h
-debug_peer.o: mail_params.h
-debug_peer.o: namadr_list.h
debug_peer.o: ../../include/match_list.h
debug_peer.o: ../../include/match_ops.h
+debug_peer.o: ../../include/msg.h
+debug_peer.o: ../../include/sys_defs.h
+debug_peer.o: debug_peer.c
debug_peer.o: debug_peer.h
+debug_peer.o: mail_params.h
debug_peer.o: match_parent_style.h
-debug_process.o: debug_process.c
-debug_process.o: ../../include/sys_defs.h
+debug_peer.o: namadr_list.h
debug_process.o: ../../include/msg.h
-debug_process.o: mail_params.h
-debug_process.o: mail_conf.h
+debug_process.o: ../../include/sys_defs.h
+debug_process.o: debug_process.c
debug_process.o: debug_process.h
-defer.o: defer.c
-defer.o: ../../include/sys_defs.h
+debug_process.o: mail_conf.h
+debug_process.o: mail_params.h
+defer.o: ../../include/attr.h
+defer.o: ../../include/iostuff.h
defer.o: ../../include/msg.h
-defer.o: ../../include/vstring.h
+defer.o: ../../include/sys_defs.h
defer.o: ../../include/vbuf.h
-defer.o: mail_params.h
-defer.o: mail_queue.h
defer.o: ../../include/vstream.h
-defer.o: mail_proto.h
-defer.o: ../../include/iostuff.h
-defer.o: ../../include/attr.h
-defer.o: flush_clnt.h
-defer.o: verify.h
+defer.o: ../../include/vstring.h
+defer.o: bounce.h
+defer.o: defer.c
+defer.o: defer.h
defer.o: deliver_request.h
-defer.o: recipient_list.h
+defer.o: dsn_util.h
+defer.o: flush_clnt.h
defer.o: log_adhoc.h
+defer.o: mail_params.h
+defer.o: mail_proto.h
+defer.o: mail_queue.h
+defer.o: recipient_list.h
defer.o: trace.h
-defer.o: bounce.h
-defer.o: defer.h
-deliver_completed.o: deliver_completed.c
-deliver_completed.o: ../../include/sys_defs.h
+defer.o: verify.h
deliver_completed.o: ../../include/msg.h
-deliver_completed.o: ../../include/vstream.h
+deliver_completed.o: ../../include/sys_defs.h
deliver_completed.o: ../../include/vbuf.h
-deliver_completed.o: record.h
+deliver_completed.o: ../../include/vstream.h
deliver_completed.o: ../../include/vstring.h
-deliver_completed.o: rec_type.h
+deliver_completed.o: deliver_completed.c
deliver_completed.o: deliver_completed.h
-deliver_flock.o: deliver_flock.c
+deliver_completed.o: rec_type.h
+deliver_completed.o: record.h
+deliver_flock.o: ../../include/iostuff.h
+deliver_flock.o: ../../include/myflock.h
deliver_flock.o: ../../include/sys_defs.h
-deliver_flock.o: ../../include/vstring.h
deliver_flock.o: ../../include/vbuf.h
-deliver_flock.o: ../../include/myflock.h
-deliver_flock.o: ../../include/iostuff.h
-deliver_flock.o: mail_params.h
+deliver_flock.o: ../../include/vstring.h
+deliver_flock.o: deliver_flock.c
deliver_flock.o: deliver_flock.h
-deliver_pass.o: deliver_pass.c
-deliver_pass.o: ../../include/sys_defs.h
+deliver_flock.o: mail_params.h
+deliver_pass.o: ../../include/attr.h
+deliver_pass.o: ../../include/iostuff.h
deliver_pass.o: ../../include/msg.h
-deliver_pass.o: ../../include/vstring.h
+deliver_pass.o: ../../include/mymalloc.h
+deliver_pass.o: ../../include/split_at.h
+deliver_pass.o: ../../include/sys_defs.h
deliver_pass.o: ../../include/vbuf.h
deliver_pass.o: ../../include/vstream.h
-deliver_pass.o: ../../include/split_at.h
-deliver_pass.o: ../../include/mymalloc.h
-deliver_pass.o: mail_params.h
+deliver_pass.o: ../../include/vstring.h
+deliver_pass.o: deliver_pass.c
deliver_pass.o: deliver_pass.h
deliver_pass.o: deliver_request.h
-deliver_pass.o: recipient_list.h
+deliver_pass.o: mail_params.h
deliver_pass.o: mail_proto.h
-deliver_pass.o: ../../include/iostuff.h
-deliver_pass.o: ../../include/attr.h
-deliver_request.o: deliver_request.c
-deliver_request.o: ../../include/sys_defs.h
+deliver_pass.o: recipient_list.h
+deliver_request.o: ../../include/attr.h
+deliver_request.o: ../../include/iostuff.h
deliver_request.o: ../../include/msg.h
-deliver_request.o: ../../include/vstream.h
+deliver_request.o: ../../include/myflock.h
+deliver_request.o: ../../include/mymalloc.h
+deliver_request.o: ../../include/sys_defs.h
deliver_request.o: ../../include/vbuf.h
+deliver_request.o: ../../include/vstream.h
deliver_request.o: ../../include/vstring.h
-deliver_request.o: ../../include/mymalloc.h
-deliver_request.o: ../../include/iostuff.h
-deliver_request.o: ../../include/myflock.h
-deliver_request.o: mail_queue.h
-deliver_request.o: mail_proto.h
-deliver_request.o: ../../include/attr.h
+deliver_request.o: deliver_request.c
+deliver_request.o: deliver_request.h
deliver_request.o: mail_open_ok.h
+deliver_request.o: mail_proto.h
+deliver_request.o: mail_queue.h
deliver_request.o: recipient_list.h
-deliver_request.o: deliver_request.h
-dict_ldap.o: dict_ldap.c
dict_ldap.o: ../../include/sys_defs.h
-dict_ldap.o: ../../include/msg.h
-dict_ldap.o: ../../include/mymalloc.h
-dict_ldap.o: ../../include/vstring.h
-dict_ldap.o: ../../include/vbuf.h
-dict_ldap.o: ../../include/dict.h
-dict_ldap.o: ../../include/vstream.h
-dict_ldap.o: ../../include/argv.h
-dict_ldap.o: ../../include/stringops.h
-dict_ldap.o: ../../include/binhash.h
-dict_ldap.o: cfg_parser.h
-dict_ldap.o: db_common.h
-dict_ldap.o: string_list.h
-dict_ldap.o: ../../include/match_list.h
-dict_ldap.o: ../../include/match_ops.h
-dict_ldap.o: dict_ldap.h
-dict_mysql.o: dict_mysql.c
+dict_ldap.o: dict_ldap.c
dict_mysql.o: ../../include/sys_defs.h
-dict_mysql.o: ../../include/dict.h
-dict_mysql.o: ../../include/vstream.h
-dict_mysql.o: ../../include/vbuf.h
-dict_mysql.o: ../../include/argv.h
-dict_mysql.o: ../../include/msg.h
-dict_mysql.o: ../../include/mymalloc.h
-dict_mysql.o: ../../include/vstring.h
-dict_mysql.o: ../../include/split_at.h
-dict_mysql.o: ../../include/find_inet.h
-dict_mysql.o: ../../include/myrand.h
-dict_mysql.o: ../../include/events.h
-dict_mysql.o: cfg_parser.h
-dict_mysql.o: db_common.h
-dict_mysql.o: string_list.h
-dict_mysql.o: ../../include/match_list.h
-dict_mysql.o: ../../include/match_ops.h
-dict_mysql.o: dict_mysql.h
-dict_pgsql.o: dict_pgsql.c
+dict_mysql.o: dict_mysql.c
dict_pgsql.o: ../../include/sys_defs.h
-dict_pgsql.o: ../../include/dict.h
-dict_pgsql.o: ../../include/vstream.h
-dict_pgsql.o: ../../include/vbuf.h
-dict_pgsql.o: ../../include/argv.h
-dict_pgsql.o: ../../include/msg.h
-dict_pgsql.o: ../../include/mymalloc.h
-dict_pgsql.o: ../../include/vstring.h
-dict_pgsql.o: ../../include/split_at.h
-dict_pgsql.o: ../../include/find_inet.h
-dict_pgsql.o: ../../include/myrand.h
-dict_pgsql.o: ../../include/events.h
-dict_pgsql.o: cfg_parser.h
-dict_pgsql.o: db_common.h
-dict_pgsql.o: string_list.h
-dict_pgsql.o: ../../include/match_list.h
-dict_pgsql.o: ../../include/match_ops.h
-dict_pgsql.o: dict_pgsql.h
-dict_proxy.o: dict_proxy.c
-dict_proxy.o: ../../include/sys_defs.h
+dict_pgsql.o: dict_pgsql.c
+dict_proxy.o: ../../include/argv.h
+dict_proxy.o: ../../include/attr.h
+dict_proxy.o: ../../include/dict.h
+dict_proxy.o: ../../include/iostuff.h
dict_proxy.o: ../../include/msg.h
dict_proxy.o: ../../include/mymalloc.h
dict_proxy.o: ../../include/stringops.h
-dict_proxy.o: ../../include/vstring.h
+dict_proxy.o: ../../include/sys_defs.h
dict_proxy.o: ../../include/vbuf.h
dict_proxy.o: ../../include/vstream.h
-dict_proxy.o: ../../include/attr.h
-dict_proxy.o: ../../include/dict.h
-dict_proxy.o: ../../include/argv.h
-dict_proxy.o: mail_proto.h
-dict_proxy.o: ../../include/iostuff.h
-dict_proxy.o: mail_params.h
+dict_proxy.o: ../../include/vstring.h
dict_proxy.o: clnt_stream.h
+dict_proxy.o: dict_proxy.c
dict_proxy.o: dict_proxy.h
-domain_list.o: domain_list.c
-domain_list.o: ../../include/sys_defs.h
+dict_proxy.o: mail_params.h
+dict_proxy.o: mail_proto.h
domain_list.o: ../../include/match_list.h
-domain_list.o: domain_list.h
domain_list.o: ../../include/match_ops.h
-dot_lockfile.o: dot_lockfile.c
+domain_list.o: ../../include/sys_defs.h
+domain_list.o: domain_list.c
+domain_list.o: domain_list.h
+dot_lockfile.o: ../../include/iostuff.h
+dot_lockfile.o: ../../include/mymalloc.h
+dot_lockfile.o: ../../include/stringops.h
dot_lockfile.o: ../../include/sys_defs.h
-dot_lockfile.o: ../../include/vstring.h
dot_lockfile.o: ../../include/vbuf.h
-dot_lockfile.o: ../../include/stringops.h
-dot_lockfile.o: ../../include/mymalloc.h
-dot_lockfile.o: ../../include/iostuff.h
-dot_lockfile.o: mail_params.h
+dot_lockfile.o: ../../include/vstring.h
+dot_lockfile.o: dot_lockfile.c
dot_lockfile.o: dot_lockfile.h
-dot_lockfile_as.o: dot_lockfile_as.c
-dot_lockfile_as.o: ../../include/sys_defs.h
+dot_lockfile.o: mail_params.h
dot_lockfile_as.o: ../../include/msg.h
dot_lockfile_as.o: ../../include/set_eugid.h
-dot_lockfile_as.o: dot_lockfile.h
-dot_lockfile_as.o: ../../include/vstring.h
+dot_lockfile_as.o: ../../include/sys_defs.h
dot_lockfile_as.o: ../../include/vbuf.h
+dot_lockfile_as.o: ../../include/vstring.h
+dot_lockfile_as.o: dot_lockfile.h
+dot_lockfile_as.o: dot_lockfile_as.c
dot_lockfile_as.o: dot_lockfile_as.h
-ehlo_mask.o: ehlo_mask.c
-ehlo_mask.o: ../../include/sys_defs.h
+dsn_util.o: ../../include/msg.h
+dsn_util.o: ../../include/mymalloc.h
+dsn_util.o: ../../include/stringops.h
+dsn_util.o: ../../include/sys_defs.h
+dsn_util.o: ../../include/vbuf.h
+dsn_util.o: ../../include/vstring.h
+dsn_util.o: dsn_util.c
+dsn_util.o: dsn_util.h
ehlo_mask.o: ../../include/name_mask.h
+ehlo_mask.o: ../../include/sys_defs.h
+ehlo_mask.o: ehlo_mask.c
ehlo_mask.o: ehlo_mask.h
-ext_prop.o: ext_prop.c
-ext_prop.o: ../../include/sys_defs.h
ext_prop.o: ../../include/name_mask.h
-ext_prop.o: mail_params.h
+ext_prop.o: ../../include/sys_defs.h
+ext_prop.o: ext_prop.c
ext_prop.o: ext_prop.h
-file_id.o: file_id.c
-file_id.o: ../../include/sys_defs.h
+ext_prop.o: mail_params.h
file_id.o: ../../include/msg.h
-file_id.o: ../../include/vstring.h
+file_id.o: ../../include/sys_defs.h
file_id.o: ../../include/vbuf.h
+file_id.o: ../../include/vstring.h
+file_id.o: file_id.c
file_id.o: file_id.h
-flush_clnt.o: flush_clnt.c
-flush_clnt.o: ../../include/sys_defs.h
+flush_clnt.o: ../../include/attr.h
+flush_clnt.o: ../../include/iostuff.h
+flush_clnt.o: ../../include/match_list.h
+flush_clnt.o: ../../include/match_ops.h
flush_clnt.o: ../../include/msg.h
-flush_clnt.o: ../../include/vstream.h
+flush_clnt.o: ../../include/sys_defs.h
flush_clnt.o: ../../include/vbuf.h
-flush_clnt.o: mail_proto.h
-flush_clnt.o: ../../include/iostuff.h
-flush_clnt.o: ../../include/attr.h
+flush_clnt.o: ../../include/vstream.h
+flush_clnt.o: domain_list.h
+flush_clnt.o: flush_clnt.c
+flush_clnt.o: flush_clnt.h
flush_clnt.o: mail_flush.h
flush_clnt.o: mail_params.h
-flush_clnt.o: domain_list.h
-flush_clnt.o: ../../include/match_list.h
-flush_clnt.o: ../../include/match_ops.h
+flush_clnt.o: mail_proto.h
flush_clnt.o: match_parent_style.h
-flush_clnt.o: flush_clnt.h
-header_opts.o: header_opts.c
-header_opts.o: ../../include/sys_defs.h
-header_opts.o: ../../include/msg.h
header_opts.o: ../../include/htable.h
-header_opts.o: ../../include/vstring.h
-header_opts.o: ../../include/vbuf.h
+header_opts.o: ../../include/msg.h
header_opts.o: ../../include/stringops.h
+header_opts.o: ../../include/sys_defs.h
+header_opts.o: ../../include/vbuf.h
+header_opts.o: ../../include/vstring.h
+header_opts.o: header_opts.c
header_opts.o: header_opts.h
-header_token.o: header_token.c
-header_token.o: ../../include/sys_defs.h
header_token.o: ../../include/msg.h
-header_token.o: ../../include/vstring.h
+header_token.o: ../../include/sys_defs.h
header_token.o: ../../include/vbuf.h
-header_token.o: lex_822.h
+header_token.o: ../../include/vstring.h
+header_token.o: header_token.c
header_token.o: header_token.h
-hold_message.o: hold_message.c
-hold_message.o: ../../include/sys_defs.h
+header_token.o: lex_822.h
hold_message.o: ../../include/msg.h
-hold_message.o: ../../include/set_eugid.h
hold_message.o: ../../include/sane_fsops.h
-hold_message.o: mail_queue.h
-hold_message.o: ../../include/vstring.h
+hold_message.o: ../../include/set_eugid.h
+hold_message.o: ../../include/sys_defs.h
hold_message.o: ../../include/vbuf.h
hold_message.o: ../../include/vstream.h
-hold_message.o: mail_params.h
+hold_message.o: ../../include/vstring.h
+hold_message.o: hold_message.c
hold_message.o: hold_message.h
-input_transp.o: input_transp.c
-input_transp.o: ../../include/sys_defs.h
-input_transp.o: ../../include/name_mask.h
+hold_message.o: mail_params.h
+hold_message.o: mail_queue.h
input_transp.o: ../../include/msg.h
-input_transp.o: mail_params.h
+input_transp.o: ../../include/name_mask.h
+input_transp.o: ../../include/sys_defs.h
input_transp.o: cleanup_user.h
+input_transp.o: input_transp.c
input_transp.o: input_transp.h
-is_header.o: is_header.c
+input_transp.o: mail_params.h
is_header.o: ../../include/sys_defs.h
+is_header.o: is_header.c
is_header.o: is_header.h
-log_adhoc.o: log_adhoc.c
-log_adhoc.o: ../../include/sys_defs.h
log_adhoc.o: ../../include/msg.h
-log_adhoc.o: ../../include/vstring.h
+log_adhoc.o: ../../include/sys_defs.h
log_adhoc.o: ../../include/vbuf.h
+log_adhoc.o: ../../include/vstring.h
+log_adhoc.o: log_adhoc.c
log_adhoc.o: log_adhoc.h
-mail_addr.o: mail_addr.c
-mail_addr.o: ../../include/sys_defs.h
mail_addr.o: ../../include/stringops.h
-mail_addr.o: ../../include/vstring.h
+mail_addr.o: ../../include/sys_defs.h
mail_addr.o: ../../include/vbuf.h
-mail_addr.o: mail_params.h
+mail_addr.o: ../../include/vstring.h
+mail_addr.o: mail_addr.c
mail_addr.o: mail_addr.h
-mail_addr_crunch.o: mail_addr_crunch.c
-mail_addr_crunch.o: ../../include/sys_defs.h
-mail_addr_crunch.o: ../../include/mymalloc.h
+mail_addr.o: mail_params.h
mail_addr_crunch.o: ../../include/argv.h
-mail_addr_crunch.o: ../../include/vstring.h
+mail_addr_crunch.o: ../../include/mymalloc.h
+mail_addr_crunch.o: ../../include/sys_defs.h
mail_addr_crunch.o: ../../include/vbuf.h
-mail_addr_crunch.o: tok822.h
-mail_addr_crunch.o: resolve_clnt.h
+mail_addr_crunch.o: ../../include/vstring.h
mail_addr_crunch.o: canon_addr.h
+mail_addr_crunch.o: mail_addr_crunch.c
mail_addr_crunch.o: mail_addr_crunch.h
-mail_addr_find.o: mail_addr_find.c
-mail_addr_find.o: ../../include/sys_defs.h
-mail_addr_find.o: ../../include/msg.h
-mail_addr_find.o: ../../include/dict.h
-mail_addr_find.o: ../../include/vstream.h
-mail_addr_find.o: ../../include/vbuf.h
+mail_addr_crunch.o: resolve_clnt.h
+mail_addr_crunch.o: tok822.h
mail_addr_find.o: ../../include/argv.h
+mail_addr_find.o: ../../include/dict.h
+mail_addr_find.o: ../../include/msg.h
+mail_addr_find.o: ../../include/mymalloc.h
mail_addr_find.o: ../../include/stringops.h
+mail_addr_find.o: ../../include/sys_defs.h
+mail_addr_find.o: ../../include/vbuf.h
+mail_addr_find.o: ../../include/vstream.h
mail_addr_find.o: ../../include/vstring.h
-mail_addr_find.o: ../../include/mymalloc.h
-mail_addr_find.o: mail_params.h
-mail_addr_find.o: strip_addr.h
+mail_addr_find.o: mail_addr_find.c
mail_addr_find.o: mail_addr_find.h
+mail_addr_find.o: mail_params.h
mail_addr_find.o: maps.h
mail_addr_find.o: resolve_local.h
-mail_addr_map.o: mail_addr_map.c
-mail_addr_map.o: ../../include/sys_defs.h
+mail_addr_find.o: strip_addr.h
+mail_addr_map.o: ../../include/argv.h
+mail_addr_map.o: ../../include/dict.h
mail_addr_map.o: ../../include/msg.h
-mail_addr_map.o: ../../include/vstring.h
+mail_addr_map.o: ../../include/mymalloc.h
+mail_addr_map.o: ../../include/sys_defs.h
mail_addr_map.o: ../../include/vbuf.h
-mail_addr_map.o: ../../include/dict.h
mail_addr_map.o: ../../include/vstream.h
-mail_addr_map.o: ../../include/argv.h
-mail_addr_map.o: ../../include/mymalloc.h
-mail_addr_map.o: mail_addr_find.h
-mail_addr_map.o: maps.h
+mail_addr_map.o: ../../include/vstring.h
mail_addr_map.o: mail_addr_crunch.h
+mail_addr_map.o: mail_addr_find.h
+mail_addr_map.o: mail_addr_map.c
mail_addr_map.o: mail_addr_map.h
-mail_command_client.o: mail_command_client.c
+mail_addr_map.o: maps.h
+mail_command_client.o: ../../include/attr.h
+mail_command_client.o: ../../include/iostuff.h
mail_command_client.o: ../../include/sys_defs.h
-mail_command_client.o: ../../include/vstream.h
mail_command_client.o: ../../include/vbuf.h
+mail_command_client.o: ../../include/vstream.h
+mail_command_client.o: mail_command_client.c
mail_command_client.o: mail_proto.h
-mail_command_client.o: ../../include/iostuff.h
-mail_command_client.o: ../../include/attr.h
-mail_command_server.o: mail_command_server.c
+mail_command_server.o: ../../include/attr.h
+mail_command_server.o: ../../include/iostuff.h
mail_command_server.o: ../../include/sys_defs.h
-mail_command_server.o: ../../include/vstream.h
mail_command_server.o: ../../include/vbuf.h
+mail_command_server.o: ../../include/vstream.h
+mail_command_server.o: mail_command_server.c
mail_command_server.o: mail_proto.h
-mail_command_server.o: ../../include/iostuff.h
-mail_command_server.o: ../../include/attr.h
-mail_conf.o: mail_conf.c
-mail_conf.o: ../../include/sys_defs.h
+mail_conf.o: ../../include/argv.h
+mail_conf.o: ../../include/dict.h
mail_conf.o: ../../include/msg.h
mail_conf.o: ../../include/mymalloc.h
-mail_conf.o: ../../include/vstream.h
-mail_conf.o: ../../include/vbuf.h
-mail_conf.o: ../../include/vstring.h
-mail_conf.o: ../../include/dict.h
-mail_conf.o: ../../include/argv.h
+mail_conf.o: ../../include/readlline.h
mail_conf.o: ../../include/safe.h
mail_conf.o: ../../include/stringops.h
-mail_conf.o: ../../include/readlline.h
-mail_conf.o: mail_params.h
+mail_conf.o: ../../include/sys_defs.h
+mail_conf.o: ../../include/vbuf.h
+mail_conf.o: ../../include/vstream.h
+mail_conf.o: ../../include/vstring.h
+mail_conf.o: mail_conf.c
mail_conf.o: mail_conf.h
-mail_conf_bool.o: mail_conf_bool.c
-mail_conf_bool.o: ../../include/sys_defs.h
-mail_conf_bool.o: ../../include/msg.h
+mail_conf.o: mail_params.h
+mail_conf_bool.o: ../../include/argv.h
mail_conf_bool.o: ../../include/dict.h
-mail_conf_bool.o: ../../include/vstream.h
+mail_conf_bool.o: ../../include/msg.h
+mail_conf_bool.o: ../../include/sys_defs.h
mail_conf_bool.o: ../../include/vbuf.h
-mail_conf_bool.o: ../../include/argv.h
+mail_conf_bool.o: ../../include/vstream.h
mail_conf_bool.o: mail_conf.h
-mail_conf_int.o: mail_conf_int.c
-mail_conf_int.o: ../../include/sys_defs.h
+mail_conf_bool.o: mail_conf_bool.c
+mail_conf_int.o: ../../include/argv.h
+mail_conf_int.o: ../../include/dict.h
mail_conf_int.o: ../../include/msg.h
mail_conf_int.o: ../../include/mymalloc.h
-mail_conf_int.o: ../../include/dict.h
-mail_conf_int.o: ../../include/vstream.h
-mail_conf_int.o: ../../include/vbuf.h
-mail_conf_int.o: ../../include/argv.h
mail_conf_int.o: ../../include/stringops.h
+mail_conf_int.o: ../../include/sys_defs.h
+mail_conf_int.o: ../../include/vbuf.h
+mail_conf_int.o: ../../include/vstream.h
mail_conf_int.o: ../../include/vstring.h
mail_conf_int.o: mail_conf.h
-mail_conf_raw.o: mail_conf_raw.c
-mail_conf_raw.o: ../../include/sys_defs.h
+mail_conf_int.o: mail_conf_int.c
mail_conf_raw.o: ../../include/msg.h
mail_conf_raw.o: ../../include/mymalloc.h
+mail_conf_raw.o: ../../include/sys_defs.h
mail_conf_raw.o: mail_conf.h
-mail_conf_str.o: mail_conf_str.c
-mail_conf_str.o: ../../include/sys_defs.h
+mail_conf_raw.o: mail_conf_raw.c
mail_conf_str.o: ../../include/msg.h
mail_conf_str.o: ../../include/mymalloc.h
+mail_conf_str.o: ../../include/sys_defs.h
mail_conf_str.o: mail_conf.h
-mail_conf_time.o: mail_conf_time.c
-mail_conf_time.o: ../../include/sys_defs.h
+mail_conf_str.o: mail_conf_str.c
+mail_conf_time.o: ../../include/argv.h
+mail_conf_time.o: ../../include/dict.h
mail_conf_time.o: ../../include/msg.h
mail_conf_time.o: ../../include/mymalloc.h
-mail_conf_time.o: ../../include/dict.h
-mail_conf_time.o: ../../include/vstream.h
-mail_conf_time.o: ../../include/vbuf.h
-mail_conf_time.o: ../../include/argv.h
mail_conf_time.o: ../../include/stringops.h
+mail_conf_time.o: ../../include/sys_defs.h
+mail_conf_time.o: ../../include/vbuf.h
+mail_conf_time.o: ../../include/vstream.h
mail_conf_time.o: ../../include/vstring.h
mail_conf_time.o: mail_conf.h
-mail_connect.o: mail_connect.c
-mail_connect.o: ../../include/sys_defs.h
-mail_connect.o: ../../include/msg.h
-mail_connect.o: ../../include/vstream.h
-mail_connect.o: ../../include/vbuf.h
+mail_conf_time.o: mail_conf_time.c
+mail_connect.o: ../../include/attr.h
mail_connect.o: ../../include/connect.h
mail_connect.o: ../../include/iostuff.h
+mail_connect.o: ../../include/msg.h
mail_connect.o: ../../include/mymalloc.h
mail_connect.o: ../../include/stringops.h
+mail_connect.o: ../../include/sys_defs.h
+mail_connect.o: ../../include/vbuf.h
+mail_connect.o: ../../include/vstream.h
mail_connect.o: ../../include/vstring.h
-mail_connect.o: timed_ipc.h
+mail_connect.o: mail_connect.c
mail_connect.o: mail_proto.h
-mail_connect.o: ../../include/attr.h
-mail_copy.o: mail_copy.c
-mail_copy.o: ../../include/sys_defs.h
-mail_copy.o: ../../include/msg.h
+mail_connect.o: timed_ipc.h
mail_copy.o: ../../include/htable.h
-mail_copy.o: ../../include/vstream.h
+mail_copy.o: ../../include/msg.h
+mail_copy.o: ../../include/safe_open.h
+mail_copy.o: ../../include/stringops.h
+mail_copy.o: ../../include/sys_defs.h
mail_copy.o: ../../include/vbuf.h
+mail_copy.o: ../../include/vstream.h
mail_copy.o: ../../include/vstring.h
mail_copy.o: ../../include/vstring_vstream.h
-mail_copy.o: ../../include/stringops.h
+mail_copy.o: dsn_util.h
+mail_copy.o: mail_addr.h
+mail_copy.o: mail_copy.c
+mail_copy.o: mail_copy.h
+mail_copy.o: mail_params.h
+mail_copy.o: mail_queue.h
+mail_copy.o: mark_corrupt.h
+mail_copy.o: mbox_open.h
mail_copy.o: quote_822_local.h
mail_copy.o: quote_flags.h
-mail_copy.o: record.h
mail_copy.o: rec_type.h
-mail_copy.o: mail_queue.h
-mail_copy.o: mail_addr.h
-mail_copy.o: mark_corrupt.h
-mail_copy.o: mail_params.h
-mail_copy.o: mail_copy.h
-mail_date.o: mail_date.c
-mail_date.o: ../../include/sys_defs.h
+mail_copy.o: record.h
mail_date.o: ../../include/msg.h
-mail_date.o: ../../include/vstring.h
+mail_date.o: ../../include/sys_defs.h
mail_date.o: ../../include/vbuf.h
+mail_date.o: ../../include/vstring.h
+mail_date.o: mail_date.c
mail_date.o: mail_date.h
-mail_dict.o: mail_dict.c
-mail_dict.o: ../../include/sys_defs.h
-mail_dict.o: ../../include/dict.h
-mail_dict.o: ../../include/vstream.h
-mail_dict.o: ../../include/vbuf.h
mail_dict.o: ../../include/argv.h
+mail_dict.o: ../../include/dict.h
mail_dict.o: ../../include/msg.h
-mail_dict.o: dict_proxy.h
+mail_dict.o: ../../include/sys_defs.h
+mail_dict.o: ../../include/vbuf.h
+mail_dict.o: ../../include/vstream.h
mail_dict.o: dict_ldap.h
mail_dict.o: dict_mysql.h
mail_dict.o: dict_pgsql.h
+mail_dict.o: dict_proxy.h
+mail_dict.o: mail_dict.c
mail_dict.o: mail_dict.h
-mail_error.o: mail_error.c
+mail_error.o: ../../include/name_mask.h
mail_error.o: ../../include/sys_defs.h
+mail_error.o: mail_error.c
mail_error.o: mail_error.h
-mail_error.o: ../../include/name_mask.h
-mail_flush.o: mail_flush.c
+mail_flush.o: ../../include/attr.h
+mail_flush.o: ../../include/iostuff.h
mail_flush.o: ../../include/sys_defs.h
-mail_flush.o: mail_params.h
-mail_flush.o: mail_proto.h
-mail_flush.o: ../../include/vstream.h
mail_flush.o: ../../include/vbuf.h
-mail_flush.o: ../../include/iostuff.h
-mail_flush.o: ../../include/attr.h
+mail_flush.o: ../../include/vstream.h
+mail_flush.o: mail_flush.c
mail_flush.o: mail_flush.h
-mail_open_ok.o: mail_open_ok.c
-mail_open_ok.o: ../../include/sys_defs.h
+mail_flush.o: mail_params.h
+mail_flush.o: mail_proto.h
mail_open_ok.o: ../../include/msg.h
-mail_open_ok.o: mail_queue.h
-mail_open_ok.o: ../../include/vstring.h
+mail_open_ok.o: ../../include/sys_defs.h
mail_open_ok.o: ../../include/vbuf.h
mail_open_ok.o: ../../include/vstream.h
+mail_open_ok.o: ../../include/vstring.h
+mail_open_ok.o: mail_open_ok.c
mail_open_ok.o: mail_open_ok.h
-mail_params.o: mail_params.c
-mail_params.o: ../../include/sys_defs.h
+mail_open_ok.o: mail_queue.h
+mail_params.o: ../../include/argv.h
+mail_params.o: ../../include/attr.h
+mail_params.o: ../../include/dict.h
+mail_params.o: ../../include/dict_db.h
+mail_params.o: ../../include/get_hostname.h
+mail_params.o: ../../include/inet_addr_list.h
+mail_params.o: ../../include/inet_proto.h
+mail_params.o: ../../include/iostuff.h
mail_params.o: ../../include/msg.h
mail_params.o: ../../include/msg_syslog.h
-mail_params.o: ../../include/get_hostname.h
-mail_params.o: ../../include/valid_hostname.h
+mail_params.o: ../../include/myaddrinfo.h
+mail_params.o: ../../include/safe.h
mail_params.o: ../../include/stringops.h
-mail_params.o: ../../include/vstring.h
+mail_params.o: ../../include/sys_defs.h
+mail_params.o: ../../include/valid_hostname.h
mail_params.o: ../../include/vbuf.h
-mail_params.o: ../../include/safe.h
-mail_params.o: ../../include/dict_db.h
-mail_params.o: ../../include/dict.h
mail_params.o: ../../include/vstream.h
-mail_params.o: ../../include/argv.h
-mail_params.o: ../../include/inet_proto.h
-mail_params.o: mynetworks.h
+mail_params.o: ../../include/vstring.h
mail_params.o: mail_conf.h
-mail_params.o: mail_version.h
+mail_params.o: mail_params.c
+mail_params.o: mail_params.h
mail_params.o: mail_proto.h
-mail_params.o: ../../include/iostuff.h
-mail_params.o: ../../include/attr.h
-mail_params.o: verp_sender.h
+mail_params.o: mail_version.h
+mail_params.o: mynetworks.h
mail_params.o: own_inet_addr.h
-mail_params.o: ../../include/inet_addr_list.h
-mail_params.o: ../../include/myaddrinfo.h
-mail_params.o: mail_params.h
-mail_pathname.o: mail_pathname.c
-mail_pathname.o: ../../include/sys_defs.h
+mail_params.o: verp_sender.h
+mail_pathname.o: ../../include/attr.h
+mail_pathname.o: ../../include/iostuff.h
mail_pathname.o: ../../include/stringops.h
-mail_pathname.o: ../../include/vstring.h
+mail_pathname.o: ../../include/sys_defs.h
mail_pathname.o: ../../include/vbuf.h
-mail_pathname.o: mail_proto.h
mail_pathname.o: ../../include/vstream.h
-mail_pathname.o: ../../include/iostuff.h
-mail_pathname.o: ../../include/attr.h
-mail_queue.o: mail_queue.c
-mail_queue.o: ../../include/sys_defs.h
-mail_queue.o: ../../include/msg.h
-mail_queue.o: ../../include/vstring.h
-mail_queue.o: ../../include/vbuf.h
-mail_queue.o: ../../include/vstream.h
-mail_queue.o: ../../include/mymalloc.h
+mail_pathname.o: ../../include/vstring.h
+mail_pathname.o: mail_pathname.c
+mail_pathname.o: mail_proto.h
mail_queue.o: ../../include/argv.h
mail_queue.o: ../../include/dir_forest.h
mail_queue.o: ../../include/make_dirs.h
-mail_queue.o: ../../include/split_at.h
+mail_queue.o: ../../include/msg.h
+mail_queue.o: ../../include/mymalloc.h
mail_queue.o: ../../include/sane_fsops.h
+mail_queue.o: ../../include/split_at.h
+mail_queue.o: ../../include/sys_defs.h
mail_queue.o: ../../include/valid_hostname.h
+mail_queue.o: ../../include/vbuf.h
+mail_queue.o: ../../include/vstream.h
+mail_queue.o: ../../include/vstring.h
mail_queue.o: file_id.h
mail_queue.o: mail_params.h
+mail_queue.o: mail_queue.c
mail_queue.o: mail_queue.h
-mail_run.o: mail_run.c
-mail_run.o: ../../include/sys_defs.h
mail_run.o: ../../include/msg.h
+mail_run.o: ../../include/mymalloc.h
mail_run.o: ../../include/stringops.h
-mail_run.o: ../../include/vstring.h
+mail_run.o: ../../include/sys_defs.h
mail_run.o: ../../include/vbuf.h
-mail_run.o: ../../include/mymalloc.h
+mail_run.o: ../../include/vstring.h
mail_run.o: mail_params.h
+mail_run.o: mail_run.c
mail_run.o: mail_run.h
-mail_scan_dir.o: mail_scan_dir.c
-mail_scan_dir.o: ../../include/sys_defs.h
mail_scan_dir.o: ../../include/scan_dir.h
+mail_scan_dir.o: ../../include/sys_defs.h
+mail_scan_dir.o: mail_scan_dir.c
mail_scan_dir.o: mail_scan_dir.h
-mail_stream.o: mail_stream.c
-mail_stream.o: ../../include/sys_defs.h
+mail_stream.o: ../../include/argv.h
+mail_stream.o: ../../include/attr.h
+mail_stream.o: ../../include/iostuff.h
mail_stream.o: ../../include/msg.h
mail_stream.o: ../../include/mymalloc.h
-mail_stream.o: ../../include/vstring.h
+mail_stream.o: ../../include/stringops.h
+mail_stream.o: ../../include/sys_defs.h
mail_stream.o: ../../include/vbuf.h
mail_stream.o: ../../include/vstream.h
-mail_stream.o: ../../include/stringops.h
-mail_stream.o: ../../include/argv.h
+mail_stream.o: ../../include/vstring.h
mail_stream.o: cleanup_user.h
+mail_stream.o: mail_params.h
mail_stream.o: mail_proto.h
-mail_stream.o: ../../include/iostuff.h
-mail_stream.o: ../../include/attr.h
mail_stream.o: mail_queue.h
-mail_stream.o: opened.h
-mail_stream.o: mail_params.h
+mail_stream.o: mail_stream.c
mail_stream.o: mail_stream.h
-mail_task.o: mail_task.c
+mail_stream.o: opened.h
+mail_task.o: ../../include/safe.h
mail_task.o: ../../include/sys_defs.h
-mail_task.o: ../../include/vstring.h
mail_task.o: ../../include/vbuf.h
-mail_task.o: ../../include/safe.h
-mail_task.o: mail_params.h
+mail_task.o: ../../include/vstring.h
mail_task.o: mail_conf.h
+mail_task.o: mail_params.h
+mail_task.o: mail_task.c
mail_task.o: mail_task.h
-mail_trigger.o: mail_trigger.c
-mail_trigger.o: ../../include/sys_defs.h
+mail_trigger.o: ../../include/attr.h
+mail_trigger.o: ../../include/iostuff.h
mail_trigger.o: ../../include/msg.h
mail_trigger.o: ../../include/mymalloc.h
-mail_trigger.o: ../../include/iostuff.h
+mail_trigger.o: ../../include/sys_defs.h
mail_trigger.o: ../../include/trigger.h
+mail_trigger.o: ../../include/vbuf.h
+mail_trigger.o: ../../include/vstream.h
mail_trigger.o: mail_params.h
mail_trigger.o: mail_proto.h
-mail_trigger.o: ../../include/vstream.h
-mail_trigger.o: ../../include/vbuf.h
-mail_trigger.o: ../../include/attr.h
+mail_trigger.o: mail_trigger.c
mail_version.o: mail_version.c
-maps.o: maps.c
-maps.o: ../../include/sys_defs.h
maps.o: ../../include/argv.h
-maps.o: ../../include/mymalloc.h
-maps.o: ../../include/msg.h
maps.o: ../../include/dict.h
-maps.o: ../../include/vstream.h
-maps.o: ../../include/vbuf.h
+maps.o: ../../include/msg.h
+maps.o: ../../include/mymalloc.h
+maps.o: ../../include/split_at.h
maps.o: ../../include/stringops.h
+maps.o: ../../include/sys_defs.h
+maps.o: ../../include/vbuf.h
+maps.o: ../../include/vstream.h
maps.o: ../../include/vstring.h
-maps.o: ../../include/split_at.h
maps.o: mail_conf.h
+maps.o: maps.c
maps.o: maps.h
-mark_corrupt.o: mark_corrupt.c
-mark_corrupt.o: ../../include/sys_defs.h
mark_corrupt.o: ../../include/msg.h
-mark_corrupt.o: ../../include/vstream.h
-mark_corrupt.o: ../../include/vbuf.h
mark_corrupt.o: ../../include/set_eugid.h
-mark_corrupt.o: mail_queue.h
+mark_corrupt.o: ../../include/sys_defs.h
+mark_corrupt.o: ../../include/vbuf.h
+mark_corrupt.o: ../../include/vstream.h
mark_corrupt.o: ../../include/vstring.h
-mark_corrupt.o: mail_params.h
mark_corrupt.o: deliver_request.h
-mark_corrupt.o: recipient_list.h
+mark_corrupt.o: mail_params.h
+mark_corrupt.o: mail_queue.h
+mark_corrupt.o: mark_corrupt.c
mark_corrupt.o: mark_corrupt.h
-match_parent_style.o: match_parent_style.c
-match_parent_style.o: ../../include/sys_defs.h
-match_parent_style.o: string_list.h
+mark_corrupt.o: recipient_list.h
match_parent_style.o: ../../include/match_list.h
match_parent_style.o: ../../include/match_ops.h
+match_parent_style.o: ../../include/sys_defs.h
match_parent_style.o: mail_params.h
+match_parent_style.o: match_parent_style.c
match_parent_style.o: match_parent_style.h
-mbox_conf.o: mbox_conf.c
-mbox_conf.o: ../../include/sys_defs.h
-mbox_conf.o: ../../include/name_mask.h
+match_parent_style.o: string_list.h
mbox_conf.o: ../../include/argv.h
+mbox_conf.o: ../../include/name_mask.h
+mbox_conf.o: ../../include/sys_defs.h
mbox_conf.o: mail_params.h
+mbox_conf.o: mbox_conf.c
mbox_conf.o: mbox_conf.h
-mbox_open.o: mbox_open.c
-mbox_open.o: ../../include/sys_defs.h
+mbox_open.o: ../../include/argv.h
+mbox_open.o: ../../include/iostuff.h
mbox_open.o: ../../include/msg.h
-mbox_open.o: ../../include/vstream.h
+mbox_open.o: ../../include/myflock.h
+mbox_open.o: ../../include/mymalloc.h
+mbox_open.o: ../../include/safe_open.h
+mbox_open.o: ../../include/sys_defs.h
mbox_open.o: ../../include/vbuf.h
+mbox_open.o: ../../include/vstream.h
mbox_open.o: ../../include/vstring.h
-mbox_open.o: ../../include/safe_open.h
-mbox_open.o: ../../include/iostuff.h
-mbox_open.o: ../../include/mymalloc.h
-mbox_open.o: dot_lockfile.h
mbox_open.o: deliver_flock.h
-mbox_open.o: ../../include/myflock.h
+mbox_open.o: dot_lockfile.h
+mbox_open.o: dsn_util.h
mbox_open.o: mbox_conf.h
-mbox_open.o: ../../include/argv.h
+mbox_open.o: mbox_open.c
mbox_open.o: mbox_open.h
-mime_state.o: mime_state.c
-mime_state.o: ../../include/sys_defs.h
-mime_state.o: ../../include/mymalloc.h
mime_state.o: ../../include/msg.h
-mime_state.o: ../../include/vstring.h
+mime_state.o: ../../include/mymalloc.h
+mime_state.o: ../../include/sys_defs.h
mime_state.o: ../../include/vbuf.h
-mime_state.o: rec_type.h
-mime_state.o: is_header.h
+mime_state.o: ../../include/vstring.h
mime_state.o: header_opts.h
-mime_state.o: mail_params.h
mime_state.o: header_token.h
+mime_state.o: is_header.h
mime_state.o: lex_822.h
+mime_state.o: mail_params.h
+mime_state.o: mime_state.c
mime_state.o: mime_state.h
-mkmap_cdb.o: mkmap_cdb.c
+mime_state.o: rec_type.h
mkmap_cdb.o: ../../include/sys_defs.h
-mkmap_db.o: mkmap_db.c
-mkmap_db.o: ../../include/sys_defs.h
+mkmap_cdb.o: mkmap_cdb.c
+mkmap_db.o: ../../include/argv.h
+mkmap_db.o: ../../include/dict.h
+mkmap_db.o: ../../include/dict_db.h
mkmap_db.o: ../../include/msg.h
+mkmap_db.o: ../../include/myflock.h
mkmap_db.o: ../../include/mymalloc.h
mkmap_db.o: ../../include/stringops.h
-mkmap_db.o: ../../include/vstring.h
+mkmap_db.o: ../../include/sys_defs.h
mkmap_db.o: ../../include/vbuf.h
-mkmap_db.o: ../../include/dict.h
mkmap_db.o: ../../include/vstream.h
-mkmap_db.o: ../../include/argv.h
-mkmap_db.o: ../../include/dict_db.h
-mkmap_db.o: ../../include/myflock.h
+mkmap_db.o: ../../include/vstring.h
mkmap_db.o: mail_params.h
-mkmap_db.o: mkmap.h
-mkmap_dbm.o: mkmap_dbm.c
-mkmap_dbm.o: ../../include/sys_defs.h
+mkmap_db.o: mkmap.h
+mkmap_db.o: mkmap_db.c
+mkmap_dbm.o: ../../include/argv.h
+mkmap_dbm.o: ../../include/dict.h
+mkmap_dbm.o: ../../include/dict_dbm.h
mkmap_dbm.o: ../../include/msg.h
+mkmap_dbm.o: ../../include/myflock.h
mkmap_dbm.o: ../../include/mymalloc.h
mkmap_dbm.o: ../../include/stringops.h
-mkmap_dbm.o: ../../include/vstring.h
+mkmap_dbm.o: ../../include/sys_defs.h
mkmap_dbm.o: ../../include/vbuf.h
-mkmap_dbm.o: ../../include/dict.h
mkmap_dbm.o: ../../include/vstream.h
-mkmap_dbm.o: ../../include/argv.h
-mkmap_dbm.o: ../../include/dict_dbm.h
-mkmap_dbm.o: ../../include/myflock.h
+mkmap_dbm.o: ../../include/vstring.h
mkmap_dbm.o: mkmap.h
-mkmap_open.o: mkmap_open.c
-mkmap_open.o: ../../include/sys_defs.h
-mkmap_open.o: ../../include/msg.h
-mkmap_open.o: ../../include/dict.h
-mkmap_open.o: ../../include/vstream.h
-mkmap_open.o: ../../include/vbuf.h
+mkmap_dbm.o: mkmap_dbm.c
mkmap_open.o: ../../include/argv.h
-mkmap_open.o: ../../include/dict_db.h
+mkmap_open.o: ../../include/dict.h
mkmap_open.o: ../../include/dict_cdb.h
+mkmap_open.o: ../../include/dict_db.h
mkmap_open.o: ../../include/dict_dbm.h
mkmap_open.o: ../../include/dict_sdbm.h
-mkmap_open.o: ../../include/sigdelay.h
+mkmap_open.o: ../../include/msg.h
mkmap_open.o: ../../include/mymalloc.h
+mkmap_open.o: ../../include/sigdelay.h
+mkmap_open.o: ../../include/sys_defs.h
+mkmap_open.o: ../../include/vbuf.h
+mkmap_open.o: ../../include/vstream.h
mkmap_open.o: mkmap.h
-mkmap_sdbm.o: mkmap_sdbm.c
-mkmap_sdbm.o: ../../include/sys_defs.h
+mkmap_open.o: mkmap_open.c
+mkmap_sdbm.o: ../../include/argv.h
+mkmap_sdbm.o: ../../include/dict.h
+mkmap_sdbm.o: ../../include/dict_sdbm.h
mkmap_sdbm.o: ../../include/msg.h
+mkmap_sdbm.o: ../../include/myflock.h
mkmap_sdbm.o: ../../include/mymalloc.h
mkmap_sdbm.o: ../../include/stringops.h
-mkmap_sdbm.o: ../../include/vstring.h
+mkmap_sdbm.o: ../../include/sys_defs.h
mkmap_sdbm.o: ../../include/vbuf.h
-mkmap_sdbm.o: ../../include/dict.h
mkmap_sdbm.o: ../../include/vstream.h
-mkmap_sdbm.o: ../../include/argv.h
-mkmap_sdbm.o: ../../include/dict_sdbm.h
-mkmap_sdbm.o: ../../include/myflock.h
+mkmap_sdbm.o: ../../include/vstring.h
mkmap_sdbm.o: mkmap.h
-mynetworks.o: mynetworks.c
-mynetworks.o: ../../include/sys_defs.h
-mynetworks.o: ../../include/msg.h
-mynetworks.o: ../../include/vstring.h
-mynetworks.o: ../../include/vbuf.h
+mkmap_sdbm.o: mkmap_sdbm.c
+mynetworks.o: ../../include/argv.h
mynetworks.o: ../../include/inet_addr_list.h
+mynetworks.o: ../../include/mask_addr.h
+mynetworks.o: ../../include/msg.h
mynetworks.o: ../../include/myaddrinfo.h
mynetworks.o: ../../include/name_mask.h
-mynetworks.o: ../../include/mask_addr.h
-mynetworks.o: ../../include/argv.h
-mynetworks.o: own_inet_addr.h
-mynetworks.o: mail_params.h
-mynetworks.o: mynetworks.h
mynetworks.o: ../../include/sock_addr.h
+mynetworks.o: ../../include/sys_defs.h
+mynetworks.o: ../../include/vbuf.h
+mynetworks.o: ../../include/vstring.h
mynetworks.o: been_here.h
-mypwd.o: mypwd.c
-mypwd.o: ../../include/sys_defs.h
-mypwd.o: ../../include/mymalloc.h
-mypwd.o: ../../include/htable.h
+mynetworks.o: mail_params.h
+mynetworks.o: mynetworks.c
+mynetworks.o: mynetworks.h
+mynetworks.o: own_inet_addr.h
mypwd.o: ../../include/binhash.h
+mypwd.o: ../../include/htable.h
mypwd.o: ../../include/msg.h
+mypwd.o: ../../include/mymalloc.h
+mypwd.o: ../../include/sys_defs.h
+mypwd.o: mypwd.c
mypwd.o: mypwd.h
-namadr_list.o: namadr_list.c
-namadr_list.o: ../../include/sys_defs.h
namadr_list.o: ../../include/match_list.h
-namadr_list.o: namadr_list.h
namadr_list.o: ../../include/match_ops.h
-off_cvt.o: off_cvt.c
-off_cvt.o: ../../include/sys_defs.h
+namadr_list.o: ../../include/sys_defs.h
+namadr_list.o: namadr_list.c
+namadr_list.o: namadr_list.h
off_cvt.o: ../../include/msg.h
-off_cvt.o: ../../include/vstring.h
+off_cvt.o: ../../include/sys_defs.h
off_cvt.o: ../../include/vbuf.h
+off_cvt.o: ../../include/vstring.h
+off_cvt.o: off_cvt.c
off_cvt.o: off_cvt.h
-opened.o: opened.c
-opened.o: ../../include/sys_defs.h
opened.o: ../../include/msg.h
-opened.o: ../../include/vstring.h
+opened.o: ../../include/sys_defs.h
opened.o: ../../include/vbuf.h
+opened.o: ../../include/vstring.h
+opened.o: opened.c
opened.o: opened.h
-own_inet_addr.o: own_inet_addr.c
-own_inet_addr.o: ../../include/sys_defs.h
-own_inet_addr.o: ../../include/msg.h
-own_inet_addr.o: ../../include/mymalloc.h
+own_inet_addr.o: ../../include/inet_addr_host.h
own_inet_addr.o: ../../include/inet_addr_list.h
-own_inet_addr.o: ../../include/myaddrinfo.h
own_inet_addr.o: ../../include/inet_addr_local.h
-own_inet_addr.o: ../../include/inet_addr_host.h
+own_inet_addr.o: ../../include/inet_proto.h
+own_inet_addr.o: ../../include/msg.h
+own_inet_addr.o: ../../include/myaddrinfo.h
+own_inet_addr.o: ../../include/mymalloc.h
+own_inet_addr.o: ../../include/sock_addr.h
own_inet_addr.o: ../../include/stringops.h
-own_inet_addr.o: ../../include/vstring.h
+own_inet_addr.o: ../../include/sys_defs.h
own_inet_addr.o: ../../include/vbuf.h
-own_inet_addr.o: ../../include/sock_addr.h
-own_inet_addr.o: ../../include/inet_proto.h
+own_inet_addr.o: ../../include/vstring.h
own_inet_addr.o: mail_params.h
+own_inet_addr.o: own_inet_addr.c
own_inet_addr.o: own_inet_addr.h
-pipe_command.o: pipe_command.c
-pipe_command.o: ../../include/sys_defs.h
+pipe_command.o: ../../include/argv.h
+pipe_command.o: ../../include/clean_env.h
+pipe_command.o: ../../include/exec_command.h
+pipe_command.o: ../../include/iostuff.h
pipe_command.o: ../../include/msg.h
-pipe_command.o: ../../include/vstream.h
-pipe_command.o: ../../include/vbuf.h
-pipe_command.o: ../../include/vstring.h
+pipe_command.o: ../../include/set_eugid.h
+pipe_command.o: ../../include/set_ugid.h
pipe_command.o: ../../include/stringops.h
-pipe_command.o: ../../include/iostuff.h
+pipe_command.o: ../../include/sys_defs.h
pipe_command.o: ../../include/timed_wait.h
-pipe_command.o: ../../include/set_ugid.h
-pipe_command.o: ../../include/set_eugid.h
-pipe_command.o: ../../include/argv.h
-pipe_command.o: mail_params.h
+pipe_command.o: ../../include/vbuf.h
+pipe_command.o: ../../include/vstream.h
+pipe_command.o: ../../include/vstring.h
+pipe_command.o: dsn_util.h
pipe_command.o: mail_copy.h
-pipe_command.o: ../../include/clean_env.h
+pipe_command.o: mail_params.h
+pipe_command.o: pipe_command.c
pipe_command.o: pipe_command.h
-pipe_command.o: ../../include/exec_command.h
pipe_command.o: sys_exits.h
-post_mail.o: post_mail.c
-post_mail.o: ../../include/sys_defs.h
+post_mail.o: ../../include/attr.h
+post_mail.o: ../../include/events.h
+post_mail.o: ../../include/iostuff.h
post_mail.o: ../../include/msg.h
-post_mail.o: ../../include/vstream.h
+post_mail.o: ../../include/mymalloc.h
+post_mail.o: ../../include/sys_defs.h
post_mail.o: ../../include/vbuf.h
+post_mail.o: ../../include/vstream.h
post_mail.o: ../../include/vstring.h
-post_mail.o: ../../include/mymalloc.h
-post_mail.o: ../../include/events.h
+post_mail.o: cleanup_user.h
+post_mail.o: mail_date.h
post_mail.o: mail_params.h
-post_mail.o: record.h
-post_mail.o: rec_type.h
post_mail.o: mail_proto.h
-post_mail.o: ../../include/iostuff.h
-post_mail.o: ../../include/attr.h
-post_mail.o: cleanup_user.h
+post_mail.o: post_mail.c
post_mail.o: post_mail.h
-post_mail.o: mail_date.h
-quote_821_local.o: quote_821_local.c
+post_mail.o: rec_type.h
+post_mail.o: record.h
quote_821_local.o: ../../include/sys_defs.h
-quote_821_local.o: ../../include/vstring.h
quote_821_local.o: ../../include/vbuf.h
+quote_821_local.o: ../../include/vstring.h
+quote_821_local.o: quote_821_local.c
quote_821_local.o: quote_821_local.h
quote_821_local.o: quote_flags.h
-quote_822_local.o: quote_822_local.c
quote_822_local.o: ../../include/sys_defs.h
-quote_822_local.o: ../../include/vstring.h
quote_822_local.o: ../../include/vbuf.h
+quote_822_local.o: ../../include/vstring.h
+quote_822_local.o: quote_822_local.c
quote_822_local.o: quote_822_local.h
quote_822_local.o: quote_flags.h
-rec2stream.o: rec2stream.c
rec2stream.o: ../../include/sys_defs.h
-rec2stream.o: ../../include/vstring.h
rec2stream.o: ../../include/vbuf.h
rec2stream.o: ../../include/vstream.h
-rec2stream.o: record.h
+rec2stream.o: ../../include/vstring.h
+rec2stream.o: rec2stream.c
rec2stream.o: rec_streamlf.h
rec2stream.o: rec_type.h
-rec_streamlf.o: rec_streamlf.c
+rec2stream.o: record.h
rec_streamlf.o: ../../include/sys_defs.h
-rec_streamlf.o: ../../include/vstring.h
rec_streamlf.o: ../../include/vbuf.h
rec_streamlf.o: ../../include/vstream.h
-rec_streamlf.o: record.h
-rec_streamlf.o: rec_type.h
+rec_streamlf.o: ../../include/vstring.h
+rec_streamlf.o: rec_streamlf.c
rec_streamlf.o: rec_streamlf.h
+rec_streamlf.o: rec_type.h
+rec_streamlf.o: record.h
rec_type.o: rec_type.c
rec_type.o: rec_type.h
-recdump.o: recdump.c
-recdump.o: ../../include/sys_defs.h
recdump.o: ../../include/msg_vstream.h
-recdump.o: ../../include/vstream.h
+recdump.o: ../../include/sys_defs.h
recdump.o: ../../include/vbuf.h
-recdump.o: record.h
+recdump.o: ../../include/vstream.h
recdump.o: ../../include/vstring.h
recdump.o: rec_streamlf.h
recdump.o: rec_type.h
-recipient_list.o: recipient_list.c
-recipient_list.o: ../../include/sys_defs.h
+recdump.o: recdump.c
+recdump.o: record.h
recipient_list.o: ../../include/mymalloc.h
+recipient_list.o: ../../include/sys_defs.h
+recipient_list.o: recipient_list.c
recipient_list.o: recipient_list.h
-record.o: record.c
-record.o: ../../include/sys_defs.h
record.o: ../../include/msg.h
record.o: ../../include/mymalloc.h
-record.o: ../../include/vstream.h
+record.o: ../../include/sys_defs.h
record.o: ../../include/vbuf.h
+record.o: ../../include/vstream.h
record.o: ../../include/vstring.h
+record.o: record.c
record.o: record.h
-remove.o: remove.c
remove.o: ../../include/sys_defs.h
-remove.o: ../../include/vstring.h
remove.o: ../../include/vbuf.h
+remove.o: ../../include/vstring.h
remove.o: mail_params.h
-resolve_clnt.o: resolve_clnt.c
-resolve_clnt.o: ../../include/sys_defs.h
+remove.o: remove.c
+resolve_clnt.o: ../../include/attr.h
+resolve_clnt.o: ../../include/events.h
+resolve_clnt.o: ../../include/iostuff.h
resolve_clnt.o: ../../include/msg.h
-resolve_clnt.o: ../../include/vstream.h
+resolve_clnt.o: ../../include/sys_defs.h
resolve_clnt.o: ../../include/vbuf.h
+resolve_clnt.o: ../../include/vstream.h
resolve_clnt.o: ../../include/vstring.h
resolve_clnt.o: ../../include/vstring_vstream.h
-resolve_clnt.o: ../../include/events.h
-resolve_clnt.o: ../../include/iostuff.h
-resolve_clnt.o: mail_proto.h
-resolve_clnt.o: ../../include/attr.h
-resolve_clnt.o: mail_params.h
resolve_clnt.o: clnt_stream.h
+resolve_clnt.o: mail_params.h
+resolve_clnt.o: mail_proto.h
+resolve_clnt.o: resolve_clnt.c
resolve_clnt.o: resolve_clnt.h
-resolve_local.o: resolve_local.c
-resolve_local.o: ../../include/sys_defs.h
-resolve_local.o: ../../include/msg.h
-resolve_local.o: ../../include/mymalloc.h
-resolve_local.o: string_list.h
+resolve_local.o: ../../include/inet_addr_list.h
resolve_local.o: ../../include/match_list.h
resolve_local.o: ../../include/match_ops.h
+resolve_local.o: ../../include/msg.h
resolve_local.o: ../../include/myaddrinfo.h
-resolve_local.o: valid_mailhost_addr.h
+resolve_local.o: ../../include/mymalloc.h
+resolve_local.o: ../../include/sys_defs.h
resolve_local.o: ../../include/valid_hostname.h
resolve_local.o: mail_params.h
resolve_local.o: own_inet_addr.h
-resolve_local.o: ../../include/inet_addr_list.h
+resolve_local.o: resolve_local.c
resolve_local.o: resolve_local.h
-rewrite_clnt.o: rewrite_clnt.c
-rewrite_clnt.o: ../../include/sys_defs.h
+resolve_local.o: string_list.h
+resolve_local.o: valid_mailhost_addr.h
+rewrite_clnt.o: ../../include/attr.h
+rewrite_clnt.o: ../../include/events.h
+rewrite_clnt.o: ../../include/iostuff.h
rewrite_clnt.o: ../../include/msg.h
-rewrite_clnt.o: ../../include/vstring.h
+rewrite_clnt.o: ../../include/sys_defs.h
rewrite_clnt.o: ../../include/vbuf.h
rewrite_clnt.o: ../../include/vstream.h
+rewrite_clnt.o: ../../include/vstring.h
rewrite_clnt.o: ../../include/vstring_vstream.h
-rewrite_clnt.o: ../../include/events.h
-rewrite_clnt.o: ../../include/iostuff.h
+rewrite_clnt.o: clnt_stream.h
+rewrite_clnt.o: mail_params.h
+rewrite_clnt.o: mail_proto.h
rewrite_clnt.o: quote_822_local.h
rewrite_clnt.o: quote_flags.h
-rewrite_clnt.o: mail_proto.h
-rewrite_clnt.o: ../../include/attr.h
-rewrite_clnt.o: mail_params.h
-rewrite_clnt.o: clnt_stream.h
+rewrite_clnt.o: rewrite_clnt.c
rewrite_clnt.o: rewrite_clnt.h
-scache.o: scache.c
-scache.o: ../../include/sys_defs.h
+scache.o: ../../include/argv.h
+scache.o: ../../include/events.h
scache.o: ../../include/msg.h
-scache.o: ../../include/vstream.h
+scache.o: ../../include/sys_defs.h
scache.o: ../../include/vbuf.h
+scache.o: ../../include/vstream.h
scache.o: ../../include/vstring.h
-scache.o: ../../include/vstring_vstream.h
-scache.o: ../../include/argv.h
-scache.o: ../../include/events.h
+scache.o: ../../include/vstring_vstream.h
+scache.o: scache.c
scache.o: scache.h
-scache_clnt.o: scache_clnt.c
-scache_clnt.o: ../../include/sys_defs.h
+scache_clnt.o: ../../include/attr.h
+scache_clnt.o: ../../include/iostuff.h
scache_clnt.o: ../../include/msg.h
scache_clnt.o: ../../include/mymalloc.h
-scache_clnt.o: mail_proto.h
-scache_clnt.o: ../../include/vstream.h
+scache_clnt.o: ../../include/sys_defs.h
scache_clnt.o: ../../include/vbuf.h
-scache_clnt.o: ../../include/iostuff.h
-scache_clnt.o: ../../include/attr.h
-scache_clnt.o: mail_params.h
+scache_clnt.o: ../../include/vstream.h
+scache_clnt.o: ../../include/vstring.h
scache_clnt.o: clnt_stream.h
+scache_clnt.o: mail_params.h
+scache_clnt.o: mail_proto.h
scache_clnt.o: scache.h
-scache_clnt.o: ../../include/vstring.h
-scache_multi.o: scache_multi.c
-scache_multi.o: ../../include/sys_defs.h
+scache_clnt.o: scache_clnt.c
+scache_multi.o: ../../include/events.h
+scache_multi.o: ../../include/htable.h
scache_multi.o: ../../include/msg.h
+scache_multi.o: ../../include/mymalloc.h
scache_multi.o: ../../include/ring.h
-scache_multi.o: ../../include/htable.h
-scache_multi.o: ../../include/vstring.h
+scache_multi.o: ../../include/sys_defs.h
scache_multi.o: ../../include/vbuf.h
-scache_multi.o: ../../include/mymalloc.h
-scache_multi.o: ../../include/events.h
+scache_multi.o: ../../include/vstring.h
scache_multi.o: scache.h
-scache_single.o: scache_single.c
-scache_single.o: ../../include/sys_defs.h
+scache_multi.o: scache_multi.c
+scache_single.o: ../../include/events.h
scache_single.o: ../../include/msg.h
-scache_single.o: ../../include/vstring.h
-scache_single.o: ../../include/vbuf.h
scache_single.o: ../../include/mymalloc.h
-scache_single.o: ../../include/events.h
+scache_single.o: ../../include/sys_defs.h
+scache_single.o: ../../include/vbuf.h
+scache_single.o: ../../include/vstring.h
scache_single.o: scache.h
-sent.o: sent.c
-sent.o: ../../include/sys_defs.h
+scache_single.o: scache_single.c
sent.o: ../../include/msg.h
-sent.o: ../../include/vstring.h
+sent.o: ../../include/sys_defs.h
sent.o: ../../include/vbuf.h
-sent.o: mail_params.h
-sent.o: verify.h
-sent.o: deliver_request.h
sent.o: ../../include/vstream.h
-sent.o: recipient_list.h
-sent.o: log_adhoc.h
-sent.o: trace.h
-sent.o: defer.h
+sent.o: ../../include/vstring.h
sent.o: bounce.h
+sent.o: defer.h
+sent.o: deliver_request.h
+sent.o: dsn_util.h
+sent.o: log_adhoc.h
+sent.o: mail_params.h
+sent.o: recipient_list.h
+sent.o: sent.c
sent.o: sent.h
-smtp_stream.o: smtp_stream.c
+sent.o: trace.h
+sent.o: verify.h
+smtp_stream.o: ../../include/iostuff.h
+smtp_stream.o: ../../include/msg.h
smtp_stream.o: ../../include/sys_defs.h
-smtp_stream.o: ../../include/vstring.h
smtp_stream.o: ../../include/vbuf.h
smtp_stream.o: ../../include/vstream.h
+smtp_stream.o: ../../include/vstring.h
smtp_stream.o: ../../include/vstring_vstream.h
-smtp_stream.o: ../../include/msg.h
-smtp_stream.o: ../../include/iostuff.h
+smtp_stream.o: smtp_stream.c
smtp_stream.o: smtp_stream.h
-split_addr.o: split_addr.c
-split_addr.o: ../../include/sys_defs.h
split_addr.o: ../../include/split_at.h
-split_addr.o: mail_params.h
+split_addr.o: ../../include/sys_defs.h
split_addr.o: mail_addr.h
+split_addr.o: mail_params.h
+split_addr.o: split_addr.c
split_addr.o: split_addr.h
-stream2rec.o: stream2rec.c
stream2rec.o: ../../include/sys_defs.h
-stream2rec.o: ../../include/vstream.h
stream2rec.o: ../../include/vbuf.h
+stream2rec.o: ../../include/vstream.h
stream2rec.o: ../../include/vstring.h
-stream2rec.o: record.h
stream2rec.o: rec_streamlf.h
stream2rec.o: rec_type.h
-string_list.o: string_list.c
-string_list.o: ../../include/sys_defs.h
+stream2rec.o: record.h
+stream2rec.o: stream2rec.c
string_list.o: ../../include/match_list.h
-string_list.o: string_list.h
string_list.o: ../../include/match_ops.h
-strip_addr.o: strip_addr.c
-strip_addr.o: ../../include/sys_defs.h
+string_list.o: ../../include/sys_defs.h
+string_list.o: string_list.c
+string_list.o: string_list.h
strip_addr.o: ../../include/mymalloc.h
+strip_addr.o: ../../include/sys_defs.h
strip_addr.o: split_addr.h
+strip_addr.o: strip_addr.c
strip_addr.o: strip_addr.h
-sys_exits.o: sys_exits.c
-sys_exits.o: ../../include/sys_defs.h
sys_exits.o: ../../include/msg.h
+sys_exits.o: ../../include/sys_defs.h
+sys_exits.o: sys_exits.c
sys_exits.o: sys_exits.h
-timed_ipc.o: timed_ipc.c
-timed_ipc.o: ../../include/sys_defs.h
timed_ipc.o: ../../include/msg.h
-timed_ipc.o: ../../include/vstream.h
+timed_ipc.o: ../../include/sys_defs.h
timed_ipc.o: ../../include/vbuf.h
+timed_ipc.o: ../../include/vstream.h
timed_ipc.o: mail_params.h
+timed_ipc.o: timed_ipc.c
timed_ipc.o: timed_ipc.h
-tok822_find.o: tok822_find.c
tok822_find.o: ../../include/sys_defs.h
-tok822_find.o: ../../include/vstring.h
tok822_find.o: ../../include/vbuf.h
-tok822_find.o: tok822.h
+tok822_find.o: ../../include/vstring.h
tok822_find.o: resolve_clnt.h
-tok822_node.o: tok822_node.c
-tok822_node.o: ../../include/sys_defs.h
+tok822_find.o: tok822.h
+tok822_find.o: tok822_find.c
tok822_node.o: ../../include/mymalloc.h
-tok822_node.o: ../../include/vstring.h
+tok822_node.o: ../../include/sys_defs.h
tok822_node.o: ../../include/vbuf.h
-tok822_node.o: tok822.h
+tok822_node.o: ../../include/vstring.h
tok822_node.o: resolve_clnt.h
-tok822_parse.o: tok822_parse.c
-tok822_parse.o: ../../include/sys_defs.h
-tok822_parse.o: ../../include/vstring.h
-tok822_parse.o: ../../include/vbuf.h
+tok822_node.o: tok822.h
+tok822_node.o: tok822_node.c
tok822_parse.o: ../../include/msg.h
tok822_parse.o: ../../include/stringops.h
+tok822_parse.o: ../../include/sys_defs.h
+tok822_parse.o: ../../include/vbuf.h
+tok822_parse.o: ../../include/vstring.h
tok822_parse.o: lex_822.h
tok822_parse.o: quote_822_local.h
tok822_parse.o: quote_flags.h
-tok822_parse.o: tok822.h
tok822_parse.o: resolve_clnt.h
-tok822_resolve.o: tok822_resolve.c
+tok822_parse.o: tok822.h
+tok822_parse.o: tok822_parse.c
+tok822_resolve.o: ../../include/msg.h
tok822_resolve.o: ../../include/sys_defs.h
-tok822_resolve.o: ../../include/vstring.h
tok822_resolve.o: ../../include/vbuf.h
-tok822_resolve.o: ../../include/msg.h
+tok822_resolve.o: ../../include/vstring.h
tok822_resolve.o: resolve_clnt.h
tok822_resolve.o: tok822.h
-tok822_rewrite.o: tok822_rewrite.c
+tok822_resolve.o: tok822_resolve.c
+tok822_rewrite.o: ../../include/attr.h
+tok822_rewrite.o: ../../include/iostuff.h
+tok822_rewrite.o: ../../include/msg.h
tok822_rewrite.o: ../../include/sys_defs.h
-tok822_rewrite.o: ../../include/vstring.h
tok822_rewrite.o: ../../include/vbuf.h
-tok822_rewrite.o: ../../include/msg.h
-tok822_rewrite.o: rewrite_clnt.h
-tok822_rewrite.o: mail_proto.h
tok822_rewrite.o: ../../include/vstream.h
-tok822_rewrite.o: ../../include/iostuff.h
-tok822_rewrite.o: ../../include/attr.h
-tok822_rewrite.o: tok822.h
+tok822_rewrite.o: ../../include/vstring.h
+tok822_rewrite.o: mail_proto.h
tok822_rewrite.o: resolve_clnt.h
-tok822_tree.o: tok822_tree.c
-tok822_tree.o: ../../include/sys_defs.h
+tok822_rewrite.o: rewrite_clnt.h
+tok822_rewrite.o: tok822.h
+tok822_rewrite.o: tok822_rewrite.c
tok822_tree.o: ../../include/mymalloc.h
-tok822_tree.o: ../../include/vstring.h
+tok822_tree.o: ../../include/sys_defs.h
tok822_tree.o: ../../include/vbuf.h
-tok822_tree.o: tok822.h
+tok822_tree.o: ../../include/vstring.h
tok822_tree.o: resolve_clnt.h
-trace.o: trace.c
-trace.o: ../../include/sys_defs.h
+tok822_tree.o: tok822.h
+tok822_tree.o: tok822_tree.c
+trace.o: ../../include/attr.h
+trace.o: ../../include/iostuff.h
trace.o: ../../include/msg.h
-trace.o: ../../include/vstring.h
+trace.o: ../../include/sys_defs.h
trace.o: ../../include/vbuf.h
-trace.o: mail_params.h
-trace.o: mail_proto.h
trace.o: ../../include/vstream.h
-trace.o: ../../include/iostuff.h
-trace.o: ../../include/attr.h
-trace.o: verify_clnt.h
+trace.o: ../../include/vstring.h
+trace.o: bounce.h
trace.o: deliver_request.h
-trace.o: recipient_list.h
trace.o: log_adhoc.h
-trace.o: bounce.h
+trace.o: mail_params.h
+trace.o: mail_proto.h
+trace.o: recipient_list.h
+trace.o: trace.c
trace.o: trace.h
-user_acl.o: user_acl.c
-user_acl.o: ../../include/sys_defs.h
-user_acl.o: ../../include/vstring.h
-user_acl.o: ../../include/vbuf.h
-user_acl.o: string_list.h
+trace.o: verify_clnt.h
user_acl.o: ../../include/match_list.h
user_acl.o: ../../include/match_ops.h
-user_acl.o: mypwd.h
+user_acl.o: ../../include/sys_defs.h
+user_acl.o: ../../include/vbuf.h
+user_acl.o: ../../include/vstring.h
user_acl.o: mail_params.h
+user_acl.o: mypwd.h
+user_acl.o: string_list.h
+user_acl.o: user_acl.c
user_acl.o: user_acl.h
-valid_mailhost_addr.o: valid_mailhost_addr.c
-valid_mailhost_addr.o: ../../include/sys_defs.h
valid_mailhost_addr.o: ../../include/msg.h
valid_mailhost_addr.o: ../../include/myaddrinfo.h
-valid_mailhost_addr.o: valid_mailhost_addr.h
+valid_mailhost_addr.o: ../../include/sys_defs.h
valid_mailhost_addr.o: ../../include/valid_hostname.h
-verify.o: verify.c
-verify.o: ../../include/sys_defs.h
+valid_mailhost_addr.o: valid_mailhost_addr.c
+valid_mailhost_addr.o: valid_mailhost_addr.h
+verify.o: ../../include/attr.h
+verify.o: ../../include/iostuff.h
verify.o: ../../include/msg.h
-verify.o: ../../include/vstring.h
+verify.o: ../../include/sys_defs.h
verify.o: ../../include/vbuf.h
-verify.o: mail_params.h
-verify.o: mail_proto.h
verify.o: ../../include/vstream.h
-verify.o: ../../include/iostuff.h
-verify.o: ../../include/attr.h
-verify.o: verify_clnt.h
+verify.o: ../../include/vstring.h
verify.o: deliver_request.h
-verify.o: recipient_list.h
verify.o: log_adhoc.h
+verify.o: mail_params.h
+verify.o: mail_proto.h
+verify.o: recipient_list.h
+verify.o: verify.c
verify.o: verify.h
-verify_clnt.o: verify_clnt.c
-verify_clnt.o: ../../include/sys_defs.h
+verify.o: verify_clnt.h
+verify_clnt.o: ../../include/attr.h
+verify_clnt.o: ../../include/iostuff.h
verify_clnt.o: ../../include/msg.h
-verify_clnt.o: ../../include/vstream.h
+verify_clnt.o: ../../include/sys_defs.h
verify_clnt.o: ../../include/vbuf.h
+verify_clnt.o: ../../include/vstream.h
verify_clnt.o: ../../include/vstring.h
-verify_clnt.o: ../../include/attr.h
-verify_clnt.o: mail_params.h
-verify_clnt.o: mail_proto.h
-verify_clnt.o: ../../include/iostuff.h
verify_clnt.o: clnt_stream.h
-verify_clnt.o: verify_clnt.h
verify_clnt.o: deliver_request.h
+verify_clnt.o: mail_params.h
+verify_clnt.o: mail_proto.h
verify_clnt.o: recipient_list.h
-verp_sender.o: verp_sender.c
+verify_clnt.o: verify_clnt.c
+verify_clnt.o: verify_clnt.h
verp_sender.o: ../../include/sys_defs.h
-verp_sender.o: ../../include/vstring.h
verp_sender.o: ../../include/vbuf.h
+verp_sender.o: ../../include/vstring.h
verp_sender.o: mail_params.h
+verp_sender.o: verp_sender.c
verp_sender.o: verp_sender.h
-virtual8_maps.o: virtual8_maps.c
-virtual8_maps.o: ../../include/sys_defs.h
+virtual8_maps.o: ../../include/argv.h
+virtual8_maps.o: ../../include/dict.h
virtual8_maps.o: ../../include/msg.h
virtual8_maps.o: ../../include/mymalloc.h
-virtual8_maps.o: maps.h
-virtual8_maps.o: ../../include/dict.h
-virtual8_maps.o: ../../include/vstream.h
+virtual8_maps.o: ../../include/sys_defs.h
virtual8_maps.o: ../../include/vbuf.h
-virtual8_maps.o: ../../include/argv.h
+virtual8_maps.o: ../../include/vstream.h
virtual8_maps.o: mail_params.h
+virtual8_maps.o: maps.h
virtual8_maps.o: strip_addr.h
+virtual8_maps.o: virtual8_maps.c
virtual8_maps.o: virtual8_maps.h
-wildcard_inet_addr.o: wildcard_inet_addr.c
-wildcard_inet_addr.o: ../../include/sys_defs.h
-wildcard_inet_addr.o: ../../include/msg.h
+wildcard_inet_addr.o: ../../include/inet_addr_host.h
wildcard_inet_addr.o: ../../include/inet_addr_list.h
+wildcard_inet_addr.o: ../../include/msg.h
wildcard_inet_addr.o: ../../include/myaddrinfo.h
-wildcard_inet_addr.o: ../../include/inet_addr_host.h
+wildcard_inet_addr.o: ../../include/sys_defs.h
+wildcard_inet_addr.o: wildcard_inet_addr.c
wildcard_inet_addr.o: wildcard_inet_addr.h
-xtext.o: xtext.c
-xtext.o: ../../include/sys_defs.h
xtext.o: ../../include/msg.h
-xtext.o: ../../include/vstring.h
+xtext.o: ../../include/sys_defs.h
xtext.o: ../../include/vbuf.h
+xtext.o: ../../include/vstring.h
+xtext.o: xtext.c
xtext.o: xtext.h
diff --git a/postfix/src/global/bounce.c b/postfix/src/global/bounce.c
index 6b121cedb..e1a1c5411 100644
--- a/postfix/src/global/bounce.c
+++ b/postfix/src/global/bounce.c
@@ -7,24 +7,26 @@
/* #include
/*
/* int bounce_append(flags, id, orig_rcpt, recipient, offset, relay,
-/* entry, format, ...)
+/* dsn, entry, format, ...)
/* int flags;
/* const char *id;
/* const char *orig_rcpt;
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/*
/* int vbounce_append(flags, id, orig_rcpt, recipient, offset, relay,
-/* entry, format, ap)
+/* dsn, entry, format, ap)
/* int flags;
/* const char *id;
/* const char *orig_rcpt;
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/* va_list ap;
@@ -37,7 +39,8 @@
/* const char *sender;
/*
/* int bounce_one(flags, queue, id, encoding, sender, orig_rcpt,
-/* recipient, offset, relay, entry, format, ...)
+/* recipient, offset, relay, dsn, entry,
+/* format, ...)
/* int flags;
/* const char *queue;
/* const char *id;
@@ -47,11 +50,13 @@
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/*
/* int vbounce_one(flags, queue, id, encoding, sender, orig_rcpt,
-/* recipient, offset, relay, entry, format, ap)
+/* recipient, offset, relay, dsn, entry,
+/* format, ap)
/* int flags;
/* const char *queue;
/* const char *id;
@@ -61,6 +66,7 @@
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/* va_list ap;
@@ -120,6 +126,8 @@
/* .IP relay
/* Name of the host that the message could not be delivered to.
/* This information is used for syslogging only.
+/* .IP dsn
+/* X.YY.ZZ Error detail as specified in RFC 1893.
/* .IP entry
/* Message arrival time.
/* .IP orig_rcpt
@@ -168,6 +176,7 @@
#include
#include
+#include
/* Global library. */
@@ -178,19 +187,21 @@
#include
#include
#include
+#include
/* bounce_append - append reason to per-message bounce log */
int bounce_append(int flags, const char *id, const char *orig_rcpt,
const char *recipient, long offset, const char *relay,
- time_t entry, const char *fmt,...)
+ const char *dsn, time_t entry,
+ const char *fmt,...)
{
va_list ap;
int status;
va_start(ap, fmt);
status = vbounce_append(flags, id, orig_rcpt, recipient,
- offset, relay, entry, fmt, ap);
+ offset, relay, dsn, entry, fmt, ap);
va_end(ap);
return (status);
}
@@ -199,16 +210,25 @@ int bounce_append(int flags, const char *id, const char *orig_rcpt,
int vbounce_append(int flags, const char *id, const char *orig_rcpt,
const char *recipient, long offset, const char *relay,
- time_t entry, const char *fmt, va_list ap)
+ const char *dsn, time_t entry,
+ const char *fmt, va_list ap)
{
int status;
+ /*
+ * Sanity check.
+ */
+ if (*dsn != '5' || !dsn_valid(dsn)) {
+ msg_warn("bounce_append: ignoring dsn code \"%s\"", dsn);
+ dsn = "5.0.0";
+ }
+
/*
* MTA-requested address verification information is stored in the verify
* service database.
*/
if (flags & DEL_REQ_FLAG_VERIFY) {
- status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+ status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
"undeliverable", DEL_RCPT_STAT_BOUNCE, fmt, ap);
return (status);
}
@@ -219,7 +239,7 @@ int vbounce_append(int flags, const char *id, const char *orig_rcpt,
*/
if (flags & DEL_REQ_FLAG_EXPAND) {
status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
- entry, "5.0.0", "undeliverable", fmt, ap);
+ dsn, entry, "undeliverable", fmt, ap);
return (status);
}
@@ -237,13 +257,15 @@ int vbounce_append(int flags, const char *id, const char *orig_rcpt,
*/
else {
VSTRING *why = vstring_alloc(100);
- char *dsn_code = var_soft_bounce ? "4.0.0" : "5.0.0";
- char *dsn_action = var_soft_bounce ? "delayed" : "failed";
+ char *my_dsn = mystrdup(dsn);
+ char *action = var_soft_bounce ? "delayed" : "failed";
char *log_status = var_soft_bounce ? "SOFTBOUNCE" : "bounced";
vstring_vsprintf(why, fmt, ap);
if (orig_rcpt == 0)
orig_rcpt = "";
+ if (var_soft_bounce)
+ my_dsn[0] = '4';
if (mail_command_client(MAIL_CLASS_PRIVATE, var_soft_bounce ?
var_defer_service : var_bounce_service,
ATTR_TYPE_NUM, MAIL_ATTR_NREQ, BOUNCE_CMD_APPEND,
@@ -252,24 +274,27 @@ int vbounce_append(int flags, const char *id, const char *orig_rcpt,
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, offset,
- ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn_code,
- ATTR_TYPE_STR, MAIL_ATTR_ACTION, dsn_action,
+ ATTR_TYPE_STR, MAIL_ATTR_STATUS, my_dsn,
+ ATTR_TYPE_STR, MAIL_ATTR_ACTION, action,
ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
ATTR_TYPE_END) == 0
&& ((flags & DEL_REQ_FLAG_RECORD) == 0
|| trace_append(flags, id, orig_rcpt, recipient, relay,
- entry, dsn_code, dsn_action,
+ my_dsn, entry, action,
"%s", vstring_str(why)) == 0)) {
- log_adhoc(id, orig_rcpt, recipient, relay,
+ log_adhoc(id, orig_rcpt, recipient, relay, my_dsn,
entry, log_status, "%s", vstring_str(why));
status = (var_soft_bounce ? -1 : 0);
} else if ((flags & BOUNCE_FLAG_CLEAN) == 0) {
+ my_dsn[0] = '4';
status = defer_append(flags, id, orig_rcpt, recipient, offset,
- relay, entry, "%s or %s service failure",
+ relay, my_dsn, entry,
+ "%s or %s service failure",
var_bounce_service, var_trace_service);
} else {
status = -1;
}
+ myfree(my_dsn);
vstring_free(why);
return (status);
}
@@ -309,15 +334,15 @@ int bounce_flush(int flags, const char *queue, const char *id,
int bounce_one(int flags, const char *queue, const char *id,
const char *encoding, const char *sender,
const char *orig_rcpt, const char *recipient,
- long offset, const char *relay, time_t entry,
- const char *fmt,...)
+ long offset, const char *relay, const char *dsn,
+ time_t entry, const char *fmt,...)
{
va_list ap;
int status;
va_start(ap, fmt);
status = vbounce_one(flags, queue, id, encoding, sender, orig_rcpt,
- recipient, offset, relay, entry, fmt, ap);
+ recipient, offset, relay, dsn, entry, fmt, ap);
va_end(ap);
return (status);
}
@@ -327,17 +352,25 @@ int bounce_one(int flags, const char *queue, const char *id,
int vbounce_one(int flags, const char *queue, const char *id,
const char *encoding, const char *sender,
const char *orig_rcpt, const char *recipient,
- long offset, const char *relay, time_t entry,
- const char *fmt, va_list ap)
+ long offset, const char *relay, const char *dsn,
+ time_t entry, const char *fmt, va_list ap)
{
int status;
+ /*
+ * Sanity check.
+ */
+ if (*dsn != '5' || !dsn_valid(dsn)) {
+ msg_warn("bounce_one: ignoring dsn code \"%s\"", dsn);
+ dsn = "5.0.0";
+ }
+
/*
* MTA-requested address verification information is stored in the verify
* service database.
*/
if (flags & DEL_REQ_FLAG_VERIFY) {
- status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+ status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
"undeliverable", DEL_RCPT_STAT_BOUNCE, fmt, ap);
return (status);
}
@@ -348,7 +381,7 @@ int vbounce_one(int flags, const char *queue, const char *id,
*/
if (flags & DEL_REQ_FLAG_EXPAND) {
status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
- entry, "5.0.0", "undeliverable", fmt, ap);
+ dsn, entry, "undeliverable", fmt, ap);
return (status);
}
@@ -358,7 +391,7 @@ int vbounce_one(int flags, const char *queue, const char *id,
*/
else if (var_soft_bounce) {
return (vbounce_append(flags, id, orig_rcpt, recipient,
- offset, relay, entry, fmt, ap));
+ offset, relay, dsn, entry, fmt, ap));
}
/*
@@ -366,10 +399,13 @@ int vbounce_one(int flags, const char *queue, const char *id,
*/
else {
VSTRING *why = vstring_alloc(100);
+ char *my_dsn = mystrdup(dsn);
vstring_vsprintf(why, fmt, ap);
if (orig_rcpt == 0)
orig_rcpt = "";
+ if (var_soft_bounce)
+ my_dsn[0] = '4';
if (mail_command_client(MAIL_CLASS_PRIVATE, var_bounce_service,
ATTR_TYPE_NUM, MAIL_ATTR_NREQ, BOUNCE_CMD_ONE,
ATTR_TYPE_NUM, MAIL_ATTR_FLAGS, flags,
@@ -380,24 +416,27 @@ int vbounce_one(int flags, const char *queue, const char *id,
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, offset,
- ATTR_TYPE_STR, MAIL_ATTR_STATUS, "5.0.0",
+ ATTR_TYPE_STR, MAIL_ATTR_STATUS, my_dsn,
ATTR_TYPE_STR, MAIL_ATTR_ACTION, "failed",
ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
ATTR_TYPE_END) == 0
&& ((flags & DEL_REQ_FLAG_RECORD) == 0
|| trace_append(flags, id, orig_rcpt, recipient, relay,
- entry, "5.0.0", "failed",
+ my_dsn, entry, "failed",
"%s", vstring_str(why)) == 0)) {
- log_adhoc(id, orig_rcpt, recipient, relay,
+ log_adhoc(id, orig_rcpt, recipient, relay, my_dsn,
entry, "bounced", "%s", vstring_str(why));
status = 0;
} else if ((flags & BOUNCE_FLAG_CLEAN) == 0) {
+ my_dsn[0] = '4';
status = defer_append(flags, id, orig_rcpt, recipient, offset,
- relay, entry, "%s or %s service failure",
+ relay, my_dsn, entry,
+ "%s or %s service failure",
var_bounce_service, var_trace_service);
} else {
status = -1;
}
+ myfree(my_dsn);
vstring_free(why);
return (status);
}
diff --git a/postfix/src/global/bounce.h b/postfix/src/global/bounce.h
index 6f1a6a552..38cb9a5a4 100644
--- a/postfix/src/global/bounce.h
+++ b/postfix/src/global/bounce.h
@@ -25,21 +25,25 @@
/*
* Client interface.
*/
-extern int PRINTFLIKE(8, 9) bounce_append(int, const char *,
+extern int PRINTFLIKE(9, 10) bounce_append(int, const char *,
const char *, const char *,
- long, const char *, time_t,
+ long, const char *,
+ const char *, time_t,
const char *,...);
extern int vbounce_append(int, const char *, const char *, const char *, long,
- const char *, time_t, const char *, va_list);
+ const char *, const char *, time_t,
+ const char *, va_list);
extern int bounce_flush(int, const char *, const char *, const char *, const char *);
-extern int PRINTFLIKE(11, 12) bounce_one(int, const char *, const char *,
+extern int PRINTFLIKE(12, 13) bounce_one(int, const char *, const char *,
const char *, const char *,
const char *, const char *,
- long, const char *, time_t,
+ long, const char *,
+ const char *, time_t,
const char *,...);
extern int vbounce_one(int, const char *, const char *, const char *,
- const char *, const char *, const char *, long,
- const char *, time_t, const char *, va_list);
+ const char *, const char *, const char *, long,
+ const char *, const char *, time_t,
+ const char *, va_list);
/*
* Bounce/defer protocol commands.
diff --git a/postfix/src/global/cleanup_strerror.c b/postfix/src/global/cleanup_strerror.c
index 489093ed9..0910102b0 100644
--- a/postfix/src/global/cleanup_strerror.c
+++ b/postfix/src/global/cleanup_strerror.c
@@ -6,13 +6,29 @@
/* SYNOPSIS
/* #include
/*
+/* typedef struct {
+/* .in +4
+/* const unsigned status; /* cleanup status */
+/* const int smtp; /* RFC 821 */
+/* const char *dsn; /* RFC 1893 */
+/* const char *text; /* free text */
+/* .in -4
+/* } CLEANUP_STAT_DETAIL;
+/*
/* const char *cleanup_strerror(code)
/* int code;
+/*
+/* CLEANUP_STAT_DETAIL *cleanup_stat_detail(code)
+/* int code;
/* DESCRIPTION
/* cleanup_strerror() maps a status code returned by the \fIcleanup\fR
/* service to printable string.
-/* The result is for read purposes only. Unknown status codes share
-/* a common result buffer.
+/* The result is for read purposes only.
+/*
+/* cleanup_stat_detail() returns a pointer to structure with
+/* assorted information.
+/* DIAGNOSTICS:
+/* Panic: unknown status.
/* LICENSE
/* .ad
/* .fi
@@ -31,47 +47,59 @@
/* Utility library. */
#include
+#include
/* Global library. */
-#include "cleanup_user.h"
+#include
/*
* Mapping from status code to printable string. One message may suffer from
* multiple errors, to it is important to list the most severe errors first,
- * or to list the cause (header overflow) before the effect (no recipients),
* because cleanup_strerror() can report only one error.
*/
-struct cleanup_stat_map {
- unsigned status;
- const char *text;
+static CLEANUP_STAT_DETAIL cleanup_stat_map[] = {
+ CLEANUP_STAT_PROXY, 451, "4.3.0", "queue file write error",
+ CLEANUP_STAT_BAD, 451, "4.3.0", "internal protocol error",
+ CLEANUP_STAT_RCPT, 550, "5.1.0", "no recipients specified",
+ CLEANUP_STAT_HOPS, 554, "5.4.0", "too many hops",
+ CLEANUP_STAT_SIZE, 552, "5.3.4", "message file too big",
+ CLEANUP_STAT_CONT, 550, "5.7.1", "message content rejected",
+ CLEANUP_STAT_WRITE, 451, "4.3.0", "queue file write error",
};
-static struct cleanup_stat_map cleanup_stat_map[] = {
- CLEANUP_STAT_BAD, "Internal protocol error",
- CLEANUP_STAT_RCPT, "No recipients specified",
- CLEANUP_STAT_HOPS, "Too many hops",
- CLEANUP_STAT_SIZE, "Message file too big",
- CLEANUP_STAT_CONT, "Message content rejected",
- CLEANUP_STAT_WRITE, "Error writing message file",
+static CLEANUP_STAT_DETAIL cleanup_stat_success = {
+ CLEANUP_STAT_OK, 250, "2.0.0", "Success",
};
/* cleanup_strerror - map status code to printable string */
const char *cleanup_strerror(unsigned status)
{
- static VSTRING *unknown;
unsigned i;
- if (status == 0)
+ if (status == CLEANUP_STAT_OK)
return ("Success");
for (i = 0; i < sizeof(cleanup_stat_map) / sizeof(cleanup_stat_map[0]); i++)
if (cleanup_stat_map[i].status & status)
return (cleanup_stat_map[i].text);
- if (unknown == 0)
- unknown = vstring_alloc(20);
- vstring_sprintf(unknown, "Unknown status %u", status);
- return (vstring_str(unknown));
+ msg_panic("cleanup_strerror: unknown status %u", status);
+}
+
+/* cleanup_stat_detail - map status code to table entry with assorted data */
+
+CLEANUP_STAT_DETAIL *cleanup_stat_detail(unsigned status)
+{
+ unsigned i;
+
+ if (status == CLEANUP_STAT_OK)
+ return (&cleanup_stat_success);
+
+ for (i = 0; i < sizeof(cleanup_stat_map) / sizeof(cleanup_stat_map[0]); i++)
+ if (cleanup_stat_map[i].status & status)
+ return (cleanup_stat_map + i);
+
+ msg_panic("cleanup_stat_detail: unknown status %u", status);
}
diff --git a/postfix/src/global/cleanup_user.h b/postfix/src/global/cleanup_user.h
index 8a398c7a8..d45efcc09 100644
--- a/postfix/src/global/cleanup_user.h
+++ b/postfix/src/global/cleanup_user.h
@@ -65,7 +65,18 @@
#define CLEANUP_STAT_MASK_INCOMPLETE \
(CLEANUP_STAT_BAD | CLEANUP_STAT_WRITE | CLEANUP_STAT_SIZE)
+ /*
+ * Mapping from status code to DSN detail and free text.
+ */
+typedef struct {
+ const unsigned status; /* CLEANUP_STAT_MUMBLE */
+ const int smtp; /* RFC 821 */
+ const char *dsn; /* RFC 1893 */
+ const char *text; /* free text */
+} CLEANUP_STAT_DETAIL;
+
extern const char *cleanup_strerror(unsigned);
+extern CLEANUP_STAT_DETAIL *cleanup_stat_detail(unsigned);
extern const char *cleanup_strflags(unsigned);
/* LICENSE
diff --git a/postfix/src/global/defer.c b/postfix/src/global/defer.c
index f710d20b2..d4f42cb73 100644
--- a/postfix/src/global/defer.c
+++ b/postfix/src/global/defer.c
@@ -7,24 +7,26 @@
/* #include
/*
/* int defer_append(flags, id, orig_rcpt, recipient, offset, relay,
-/* entry, format, ...)
+/* dsn, entry, format, ...)
/* int flags;
/* const char *id;
/* const char *orig_rcpt;
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/*
/* int vdefer_append(flags, id, orig_rcpt, recipient, offset, relay,
-/* entry, format, ap)
+/* dsn, entry, format, ap)
/* int flags;
/* const char *id;
/* const char *orig_rcpt;
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/* va_list ap;
@@ -104,6 +106,8 @@
/* Host we could not talk to.
/* .IP entry
/* Message arrival time.
+/* .IP dsn
+/* X.YY.ZZ Error detail as specified in RFC 1893.
/* .IP format
/* The reason for non-delivery.
/* .IP ap
@@ -154,6 +158,7 @@
#include
#include
#include
+#include
#define STR(x) vstring_str(x)
@@ -161,14 +166,15 @@
int defer_append(int flags, const char *id, const char *orig_rcpt,
const char *recipient, long offset, const char *relay,
- time_t entry, const char *fmt,...)
+ const char *dsn, time_t entry,
+ const char *fmt,...)
{
va_list ap;
int status;
va_start(ap, fmt);
status = vdefer_append(flags, id, orig_rcpt, recipient,
- offset, relay, entry, fmt, ap);
+ offset, relay, dsn, entry, fmt, ap);
va_end(ap);
return (status);
}
@@ -177,17 +183,26 @@ int defer_append(int flags, const char *id, const char *orig_rcpt,
int vdefer_append(int flags, const char *id, const char *orig_rcpt,
const char *recipient, long offset, const char *relay,
- time_t entry, const char *fmt, va_list ap)
+ const char *dsn, time_t entry,
+ const char *fmt, va_list ap)
{
const char *rcpt_domain;
int status;
+ /*
+ * Sanity check.
+ */
+ if (*dsn != '4' || !dsn_valid(dsn)) {
+ msg_warn("defer_append: ignoring dsn code \"%s\"", dsn);
+ dsn = "4.0.0";
+ }
+
/*
* MTA-requested address verification information is stored in the verify
* service database.
*/
if (flags & DEL_REQ_FLAG_VERIFY) {
- status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+ status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
"undeliverable", DEL_RCPT_STAT_DEFER, fmt, ap);
return (status);
}
@@ -198,7 +213,7 @@ int vdefer_append(int flags, const char *id, const char *orig_rcpt,
*/
if (flags & DEL_REQ_FLAG_EXPAND) {
status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
- entry, "4.0.0", "undeliverable", fmt, ap);
+ dsn, entry, "undeliverable", fmt, ap);
return (status);
}
@@ -219,12 +234,12 @@ int vdefer_append(int flags, const char *id, const char *orig_rcpt,
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, offset,
- ATTR_TYPE_STR, MAIL_ATTR_STATUS, "4.0.0",
+ ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn,
ATTR_TYPE_STR, MAIL_ATTR_ACTION, "delayed",
ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
ATTR_TYPE_END) != 0)
msg_warn("%s: %s service failure", id, var_defer_service);
- log_adhoc(id, orig_rcpt, recipient, relay, entry, "deferred",
+ log_adhoc(id, orig_rcpt, recipient, relay, dsn, entry, "deferred",
"%s", vstring_str(why));
/*
@@ -232,7 +247,7 @@ int vdefer_append(int flags, const char *id, const char *orig_rcpt,
*/
if (flags & DEL_REQ_FLAG_RECORD)
if (trace_append(flags, id, orig_rcpt, recipient, relay,
- entry, "4.0.0", "deferred",
+ dsn, entry, "deferred",
"%s", vstring_str(why)) != 0)
msg_warn("%s: %s service failure", id, var_trace_service);
diff --git a/postfix/src/global/defer.h b/postfix/src/global/defer.h
index 9e39ce2f4..6680f3217 100644
--- a/postfix/src/global/defer.h
+++ b/postfix/src/global/defer.h
@@ -26,12 +26,14 @@
/*
* External interface.
*/
-extern int PRINTFLIKE(8, 9) defer_append(int, const char *,
+extern int PRINTFLIKE(9, 10) defer_append(int, const char *,
const char *, const char *,
- long, const char *, time_t,
+ long, const char *,
+ const char *, time_t,
const char *,...);
extern int vdefer_append(int, const char *, const char *, const char *, long,
- const char *, time_t, const char *, va_list);
+ const char *, const char *, time_t,
+ const char *, va_list);
extern int defer_flush(int, const char *, const char *, const char *, const char *);
extern int defer_warn(int, const char *, const char *, const char *);
diff --git a/postfix/src/global/deliver_request.c b/postfix/src/global/deliver_request.c
index f8a1fc7f8..26c18ecf2 100644
--- a/postfix/src/global/deliver_request.c
+++ b/postfix/src/global/deliver_request.c
@@ -64,7 +64,8 @@
/* The \fIhop_status\fR structure member must be updated
/* by the caller when all delivery to the destination in
/* \fInexthop\fR should be deferred. The value of the
-/* \fIhop_status\fR member is the reason; it is passed
+/* \fIhop_status\fR member is the reason, with optional
+/* RFC 1893-style detail at the beginning; it is passed
/* to myfree().
/*
/* deliver_request_done() reports the delivery status back to the
diff --git a/postfix/src/global/dsn_util.c b/postfix/src/global/dsn_util.c
new file mode 100644
index 000000000..35bec1d61
--- /dev/null
+++ b/postfix/src/global/dsn_util.c
@@ -0,0 +1,240 @@
+/*++
+/* NAME
+/* dsn_util 3
+/* SUMMARY
+/* DSN support routines
+/* SYNOPSIS
+/* #include
+/*
+/* typedef struct {
+/* .in +4
+/* char dsn[...]; /* RFC 1893 */
+/* const char *text; /* Free text */
+/* .in -4
+/* } DSN_SPLIT;
+/*
+/* DSN_SPLIT *dsn_split(dp, def_dsn, text)
+/* DSN_SPLIT *dp;
+/* const char *def_dsn;
+/* const char *text;
+/*
+/* char *dsn_prepend(def_dsn, text)
+/* const char *def_dsn;
+/* const char *text;
+/*
+/* typedef struct {
+/* .in +4
+/* char dsn[...]; /* RFC 1893 */
+/* VSTRING *text; /* Free text */
+/* .in -4
+/* } DSN_VSTRING;
+/*
+/* DSN_VSTRING *dsn_vstring_alloc(len)
+/* int len;
+/*
+/* DSN_VSTRING *dsn_vstring_update(dv, dsn, format, ...)
+/* DSN_VSTRING *dv;
+/* const char *dsn;
+/* const char *format;
+/*
+/* void dsn_vstring_free(dv)
+/* DSN_VSTRING *dv;
+/*
+/* size_t dsn_valid(text)
+/* const char *text;
+/* DESCRIPTION
+/* The functions in this module manipulate pairs of RFC 1893
+/* X.X.X detail codes and descriptive free text.
+/*
+/* dsn_split() splits text into an RFC 1893 detail code and
+/* descriptive free text. When the text does not start with
+/* a detail code, the specified default detail code is used
+/* instead. Whitespace before the optional detail code or
+/* text is skipped. dsn_split() returns a copy of the RFC
+/* 1893 detail code, and returns a pointer to (not copy of)
+/* the remainder of the text. The result value is the first
+/* argument.
+/*
+/* dsn_prepend() prepends the specified default RFC 1893 detail
+/* code to the specified text if no detail code is present in
+/* the text. This function produces the same result as calling
+/* concatenate() with the results from dsn_split(). The result
+/* should be passed to myfree(). Whitespace before the optional
+/* detail code or text is skipped.
+/*
+/* dsn_vstring_alloc() creates initialized storage for an RFC
+/* 1893 detail code and descriptive free text.
+/*
+/* dsn_vstring_update() updates the detail code, the descriptive
+/* free text, or both. Specify a null pointer (or zero-length
+/* string) for information that should not be updated.
+/*
+/* dsn_vstring_free() recycles the storage that was allocated
+/* by dsn_vstring_alloc() and dsn_vstring_update().
+/*
+/* dsn_valid() returns the length of the RFC 1893 detail code
+/* at the beginning of text, or zero. It does not skip initial
+/* whitespace.
+/*
+/* Arguments:
+/* .IP def_dsn
+/* Null-terminated default RFC 1893 detail code that will be
+/* used when the free text does not start with one.
+/* .IP dp
+/* Pointer to storage for copy of DSN detail code, and for
+/* pointer to free text.
+/* .IP dsn
+/* Null-terminated RFC 1893 detail code.
+/* .IP text
+/* Null-terminated free text.
+/* .IP vp
+/* VSTRING buffer, or null pointer.
+/* SEE ALSO
+/* msg(3) diagnostics interface
+/* DIAGNOSTICS
+/* Panic: invalid default DSN code; invalid dsn_vstring_update()
+/* DSN argument.
+/* LICENSE
+/* .ad
+/* .fi
+/* The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/* Wietse Venema
+/* IBM T.J. Watson Research
+/* P.O. Box 704
+/* Yorktown Heights, NY 10598, USA
+/*--*/
+
+/* System library. */
+
+#include
+#include
+#include
+#include
+
+/* Utility library. */
+
+#include
+#include
+#include
+#include
+
+/* Global library. */
+
+#include
+
+/* dsn_valid - check RFC 1893 enhanced status code, return length or zero */
+
+size_t dsn_valid(const char *text)
+{
+ const unsigned char *cp = (unsigned char *) text;
+ int len;
+
+ /* First portion is one digit followed by dot. */
+ if ((cp[0] != '2' && cp[0] != '4' && cp[0] != '5') || cp[1] != '.')
+ return (0);
+
+ /* Second portion is 1-3 digits followed by dot. */
+ cp += 2;
+ if ((len = strspn((char *) cp, "0123456789")) < 1 || len > DSN_DIGS2
+ || cp[len] != '.')
+ return (0);
+
+ /* Last portion is 1-3 digits followed by end-of-string or whitespace. */
+ cp += len + 1;
+ if ((len = strspn((char *) cp, "0123456789")) < 1 || len > DSN_DIGS3
+ || (cp[len] != 0 && !ISSPACE(cp[len])))
+ return (0);
+
+ return (((char *) cp - text) + len);
+}
+
+/* dsn_split - split text into DSN and text */
+
+DSN_SPLIT *dsn_split(DSN_SPLIT *dp, const char *def_dsn, const char *text)
+{
+ const char *cp = text;
+ size_t len;
+
+ /*
+ * Look for an optional RFC 1893 enhanced status code.
+ *
+ * XXX If we want to enforce that the first digit of the status code in the
+ * text matches the default status code, then pipe_command() needs to be
+ * changed. It currently auto-detects the reply code without knowing in
+ * advance if the result will start with '4' or '5'.
+ */
+ while (ISSPACE(*cp))
+ cp++;
+ if ((len = dsn_valid(cp)) > 0) {
+ if (len >= sizeof(dp->dsn))
+ msg_panic("dsn_split: bad DSN code length %d", len);
+ DSN_BUF_UPDATE(dp->dsn, cp, len);
+ cp += len + 1;
+ } else {
+ len = strlen(def_dsn);
+ if (len >= sizeof(dp->dsn))
+ msg_panic("dsn_split: bad default DSN code length %d", len);
+ DSN_BUF_UPDATE(dp->dsn, def_dsn, len);
+ }
+
+ /*
+ * The remainder is free text.
+ */
+ while (ISSPACE(*cp))
+ cp++;
+ dp->text = cp;
+
+ return (dp);
+}
+
+/* dsn_prepend - prepend optional detail to text, result on heap */
+
+char *dsn_prepend(const char *def_dsn, const char *text)
+{
+ DSN_SPLIT dp;
+
+ dsn_split(&dp, def_dsn, text);
+ return (concatenate(dp.dsn, " ", dp.text, (char *) 0));
+}
+
+/* dsn_vstring_alloc - create DSN+string storage */
+
+DSN_VSTRING *dsn_vstring_alloc(int len)
+{
+ DSN_VSTRING *dv;
+
+ dv = (DSN_VSTRING *) mymalloc(sizeof(*dv));
+ dv->dsn[0] = 0;
+ dv->vstring = vstring_alloc(len);
+ return(dv);
+}
+
+/* dsn_vstring_free - destroy DSN+string storage */
+
+void dsn_vstring_free(DSN_VSTRING *dv)
+{
+ vstring_free(dv->vstring);
+ myfree((char *) dv);
+}
+
+/* dsn_vstring_update - update DSN and/or text */
+
+DSN_VSTRING *dsn_vstring_update(DSN_VSTRING *dv, const char *dsn,
+ const char *format,...)
+{
+ va_list ap;
+ size_t len;
+
+ if (dsn && *dsn) {
+ if ((len = dsn_valid(dsn)) == 0 || len >= sizeof(dv->dsn))
+ msg_panic("dsn_vstring_update: bad dsn: \"%s\"", dsn);
+ DSN_BUF_UPDATE(dv->dsn, dsn, len);
+ }
+ if (format && *format) {
+ va_start(ap, format);
+ vstring_vsprintf(dv->vstring, format, ap);
+ va_end(ap);
+ }
+ return (dv);
+}
diff --git a/postfix/src/global/dsn_util.h b/postfix/src/global/dsn_util.h
new file mode 100644
index 000000000..a9323533e
--- /dev/null
+++ b/postfix/src/global/dsn_util.h
@@ -0,0 +1,72 @@
+#ifndef _DSN_SPLIT_H_INCLUDED_
+#define _DSN_SPLIT_H_INCLUDED_
+
+/*++
+/* NAME
+/* dsn_util 3
+/* SUMMARY
+/* Extract DSN detail from text
+/* SYNOPSIS
+/* #include "dsn_split.h"
+/* DESCRIPTION
+/* .nf
+
+ /*
+ * Utility library.
+ */
+#include
+
+ /*
+ * Detail format is digit "." digit{1,3} "." digit{1,3}.
+ */
+#define DSN_DIGS1 1 /* leading digits */
+#define DSN_DIGS2 3 /* middle digits */
+#define DSN_DIGS3 3 /* trailing digits */
+#define DSN_LEN (DSN_DIGS1 + 1 + DSN_DIGS2 + 1 + DSN_DIGS3)
+#define DSN_BUFSIZE (DSN_LEN + 1)
+
+ /*
+ * Split flat text into detail code and free text.
+ */
+typedef struct {
+ char dsn[DSN_BUFSIZE]; /* RFC 1893 X.XXX.XXX detail */
+ const char *text; /* free text */
+} DSN_SPLIT;
+
+#define DSN_BUF_UPDATE(buf, text, len) do { \
+ strncpy((buf), (text), (len)); \
+ (buf)[len] = 0; \
+ } while (0)
+
+extern DSN_SPLIT *dsn_split(DSN_SPLIT *, const char *, const char *);
+extern size_t dsn_valid(const char *);
+
+ /*
+ * Create flat text from detail code and free text.
+ */
+extern char *dsn_prepend(const char *, const char *);
+
+ /*
+ * Easy to update pair of detail code and free text.
+ */
+typedef struct {
+ char dsn[DSN_LEN + 1]; /* RFC 1893 X.XXX.XXX detail */
+ VSTRING *vstring; /* free text */
+} DSN_VSTRING;
+
+extern DSN_VSTRING *dsn_vstring_alloc(int);
+extern DSN_VSTRING *dsn_vstring_update(DSN_VSTRING *, const char *, const char *,...);
+extern void dsn_vstring_free(DSN_VSTRING *);
+
+/* LICENSE
+/* .ad
+/* .fi
+/* The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/* Wietse Venema
+/* IBM T.J. Watson Research
+/* P.O. Box 704
+/* Yorktown Heights, NY 10598, USA
+/*--*/
+
+#endif
diff --git a/postfix/src/global/log_adhoc.c b/postfix/src/global/log_adhoc.c
index 03a3539f0..3f05d474e 100644
--- a/postfix/src/global/log_adhoc.c
+++ b/postfix/src/global/log_adhoc.c
@@ -7,21 +7,23 @@
/* #include
/*
/* void log_adhoc(id, orig_rcpt, recipient, relay,
-/* entry, status, format, ...)
+/* detail, entry, status, format, ...)
/* const char *id;
/* const char *orig_rcpt;
/* const char *recipient;
/* const char *relay;
+/* const char *detail;
/* time_t entry;
/* const char *status;
/* const char *format;
/*
/* void vlog_adhoc(id, orig_rcpt, recipient, relay,
-/* entry, status, format, ap)
+/* detail, entry, status, format, ap)
/* const char *id;
/* const char *orig_rcpt;
/* const char *recipient;
/* const char *relay;
+/* const char *detail;
/* time_t entry;
/* const char *status;
/* const char *format;
@@ -50,6 +52,8 @@
/* Host we could (not) talk to.
/* .IP status
/* bounced, deferred, sent, and so on.
+/* .IP detail
+/* X.YY.ZZ Error detail as specified in RFC 1893.
/* .IP entry
/* Message arrival time.
/* .IP format
@@ -94,13 +98,13 @@
void log_adhoc(const char *id, const char *orig_rcpt,
const char *recipient, const char *relay,
- time_t entry, const char *status,
- const char *fmt,...)
+ const char *detail, time_t entry,
+ const char *status, const char *fmt,...)
{
va_list ap;
va_start(ap, fmt);
- vlog_adhoc(id, orig_rcpt, recipient, relay, entry, status, fmt, ap);
+ vlog_adhoc(id, orig_rcpt, recipient, relay, detail, entry, status, fmt, ap);
va_end(ap);
}
@@ -108,7 +112,7 @@ void log_adhoc(const char *id, const char *orig_rcpt,
void vlog_adhoc(const char *id, const char *orig_rcpt,
const char *recipient, const char *relay,
- time_t entry, const char *status,
+ const char *detail, time_t entry, const char *status,
const char *fmt, va_list ap)
{
VSTRING *why = vstring_alloc(100);
@@ -116,10 +120,10 @@ void vlog_adhoc(const char *id, const char *orig_rcpt,
vstring_vsprintf(why, fmt, ap);
if (orig_rcpt && *orig_rcpt && strcasecmp(recipient, orig_rcpt) != 0)
- msg_info("%s: to=<%s>, orig_to=<%s>, relay=%s, delay=%d, status=%s (%s)",
- id, recipient, orig_rcpt, relay, delay, status, vstring_str(why));
+ msg_info("%s: to=<%s>, orig_to=<%s>, relay=%s, delay=%d, dsn=%s status=%s (%s)",
+ id, recipient, orig_rcpt, relay, delay, detail, status, vstring_str(why));
else
- msg_info("%s: to=<%s>, relay=%s, delay=%d, status=%s (%s)",
- id, recipient, relay, delay, status, vstring_str(why));
+ msg_info("%s: to=<%s>, relay=%s, delay=%d, dsn=%s status=%s (%s)",
+ id, recipient, relay, delay, detail, status, vstring_str(why));
vstring_free(why);
}
diff --git a/postfix/src/global/log_adhoc.h b/postfix/src/global/log_adhoc.h
index 7e3108cfb..561edd035 100644
--- a/postfix/src/global/log_adhoc.h
+++ b/postfix/src/global/log_adhoc.h
@@ -20,13 +20,13 @@
/*
* Client interface.
*/
-extern void PRINTFLIKE(7, 8) log_adhoc(const char *, const char *,
+extern void PRINTFLIKE(8, 9) log_adhoc(const char *, const char *,
const char *, const char *,
- time_t, const char *,
- const char *,...);
+ const char *, time_t,
+ const char *, const char *,...);
extern void vlog_adhoc(const char *, const char *,
const char *, const char *,
- time_t, const char *,
+ const char *, time_t, const char *,
const char *, va_list);
/* LICENSE
diff --git a/postfix/src/global/mail_copy.c b/postfix/src/global/mail_copy.c
index 07932828c..90423eca3 100644
--- a/postfix/src/global/mail_copy.c
+++ b/postfix/src/global/mail_copy.c
@@ -14,7 +14,7 @@
/* VSTREAM *dst;
/* int flags;
/* const char *eol;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/* DESCRIPTION
/* mail_copy() copies a mail message from record stream to stream-lf
/* stream, and attempts to detect all possible I/O errors.
@@ -62,7 +62,8 @@
/* .IP eol
/* Record delimiter, for example, LF or CF LF.
/* .IP why
-/* A null pointer, or storage for the reason of failure.
+/* A null pointer, or storage for the reason of failure in
+/* the form of a DSN detail code plus free text.
/* DIAGNOSTICS
/* A non-zero result means the operation failed. Warnings: corrupt
/* message file. A corrupt message is marked as corrupt.
@@ -114,6 +115,8 @@
#include "mark_corrupt.h"
#include "mail_params.h"
#include "mail_copy.h"
+#include "mbox_open.h"
+#include "dsn_util.h"
/* mail_copy - copy message with extreme prejudice */
@@ -121,7 +124,7 @@ int mail_copy(const char *sender,
const char *orig_rcpt,
const char *delivered,
VSTREAM *src, VSTREAM *dst,
- int flags, const char *eol, VSTRING *why)
+ int flags, const char *eol, DSN_VSTRING *why)
{
char *myname = "mail_copy";
VSTRING *buf;
@@ -255,10 +258,23 @@ int mail_copy(const char *sender,
ftruncate(vstream_fileno(dst), orig_length);
#endif
write_error |= vstream_fclose(dst);
+
+ /*
+ * Return the optional verbose error description.
+ */
+#define TRY_AGAIN_ERROR(errno) \
+ (errno == EAGAIN || errno == ESTALE)
+
if (why && read_error)
- vstring_sprintf(why, "error reading message: %m");
+ dsn_vstring_update(why, TRY_AGAIN_ERROR(errno) ? "4.3.0" : "5.3.0",
+ "error reading message: %m");
if (why && write_error)
- vstring_sprintf(why, "error writing message: %m");
+ dsn_vstring_update(why, mbox_dsn(errno), "error writing message: %m");
+
+ /*
+ * Use flag+errno description when the optional verbose description is
+ * not desired.
+ */
return ((corrupt_error ? MAIL_COPY_STAT_CORRUPT : 0)
| (read_error ? MAIL_COPY_STAT_READ : 0)
| (write_error ? MAIL_COPY_STAT_WRITE : 0));
diff --git a/postfix/src/global/mail_copy.h b/postfix/src/global/mail_copy.h
index bd7f1d58f..8aa7e3c62 100644
--- a/postfix/src/global/mail_copy.h
+++ b/postfix/src/global/mail_copy.h
@@ -17,12 +17,17 @@
#include
#include
+ /*
+ * Global library.
+ */
+#include
+
/*
* External interface.
*/
extern int mail_copy(const char *, const char *, const char *,
VSTREAM *, VSTREAM *,
- int, const char *, VSTRING *);
+ int, const char *, DSN_VSTRING *);
#define MAIL_COPY_QUOTE (1<<0) /* prepend > to From_ */
#define MAIL_COPY_TOFILE (1<<1) /* fsync, ftruncate() */
diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h
index ebce57eaa..6a5255cdb 100644
--- a/postfix/src/global/mail_params.h
+++ b/postfix/src/global/mail_params.h
@@ -1689,7 +1689,7 @@ extern int var_access_map_code;
extern char *var_rbl_reply_maps;
#define VAR_DEF_RBL_REPLY "default_rbl_reply"
-#define DEF_DEF_RBL_REPLY "$rbl_code Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}"
+#define DEF_DEF_RBL_REPLY "$rbl_code 5.7.1 Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}"
extern char *var_def_rbl_reply;
#define REJECT_MAPS_RBL "reject_maps_rbl" /* backwards compat */
diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h
index bb01bc1cd..f7fd1ccf2 100644
--- a/postfix/src/global/mail_version.h
+++ b/postfix/src/global/mail_version.h
@@ -20,7 +20,7 @@
* Patches change the patchlevel and the release date. Snapshots change the
* release date only.
*/
-#define MAIL_RELEASE_DATE "20050315"
+#define MAIL_RELEASE_DATE "20050327"
#define MAIL_VERSION_NUMBER "2.3"
#define VAR_MAIL_VERSION "mail_version"
diff --git a/postfix/src/global/mbox_open.c b/postfix/src/global/mbox_open.c
index d533dd86f..991f49ce9 100644
--- a/postfix/src/global/mbox_open.c
+++ b/postfix/src/global/mbox_open.c
@@ -8,8 +8,8 @@
/*
/* typedef struct {
/* .in +4
-/* /* public members... */
-/* VSTREAM *fp;
+/* /* public members... */
+/* VSTREAM *fp;
/* .in -4
/* } MBOX;
/*
@@ -21,10 +21,13 @@
/* uid_t user;
/* gid_t group;
/* int lock_style;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/*
/* void mbox_release(mbox)
/* MBOX *mbox;
+/*
+/* const char *mbox_dsn(err)
+/* int err;
/* DESCRIPTION
/* This module manages access to UNIX mailbox-style files.
/*
@@ -39,6 +42,9 @@
/*
/* mbox_release() releases the named mailbox. It is up to the
/* application to close the stream.
+/*
+/* mbox_dsn() translates an errno value to a mailbox related
+/* DSN detail code.
/* DIAGNOSTICS
/* mbox_open() returns a null pointer in case of problems, and
/* sets errno to EAGAIN if someone else has exclusive access.
@@ -60,6 +66,10 @@
#include
#include
+#ifndef EDQUOT
+#define EDQUOT EFBIG
+#endif
+
/* Utility library. */
#include
@@ -80,13 +90,12 @@
MBOX *mbox_open(const char *path, int flags, int mode, struct stat * st,
uid_t chown_uid, gid_t chown_gid,
- int lock_style, VSTRING *why)
+ int lock_style, DSN_VSTRING *why)
{
struct stat local_statbuf;
MBOX *mp;
int locked = 0;
VSTREAM *fp;
- int saved_errno;
/*
* Open or create the target file. In case of a privileged open, the
@@ -103,7 +112,8 @@ MBOX *mbox_open(const char *path, int flags, int mode, struct stat * st,
if (st == 0)
st = &local_statbuf;
if ((fp = safe_open(path, flags | O_NONBLOCK, mode, st,
- chown_uid, chown_gid, why)) == 0) {
+ chown_uid, chown_gid, why->vstring)) == 0) {
+ dsn_vstring_update(why, mbox_dsn(errno), "");
return (0);
}
close_on_exec(vstream_fileno(fp), CLOSE_ON_EXEC);
@@ -124,15 +134,16 @@ MBOX *mbox_open(const char *path, int flags, int mode, struct stat * st,
* an unprivileged user is not supposed to be able to do.
*/
if (S_ISREG(st->st_mode) && (lock_style & MBOX_DOT_LOCK)) {
- if (dot_lockfile(path, why) == 0) {
+ if (dot_lockfile(path, why->vstring) == 0) {
locked |= MBOX_DOT_LOCK;
} else if (errno == EEXIST) {
- errno = EAGAIN;
+ dsn_vstring_update(why, mbox_dsn(EAGAIN), "");
vstream_fclose(fp);
return (0);
} else if (lock_style & MBOX_DOT_LOCK_MAY_FAIL) {
- msg_warn("%s", vstring_str(why));
+ msg_warn("%s", vstring_str(why->vstring));
} else {
+ dsn_vstring_update(why, mbox_dsn(errno), "");
vstream_fclose(fp);
return (0);
}
@@ -145,18 +156,17 @@ MBOX *mbox_open(const char *path, int flags, int mode, struct stat * st,
* problems.
*/
#define HUNKY_DORY(lock_mask, myflock_style) ((lock_style & (lock_mask)) == 0 \
- || deliver_flock(vstream_fileno(fp), (myflock_style), why) == 0)
+ || deliver_flock(vstream_fileno(fp), (myflock_style), why->vstring) == 0)
if (S_ISREG(st->st_mode)) {
if (HUNKY_DORY(MBOX_FLOCK_LOCK, MYFLOCK_STYLE_FLOCK)
&& HUNKY_DORY(MBOX_FCNTL_LOCK, MYFLOCK_STYLE_FCNTL)) {
locked |= lock_style;
} else {
- saved_errno = errno;
+ dsn_vstring_update(why, mbox_dsn(errno), "");
if (locked & MBOX_DOT_LOCK)
dot_unlockfile(path);
vstream_fclose(fp);
- errno = saved_errno;
return (0);
}
}
@@ -185,3 +195,20 @@ void mbox_release(MBOX *mp)
myfree(mp->path);
myfree((char *) mp);
}
+
+/* mbox_dsn - map errno value to mailbox-related DSN detail */
+
+const char *mbox_dsn(int err)
+{
+#define TRY_AGAIN_ERROR(e) \
+ (e == EACCES || e == EAGAIN || e == ESTALE)
+#define SYSTEM_FULL_ERROR(e) \
+ (e == ENOSPC)
+#define MBOX_FULL_ERROR(e) \
+ (e == EDQUOT || e == EFBIG)
+
+ return (TRY_AGAIN_ERROR(err) ? "4.2.0" :
+ SYSTEM_FULL_ERROR(err) ? "4.3.0" :
+ MBOX_FULL_ERROR(err) ? "5.2.2" :
+ "5.2.0");
+}
diff --git a/postfix/src/global/mbox_open.h b/postfix/src/global/mbox_open.h
index 940f04b52..e904cd8c6 100644
--- a/postfix/src/global/mbox_open.h
+++ b/postfix/src/global/mbox_open.h
@@ -18,6 +18,11 @@
#include
#include
+ /*
+ * Global library.
+ */
+#include
+
/*
* External interface.
*/
@@ -26,8 +31,9 @@ typedef struct {
VSTREAM *fp; /* open stream or null */
int locked; /* what locks were set */
} MBOX;
-extern MBOX *mbox_open(const char *, int, int, struct stat *, uid_t, gid_t, int, VSTRING *);
+extern MBOX *mbox_open(const char *, int, int, struct stat *, uid_t, gid_t, int, DSN_VSTRING *);
extern void mbox_release(MBOX *);
+extern const char *mbox_dsn(int);
/* LICENSE
/* .ad
diff --git a/postfix/src/global/pipe_command.c b/postfix/src/global/pipe_command.c
index e091b6e77..1e2ee88c0 100644
--- a/postfix/src/global/pipe_command.c
+++ b/postfix/src/global/pipe_command.c
@@ -8,19 +8,26 @@
/*
/* int pipe_command(src, why, key, value, ...)
/* VSTREAM *src;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/* int key;
/* DESCRIPTION
/* pipe_command() runs a command with a message as standard
/* input. A limited amount of standard output and standard error
/* output is captured for diagnostics purposes.
/*
+/* If the command invokes exit() with a non-zero status,
+/* the delivery status is taken from an RFC 1893-style code
+/* at the beginning of command output. If that information is
+/* unavailable, the delivery status is taken from the command
+/* exit status as per .
+/*
/* Arguments:
/* .IP src
/* An open message queue file, positioned at the start of the actual
/* message content.
/* .IP why
-/* Storage for diagnostic information.
+/* Storage for diagnostic information in the form of a DSN
+/* detail code followed by free text.
/* .IP key
/* Specifies what value will follow. pipe_command() takes a list
/* of (key, value) arguments, terminated by PIPE_CMD_END. The
@@ -147,6 +154,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -343,7 +351,7 @@ static int pipe_command_wait_or_kill(pid_t pid, WAIT_STATUS_T *statusp, int sig,
/* pipe_command - execute command with extreme prejudice */
-int pipe_command(VSTREAM *src, VSTRING *why,...)
+int pipe_command(VSTREAM *src, DSN_VSTRING *why,...)
{
char *myname = "pipe_comand";
va_list ap;
@@ -360,6 +368,8 @@ int pipe_command(VSTREAM *src, VSTRING *why,...)
struct pipe_args args;
char **cpp;
ARGV *argv;
+ DSN_SPLIT dp;
+ SYS_EXITS_DETAIL *sp;
/*
* Process the variadic argument list. This also does sanity checks on
@@ -413,7 +423,7 @@ int pipe_command(VSTREAM *src, VSTRING *why,...)
*/
case -1:
msg_warn("fork: %m");
- vstring_sprintf(why, "Delivery failed: %m");
+ dsn_vstring_update(why, "4.3.0", "Delivery failed: %m");
return (PIPE_STAT_DEFER);
/*
@@ -506,7 +516,7 @@ int pipe_command(VSTREAM *src, VSTRING *why,...)
* stop reading input early, and that should not be considered an
* error condition.
*/
-#define DONT_CARE_WHY ((VSTRING *) 0)
+#define DONT_CARE_WHY ((DSN_VSTRING *) 0)
write_status = mail_copy(args.sender, args.orig_rcpt,
args.delivered, src,
@@ -541,9 +551,10 @@ int pipe_command(VSTREAM *src, VSTRING *why,...)
args.uid, args.gid) < 0)
msg_fatal("wait: %m");
if (pipe_command_timeout) {
- vstring_sprintf(why, "Command time limit exceeded: \"%s\"%s%s",
- args.command,
- log_len ? ". Command output: " : "", log_buf);
+ dsn_vstring_update(why, "5.3.0",
+ "Command time limit exceeded: \"%s\"%s%s",
+ args.command,
+ log_len ? ". Command output: " : "", log_buf);
return (PIPE_STAT_BOUNCE);
}
@@ -553,33 +564,50 @@ int pipe_command(VSTREAM *src, VSTRING *why,...)
*/
if (!NORMAL_EXIT_STATUS(wait_status)) {
if (WIFSIGNALED(wait_status)) {
- vstring_sprintf(why, "Command died with signal %d: \"%s\"%s%s",
- WTERMSIG(wait_status),
- args.command,
+ dsn_vstring_update(why, "5.3.0",
+ "Command died with signal %d: \"%s\"%s%s",
+ WTERMSIG(wait_status),
+ args.command,
log_len ? ". Command output: " : "", log_buf);
- return (PIPE_STAT_DEFER);
- } else if (SYS_EXITS_CODE(WEXITSTATUS(wait_status))) {
- vstring_sprintf(why, "%s%s%s",
- sys_exits_strerror(WEXITSTATUS(wait_status)),
+ return (PIPE_STAT_BOUNCE);
+ }
+ /* Use "D.S.N text" command output. */
+ else if (dsn_valid(log_buf) > 0) {
+ /* XXX Assumes dsn_split() does not require 5.x.x in log_buf */
+ dsn_split(&dp, "5.3.0", log_buf);
+ dsn_vstring_update(why, dp.dsn, "%s", dp.text);
+ return (dp.dsn[0] == '4' ?
+ PIPE_STAT_DEFER : PIPE_STAT_BOUNCE);
+ }
+ /* Use compatible exit status. */
+ else if (SYS_EXITS_CODE(WEXITSTATUS(wait_status))) {
+ sp = sys_exits_detail(WEXITSTATUS(wait_status));
+ dsn_vstring_update(why, sp->dsn, "%s%s", sp->text,
log_len ? ". Command output: " : "", log_buf);
- return (sys_exits_softerror(WEXITSTATUS(wait_status)) ?
+ return (sp->dsn[0] == '4' ?
PIPE_STAT_DEFER : PIPE_STAT_BOUNCE);
- } else {
- vstring_sprintf(why, "Command died with status %d: \"%s\"%s%s",
- WEXITSTATUS(wait_status),
- args.command,
+ }
+
+ /* No "D.S.N text" and no compatible exit status. */
+ else {
+ dsn_vstring_update(why, "5.3.0",
+ "Command died with status %d: \"%s\"%s%s",
+ WEXITSTATUS(wait_status), args.command,
log_len ? ". Command output: " : "", log_buf);
return (PIPE_STAT_BOUNCE);
}
- } else if (write_status & MAIL_COPY_STAT_CORRUPT) {
+ } else if (write_status &
+ MAIL_COPY_STAT_CORRUPT) {
return (PIPE_STAT_CORRUPT);
} else if (write_status && write_errno != EPIPE) {
errno = write_errno;
- vstring_sprintf(why, "Command failed due to %s: %m: \"%s\"",
+ dsn_vstring_update(why, "5.3.0",
+ "Command failed due to %s: %m: \"%s\"",
(write_status & MAIL_COPY_STAT_READ) ? "delivery read error" :
(write_status & MAIL_COPY_STAT_WRITE) ? "delivery write error" :
- "some delivery error", args.command);
- return (PIPE_STAT_DEFER);
+ "some delivery error",
+ args.command);
+ return (PIPE_STAT_BOUNCE);
} else {
return (PIPE_STAT_OK);
}
diff --git a/postfix/src/global/pipe_command.h b/postfix/src/global/pipe_command.h
index a500e8440..eade930d9 100644
--- a/postfix/src/global/pipe_command.h
+++ b/postfix/src/global/pipe_command.h
@@ -21,6 +21,7 @@
* Global library.
*/
#include
+#include
/*
* Request arguments.
@@ -49,7 +50,7 @@
#define PIPE_STAT_BOUNCE 2 /* failed */
#define PIPE_STAT_CORRUPT 3 /* corrupted file */
-extern int pipe_command(VSTREAM *, VSTRING *,...);
+extern int pipe_command(VSTREAM *, DSN_VSTRING *,...);
/* LICENSE
/* .ad
diff --git a/postfix/src/global/sent.c b/postfix/src/global/sent.c
index 4f845ed78..e3410dda9 100644
--- a/postfix/src/global/sent.c
+++ b/postfix/src/global/sent.c
@@ -7,24 +7,26 @@
/* #include
/*
/* int sent(flags, queue_id, orig_rcpt, recipient, offset, relay,
-/* entry, format, ...)
+/* dsn, entry, format, ...)
/* int flags;
/* const char *queue_id;
/* const char *orig_rcpt;
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/*
/* int vsent(flags, queue_id, orig_rcpt, recipient, offset, relay,
-/* entry, format, ap)
+/* dsn, entry, format, ap)
/* int flags;
/* const char *queue_id;
/* const char *orig_rcpt;
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/* va_list ap;
@@ -63,6 +65,8 @@
/* Queue file offset of the recipient record.
/* .IP relay
/* Name of the host we're talking to.
+/* .IP dsn
+/* X.YY.ZZ Error detail as specified in RFC 1893.
/* .IP entry
/* Message arrival time.
/* .IP format
@@ -110,6 +114,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -117,14 +122,14 @@
int sent(int flags, const char *id, const char *orig_rcpt,
const char *recipient, long offset, const char *relay,
- time_t entry, const char *fmt,...)
+ const char *dsn, time_t entry, const char *fmt,...)
{
va_list ap;
int status;
va_start(ap, fmt);
status = vsent(flags, id, orig_rcpt, recipient,
- offset, relay, entry, fmt, ap);
+ offset, relay, dsn, entry, fmt, ap);
va_end(ap);
return (status);
}
@@ -133,16 +138,25 @@ int sent(int flags, const char *id, const char *orig_rcpt,
int vsent(int flags, const char *id, const char *orig_rcpt,
const char *recipient, long offset, const char *relay,
- time_t entry, const char *fmt, va_list ap)
+ const char *dsn, time_t entry,
+ const char *fmt, va_list ap)
{
int status;
+ /*
+ * Sanity check.
+ */
+ if (*dsn != '2' || !dsn_valid(dsn)) {
+ msg_warn("sent: ignoring dsn code \"%s\"", dsn);
+ dsn = "2.0.0";
+ }
+
/*
* MTA-requested address verification information is stored in the verify
* service database.
*/
if (flags & DEL_REQ_FLAG_VERIFY) {
- status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+ status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
"deliverable", DEL_RCPT_STAT_OK, fmt, ap);
return (status);
}
@@ -153,7 +167,7 @@ int vsent(int flags, const char *id, const char *orig_rcpt,
*/
if (flags & DEL_REQ_FLAG_EXPAND) {
status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
- entry, "2.0.0", "deliverable", fmt, ap);
+ dsn, entry, "deliverable", fmt, ap);
return (status);
}
@@ -166,14 +180,15 @@ int vsent(int flags, const char *id, const char *orig_rcpt,
vstring_vsprintf(text, fmt, ap);
if ((flags & DEL_REQ_FLAG_RECORD) == 0
|| trace_append(flags, id, orig_rcpt, recipient, relay,
- entry, "2.0.0", "delivered",
+ dsn, entry, "delivered",
"%s", vstring_str(text)) == 0) {
- log_adhoc(id, orig_rcpt, recipient, relay,
+ log_adhoc(id, orig_rcpt, recipient, relay, dsn,
entry, "sent", "%s", vstring_str(text));
status = 0;
} else {
status = defer_append(flags, id, orig_rcpt, recipient, offset,
- relay, entry, "%s: %s service failed",
+ relay, dsn, entry,
+ "%s: %s service failed",
id, var_trace_service);
}
vstring_free(text);
diff --git a/postfix/src/global/sent.h b/postfix/src/global/sent.h
index d303449e6..67a3b5280 100644
--- a/postfix/src/global/sent.h
+++ b/postfix/src/global/sent.h
@@ -27,10 +27,12 @@
*/
#define SENT_FLAG_NONE (0)
-extern int PRINTFLIKE(8, 9) sent(int, const char *, const char *, const char *,
- long, const char *, time_t, const char *,...);
+extern int PRINTFLIKE(9, 10) sent(int, const char *, const char *, const char *,
+ long, const char *, const char *, time_t,
+ const char *,...);
extern int vsent(int, const char *, const char *, const char *, long,
- const char *, time_t, const char *, va_list);
+ const char *, const char *, time_t,
+ const char *, va_list);
/* LICENSE
/* .ad
diff --git a/postfix/src/global/sys_exits.c b/postfix/src/global/sys_exits.c
index ef7eb2ef5..cbb989ea7 100644
--- a/postfix/src/global/sys_exits.c
+++ b/postfix/src/global/sys_exits.c
@@ -6,17 +6,28 @@
/* SYNOPSIS
/* #include
/*
+/* typedef struct {
+/* .in +4
+/* int status; /* exit status */
+/* const char *dsn; /* RFC 1893 */
+/* const char *text; /* free text */
+/* .in -4
+/* } SYS_EXITS_DETAIL;
+/*
/* int SYS_EXITS_CODE(code)
/* int code;
/*
/* const char *sys_exits_strerror(code)
/* int code;
/*
+/* SYS_EXITS_DETAIL *sys_exits_detail(code)
+/* int code;
+/*
/* int sys_exits_softerror(code)
/* int code;
/* DESCRIPTION
/* This module interprets sendmail-compatible process exit status
-/* codes. A default result is returned for other exit codes.
+/* codes.
/*
/* SYS_EXITS_CODE() returns non-zero when the specified code
/* is a sendmail-compatible process exit status code.
@@ -24,6 +35,10 @@
/* sys_exits_strerror() returns a descriptive text for the
/* specified sendmail-compatible status code.
/*
+/* sys_exits_detail() returns a table entry with assorted
+/* information about the specified sendmail-compatible status
+/* code.
+/*
/* sys_exits_softerror() returns non-zero when the specified
/* sendmail-compatible status code corresponds to a recoverable error.
/* DIAGNOSTICS
@@ -53,28 +68,22 @@
/* Application-specific. */
-typedef struct {
- int flags; /* non-zero if recoverable */
- int code; /* exit status code */
- const char *text; /* descriptive text */
-} SYS_EXITS_TABLE;
-
-static SYS_EXITS_TABLE sys_exits_table[] = {
- 0, EX_USAGE, "command line usage error",
- 0, EX_DATAERR, "data format error",
- 0, EX_NOINPUT, "cannot open input",
- 0, EX_NOUSER, "user unknown",
- 0, EX_NOHOST, "host name unknown",
- 0, EX_UNAVAILABLE, "service unavailable",
- 0, EX_SOFTWARE, "internal software error",
- 1, EX_OSERR, "system resource problem",
- 0, EX_OSFILE, "critical OS file missing",
- 0, EX_CANTCREAT, "can't create user output file",
- 0, EX_IOERR, "input/output error",
- 1, EX_TEMPFAIL, "temporary failure",
- 0, EX_PROTOCOL, "remote error in protocol",
- 0, EX_NOPERM, "permission denied",
- 0, EX_CONFIG, "local configuration error",
+static SYS_EXITS_DETAIL sys_exits_table[] = {
+ EX_USAGE, "5.3.0", "command line usage error",
+ EX_DATAERR, "5.6.0", "data format error",
+ EX_NOINPUT, "5.3.0", "cannot open input",
+ EX_NOUSER, "5.1.1", "user unknown",
+ EX_NOHOST, "5.1.2", "host name unknown",
+ EX_UNAVAILABLE, "5.3.0", "service unavailable",
+ EX_SOFTWARE, "5.3.0", "internal software error",
+ EX_OSERR, "4.3.0", "system resource problem",
+ EX_OSFILE, "5.3.0", "critical OS file missing",
+ EX_CANTCREAT, "5.2.0", "can't create user output file",
+ EX_IOERR, "5.3.0", "input/output error",
+ EX_TEMPFAIL, "4.3.0", "temporary failure",
+ EX_PROTOCOL, "5.5.0", "remote error in protocol",
+ EX_NOPERM, "5.7.0", "permission denied",
+ EX_CONFIG, "5.3.5", "local configuration error",
};
/* sys_exits_strerror - map exit status to error string */
@@ -89,6 +98,18 @@ const char *sys_exits_strerror(int code)
return (sys_exits_table[code - EX__BASE].text);
}
+/* sys_exits_detail - map exit status info table entry */
+
+SYS_EXITS_DETAIL *sys_exits_detail(int code)
+{
+ char *myname = "sys_exits_detail";
+
+ if (!SYS_EXITS_CODE(code))
+ msg_panic("%s: bad code: %d", myname, code);
+
+ return (sys_exits_table + code - EX__BASE);
+}
+
/* sys_exits_softerror - determine if error is transient */
int sys_exits_softerror(int code)
@@ -98,5 +119,5 @@ int sys_exits_softerror(int code)
if (!SYS_EXITS_CODE(code))
msg_panic("%s: bad code: %d", myname, code);
- return (sys_exits_table[code - EX__BASE].flags);
+ return (sys_exits_table[code - EX__BASE].dsn[0] == '4');
}
diff --git a/postfix/src/global/sys_exits.h b/postfix/src/global/sys_exits.h
index 4b09cb3bb..ee3b8ba32 100644
--- a/postfix/src/global/sys_exits.h
+++ b/postfix/src/global/sys_exits.h
@@ -14,7 +14,14 @@
/*
* External interface.
*/
+typedef struct {
+ const int status; /* exit status code */
+ const char *dsn; /* DSN detail */
+ const char *text; /* descriptive text */
+} SYS_EXITS_DETAIL;
+
extern const char *sys_exits_strerror(int);
+extern SYS_EXITS_DETAIL *sys_exits_detail(int);
extern int sys_exits_softerror(int);
#define SYS_EXITS_CODE(n) ((n) >= EX__BASE && (n) <= EX__MAX)
diff --git a/postfix/src/global/trace.c b/postfix/src/global/trace.c
index cd9710c65..9f2e0df18 100644
--- a/postfix/src/global/trace.c
+++ b/postfix/src/global/trace.c
@@ -7,27 +7,27 @@
/* #include
/*
/* int trace_append(flags, queue_id, orig_rcpt, recipient, relay,
-/* entry, dsn_code, dsn_action, format, ...)
+/* dsn, entry, action, format, ...)
/* int flags;
/* const char *queue_id;
/* const char *orig_rcpt;
/* const char *recipient;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
-/* const char *dsn_code;
-/* const char *dsn_action;
+/* const char *action;
/* const char *format;
/*
/* int vtrace_append(flags, queue_id, orig_rcpt, recipient, relay,
-/* entry, dsn_code, dsn_action, format, ap)
+/* dsn, entry, action, format, ap)
/* int flags;
/* const char *queue_id;
/* const char *orig_rcpt;
/* const char *recipient;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
-/* const char *dsn_code;
-/* const char *dsn_action;
+/* const char *action;
/* const char *format;
/* va_list ap;
/*
@@ -69,9 +69,9 @@
/* The host we sent the mail to.
/* .IP entry
/* Message arrival time.
-/* .IP dsn_code
-/* three-digit dot-separated code.
-/* .IP dsn_action
+/* .IP dsn
+/* X.YY.ZZ Error detail as specified in RFC 1893.
+/* .IP action
/* "deliverable", "undeliverable", and so on.
/* .IP format
/* Optional additional information.
@@ -123,8 +123,8 @@
int trace_append(int flags, const char *queue_id,
const char *orig_rcpt, const char *recipient,
- const char *relay, time_t entry,
- const char *dsn_code, const char *dsn_action,
+ const char *relay, const char *dsn,
+ time_t entry, const char *action,
const char *fmt,...)
{
va_list ap;
@@ -132,7 +132,7 @@ int trace_append(int flags, const char *queue_id,
va_start(ap, fmt);
req_stat = vtrace_append(flags, queue_id, orig_rcpt, recipient,
- relay, entry, dsn_code, dsn_action, fmt, ap);
+ relay, dsn, entry, action, fmt, ap);
va_end(ap);
return (req_stat);
}
@@ -141,13 +141,18 @@ int trace_append(int flags, const char *queue_id,
int vtrace_append(int flags, const char *queue_id,
const char *orig_rcpt, const char *recipient,
- const char *relay, time_t entry,
- const char *dsn_code, const char *dsn_action,
+ const char *relay, const char *dsn,
+ time_t entry, const char *action,
const char *fmt, va_list ap)
{
VSTRING *why = vstring_alloc(100);
int req_stat;
+ /*
+ * XXX No DSN check. This routine is called from bounce/defer/sent, which
+ * already know what the DSN initial digit should look like.
+ */
+
/*
* User-requested address verification or verbose delivery. Mail the
* report to the requesting user.
@@ -164,16 +169,16 @@ int vtrace_append(int flags, const char *queue_id,
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, (long) 0,
- ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn_code,
- ATTR_TYPE_STR, MAIL_ATTR_ACTION, dsn_action,
+ ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn,
+ ATTR_TYPE_STR, MAIL_ATTR_ACTION, action,
ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
ATTR_TYPE_END) != 0) {
msg_warn("%s: %s service failure", queue_id, var_trace_service);
req_stat = -1;
} else {
if (flags & DEL_REQ_FLAG_EXPAND)
- log_adhoc(queue_id, orig_rcpt, recipient, relay,
- entry, dsn_action, "%s", vstring_str(why));
+ log_adhoc(queue_id, orig_rcpt, recipient, relay, dsn,
+ entry, action, "%s", vstring_str(why));
req_stat = 0;
}
vstring_free(why);
diff --git a/postfix/src/global/trace.h b/postfix/src/global/trace.h
index b024c3209..1afab0993 100644
--- a/postfix/src/global/trace.h
+++ b/postfix/src/global/trace.h
@@ -27,13 +27,13 @@
*/
extern int PRINTFLIKE(9, 10) trace_append(int, const char *,
const char *, const char *,
- const char *, time_t,
const char *, const char *,
+ time_t, const char *,
const char *,...);
extern int vtrace_append(int, const char *,
const char *, const char *,
- const char *, time_t,
const char *, const char *,
+ time_t, const char *,
const char *, va_list);
extern int trace_flush(int, const char *, const char *, const char *, const char *);
diff --git a/postfix/src/global/verify.c b/postfix/src/global/verify.c
index 623013be5..a6ceed1bf 100644
--- a/postfix/src/global/verify.c
+++ b/postfix/src/global/verify.c
@@ -7,25 +7,27 @@
/* #include
/*
/* int verify_append(queue_id, orig_rcpt, recipient,
-/* relay, entry, status,
+/* relay, dsn, entry, status,
/* recipient_status, format, ...)
/* const char *queue_id;
/* const char *orig_rcpt;
/* const char *recipient;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *status;
/* int recipient_status;
/* const char *format;
/*
/* int vverify_append(queue_id, orig_rcpt, recipient,
-/* relay, entry, status,
+/* relay, dsn, entry, status,
/* recipient_status, format, ap)
/* int recipient_status;
/* const char *queue_id;
/* const char *orig_rcpt;
/* const char *recipient;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *status;
/* int recipient_status;
@@ -51,6 +53,8 @@
/* The recipient address.
/* .IP relay
/* Name of the host we're talking to.
+/* .IP dsn
+/* X.YY.ZZ Error detail as specified in RFC 1893.
/* .IP entry
/* Message arrival time.
/* .IP status
@@ -113,16 +117,17 @@
/* verify_append - update address verification database */
int verify_append(const char *queue_id, const char *orig_rcpt,
- const char *recipient, const char *relay,
- time_t entry, const char *status,
- int rcpt_stat, const char *fmt,...)
+ const char *recipient, const char *relay,
+ const char *dsn, time_t entry,
+ const char *status, int rcpt_stat,
+ const char *fmt,...)
{
va_list ap;
int req_stat;
va_start(ap, fmt);
req_stat = vverify_append(queue_id, orig_rcpt, recipient, relay,
- entry, status, rcpt_stat, fmt, ap);
+ dsn, entry, status, rcpt_stat, fmt, ap);
va_end(ap);
return (req_stat);
}
@@ -130,17 +135,26 @@ int verify_append(const char *queue_id, const char *orig_rcpt,
/* vverify_append - update address verification database */
int vverify_append(const char *queue_id, const char *orig_rcpt,
- const char *recipient, const char *relay,
- time_t entry, const char *status,
- int rcpt_stat, const char *fmt, va_list ap)
+ const char *recipient, const char *relay,
+ const char *dsn, time_t entry,
+ const char *status, int rcpt_stat,
+ const char *fmt, va_list ap)
{
VSTRING *text = vstring_alloc(10);
int req_stat;
/*
* Impedance adaptor between bounce/defer/sent and verify_clnt.
+ *
+ * XXX No DSN check; this routine is called from bounce/defer/sent, which
+ * know what the DSN initial digit should look like.
+ *
+ * XXX rcpt_stat is competely redundant because of dsn.
*/
- vstring_vsprintf(text, fmt, ap);
+#if 0
+ vstring_sprintf(text, "%s ", dsn);
+#endif
+ vstring_vsprintf_append(text, fmt, ap);
if (var_verify_neg_cache || rcpt_stat == DEL_RCPT_STAT_OK) {
req_stat = verify_clnt_update(orig_rcpt, rcpt_stat,
"%s", vstring_str(text));
@@ -152,7 +166,7 @@ int vverify_append(const char *queue_id, const char *orig_rcpt,
req_stat = VRFY_STAT_OK;
}
if (req_stat == VRFY_STAT_OK) {
- log_adhoc(queue_id, orig_rcpt, recipient, relay,
+ log_adhoc(queue_id, orig_rcpt, recipient, relay, dsn,
entry, status, "%s", vstring_str(text));
req_stat = 0;
} else {
diff --git a/postfix/src/global/verify.h b/postfix/src/global/verify.h
index 1ecd4daa4..59d69dbbd 100644
--- a/postfix/src/global/verify.h
+++ b/postfix/src/global/verify.h
@@ -25,14 +25,15 @@
/*
* External interface.
*/
-extern int PRINTFLIKE(8, 9) verify_append(const char *, const char *,
+extern int PRINTFLIKE(9, 10) verify_append(const char *, const char *,
const char *, const char *,
- time_t, const char *,
- int, const char *,...);
+ const char *, time_t,
+ const char *, int,
+ const char *,...);
extern int vverify_append(const char *, const char *,
- const char *, const char *,
- time_t, const char *,
- int, const char *, va_list);
+ const char *, const char *,
+ const char *, time_t, const char *,
+ int, const char *, va_list);
/* LICENSE
/* .ad
diff --git a/postfix/src/lmtp/Makefile.in b/postfix/src/lmtp/Makefile.in
index 24aad7250..4208feb0d 100644
--- a/postfix/src/lmtp/Makefile.in
+++ b/postfix/src/lmtp/Makefile.in
@@ -52,203 +52,214 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-lmtp.o: lmtp.c
-lmtp.o: ../../include/sys_defs.h
-lmtp.o: ../../include/dict.h
-lmtp.o: ../../include/vstream.h
-lmtp.o: ../../include/vbuf.h
lmtp.o: ../../include/argv.h
+lmtp.o: ../../include/debug_peer.h
+lmtp.o: ../../include/deliver_request.h
+lmtp.o: ../../include/dict.h
+lmtp.o: ../../include/dsn_util.h
+lmtp.o: ../../include/flush_clnt.h
+lmtp.o: ../../include/mail_conf.h
+lmtp.o: ../../include/mail_error.h
+lmtp.o: ../../include/mail_params.h
+lmtp.o: ../../include/mail_queue.h
+lmtp.o: ../../include/mail_server.h
lmtp.o: ../../include/msg.h
lmtp.o: ../../include/mymalloc.h
lmtp.o: ../../include/name_mask.h
+lmtp.o: ../../include/recipient_list.h
lmtp.o: ../../include/split_at.h
-lmtp.o: ../../include/deliver_request.h
+lmtp.o: ../../include/sys_defs.h
+lmtp.o: ../../include/vbuf.h
+lmtp.o: ../../include/vstream.h
lmtp.o: ../../include/vstring.h
-lmtp.o: ../../include/recipient_list.h
-lmtp.o: ../../include/mail_queue.h
-lmtp.o: ../../include/mail_params.h
-lmtp.o: ../../include/mail_conf.h
-lmtp.o: ../../include/debug_peer.h
-lmtp.o: ../../include/mail_error.h
-lmtp.o: ../../include/flush_clnt.h
-lmtp.o: ../../include/mail_server.h
+lmtp.o: lmtp.c
lmtp.o: lmtp.h
lmtp.o: lmtp_sasl.h
-lmtp_addr.o: lmtp_addr.c
-lmtp_addr.o: ../../include/sys_defs.h
-lmtp_addr.o: ../../include/msg.h
-lmtp_addr.o: ../../include/vstring.h
-lmtp_addr.o: ../../include/vbuf.h
-lmtp_addr.o: ../../include/mymalloc.h
+lmtp_addr.o: ../../include/argv.h
+lmtp_addr.o: ../../include/deliver_request.h
+lmtp_addr.o: ../../include/dns.h
+lmtp_addr.o: ../../include/dsn_util.h
lmtp_addr.o: ../../include/inet_addr_list.h
-lmtp_addr.o: ../../include/myaddrinfo.h
-lmtp_addr.o: ../../include/stringops.h
-lmtp_addr.o: ../../include/sock_addr.h
lmtp_addr.o: ../../include/inet_proto.h
lmtp_addr.o: ../../include/mail_params.h
+lmtp_addr.o: ../../include/msg.h
+lmtp_addr.o: ../../include/myaddrinfo.h
+lmtp_addr.o: ../../include/mymalloc.h
lmtp_addr.o: ../../include/own_inet_addr.h
-lmtp_addr.o: ../../include/dns.h
-lmtp_addr.o: lmtp.h
-lmtp_addr.o: ../../include/vstream.h
-lmtp_addr.o: ../../include/argv.h
-lmtp_addr.o: ../../include/deliver_request.h
lmtp_addr.o: ../../include/recipient_list.h
+lmtp_addr.o: ../../include/sock_addr.h
+lmtp_addr.o: ../../include/stringops.h
+lmtp_addr.o: ../../include/sys_defs.h
+lmtp_addr.o: ../../include/vbuf.h
+lmtp_addr.o: ../../include/vstream.h
+lmtp_addr.o: ../../include/vstring.h
+lmtp_addr.o: lmtp.h
+lmtp_addr.o: lmtp_addr.c
lmtp_addr.o: lmtp_addr.h
-lmtp_chat.o: lmtp_chat.c
-lmtp_chat.o: ../../include/sys_defs.h
-lmtp_chat.o: ../../include/msg.h
-lmtp_chat.o: ../../include/vstring.h
-lmtp_chat.o: ../../include/vbuf.h
-lmtp_chat.o: ../../include/vstream.h
lmtp_chat.o: ../../include/argv.h
-lmtp_chat.o: ../../include/stringops.h
-lmtp_chat.o: ../../include/line_wrap.h
-lmtp_chat.o: ../../include/mymalloc.h
-lmtp_chat.o: ../../include/recipient_list.h
+lmtp_chat.o: ../../include/cleanup_user.h
lmtp_chat.o: ../../include/deliver_request.h
-lmtp_chat.o: ../../include/smtp_stream.h
-lmtp_chat.o: ../../include/mail_params.h
+lmtp_chat.o: ../../include/dsn_util.h
+lmtp_chat.o: ../../include/line_wrap.h
lmtp_chat.o: ../../include/mail_addr.h
-lmtp_chat.o: ../../include/post_mail.h
-lmtp_chat.o: ../../include/cleanup_user.h
lmtp_chat.o: ../../include/mail_error.h
+lmtp_chat.o: ../../include/mail_params.h
+lmtp_chat.o: ../../include/msg.h
+lmtp_chat.o: ../../include/mymalloc.h
lmtp_chat.o: ../../include/name_mask.h
+lmtp_chat.o: ../../include/post_mail.h
+lmtp_chat.o: ../../include/recipient_list.h
+lmtp_chat.o: ../../include/smtp_stream.h
+lmtp_chat.o: ../../include/stringops.h
+lmtp_chat.o: ../../include/sys_defs.h
+lmtp_chat.o: ../../include/vbuf.h
+lmtp_chat.o: ../../include/vstream.h
+lmtp_chat.o: ../../include/vstring.h
lmtp_chat.o: lmtp.h
-lmtp_connect.o: lmtp_connect.c
-lmtp_connect.o: ../../include/sys_defs.h
-lmtp_connect.o: ../../include/msg.h
-lmtp_connect.o: ../../include/vstream.h
-lmtp_connect.o: ../../include/vbuf.h
-lmtp_connect.o: ../../include/vstring.h
-lmtp_connect.o: ../../include/split_at.h
-lmtp_connect.o: ../../include/mymalloc.h
-lmtp_connect.o: ../../include/iostuff.h
-lmtp_connect.o: ../../include/timed_connect.h
-lmtp_connect.o: ../../include/stringops.h
+lmtp_chat.o: lmtp_chat.c
+lmtp_connect.o: ../../include/argv.h
+lmtp_connect.o: ../../include/attr.h
+lmtp_connect.o: ../../include/deliver_request.h
+lmtp_connect.o: ../../include/dns.h
+lmtp_connect.o: ../../include/dsn_util.h
lmtp_connect.o: ../../include/host_port.h
-lmtp_connect.o: ../../include/sane_connect.h
lmtp_connect.o: ../../include/inet_addr_list.h
-lmtp_connect.o: ../../include/myaddrinfo.h
-lmtp_connect.o: ../../include/sock_addr.h
+lmtp_connect.o: ../../include/iostuff.h
lmtp_connect.o: ../../include/mail_params.h
lmtp_connect.o: ../../include/mail_proto.h
-lmtp_connect.o: ../../include/attr.h
+lmtp_connect.o: ../../include/msg.h
+lmtp_connect.o: ../../include/myaddrinfo.h
+lmtp_connect.o: ../../include/mymalloc.h
lmtp_connect.o: ../../include/own_inet_addr.h
-lmtp_connect.o: ../../include/dns.h
-lmtp_connect.o: lmtp.h
-lmtp_connect.o: ../../include/argv.h
-lmtp_connect.o: ../../include/deliver_request.h
lmtp_connect.o: ../../include/recipient_list.h
+lmtp_connect.o: ../../include/sane_connect.h
+lmtp_connect.o: ../../include/sock_addr.h
+lmtp_connect.o: ../../include/split_at.h
+lmtp_connect.o: ../../include/stringops.h
+lmtp_connect.o: ../../include/sys_defs.h
+lmtp_connect.o: ../../include/timed_connect.h
+lmtp_connect.o: ../../include/vbuf.h
+lmtp_connect.o: ../../include/vstream.h
+lmtp_connect.o: ../../include/vstring.h
+lmtp_connect.o: lmtp.h
lmtp_connect.o: lmtp_addr.h
-lmtp_proto.o: lmtp_proto.c
-lmtp_proto.o: ../../include/sys_defs.h
+lmtp_connect.o: lmtp_connect.c
+lmtp_proto.o: ../../include/argv.h
+lmtp_proto.o: ../../include/attr.h
+lmtp_proto.o: ../../include/bounce.h
+lmtp_proto.o: ../../include/defer.h
+lmtp_proto.o: ../../include/deliver_completed.h
+lmtp_proto.o: ../../include/deliver_request.h
+lmtp_proto.o: ../../include/dsn_util.h
+lmtp_proto.o: ../../include/iostuff.h
+lmtp_proto.o: ../../include/mail_params.h
+lmtp_proto.o: ../../include/mail_proto.h
+lmtp_proto.o: ../../include/mail_queue.h
+lmtp_proto.o: ../../include/mark_corrupt.h
lmtp_proto.o: ../../include/msg.h
-lmtp_proto.o: ../../include/vstring.h
-lmtp_proto.o: ../../include/vbuf.h
-lmtp_proto.o: ../../include/vstream.h
-lmtp_proto.o: ../../include/vstring_vstream.h
-lmtp_proto.o: ../../include/stringops.h
lmtp_proto.o: ../../include/mymalloc.h
lmtp_proto.o: ../../include/name_code.h
-lmtp_proto.o: ../../include/mail_params.h
-lmtp_proto.o: ../../include/smtp_stream.h
-lmtp_proto.o: ../../include/mail_queue.h
-lmtp_proto.o: ../../include/recipient_list.h
-lmtp_proto.o: ../../include/deliver_request.h
-lmtp_proto.o: ../../include/deliver_completed.h
-lmtp_proto.o: ../../include/defer.h
-lmtp_proto.o: ../../include/bounce.h
-lmtp_proto.o: ../../include/sent.h
-lmtp_proto.o: ../../include/record.h
-lmtp_proto.o: ../../include/rec_type.h
lmtp_proto.o: ../../include/off_cvt.h
-lmtp_proto.o: ../../include/mark_corrupt.h
lmtp_proto.o: ../../include/quote_821_local.h
lmtp_proto.o: ../../include/quote_flags.h
-lmtp_proto.o: ../../include/mail_proto.h
-lmtp_proto.o: ../../include/iostuff.h
-lmtp_proto.o: ../../include/attr.h
+lmtp_proto.o: ../../include/rec_type.h
+lmtp_proto.o: ../../include/recipient_list.h
+lmtp_proto.o: ../../include/record.h
+lmtp_proto.o: ../../include/sent.h
+lmtp_proto.o: ../../include/smtp_stream.h
+lmtp_proto.o: ../../include/stringops.h
+lmtp_proto.o: ../../include/sys_defs.h
+lmtp_proto.o: ../../include/vbuf.h
+lmtp_proto.o: ../../include/vstream.h
+lmtp_proto.o: ../../include/vstring.h
+lmtp_proto.o: ../../include/vstring_vstream.h
lmtp_proto.o: lmtp.h
-lmtp_proto.o: ../../include/argv.h
+lmtp_proto.o: lmtp_proto.c
lmtp_proto.o: lmtp_sasl.h
-lmtp_sasl_glue.o: lmtp_sasl_glue.c
-lmtp_sasl_glue.o: ../../include/sys_defs.h
+lmtp_sasl_glue.o: ../../include/argv.h
+lmtp_sasl_glue.o: ../../include/deliver_request.h
+lmtp_sasl_glue.o: ../../include/dict.h
+lmtp_sasl_glue.o: ../../include/dsn_util.h
+lmtp_sasl_glue.o: ../../include/mail_params.h
+lmtp_sasl_glue.o: ../../include/maps.h
+lmtp_sasl_glue.o: ../../include/match_list.h
+lmtp_sasl_glue.o: ../../include/match_ops.h
lmtp_sasl_glue.o: ../../include/msg.h
lmtp_sasl_glue.o: ../../include/mymalloc.h
-lmtp_sasl_glue.o: ../../include/stringops.h
-lmtp_sasl_glue.o: ../../include/vstring.h
-lmtp_sasl_glue.o: ../../include/vbuf.h
-lmtp_sasl_glue.o: ../../include/split_at.h
lmtp_sasl_glue.o: ../../include/name_mask.h
-lmtp_sasl_glue.o: ../../include/mail_params.h
+lmtp_sasl_glue.o: ../../include/recipient_list.h
+lmtp_sasl_glue.o: ../../include/split_at.h
lmtp_sasl_glue.o: ../../include/string_list.h
-lmtp_sasl_glue.o: ../../include/match_list.h
-lmtp_sasl_glue.o: ../../include/match_ops.h
-lmtp_sasl_glue.o: ../../include/maps.h
-lmtp_sasl_glue.o: ../../include/dict.h
+lmtp_sasl_glue.o: ../../include/stringops.h
+lmtp_sasl_glue.o: ../../include/sys_defs.h
+lmtp_sasl_glue.o: ../../include/vbuf.h
lmtp_sasl_glue.o: ../../include/vstream.h
-lmtp_sasl_glue.o: ../../include/argv.h
+lmtp_sasl_glue.o: ../../include/vstring.h
lmtp_sasl_glue.o: lmtp.h
-lmtp_sasl_glue.o: ../../include/deliver_request.h
-lmtp_sasl_glue.o: ../../include/recipient_list.h
lmtp_sasl_glue.o: lmtp_sasl.h
-lmtp_sasl_proto.o: lmtp_sasl_proto.c
-lmtp_sasl_proto.o: ../../include/sys_defs.h
+lmtp_sasl_glue.o: lmtp_sasl_glue.c
+lmtp_sasl_proto.o: ../../include/argv.h
+lmtp_sasl_proto.o: ../../include/deliver_request.h
+lmtp_sasl_proto.o: ../../include/dsn_util.h
+lmtp_sasl_proto.o: ../../include/mail_params.h
lmtp_sasl_proto.o: ../../include/msg.h
lmtp_sasl_proto.o: ../../include/mymalloc.h
-lmtp_sasl_proto.o: ../../include/mail_params.h
-lmtp_sasl_proto.o: lmtp.h
-lmtp_sasl_proto.o: ../../include/vstream.h
+lmtp_sasl_proto.o: ../../include/recipient_list.h
+lmtp_sasl_proto.o: ../../include/sys_defs.h
lmtp_sasl_proto.o: ../../include/vbuf.h
+lmtp_sasl_proto.o: ../../include/vstream.h
lmtp_sasl_proto.o: ../../include/vstring.h
-lmtp_sasl_proto.o: ../../include/argv.h
-lmtp_sasl_proto.o: ../../include/deliver_request.h
-lmtp_sasl_proto.o: ../../include/recipient_list.h
+lmtp_sasl_proto.o: lmtp.h
lmtp_sasl_proto.o: lmtp_sasl.h
-lmtp_session.o: lmtp_session.c
-lmtp_session.o: ../../include/sys_defs.h
+lmtp_sasl_proto.o: lmtp_sasl_proto.c
+lmtp_session.o: ../../include/argv.h
+lmtp_session.o: ../../include/debug_peer.h
+lmtp_session.o: ../../include/deliver_request.h
+lmtp_session.o: ../../include/dsn_util.h
lmtp_session.o: ../../include/mymalloc.h
-lmtp_session.o: ../../include/vstream.h
-lmtp_session.o: ../../include/vbuf.h
+lmtp_session.o: ../../include/recipient_list.h
lmtp_session.o: ../../include/stringops.h
+lmtp_session.o: ../../include/sys_defs.h
+lmtp_session.o: ../../include/vbuf.h
+lmtp_session.o: ../../include/vstream.h
lmtp_session.o: ../../include/vstring.h
-lmtp_session.o: ../../include/debug_peer.h
lmtp_session.o: lmtp.h
-lmtp_session.o: ../../include/argv.h
-lmtp_session.o: ../../include/deliver_request.h
-lmtp_session.o: ../../include/recipient_list.h
-lmtp_state.o: lmtp_state.c
-lmtp_state.o: ../../include/sys_defs.h
+lmtp_session.o: lmtp_session.c
+lmtp_state.o: ../../include/argv.h
+lmtp_state.o: ../../include/deliver_request.h
+lmtp_state.o: ../../include/dsn_util.h
+lmtp_state.o: ../../include/mail_conf.h
lmtp_state.o: ../../include/mymalloc.h
-lmtp_state.o: ../../include/vstring.h
+lmtp_state.o: ../../include/recipient_list.h
+lmtp_state.o: ../../include/sys_defs.h
lmtp_state.o: ../../include/vbuf.h
lmtp_state.o: ../../include/vstream.h
-lmtp_state.o: ../../include/mail_conf.h
+lmtp_state.o: ../../include/vstring.h
lmtp_state.o: lmtp.h
-lmtp_state.o: ../../include/argv.h
-lmtp_state.o: ../../include/deliver_request.h
-lmtp_state.o: ../../include/recipient_list.h
lmtp_state.o: lmtp_sasl.h
-lmtp_trouble.o: lmtp_trouble.c
-lmtp_trouble.o: ../../include/sys_defs.h
-lmtp_trouble.o: ../../include/msg.h
-lmtp_trouble.o: ../../include/vstring.h
-lmtp_trouble.o: ../../include/vbuf.h
-lmtp_trouble.o: ../../include/stringops.h
-lmtp_trouble.o: ../../include/mymalloc.h
-lmtp_trouble.o: ../../include/smtp_stream.h
-lmtp_trouble.o: ../../include/vstream.h
-lmtp_trouble.o: ../../include/deliver_request.h
-lmtp_trouble.o: ../../include/recipient_list.h
-lmtp_trouble.o: ../../include/deliver_completed.h
+lmtp_state.o: lmtp_state.c
+lmtp_trouble.o: ../../include/argv.h
lmtp_trouble.o: ../../include/bounce.h
lmtp_trouble.o: ../../include/defer.h
+lmtp_trouble.o: ../../include/deliver_completed.h
+lmtp_trouble.o: ../../include/deliver_request.h
+lmtp_trouble.o: ../../include/dsn_util.h
lmtp_trouble.o: ../../include/mail_error.h
+lmtp_trouble.o: ../../include/msg.h
+lmtp_trouble.o: ../../include/mymalloc.h
lmtp_trouble.o: ../../include/name_mask.h
+lmtp_trouble.o: ../../include/recipient_list.h
+lmtp_trouble.o: ../../include/smtp_stream.h
+lmtp_trouble.o: ../../include/stringops.h
+lmtp_trouble.o: ../../include/sys_defs.h
+lmtp_trouble.o: ../../include/vbuf.h
+lmtp_trouble.o: ../../include/vstream.h
+lmtp_trouble.o: ../../include/vstring.h
lmtp_trouble.o: lmtp.h
-lmtp_trouble.o: ../../include/argv.h
+lmtp_trouble.o: lmtp_trouble.c
diff --git a/postfix/src/lmtp/lmtp.c b/postfix/src/lmtp/lmtp.c
index e9078e551..6b9206de6 100644
--- a/postfix/src/lmtp/lmtp.c
+++ b/postfix/src/lmtp/lmtp.c
@@ -50,6 +50,7 @@
/* RFC 1652 (8bit-MIME transport)
/* RFC 1870 (Message Size Declaration)
/* RFC 2033 (LMTP protocol)
+/* RFC 2034 (Enhanced Error Codes)
/* RFC 2554 (AUTH command)
/* RFC 2821 (SMTP protocol)
/* RFC 2920 (SMTP Pipelining)
@@ -261,6 +262,7 @@
#include
#include
#include
+#include
/* Single server skeleton. */
@@ -311,7 +313,7 @@ static LMTP_STATE *state = 0;
static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
{
char *myname = "deliver_message";
- VSTRING *why;
+ DSN_VSTRING *why;
int result;
if (msg_verbose)
@@ -334,7 +336,7 @@ static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
* performed in the MAIL_SERVER_POST_INIT function (post_init).
*
*/
- why = vstring_alloc(100);
+ why = dsn_vstring_alloc(100);
state->request = request;
state->src = request->fp;
@@ -397,8 +399,15 @@ static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
* Bounce or defer the recipients if no connection can be made.
*/
if ((state->session = lmtp_connect(request->nexthop, why)) == 0) {
- lmtp_site_fail(state, lmtp_errno == LMTP_RETRY ? 450 : 550,
- "%s", vstring_str(why));
+ if (lmtp_errno == LMTP_RETRY) {
+ why->dsn[0] = '4';
+ lmtp_site_fail(state, why->dsn, 450,
+ "%s", vstring_str(why->vstring));
+ } else {
+ why->dsn[0] = '5';
+ lmtp_site_fail(state, why->dsn, 550,
+ "%s", vstring_str(why->vstring));
+ }
}
/*
@@ -448,7 +457,7 @@ static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
/*
* Clean up.
*/
- vstring_free(why);
+ dsn_vstring_free(why);
result = state->status;
lmtp_chat_reset(state);
diff --git a/postfix/src/lmtp/lmtp.h b/postfix/src/lmtp/lmtp.h
index 2c30226c4..560a712c7 100644
--- a/postfix/src/lmtp/lmtp.h
+++ b/postfix/src/lmtp/lmtp.h
@@ -27,6 +27,7 @@
* Global library.
*/
#include
+#include
/*
* State information associated with each LMTP delivery. We're bundling the
@@ -89,7 +90,7 @@ extern LMTP_SESSION *lmtp_session_free(LMTP_SESSION *);
/*
* lmtp_connect.c
*/
-extern LMTP_SESSION *lmtp_connect(const char *, VSTRING *);
+extern LMTP_SESSION *lmtp_connect(const char *, DSN_VSTRING *);
/*
* lmtp_proto.c
@@ -104,6 +105,7 @@ extern int lmtp_rset(LMTP_STATE *);
*/
typedef struct LMTP_RESP { /* server response */
int code; /* status */
+ char dsn[DSN_BUFSIZE]; /* DSN detail */
char *str; /* text */
VSTRING *buf; /* origin of text */
} LMTP_RESP;
@@ -116,11 +118,13 @@ extern void lmtp_chat_notify(LMTP_STATE *);
/*
* lmtp_trouble.c
*/
-extern int PRINTFLIKE(3, 4) lmtp_conn_fail(LMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) lmtp_site_fail(LMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) lmtp_mesg_fail(LMTP_STATE *, int, char *,...);
-extern void PRINTFLIKE(4, 5) lmtp_rcpt_fail(LMTP_STATE *, int, RECIPIENT *, char *,...);
-extern int lmtp_stream_except(LMTP_STATE *, int, char *);
+extern int PRINTFLIKE(4, 5) lmtp_site_fail(LMTP_STATE *, const char *, int,
+ const char *,...);
+extern int PRINTFLIKE(4, 5) lmtp_mesg_fail(LMTP_STATE *, const char *, int,
+ const char *,...);
+extern void PRINTFLIKE(5, 6) lmtp_rcpt_fail(LMTP_STATE *, const char *, int,
+ RECIPIENT *, const char *,...);
+extern int lmtp_stream_except(LMTP_STATE *, int, const char *);
/*
* lmtp_state.c
diff --git a/postfix/src/lmtp/lmtp_addr.c b/postfix/src/lmtp/lmtp_addr.c
index 1710f787d..af44ebb8f 100644
--- a/postfix/src/lmtp/lmtp_addr.c
+++ b/postfix/src/lmtp/lmtp_addr.c
@@ -8,7 +8,7 @@
/*
/* DNS_RR *lmtp_host_addr(name, why)
/* char *name;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/* DESCRIPTION
/* This module implements Internet address lookups. By default,
/* lookups are done via the Internet domain name service (DNS).
@@ -31,7 +31,7 @@
/* .IP LMTP_FAIL
/* The request attempt failed due to a hard error.
/* .PP
-/* In addition, a textual description of the problem is made available
+/* In addition, a description of the problem is made available
/* via the \fIwhy\fR argument.
/* LICENSE
/* .ad
@@ -82,6 +82,7 @@
#include
#include
+#include
/* DNS library. */
@@ -114,7 +115,8 @@ static void lmtp_print_addr(char *what, DNS_RR *addr_list)
/* lmtp_addr_one - address lookup for one host name */
-static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRING *why)
+static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref,
+ DSN_VSTRING *why)
{
char *myname = "lmtp_addr_one";
DNS_RR *addr = 0;
@@ -132,7 +134,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
* Interpret a numerical name as an address.
*/
if (hostaddr_to_sockaddr(host, (char *) 0, 0, &res0) == 0
- && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
+ && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
if ((addr = dns_sa_to_rr(host, pref, res0->ai_addr)) == 0)
msg_fatal("host %s: conversion error for address family %d: %m",
host, ((struct sockaddr *) (res0->ai_addr))->sa_family);
@@ -146,10 +148,19 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
*/
#define RETRY_AI_ERROR(e) \
((e) == EAI_AGAIN || (e) == EAI_MEMORY || (e) == EAI_SYSTEM)
+#ifdef EAI_NODATA
+#define DSN_NOHOST(e) \
+ ((e) == EAI_AGAIN || (e) == EAI_NODATA || (e) == EAI_NONAME)
+#else
+#define DSN_NOHOST(e) \
+ ((e) == EAI_AGAIN || (e) == EAI_NONAME)
+#endif
if (var_disable_dns) {
if ((aierr = hostname_to_sockaddr(host, (char *) 0, 0, &res0)) != 0) {
- vstring_sprintf(why, "%s: %s", host, MAI_STRERROR(aierr));
+ dsn_vstring_update(why, DSN_NOHOST(aierr) ? "4.4.4" : "4.3.0",
+ "unable to look up host %s: %s",
+ host, MAI_STRERROR(aierr));
lmtp_errno = (RETRY_AI_ERROR(aierr) ? LMTP_RETRY : LMTP_FAIL);
} else {
for (found = 0, res = res0; res != 0; res = res->ai_next) {
@@ -166,7 +177,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
}
freeaddrinfo(res0);
if (found == 0) {
- vstring_sprintf(why, "%s: host not found", host);
+ dsn_vstring_update(why, "5.4.4", "%s: host not found", host);
lmtp_errno = LMTP_FAIL;
}
return (addr_list);
@@ -176,7 +187,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
/*
* Append the addresses for this host to the address list.
*/
- switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0, why,
+ switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0, why->vstring,
DNS_REQ_FLAG_ALL, proto_info->dns_atype_list)) {
case DNS_OK:
for (rr = addr; rr; rr = rr->next)
@@ -184,10 +195,15 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
addr_list = dns_rr_append(addr_list, addr);
break;
default:
+ dsn_vstring_update(why, "4.4.3", "");
lmtp_errno = LMTP_RETRY;
break;
- case DNS_NOTFOUND:
case DNS_FAIL:
+ dsn_vstring_update(why, "4.4.3", "");
+ lmtp_errno = LMTP_FAIL;
+ break;
+ case DNS_NOTFOUND:
+ dsn_vstring_update(why, "4.4.4", "");
lmtp_errno = LMTP_FAIL;
break;
}
@@ -196,7 +212,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
/* lmtp_host_addr - direct host lookup */
-DNS_RR *lmtp_host_addr(char *host, VSTRING *why)
+DNS_RR *lmtp_host_addr(char *host, DSN_VSTRING *why)
{
DNS_RR *addr_list;
diff --git a/postfix/src/lmtp/lmtp_addr.h b/postfix/src/lmtp/lmtp_addr.h
index 579b7f034..92d1c2ee6 100644
--- a/postfix/src/lmtp/lmtp_addr.h
+++ b/postfix/src/lmtp/lmtp_addr.h
@@ -8,6 +8,11 @@
/* DESCRIPTION
/* .nf
+ /*
+ * Global library.
+ */
+#include
+
/*
* DNS library.
*/
@@ -16,7 +21,7 @@
/*
* Internal interfaces.
*/
-extern DNS_RR *lmtp_host_addr(char *, VSTRING *);
+extern DNS_RR *lmtp_host_addr(char *, DSN_VSTRING *);
/* LICENSE
/* .ad
diff --git a/postfix/src/lmtp/lmtp_chat.c b/postfix/src/lmtp/lmtp_chat.c
index 43379a753..a5c1f5d8c 100644
--- a/postfix/src/lmtp/lmtp_chat.c
+++ b/postfix/src/lmtp/lmtp_chat.c
@@ -9,6 +9,7 @@
/* typedef struct {
/* .in +4
/* int code;
+/* char dsn[...];
/* char *str;
/* VSTRING *buf;
/* .in -4
@@ -85,6 +86,7 @@
#include
#include
#include
+#include
/* Utility library. */
@@ -105,6 +107,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -175,6 +178,8 @@ LMTP_RESP *lmtp_chat_resp(LMTP_STATE *state)
static LMTP_RESP rdata;
char *cp;
int last_char;
+ int three_digs = 0;
+ size_t len;
/*
* Initialize the response data buffer.
@@ -215,7 +220,7 @@ LMTP_RESP *lmtp_chat_resp(LMTP_STATE *state)
*/
for (cp = STR(state->buffer); *cp && ISDIGIT(*cp); cp++)
/* void */ ;
- if (cp - STR(state->buffer) == 3) {
+ if ((three_digs = (cp - STR(state->buffer) == 3)) != 0) {
if (*cp == '-')
continue;
if (*cp == ' ' || *cp == 0)
@@ -223,7 +228,25 @@ LMTP_RESP *lmtp_chat_resp(LMTP_STATE *state)
}
state->error_mask |= MAIL_ERROR_PROTOCOL;
}
- rdata.code = atoi(STR(state->buffer));
+
+ /*
+ * Extract RFC 821 reply code and RFC 2034 detail code. Use a default
+ * detail code if none was given.
+ */
+ rdata.dsn[0] = 0;
+ if (three_digs != 0) {
+ rdata.code = atoi(STR(state->buffer));
+ for (cp = STR(state->buffer) + 4; *cp == ' '; cp++)
+ /* void */ ;
+ if ((len = dsn_valid(cp)) > 0 && len < sizeof(rdata.dsn)) {
+ DSN_BUF_UPDATE(rdata.dsn, cp, len);
+ } else if (strchr("245", STR(state->buffer)[0]) != 0) {
+ DSN_BUF_UPDATE(rdata.dsn, "0.0.0", sizeof("0.0.0") - 1);
+ rdata.dsn[0] = STR(state->buffer)[0];
+ }
+ } else {
+ rdata.code = 0;
+ }
VSTRING_TERMINATE(rdata.buf);
rdata.str = STR(rdata.buf);
return (&rdata);
diff --git a/postfix/src/lmtp/lmtp_connect.c b/postfix/src/lmtp/lmtp_connect.c
index e00a15114..b06ff2b1f 100644
--- a/postfix/src/lmtp/lmtp_connect.c
+++ b/postfix/src/lmtp/lmtp_connect.c
@@ -8,7 +8,7 @@
/*
/* LMTP_SESSION *lmtp_connect(destination, why)
/* char *destination;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/* DESCRIPTION
/* This module implements LMTP connection management.
/*
@@ -37,7 +37,7 @@
/* .IP LMTP_FAIL
/* The connection attempt failed.
/* .PP
-/* In addition, a textual description of the error is made available
+/* In addition, a description of the error is made available
/* via the \fIwhy\fR argument.
/* SEE ALSO
/* lmtp_proto(3) LMTP client protocol
@@ -107,7 +107,7 @@
/* DNS library. */
#include
-
+
/* Application-specific. */
#include "lmtp.h"
@@ -118,12 +118,12 @@
*/
static LMTP_SESSION *lmtp_connect_sock(int, struct sockaddr *, int,
const char *, const char *,
- const char *, VSTRING *);
+ const char *, DSN_VSTRING *);
/* lmtp_connect_unix - connect to UNIX-domain address */
static LMTP_SESSION *lmtp_connect_unix(const char *addr,
- const char *destination, VSTRING *why)
+ const char *destination, DSN_VSTRING *why)
{
#undef sun
char *myname = "lmtp_connect_unix";
@@ -136,6 +136,7 @@ static LMTP_SESSION *lmtp_connect_unix(const char *addr,
*/
if (len >= (int) sizeof(sun.sun_path)) {
msg_warn("unix-domain name too long: %s", addr);
+ dsn_vstring_update(why, "4.3.5", "Server configuration error");
lmtp_errno = LMTP_RETRY;
return (0);
}
@@ -169,7 +170,7 @@ static LMTP_SESSION *lmtp_connect_unix(const char *addr,
/* lmtp_connect_addr - connect to explicit address */
static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
- const char *destination, VSTRING *why)
+ const char *destination, DSN_VSTRING *why)
{
char *myname = "lmtp_connect_addr";
struct sockaddr_storage ss;
@@ -184,6 +185,7 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
if (dns_rr_to_sa(addr, port, sa, &salen) != 0) {
msg_warn("%s: skip address type %s: %m",
myname, dns_strtype(addr->type));
+ dsn_vstring_update(why, "4.3.0", "network address conversion failed");
lmtp_errno = LMTP_RETRY;
return (0);
}
@@ -210,7 +212,8 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
const char *name, const char *addr,
- const char *destination, VSTRING *why)
+ const char *destination,
+ DSN_VSTRING *why)
{
int conn_stat;
int saved_errno;
@@ -227,8 +230,8 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
conn_stat = sane_connect(sock, sa, len);
}
if (conn_stat < 0) {
- vstring_sprintf(why, "connect to %s[%s]: %m",
- name, addr);
+ dsn_vstring_update(why, "4.4.1", "connect to %s[%s]: %m",
+ name, addr);
lmtp_errno = LMTP_RETRY;
close(sock);
return (0);
@@ -238,8 +241,8 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
* Skip this host if it takes no action within some time limit.
*/
if (read_wait(sock, var_lmtp_lhlo_tmout) < 0) {
- vstring_sprintf(why, "connect to %s[%s]: read timeout",
- name, addr);
+ dsn_vstring_update(why, "4.4.2", "connect to %s[%s]: read timeout",
+ name, addr);
lmtp_errno = LMTP_RETRY;
close(sock);
return (0);
@@ -250,8 +253,9 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
*/
stream = vstream_fdopen(sock, O_RDWR);
if ((ch = VSTREAM_GETC(stream)) == VSTREAM_EOF) {
- vstring_sprintf(why, "connect to %s[%s]: server dropped connection without sending the initial greeting",
- name, addr);
+ dsn_vstring_update(why, "4.4.0",
+ "connect to %s[%s]: server dropped connection without sending the initial greeting",
+ name, addr);
lmtp_errno = LMTP_RETRY;
vstream_fclose(stream);
return (0);
@@ -262,8 +266,9 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
* Skip this host if it sends a 4xx or 5xx greeting.
*/
if (ch == '4' || ch == '5') {
- vstring_sprintf(why, "connect to %s[%s]: server refused mail service",
- name, addr);
+ dsn_vstring_update(why, "4.3.0",
+ "connect to %s[%s]: server refused mail service",
+ name, addr);
lmtp_errno = LMTP_RETRY;
vstream_fclose(stream);
return (0);
@@ -274,7 +279,7 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
/* lmtp_connect_host - direct connection to host */
static LMTP_SESSION *lmtp_connect_host(char *host, unsigned port,
- const char *destination, VSTRING *why)
+ const char *destination, DSN_VSTRING *why)
{
LMTP_SESSION *session = 0;
DNS_RR *addr_list;
@@ -336,7 +341,7 @@ static char *lmtp_parse_destination(const char *destination, char *def_service,
/* lmtp_connect - establish LMTP connection */
-LMTP_SESSION *lmtp_connect(const char *destination, VSTRING *why)
+LMTP_SESSION *lmtp_connect(const char *destination, DSN_VSTRING *why)
{
char *myname = "lmtp_connect";
LMTP_SESSION *session;
diff --git a/postfix/src/lmtp/lmtp_proto.c b/postfix/src/lmtp/lmtp_proto.c
index ebfa6323d..f446f1f74 100644
--- a/postfix/src/lmtp/lmtp_proto.c
+++ b/postfix/src/lmtp/lmtp_proto.c
@@ -224,7 +224,7 @@ int lmtp_lhlo(LMTP_STATE *state)
* Read and parse the server's LMTP greeting banner.
*/
if (((resp = lmtp_chat_resp(state))->code / 100) != 2)
- return (lmtp_site_fail(state, resp->code,
+ return (lmtp_site_fail(state, resp->dsn, resp->code,
"host %s refused to talk to me: %s",
session->namaddr, translit(resp->str, "\n", " ")));
@@ -233,7 +233,7 @@ int lmtp_lhlo(LMTP_STATE *state)
*/
lmtp_chat_cmd(state, "LHLO %s", var_myhostname);
if ((resp = lmtp_chat_resp(state))->code / 100 != 2)
- return (lmtp_site_fail(state, resp->code,
+ return (lmtp_site_fail(state, resp->dsn, resp->code,
"host %s refused to talk to me: %s",
session->namaddr,
translit(resp->str, "\n", " ")));
@@ -594,7 +594,7 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
*/
case LMTP_STATE_MAIL:
if (resp->code / 100 != 2) {
- lmtp_mesg_fail(state, resp->code,
+ lmtp_mesg_fail(state, resp->dsn, resp->code,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
@@ -634,15 +634,16 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
&& sent(DEL_REQ_TRACE_FLAGS(request->flags),
request->queue_id, rcpt->orig_addr,
rcpt->address, rcpt->offset,
- session->namaddr, request->arrival_time,
- "%s",
+ session->namaddr, resp->dsn,
+ request->arrival_time, "%s",
translit(resp->str, "\n", " ")) == 0) {
if (request->flags & DEL_REQ_FLAG_SUCCESS)
deliver_completed(state->src, rcpt->offset);
rcpt->offset = 0; /* in case deferred */
}
} else {
- lmtp_rcpt_fail(state, resp->code, rcpt,
+ lmtp_rcpt_fail(state, resp->dsn,
+ resp->code, rcpt,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
@@ -664,7 +665,7 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
case LMTP_STATE_DATA:
if (resp->code / 100 != 3) {
if (nrcpt > 0)
- lmtp_mesg_fail(state, resp->code,
+ lmtp_mesg_fail(state, resp->dsn, resp->code,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
@@ -691,7 +692,7 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
if (sent(DEL_REQ_TRACE_FLAGS(request->flags),
request->queue_id, rcpt->orig_addr,
rcpt->address, rcpt->offset,
- session->namaddr,
+ session->namaddr, resp->dsn,
request->arrival_time,
"%s", resp->str) == 0) {
if (request->flags & DEL_REQ_FLAG_SUCCESS)
@@ -700,7 +701,8 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
}
}
} else {
- lmtp_rcpt_fail(state, resp->code, rcpt,
+ lmtp_rcpt_fail(state, resp->dsn,
+ resp->code, rcpt,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
diff --git a/postfix/src/lmtp/lmtp_sasl_proto.c b/postfix/src/lmtp/lmtp_sasl_proto.c
index e9fc09a2c..6d15e2659 100644
--- a/postfix/src/lmtp/lmtp_sasl_proto.c
+++ b/postfix/src/lmtp/lmtp_sasl_proto.c
@@ -116,7 +116,8 @@ int lmtp_sasl_helo_login(LMTP_STATE *state)
if (lmtp_sasl_passwd_lookup(state) != 0) {
lmtp_sasl_start(state, VAR_LMTP_SASL_OPTS, var_lmtp_sasl_opts);
if (lmtp_sasl_authenticate(state, why) <= 0)
- ret = lmtp_site_fail(state, 450, "Authentication failed: %s",
+ ret = lmtp_site_fail(state, "4.7.0", 450,
+ "Authentication failed: %s",
vstring_str(why));
}
vstring_free(why);
diff --git a/postfix/src/lmtp/lmtp_trouble.c b/postfix/src/lmtp/lmtp_trouble.c
index 84ce001e1..2dc71b81d 100644
--- a/postfix/src/lmtp/lmtp_trouble.c
+++ b/postfix/src/lmtp/lmtp_trouble.c
@@ -6,26 +6,29 @@
/* SYNOPSIS
/* #include "lmtp.h"
/*
-/* int lmtp_site_fail(state, code, format, ...)
+/* int lmtp_site_fail(state, dsn, code, format, ...)
/* LMTP_STATE *state;
+/* const char *dsn;
/* int code;
-/* char *format;
+/* const char *format;
/*
-/* int lmtp_mesg_fail(state, code, format, ...)
+/* int lmtp_mesg_fail(state, dsn, code, format, ...)
/* LMTP_STATE *state;
+/* const char *dsn;
/* int code;
-/* char *format;
+/* const char *format;
/*
-/* void lmtp_rcpt_fail(state, code, recipient, format, ...)
+/* void lmtp_rcpt_fail(state, dsn, code, recipient, format, ...)
/* LMTP_STATE *state;
+/* const char *dsn;
/* int code;
/* RECIPIENT *recipient;
-/* char *format;
+/* const char *format;
/*
/* int lmtp_stream_except(state, exception, description)
/* LMTP_STATE *state;
/* int exception;
-/* char *description;
+/* const char *description;
/* DESCRIPTION
/* This module handles all non-fatal errors that can happen while
/* attempting to deliver mail via LMTP, and implements the policy
@@ -119,6 +122,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -150,7 +154,8 @@ static void lmtp_check_code(LMTP_STATE *state, int code)
/* lmtp_site_fail - defer site or bounce recipients */
-int lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
+int lmtp_site_fail(LMTP_STATE *state, const char *dsn,
+ int code, const char *format,...)
{
DELIVER_REQUEST *request = state->request;
LMTP_SESSION *session = state->session;
@@ -165,7 +170,11 @@ int lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
* Initialize.
*/
va_start(ap, format);
- vstring_vsprintf(why, format, ap);
+ if (code < 400 || code > 599) {
+ vstring_sprintf(why, "Protocol error: ");
+ dsn = "5.5.0";
+ }
+ vstring_vsprintf_append(why, format, ap);
va_end(ap);
/*
@@ -180,7 +189,7 @@ int lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
(DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
rcpt->orig_addr, rcpt->address, rcpt->offset,
session ? session->namaddr : "none",
- request->arrival_time, "%s", vstring_str(why));
+ dsn, request->arrival_time, "%s", vstring_str(why));
if (status == 0) {
deliver_completed(state->src, rcpt->offset);
rcpt->offset = 0;
@@ -188,7 +197,7 @@ int lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
state->status |= status;
}
if (soft_error && request->hop_status == 0)
- request->hop_status = mystrdup(vstring_str(why));
+ request->hop_status = dsn_prepend(dsn, vstring_str(why));
/*
* Cleanup.
@@ -199,7 +208,8 @@ int lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
/* lmtp_mesg_fail - defer message or bounce all recipients */
-int lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
+int lmtp_mesg_fail(LMTP_STATE *state, const char *dsn,
+ int code, const char *format,...)
{
DELIVER_REQUEST *request = state->request;
LMTP_SESSION *session = state->session;
@@ -213,7 +223,11 @@ int lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
* Initialize.
*/
va_start(ap, format);
- vstring_vsprintf(why, format, ap);
+ if (code < 400 || code > 599) {
+ vstring_sprintf(why, "Protocol error: ");
+ dsn = "5.5.0";
+ }
+ vstring_vsprintf_append(why, format, ap);
va_end(ap);
/*
@@ -227,7 +241,7 @@ int lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
status = (LMTP_SOFT(code) ? defer_append : bounce_append)
(DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
rcpt->orig_addr, rcpt->address, rcpt->offset,
- session->namaddr, request->arrival_time,
+ session->namaddr, dsn, request->arrival_time,
"%s", vstring_str(why));
if (status == 0) {
deliver_completed(state->src, rcpt->offset);
@@ -246,41 +260,58 @@ int lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
/* lmtp_rcpt_fail - defer or bounce recipient */
-void lmtp_rcpt_fail(LMTP_STATE *state, int code, RECIPIENT *rcpt,
- char *format,...)
+void lmtp_rcpt_fail(LMTP_STATE *state, const char *dsn, int code,
+ RECIPIENT *rcpt, const char *format,...)
{
DELIVER_REQUEST *request = state->request;
LMTP_SESSION *session = state->session;
int status;
va_list ap;
+ VSTRING *why = vstring_alloc(100);
+
+ /*
+ * Initialize.
+ */
+ va_start(ap, format);
+ if (code < 400 || code > 599) {
+ vstring_sprintf(why, "Protocol error: ");
+ dsn = "5.5.0";
+ }
+ vstring_vsprintf_append(why, format, ap);
+ va_end(ap);
/*
* If this is a soft error, postpone delivery to this recipient.
* Otherwise, generate a bounce record for this recipient.
*/
- va_start(ap, format);
- status = (LMTP_SOFT(code) ? vdefer_append : vbounce_append)
+ status = (LMTP_SOFT(code) ? defer_append : bounce_append)
(DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
rcpt->orig_addr, rcpt->address, rcpt->offset,
- session->namaddr, request->arrival_time, format, ap);
- va_end(ap);
+ session->namaddr, dsn, request->arrival_time,
+ "%s", vstring_str(why));
if (status == 0) {
deliver_completed(state->src, rcpt->offset);
rcpt->offset = 0;
}
lmtp_check_code(state, code);
state->status |= status;
+
+ /*
+ * Cleanup.
+ */
+ vstring_free(why);
}
/* lmtp_stream_except - defer domain after I/O problem */
-int lmtp_stream_except(LMTP_STATE *state, int code, char *description)
+int lmtp_stream_except(LMTP_STATE *state, int code, const char *description)
{
DELIVER_REQUEST *request = state->request;
LMTP_SESSION *session = state->session;
RECIPIENT *rcpt;
int nrcpt;
VSTRING *why = vstring_alloc(100);
+ const char *dsn;
/*
* Initialize.
@@ -291,10 +322,12 @@ int lmtp_stream_except(LMTP_STATE *state, int code, char *description)
case SMTP_ERR_EOF:
vstring_sprintf(why, "lost connection with %s while %s",
session->namaddr, description);
+ dsn = "4.4.2";
break;
case SMTP_ERR_TIME:
vstring_sprintf(why, "conversation with %s timed out while %s",
session->namaddr, description);
+ dsn = "4.4.2";
break;
}
@@ -310,9 +343,11 @@ int lmtp_stream_except(LMTP_STATE *state, int code, char *description)
request->queue_id,
rcpt->orig_addr, rcpt->address,
rcpt->offset, session->namaddr,
- request->arrival_time,
+ dsn, request->arrival_time,
"%s", vstring_str(why));
}
+ if (request->hop_status == 0)
+ request->hop_status = dsn_prepend(dsn, vstring_str(why));
/*
* Cleanup.
diff --git a/postfix/src/local/Makefile.in b/postfix/src/local/Makefile.in
index fb439cde6..b5a0c702a 100644
--- a/postfix/src/local/Makefile.in
+++ b/postfix/src/local/Makefile.in
@@ -54,449 +54,454 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-alias.o: alias.c
-alias.o: ../../include/sys_defs.h
-alias.o: ../../include/msg.h
-alias.o: ../../include/htable.h
-alias.o: ../../include/dict.h
-alias.o: ../../include/vstream.h
-alias.o: ../../include/vbuf.h
alias.o: ../../include/argv.h
-alias.o: ../../include/stringops.h
-alias.o: ../../include/vstring.h
-alias.o: ../../include/mymalloc.h
-alias.o: ../../include/mail_params.h
-alias.o: ../../include/defer.h
+alias.o: ../../include/been_here.h
alias.o: ../../include/bounce.h
+alias.o: ../../include/canon_addr.h
+alias.o: ../../include/defer.h
alias.o: ../../include/deliver_request.h
-alias.o: ../../include/recipient_list.h
+alias.o: ../../include/dict.h
+alias.o: ../../include/htable.h
+alias.o: ../../include/mail_params.h
alias.o: ../../include/maps.h
+alias.o: ../../include/mbox_conf.h
+alias.o: ../../include/msg.h
+alias.o: ../../include/mymalloc.h
alias.o: ../../include/mypwd.h
-alias.o: ../../include/canon_addr.h
+alias.o: ../../include/recipient_list.h
+alias.o: ../../include/resolve_clnt.h
alias.o: ../../include/sent.h
-alias.o: local.h
-alias.o: ../../include/been_here.h
+alias.o: ../../include/stringops.h
+alias.o: ../../include/sys_defs.h
alias.o: ../../include/tok822.h
-alias.o: ../../include/resolve_clnt.h
-alias.o: ../../include/mbox_conf.h
-biff_notify.o: biff_notify.c
-biff_notify.o: ../../include/sys_defs.h
+alias.o: ../../include/vbuf.h
+alias.o: ../../include/vstream.h
+alias.o: ../../include/vstring.h
+alias.o: alias.c
+alias.o: local.h
biff_notify.o: ../../include/msg.h
+biff_notify.o: ../../include/sys_defs.h
+biff_notify.o: biff_notify.c
biff_notify.o: biff_notify.h
-command.o: command.c
-command.o: ../../include/sys_defs.h
-command.o: ../../include/msg.h
-command.o: ../../include/htable.h
-command.o: ../../include/vstring.h
-command.o: ../../include/vbuf.h
-command.o: ../../include/vstream.h
command.o: ../../include/argv.h
-command.o: ../../include/mac_parse.h
-command.o: ../../include/defer.h
+command.o: ../../include/been_here.h
command.o: ../../include/bounce.h
+command.o: ../../include/defer.h
command.o: ../../include/deliver_request.h
-command.o: ../../include/recipient_list.h
-command.o: ../../include/sent.h
-command.o: ../../include/been_here.h
+command.o: ../../include/dict.h
+command.o: ../../include/dsn_util.h
+command.o: ../../include/htable.h
+command.o: ../../include/mac_parse.h
+command.o: ../../include/mail_copy.h
command.o: ../../include/mail_params.h
+command.o: ../../include/maps.h
+command.o: ../../include/mbox_conf.h
+command.o: ../../include/msg.h
command.o: ../../include/pipe_command.h
-command.o: ../../include/mail_copy.h
-command.o: local.h
-command.o: ../../include/tok822.h
+command.o: ../../include/recipient_list.h
command.o: ../../include/resolve_clnt.h
-command.o: ../../include/mbox_conf.h
-command.o: ../../include/maps.h
-command.o: ../../include/dict.h
-deliver_attr.o: deliver_attr.c
-deliver_attr.o: ../../include/sys_defs.h
-deliver_attr.o: ../../include/msg.h
-deliver_attr.o: ../../include/vstream.h
-deliver_attr.o: ../../include/vbuf.h
-deliver_attr.o: local.h
-deliver_attr.o: ../../include/htable.h
-deliver_attr.o: ../../include/vstring.h
+command.o: ../../include/sent.h
+command.o: ../../include/sys_defs.h
+command.o: ../../include/tok822.h
+command.o: ../../include/vbuf.h
+command.o: ../../include/vstream.h
+command.o: ../../include/vstring.h
+command.o: command.c
+command.o: local.h
+deliver_attr.o: ../../include/argv.h
deliver_attr.o: ../../include/been_here.h
-deliver_attr.o: ../../include/tok822.h
-deliver_attr.o: ../../include/resolve_clnt.h
deliver_attr.o: ../../include/deliver_request.h
-deliver_attr.o: ../../include/recipient_list.h
-deliver_attr.o: ../../include/mbox_conf.h
-deliver_attr.o: ../../include/argv.h
-deliver_attr.o: ../../include/maps.h
deliver_attr.o: ../../include/dict.h
-delivered.o: delivered.c
-delivered.o: ../../include/sys_defs.h
-delivered.o: ../../include/msg.h
+deliver_attr.o: ../../include/htable.h
+deliver_attr.o: ../../include/maps.h
+deliver_attr.o: ../../include/mbox_conf.h
+deliver_attr.o: ../../include/msg.h
+deliver_attr.o: ../../include/recipient_list.h
+deliver_attr.o: ../../include/resolve_clnt.h
+deliver_attr.o: ../../include/sys_defs.h
+deliver_attr.o: ../../include/tok822.h
+deliver_attr.o: ../../include/vbuf.h
+deliver_attr.o: ../../include/vstream.h
+deliver_attr.o: ../../include/vstring.h
+deliver_attr.o: deliver_attr.c
+deliver_attr.o: local.h
+delivered.o: ../../include/argv.h
+delivered.o: ../../include/been_here.h
+delivered.o: ../../include/deliver_request.h
+delivered.o: ../../include/dict.h
+delivered.o: ../../include/header_opts.h
delivered.o: ../../include/htable.h
-delivered.o: ../../include/vstring.h
-delivered.o: ../../include/vbuf.h
-delivered.o: ../../include/vstream.h
-delivered.o: ../../include/vstring_vstream.h
-delivered.o: ../../include/stringops.h
-delivered.o: ../../include/record.h
-delivered.o: ../../include/rec_type.h
delivered.o: ../../include/is_header.h
+delivered.o: ../../include/maps.h
+delivered.o: ../../include/mbox_conf.h
+delivered.o: ../../include/msg.h
delivered.o: ../../include/quote_822_local.h
delivered.o: ../../include/quote_flags.h
-delivered.o: ../../include/header_opts.h
-delivered.o: local.h
-delivered.o: ../../include/been_here.h
-delivered.o: ../../include/tok822.h
-delivered.o: ../../include/resolve_clnt.h
-delivered.o: ../../include/deliver_request.h
+delivered.o: ../../include/rec_type.h
delivered.o: ../../include/recipient_list.h
-delivered.o: ../../include/mbox_conf.h
-delivered.o: ../../include/argv.h
-delivered.o: ../../include/maps.h
-delivered.o: ../../include/dict.h
-dotforward.o: dotforward.c
-dotforward.o: ../../include/sys_defs.h
-dotforward.o: ../../include/msg.h
-dotforward.o: ../../include/vstring.h
-dotforward.o: ../../include/vbuf.h
-dotforward.o: ../../include/vstream.h
+delivered.o: ../../include/record.h
+delivered.o: ../../include/resolve_clnt.h
+delivered.o: ../../include/stringops.h
+delivered.o: ../../include/sys_defs.h
+delivered.o: ../../include/tok822.h
+delivered.o: ../../include/vbuf.h
+delivered.o: ../../include/vstream.h
+delivered.o: ../../include/vstring.h
+delivered.o: ../../include/vstring_vstream.h
+delivered.o: delivered.c
+delivered.o: local.h
+dotforward.o: ../../include/argv.h
+dotforward.o: ../../include/been_here.h
+dotforward.o: ../../include/bounce.h
+dotforward.o: ../../include/deliver_request.h
+dotforward.o: ../../include/dict.h
+dotforward.o: ../../include/ext_prop.h
dotforward.o: ../../include/htable.h
-dotforward.o: ../../include/open_as.h
-dotforward.o: ../../include/lstat_as.h
dotforward.o: ../../include/iostuff.h
-dotforward.o: ../../include/stringops.h
-dotforward.o: ../../include/mymalloc.h
+dotforward.o: ../../include/lstat_as.h
dotforward.o: ../../include/mac_expand.h
dotforward.o: ../../include/mac_parse.h
+dotforward.o: ../../include/mail_conf.h
+dotforward.o: ../../include/mail_params.h
+dotforward.o: ../../include/maps.h
+dotforward.o: ../../include/mbox_conf.h
+dotforward.o: ../../include/msg.h
+dotforward.o: ../../include/mymalloc.h
dotforward.o: ../../include/mypwd.h
-dotforward.o: ../../include/bounce.h
-dotforward.o: ../../include/deliver_request.h
+dotforward.o: ../../include/open_as.h
dotforward.o: ../../include/recipient_list.h
-dotforward.o: ../../include/been_here.h
-dotforward.o: ../../include/mail_params.h
-dotforward.o: ../../include/mail_conf.h
-dotforward.o: ../../include/ext_prop.h
+dotforward.o: ../../include/resolve_clnt.h
dotforward.o: ../../include/sent.h
-dotforward.o: local.h
+dotforward.o: ../../include/stringops.h
+dotforward.o: ../../include/sys_defs.h
dotforward.o: ../../include/tok822.h
-dotforward.o: ../../include/resolve_clnt.h
-dotforward.o: ../../include/mbox_conf.h
-dotforward.o: ../../include/argv.h
-dotforward.o: ../../include/maps.h
-dotforward.o: ../../include/dict.h
-file.o: file.c
-file.o: ../../include/sys_defs.h
-file.o: ../../include/msg.h
-file.o: ../../include/htable.h
-file.o: ../../include/vstring.h
-file.o: ../../include/vbuf.h
-file.o: ../../include/vstream.h
-file.o: ../../include/deliver_flock.h
-file.o: ../../include/myflock.h
-file.o: ../../include/set_eugid.h
-file.o: ../../include/mail_copy.h
+dotforward.o: ../../include/vbuf.h
+dotforward.o: ../../include/vstream.h
+dotforward.o: ../../include/vstring.h
+dotforward.o: dotforward.c
+dotforward.o: local.h
+file.o: ../../include/argv.h
+file.o: ../../include/been_here.h
file.o: ../../include/bounce.h
-file.o: ../../include/deliver_request.h
-file.o: ../../include/recipient_list.h
file.o: ../../include/defer.h
-file.o: ../../include/sent.h
-file.o: ../../include/been_here.h
+file.o: ../../include/deliver_flock.h
+file.o: ../../include/deliver_request.h
+file.o: ../../include/dict.h
+file.o: ../../include/dsn_util.h
+file.o: ../../include/htable.h
+file.o: ../../include/mail_copy.h
file.o: ../../include/mail_params.h
+file.o: ../../include/maps.h
file.o: ../../include/mbox_conf.h
-file.o: ../../include/argv.h
file.o: ../../include/mbox_open.h
+file.o: ../../include/msg.h
+file.o: ../../include/myflock.h
+file.o: ../../include/recipient_list.h
+file.o: ../../include/resolve_clnt.h
file.o: ../../include/safe_open.h
-file.o: local.h
+file.o: ../../include/sent.h
+file.o: ../../include/set_eugid.h
+file.o: ../../include/sys_defs.h
file.o: ../../include/tok822.h
-file.o: ../../include/resolve_clnt.h
-file.o: ../../include/maps.h
-file.o: ../../include/dict.h
-forward.o: forward.c
-forward.o: ../../include/sys_defs.h
-forward.o: ../../include/msg.h
-forward.o: ../../include/mymalloc.h
-forward.o: ../../include/htable.h
+file.o: ../../include/vbuf.h
+file.o: ../../include/vstream.h
+file.o: ../../include/vstring.h
+file.o: file.c
+file.o: local.h
forward.o: ../../include/argv.h
-forward.o: ../../include/vstring.h
-forward.o: ../../include/vbuf.h
-forward.o: ../../include/vstream.h
-forward.o: ../../include/vstring_vstream.h
-forward.o: ../../include/iostuff.h
-forward.o: ../../include/stringops.h
-forward.o: ../../include/mail_proto.h
forward.o: ../../include/attr.h
+forward.o: ../../include/been_here.h
forward.o: ../../include/cleanup_user.h
-forward.o: ../../include/sent.h
forward.o: ../../include/deliver_request.h
-forward.o: ../../include/recipient_list.h
-forward.o: ../../include/record.h
-forward.o: ../../include/rec_type.h
-forward.o: ../../include/mark_corrupt.h
+forward.o: ../../include/dict.h
+forward.o: ../../include/htable.h
+forward.o: ../../include/iostuff.h
forward.o: ../../include/mail_date.h
forward.o: ../../include/mail_params.h
-forward.o: local.h
-forward.o: ../../include/been_here.h
-forward.o: ../../include/tok822.h
-forward.o: ../../include/resolve_clnt.h
-forward.o: ../../include/mbox_conf.h
+forward.o: ../../include/mail_proto.h
forward.o: ../../include/maps.h
-forward.o: ../../include/dict.h
-include.o: include.c
-include.o: ../../include/sys_defs.h
-include.o: ../../include/msg.h
+forward.o: ../../include/mark_corrupt.h
+forward.o: ../../include/mbox_conf.h
+forward.o: ../../include/msg.h
+forward.o: ../../include/mymalloc.h
+forward.o: ../../include/rec_type.h
+forward.o: ../../include/recipient_list.h
+forward.o: ../../include/record.h
+forward.o: ../../include/resolve_clnt.h
+forward.o: ../../include/sent.h
+forward.o: ../../include/stringops.h
+forward.o: ../../include/sys_defs.h
+forward.o: ../../include/tok822.h
+forward.o: ../../include/vbuf.h
+forward.o: ../../include/vstream.h
+forward.o: ../../include/vstring.h
+forward.o: ../../include/vstring_vstream.h
+forward.o: forward.c
+forward.o: local.h
+include.o: ../../include/argv.h
+include.o: ../../include/been_here.h
+include.o: ../../include/bounce.h
+include.o: ../../include/defer.h
+include.o: ../../include/deliver_request.h
+include.o: ../../include/dict.h
+include.o: ../../include/ext_prop.h
include.o: ../../include/htable.h
-include.o: ../../include/mymalloc.h
-include.o: ../../include/vstream.h
-include.o: ../../include/vbuf.h
-include.o: ../../include/open_as.h
-include.o: ../../include/stat_as.h
include.o: ../../include/iostuff.h
+include.o: ../../include/mail_params.h
+include.o: ../../include/maps.h
+include.o: ../../include/mbox_conf.h
+include.o: ../../include/msg.h
+include.o: ../../include/mymalloc.h
include.o: ../../include/mypwd.h
-include.o: ../../include/bounce.h
-include.o: ../../include/deliver_request.h
-include.o: ../../include/vstring.h
+include.o: ../../include/open_as.h
include.o: ../../include/recipient_list.h
-include.o: ../../include/defer.h
-include.o: ../../include/been_here.h
-include.o: ../../include/mail_params.h
-include.o: ../../include/ext_prop.h
+include.o: ../../include/resolve_clnt.h
include.o: ../../include/sent.h
-include.o: local.h
+include.o: ../../include/stat_as.h
+include.o: ../../include/sys_defs.h
include.o: ../../include/tok822.h
-include.o: ../../include/resolve_clnt.h
-include.o: ../../include/mbox_conf.h
-include.o: ../../include/argv.h
-include.o: ../../include/maps.h
-include.o: ../../include/dict.h
-indirect.o: indirect.c
-indirect.o: ../../include/sys_defs.h
-indirect.o: ../../include/msg.h
-indirect.o: ../../include/htable.h
-indirect.o: ../../include/mail_params.h
+include.o: ../../include/vbuf.h
+include.o: ../../include/vstream.h
+include.o: ../../include/vstring.h
+include.o: include.c
+include.o: local.h
+indirect.o: ../../include/argv.h
+indirect.o: ../../include/been_here.h
indirect.o: ../../include/bounce.h
+indirect.o: ../../include/defer.h
indirect.o: ../../include/deliver_request.h
-indirect.o: ../../include/vstring.h
-indirect.o: ../../include/vbuf.h
-indirect.o: ../../include/vstream.h
+indirect.o: ../../include/dict.h
+indirect.o: ../../include/htable.h
+indirect.o: ../../include/mail_params.h
+indirect.o: ../../include/maps.h
+indirect.o: ../../include/mbox_conf.h
+indirect.o: ../../include/msg.h
indirect.o: ../../include/recipient_list.h
-indirect.o: ../../include/defer.h
-indirect.o: ../../include/been_here.h
+indirect.o: ../../include/resolve_clnt.h
indirect.o: ../../include/sent.h
-indirect.o: local.h
+indirect.o: ../../include/sys_defs.h
indirect.o: ../../include/tok822.h
-indirect.o: ../../include/resolve_clnt.h
-indirect.o: ../../include/mbox_conf.h
-indirect.o: ../../include/argv.h
-indirect.o: ../../include/maps.h
-indirect.o: ../../include/dict.h
-local.o: local.c
-local.o: ../../include/sys_defs.h
-local.o: ../../include/msg.h
-local.o: ../../include/mymalloc.h
-local.o: ../../include/htable.h
-local.o: ../../include/vstring.h
-local.o: ../../include/vbuf.h
-local.o: ../../include/vstream.h
-local.o: ../../include/iostuff.h
-local.o: ../../include/name_mask.h
-local.o: ../../include/set_eugid.h
-local.o: ../../include/dict.h
+indirect.o: ../../include/vbuf.h
+indirect.o: ../../include/vstream.h
+indirect.o: ../../include/vstring.h
+indirect.o: indirect.c
+indirect.o: local.h
local.o: ../../include/argv.h
-local.o: ../../include/recipient_list.h
-local.o: ../../include/deliver_request.h
-local.o: ../../include/deliver_completed.h
-local.o: ../../include/mail_params.h
-local.o: ../../include/mail_addr.h
-local.o: ../../include/mail_conf.h
local.o: ../../include/been_here.h
+local.o: ../../include/deliver_completed.h
+local.o: ../../include/deliver_request.h
+local.o: ../../include/dict.h
local.o: ../../include/ext_prop.h
-local.o: ../../include/maps.h
local.o: ../../include/flush_clnt.h
+local.o: ../../include/htable.h
+local.o: ../../include/iostuff.h
+local.o: ../../include/mail_addr.h
+local.o: ../../include/mail_conf.h
+local.o: ../../include/mail_params.h
local.o: ../../include/mail_server.h
-local.o: local.h
-local.o: ../../include/tok822.h
-local.o: ../../include/resolve_clnt.h
+local.o: ../../include/maps.h
local.o: ../../include/mbox_conf.h
-local_expand.o: local_expand.c
-local_expand.o: ../../include/sys_defs.h
-local_expand.o: ../../include/vstring.h
-local_expand.o: ../../include/vbuf.h
+local.o: ../../include/msg.h
+local.o: ../../include/mymalloc.h
+local.o: ../../include/name_mask.h
+local.o: ../../include/recipient_list.h
+local.o: ../../include/resolve_clnt.h
+local.o: ../../include/set_eugid.h
+local.o: ../../include/sys_defs.h
+local.o: ../../include/tok822.h
+local.o: ../../include/vbuf.h
+local.o: ../../include/vstream.h
+local.o: ../../include/vstring.h
+local.o: local.c
+local.o: local.h
+local_expand.o: ../../include/argv.h
+local_expand.o: ../../include/been_here.h
+local_expand.o: ../../include/deliver_request.h
+local_expand.o: ../../include/dict.h
+local_expand.o: ../../include/htable.h
local_expand.o: ../../include/mac_expand.h
local_expand.o: ../../include/mac_parse.h
local_expand.o: ../../include/mail_params.h
-local_expand.o: local.h
-local_expand.o: ../../include/htable.h
-local_expand.o: ../../include/vstream.h
-local_expand.o: ../../include/been_here.h
-local_expand.o: ../../include/tok822.h
-local_expand.o: ../../include/resolve_clnt.h
-local_expand.o: ../../include/deliver_request.h
-local_expand.o: ../../include/recipient_list.h
-local_expand.o: ../../include/mbox_conf.h
-local_expand.o: ../../include/argv.h
local_expand.o: ../../include/maps.h
-local_expand.o: ../../include/dict.h
-mailbox.o: mailbox.c
-mailbox.o: ../../include/sys_defs.h
-mailbox.o: ../../include/msg.h
-mailbox.o: ../../include/htable.h
-mailbox.o: ../../include/vstring.h
-mailbox.o: ../../include/vbuf.h
-mailbox.o: ../../include/vstream.h
-mailbox.o: ../../include/mymalloc.h
-mailbox.o: ../../include/stringops.h
-mailbox.o: ../../include/set_eugid.h
-mailbox.o: ../../include/mail_copy.h
-mailbox.o: ../../include/defer.h
+local_expand.o: ../../include/mbox_conf.h
+local_expand.o: ../../include/recipient_list.h
+local_expand.o: ../../include/resolve_clnt.h
+local_expand.o: ../../include/sys_defs.h
+local_expand.o: ../../include/tok822.h
+local_expand.o: ../../include/vbuf.h
+local_expand.o: ../../include/vstream.h
+local_expand.o: ../../include/vstring.h
+local_expand.o: local.h
+local_expand.o: local_expand.c
+mailbox.o: ../../include/argv.h
+mailbox.o: ../../include/attr.h
+mailbox.o: ../../include/been_here.h
mailbox.o: ../../include/bounce.h
+mailbox.o: ../../include/defer.h
+mailbox.o: ../../include/deliver_pass.h
mailbox.o: ../../include/deliver_request.h
-mailbox.o: ../../include/recipient_list.h
-mailbox.o: ../../include/sent.h
-mailbox.o: ../../include/mypwd.h
-mailbox.o: ../../include/been_here.h
+mailbox.o: ../../include/dict.h
+mailbox.o: ../../include/dsn_util.h
+mailbox.o: ../../include/htable.h
+mailbox.o: ../../include/iostuff.h
+mailbox.o: ../../include/mail_copy.h
mailbox.o: ../../include/mail_params.h
-mailbox.o: ../../include/deliver_pass.h
mailbox.o: ../../include/mail_proto.h
-mailbox.o: ../../include/iostuff.h
-mailbox.o: ../../include/attr.h
+mailbox.o: ../../include/maps.h
+mailbox.o: ../../include/mbox_conf.h
mailbox.o: ../../include/mbox_open.h
+mailbox.o: ../../include/msg.h
+mailbox.o: ../../include/mymalloc.h
+mailbox.o: ../../include/mypwd.h
+mailbox.o: ../../include/recipient_list.h
+mailbox.o: ../../include/resolve_clnt.h
mailbox.o: ../../include/safe_open.h
-mailbox.o: ../../include/maps.h
-mailbox.o: ../../include/dict.h
-mailbox.o: ../../include/argv.h
-mailbox.o: local.h
+mailbox.o: ../../include/sent.h
+mailbox.o: ../../include/set_eugid.h
+mailbox.o: ../../include/stringops.h
+mailbox.o: ../../include/sys_defs.h
mailbox.o: ../../include/tok822.h
-mailbox.o: ../../include/resolve_clnt.h
-mailbox.o: ../../include/mbox_conf.h
+mailbox.o: ../../include/vbuf.h
+mailbox.o: ../../include/vstream.h
+mailbox.o: ../../include/vstring.h
mailbox.o: biff_notify.h
-maildir.o: maildir.c
-maildir.o: ../../include/sys_defs.h
+mailbox.o: local.h
+mailbox.o: mailbox.c
+maildir.o: ../../include/argv.h
+maildir.o: ../../include/been_here.h
+maildir.o: ../../include/bounce.h
+maildir.o: ../../include/defer.h
+maildir.o: ../../include/deliver_request.h
+maildir.o: ../../include/dict.h
+maildir.o: ../../include/dsn_util.h
+maildir.o: ../../include/get_hostname.h
+maildir.o: ../../include/htable.h
+maildir.o: ../../include/mail_copy.h
+maildir.o: ../../include/mail_params.h
+maildir.o: ../../include/make_dirs.h
+maildir.o: ../../include/maps.h
+maildir.o: ../../include/mbox_conf.h
maildir.o: ../../include/msg.h
maildir.o: ../../include/mymalloc.h
+maildir.o: ../../include/recipient_list.h
+maildir.o: ../../include/resolve_clnt.h
+maildir.o: ../../include/sane_fsops.h
+maildir.o: ../../include/sent.h
+maildir.o: ../../include/set_eugid.h
maildir.o: ../../include/stringops.h
-maildir.o: ../../include/vstring.h
+maildir.o: ../../include/sys_defs.h
+maildir.o: ../../include/tok822.h
maildir.o: ../../include/vbuf.h
maildir.o: ../../include/vstream.h
-maildir.o: ../../include/make_dirs.h
-maildir.o: ../../include/set_eugid.h
-maildir.o: ../../include/get_hostname.h
-maildir.o: ../../include/sane_fsops.h
-maildir.o: ../../include/mail_copy.h
-maildir.o: ../../include/bounce.h
-maildir.o: ../../include/deliver_request.h
-maildir.o: ../../include/recipient_list.h
-maildir.o: ../../include/defer.h
-maildir.o: ../../include/sent.h
-maildir.o: ../../include/mail_params.h
+maildir.o: ../../include/vstring.h
maildir.o: local.h
-maildir.o: ../../include/htable.h
-maildir.o: ../../include/been_here.h
-maildir.o: ../../include/tok822.h
-maildir.o: ../../include/resolve_clnt.h
-maildir.o: ../../include/mbox_conf.h
-maildir.o: ../../include/argv.h
-maildir.o: ../../include/maps.h
-maildir.o: ../../include/dict.h
-recipient.o: recipient.c
-recipient.o: ../../include/sys_defs.h
-recipient.o: ../../include/msg.h
-recipient.o: ../../include/mymalloc.h
-recipient.o: ../../include/htable.h
-recipient.o: ../../include/split_at.h
-recipient.o: ../../include/stringops.h
-recipient.o: ../../include/vstring.h
-recipient.o: ../../include/vbuf.h
-recipient.o: ../../include/dict.h
-recipient.o: ../../include/vstream.h
+maildir.o: maildir.c
recipient.o: ../../include/argv.h
-recipient.o: ../../include/stat_as.h
+recipient.o: ../../include/been_here.h
recipient.o: ../../include/bounce.h
-recipient.o: ../../include/deliver_request.h
-recipient.o: ../../include/recipient_list.h
+recipient.o: ../../include/canon_addr.h
recipient.o: ../../include/defer.h
+recipient.o: ../../include/deliver_request.h
+recipient.o: ../../include/dict.h
+recipient.o: ../../include/ext_prop.h
+recipient.o: ../../include/htable.h
recipient.o: ../../include/mail_params.h
+recipient.o: ../../include/maps.h
+recipient.o: ../../include/mbox_conf.h
+recipient.o: ../../include/msg.h
+recipient.o: ../../include/mymalloc.h
+recipient.o: ../../include/mypwd.h
+recipient.o: ../../include/recipient_list.h
+recipient.o: ../../include/resolve_clnt.h
recipient.o: ../../include/split_addr.h
+recipient.o: ../../include/split_at.h
+recipient.o: ../../include/stat_as.h
+recipient.o: ../../include/stringops.h
recipient.o: ../../include/strip_addr.h
-recipient.o: ../../include/ext_prop.h
-recipient.o: ../../include/mypwd.h
-recipient.o: ../../include/canon_addr.h
-recipient.o: local.h
-recipient.o: ../../include/been_here.h
+recipient.o: ../../include/sys_defs.h
recipient.o: ../../include/tok822.h
-recipient.o: ../../include/resolve_clnt.h
-recipient.o: ../../include/mbox_conf.h
-recipient.o: ../../include/maps.h
-resolve.o: resolve.c
-resolve.o: ../../include/sys_defs.h
-resolve.o: ../../include/msg.h
-resolve.o: ../../include/vstring.h
-resolve.o: ../../include/vbuf.h
+recipient.o: ../../include/vbuf.h
+recipient.o: ../../include/vstream.h
+recipient.o: ../../include/vstring.h
+recipient.o: local.h
+recipient.o: recipient.c
+resolve.o: ../../include/argv.h
+resolve.o: ../../include/attr.h
+resolve.o: ../../include/been_here.h
+resolve.o: ../../include/bounce.h
+resolve.o: ../../include/defer.h
+resolve.o: ../../include/deliver_request.h
+resolve.o: ../../include/dict.h
resolve.o: ../../include/htable.h
-resolve.o: ../../include/mail_proto.h
-resolve.o: ../../include/vstream.h
resolve.o: ../../include/iostuff.h
-resolve.o: ../../include/attr.h
+resolve.o: ../../include/mail_params.h
+resolve.o: ../../include/mail_proto.h
+resolve.o: ../../include/maps.h
+resolve.o: ../../include/mbox_conf.h
+resolve.o: ../../include/msg.h
+resolve.o: ../../include/recipient_list.h
resolve.o: ../../include/resolve_clnt.h
resolve.o: ../../include/rewrite_clnt.h
+resolve.o: ../../include/sys_defs.h
resolve.o: ../../include/tok822.h
-resolve.o: ../../include/mail_params.h
-resolve.o: ../../include/defer.h
-resolve.o: ../../include/bounce.h
-resolve.o: ../../include/deliver_request.h
-resolve.o: ../../include/recipient_list.h
+resolve.o: ../../include/vbuf.h
+resolve.o: ../../include/vstream.h
+resolve.o: ../../include/vstring.h
resolve.o: local.h
-resolve.o: ../../include/been_here.h
-resolve.o: ../../include/mbox_conf.h
-resolve.o: ../../include/argv.h
-resolve.o: ../../include/maps.h
-resolve.o: ../../include/dict.h
-token.o: token.c
-token.o: ../../include/sys_defs.h
-token.o: ../../include/msg.h
-token.o: ../../include/vstring.h
-token.o: ../../include/vbuf.h
-token.o: ../../include/vstream.h
+resolve.o: resolve.c
+token.o: ../../include/argv.h
+token.o: ../../include/been_here.h
+token.o: ../../include/bounce.h
+token.o: ../../include/defer.h
+token.o: ../../include/deliver_request.h
+token.o: ../../include/dict.h
token.o: ../../include/htable.h
-token.o: ../../include/readlline.h
+token.o: ../../include/mail_params.h
+token.o: ../../include/maps.h
+token.o: ../../include/mbox_conf.h
+token.o: ../../include/msg.h
token.o: ../../include/mymalloc.h
-token.o: ../../include/vstring_vstream.h
+token.o: ../../include/readlline.h
+token.o: ../../include/recipient_list.h
+token.o: ../../include/resolve_clnt.h
token.o: ../../include/stringops.h
+token.o: ../../include/sys_defs.h
token.o: ../../include/tok822.h
-token.o: ../../include/resolve_clnt.h
-token.o: ../../include/mail_params.h
-token.o: ../../include/bounce.h
-token.o: ../../include/deliver_request.h
-token.o: ../../include/recipient_list.h
-token.o: ../../include/defer.h
+token.o: ../../include/vbuf.h
+token.o: ../../include/vstream.h
+token.o: ../../include/vstring.h
+token.o: ../../include/vstring_vstream.h
token.o: local.h
-token.o: ../../include/been_here.h
-token.o: ../../include/mbox_conf.h
-token.o: ../../include/argv.h
-token.o: ../../include/maps.h
-token.o: ../../include/dict.h
-unknown.o: unknown.c
-unknown.o: ../../include/sys_defs.h
-unknown.o: ../../include/msg.h
-unknown.o: ../../include/stringops.h
-unknown.o: ../../include/vstring.h
-unknown.o: ../../include/vbuf.h
-unknown.o: ../../include/mymalloc.h
-unknown.o: ../../include/been_here.h
-unknown.o: ../../include/mail_params.h
-unknown.o: ../../include/mail_proto.h
-unknown.o: ../../include/vstream.h
-unknown.o: ../../include/iostuff.h
+token.o: token.c
+unknown.o: ../../include/argv.h
unknown.o: ../../include/attr.h
+unknown.o: ../../include/been_here.h
unknown.o: ../../include/bounce.h
unknown.o: ../../include/deliver_request.h
-unknown.o: ../../include/recipient_list.h
+unknown.o: ../../include/dict.h
+unknown.o: ../../include/htable.h
+unknown.o: ../../include/iostuff.h
unknown.o: ../../include/mail_addr.h
+unknown.o: ../../include/mail_params.h
+unknown.o: ../../include/mail_proto.h
+unknown.o: ../../include/maps.h
+unknown.o: ../../include/mbox_conf.h
+unknown.o: ../../include/msg.h
+unknown.o: ../../include/mymalloc.h
+unknown.o: ../../include/recipient_list.h
+unknown.o: ../../include/resolve_clnt.h
unknown.o: ../../include/sent.h
-unknown.o: local.h
-unknown.o: ../../include/htable.h
+unknown.o: ../../include/stringops.h
+unknown.o: ../../include/sys_defs.h
unknown.o: ../../include/tok822.h
-unknown.o: ../../include/resolve_clnt.h
-unknown.o: ../../include/mbox_conf.h
-unknown.o: ../../include/argv.h
-unknown.o: ../../include/maps.h
-unknown.o: ../../include/dict.h
+unknown.o: ../../include/vbuf.h
+unknown.o: ../../include/vstream.h
+unknown.o: ../../include/vstring.h
+unknown.o: local.h
+unknown.o: unknown.c
diff --git a/postfix/src/local/alias.c b/postfix/src/local/alias.c
index ad8ebee7a..d87571fbd 100644
--- a/postfix/src/local/alias.c
+++ b/postfix/src/local/alias.c
@@ -164,7 +164,7 @@ int deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
if (state.level > 100) {
msg_warn("possible alias database loop for %s", name);
*statusp = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
"possible alias database loop for %s", name);
return (YES);
}
@@ -198,7 +198,7 @@ int deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
*/
if (state.request->flags & DEL_REQ_FLAG_VERIFY) {
*statusp = sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"aliased to %s", alias_result);
return (YES);
}
@@ -226,7 +226,7 @@ int deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
if ((alias_pwd = mypwuid(alias_uid)) == 0) {
msg_warn("cannot find alias database owner for %s", *cpp);
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"cannot find alias database owner");
return (YES);
}
@@ -273,7 +273,7 @@ int deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
*statusp =
(dict_errno ?
defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"alias database unavailable") :
deliver_token_string(state, usr_attr, expansion, &alias_count));
#if 0
@@ -286,7 +286,7 @@ int deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
if (alias_count < 1) {
msg_warn("no recipient in alias lookup result for %s", name);
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"alias database unavailable");
}
myfree(expansion);
@@ -305,7 +305,7 @@ int deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
*/
if (dict_errno != 0) {
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"alias database unavailable");
return (YES);
} else {
diff --git a/postfix/src/local/command.c b/postfix/src/local/command.c
index 7d7ea4e50..a06cf0208 100644
--- a/postfix/src/local/command.c
+++ b/postfix/src/local/command.c
@@ -73,6 +73,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -83,7 +84,7 @@
int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *command)
{
char *myname = "deliver_command";
- VSTRING *why;
+ DSN_VSTRING *why;
int cmd_status;
int deliver_status;
ARGV *env;
@@ -114,7 +115,8 @@ int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
* Don't deliver a trace-only request.
*/
if (DEL_REQ_TRACE_ONLY(state.request->flags))
- return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+ return (sent(BOUNCE_FLAGS(state.request),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivers to command: %s", command));
/*
@@ -136,7 +138,7 @@ int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
if (local_deliver_hdr_mask & DELIVER_HDR_CMD)
copy_flags |= MAIL_COPY_DELIVERED;
- why = vstring_alloc(1);
+ why = dsn_vstring_alloc(1);
if (vstream_fseek(state.msg_attr.fp, state.msg_attr.offset, SEEK_SET) < 0)
msg_fatal("%s: seek queue file %s: %m",
myname, VSTREAM_PATH(state.msg_attr.fp));
@@ -195,7 +197,7 @@ int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
if (expand_status & MAC_PARSE_ERROR) {
cmd_status = PIPE_STAT_DEFER;
- vstring_strcpy(why, "Server configuration error");
+ dsn_vstring_update(why, "4.3.5", "Server configuration error");
msg_warn("bad parameter value syntax for %s: %s",
VAR_EXEC_DIRECTORY, var_exec_directory);
} else {
@@ -225,18 +227,15 @@ int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
switch (cmd_status) {
case PIPE_STAT_OK:
deliver_status = sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivered to command: %s", command);
break;
case PIPE_STAT_BOUNCE:
- deliver_status = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
- "%s", vstring_str(why));
- break;
case PIPE_STAT_DEFER:
- deliver_status = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
- "%s", vstring_str(why));
+ deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+ (BOUNCE_FLAGS(state.request),
+ BOUNCE_ATTR(state.msg_attr, why->dsn),
+ "%s", vstring_str(why->vstring));
break;
case PIPE_STAT_CORRUPT:
deliver_status = DEL_STAT_DEFER;
@@ -249,7 +248,7 @@ int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
/*
* Cleanup.
*/
- vstring_free(why);
+ dsn_vstring_free(why);
return (deliver_status);
}
diff --git a/postfix/src/local/dotforward.c b/postfix/src/local/dotforward.c
index 307082169..6d5df5b88 100644
--- a/postfix/src/local/dotforward.c
+++ b/postfix/src/local/dotforward.c
@@ -221,7 +221,7 @@ int deliver_dotforward(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp)
*/
if (state.request->flags & DEL_REQ_FLAG_VERIFY) {
*statusp = sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"forward via file: %s", STR(path));
forward_found = YES;
} else if (been_here(state.dup_filter, "forward %s", STR(path)) == 0) {
diff --git a/postfix/src/local/file.c b/postfix/src/local/file.c
index 7e5b73f66..09c675aba 100644
--- a/postfix/src/local/file.c
+++ b/postfix/src/local/file.c
@@ -71,6 +71,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -85,7 +86,7 @@ int deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
char *myname = "deliver_file";
struct stat st;
MBOX *mp;
- VSTRING *why;
+ DSN_VSTRING *why;
int mail_copy_status = MAIL_COPY_STAT_WRITE;
int deliver_status;
int copy_flags;
@@ -112,14 +113,15 @@ int deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
*/
if ((local_file_deliver_mask & state.msg_attr.exp_type) == 0)
return (bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.7.1"),
"mail to file is restricted"));
/*
* Don't deliver trace-only requests.
*/
if (DEL_REQ_TRACE_ONLY(state.request->flags))
- return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+ return (sent(BOUNCE_FLAGS(state.request),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivers to file: %s", path));
/*
@@ -146,7 +148,7 @@ int deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
(long) usr_attr.uid, (long) usr_attr.gid, path);
if (vstream_fseek(state.msg_attr.fp, state.msg_attr.offset, SEEK_SET) < 0)
msg_fatal("seek queue file %s: %m", state.msg_attr.queue_id);
- why = vstring_alloc(100);
+ why = dsn_vstring_alloc(100);
/*
* As the specified user, open or create the file, lock it, and append
@@ -163,8 +165,7 @@ int deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
if (mp != 0) {
if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
vstream_fclose(mp->fp);
- vstring_sprintf(why, "destination file is executable");
- errno = 0;
+ dsn_vstring_update(why, "5.7.1", "destination file is executable");
} else {
mail_copy_status = mail_copy(COPY_ATTR(state.msg_attr), mp->fp,
S_ISREG(st.st_mode) ? copy_flags :
@@ -181,20 +182,20 @@ int deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
deliver_status = DEL_STAT_DEFER;
} else if (mail_copy_status != 0) {
- deliver_status = (errno == EAGAIN || errno == ENOSPC || errno == ESTALE ?
- defer_append : bounce_append)
- (BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr),
+ deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+ (BOUNCE_FLAGS(state.request),
+ BOUNCE_ATTR(state.msg_attr, why->dsn),
"cannot append message to destination file %s: %s",
- path, STR(why));
+ path, vstring_str(why->vstring));
} else {
deliver_status = sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivered to file: %s", path);
}
/*
* Clean up.
*/
- vstring_free(why);
+ dsn_vstring_free(why);
return (deliver_status);
}
diff --git a/postfix/src/local/forward.c b/postfix/src/local/forward.c
index 2e987d9ba..2ce28d4a3 100644
--- a/postfix/src/local/forward.c
+++ b/postfix/src/local/forward.c
@@ -280,7 +280,8 @@ static int forward_send(FORWARD_INFO *info, DELIVER_REQUEST *request,
* Log successful forwarding.
*/
if (status == 0)
- status = sent(BOUNCE_FLAGS(request), SENT_ATTR(attr),
+ status = sent(BOUNCE_FLAGS(request),
+ SENT_ATTR(attr, "2.0.0"),
"forwarded as %s", info->queue_id);
/*
diff --git a/postfix/src/local/include.c b/postfix/src/local/include.c
index 53d31a447..4608bc897 100644
--- a/postfix/src/local/include.c
+++ b/postfix/src/local/include.c
@@ -108,19 +108,19 @@ int deliver_include(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
*/
if (*path != '/')
return (bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
":include:%s uses a relative path", path));
if (stat_as(path, &st, usr_attr.uid, usr_attr.gid) < 0)
return (bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
"unable to lookup include file %s: %m", path));
if (S_ISREG(st.st_mode) == 0)
return (bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
"not a regular include file: %s", path));
if (st.st_mode & S_IWOTH)
return (bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
"world writable include file: %s", path));
/*
@@ -147,7 +147,7 @@ int deliver_include(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
if ((file_pwd = mypwuid(st.st_uid)) == 0) {
msg_warn("cannot find username for uid %ld", (long) st.st_uid);
return (defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"%s: cannot find :include: file owner", path));
}
if (file_pwd->pw_uid != 0)
@@ -184,7 +184,7 @@ int deliver_include(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
if ((fp = FOPEN_AS(path, usr_attr.uid, usr_attr.gid)) == 0) {
status = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
"cannot open include file %s: %m", path);
} else {
if ((local_ext_prop_mask & EXT_PROP_INCLUDE) == 0)
diff --git a/postfix/src/local/indirect.c b/postfix/src/local/indirect.c
index 4b81777f0..824d89320 100644
--- a/postfix/src/local/indirect.c
+++ b/postfix/src/local/indirect.c
@@ -76,7 +76,7 @@ int deliver_indirect(LOCAL_STATE state)
*/
if (DEL_REQ_TRACE_ONLY(state.request->flags))
return (sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"forwards to %s", state.msg_attr.recipient));
/*
@@ -85,7 +85,7 @@ int deliver_indirect(LOCAL_STATE state)
*/
if (forward_append(state.msg_attr))
return (defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"unable to forward message"));
return (0);
}
diff --git a/postfix/src/local/local.h b/postfix/src/local/local.h
index e2945e723..6f39095b8 100644
--- a/postfix/src/local/local.h
+++ b/postfix/src/local/local.h
@@ -125,19 +125,20 @@ typedef struct LOCAL_STATE {
*/
#define BOUNCE_FLAGS(request) DEL_REQ_TRACE_FLAGS((request)->flags)
-#define BOUNCE_ATTR(attr) attr.queue_id, attr.orig_rcpt, attr.recipient, \
- attr.rcpt_offset, attr.relay, \
- attr.arrival_time
-#define BOUNCE_ONE_ATTR(attr) attr.queue_name, attr.queue_id, attr.encoding, \
- attr.sender, attr.orig_rcpt, \
- attr.recipient, attr.rcpt_offset, \
- attr.relay, attr.arrival_time
-#define SENT_ATTR(attr) attr.queue_id, attr.orig_rcpt, attr.recipient, \
- attr.rcpt_offset, attr.relay, \
- attr.arrival_time
-#define OPENED_ATTR(attr) attr.queue_id, attr.sender
-#define COPY_ATTR(attr) attr.sender, attr.orig_rcpt, attr.delivered, \
- attr.fp
+#define BOUNCE_ATTR(attr, detail) \
+ attr.queue_id, attr.orig_rcpt, attr.recipient, \
+ attr.rcpt_offset, attr.relay, detail, attr.arrival_time
+#define BOUNCE_ONE_ATTR(attr, detail) \
+ attr.queue_name, attr.queue_id, attr.encoding, \
+ attr.sender, attr.orig_rcpt, attr.recipient, attr.rcpt_offset, \
+ attr.relay, detail, attr.arrival_time
+#define SENT_ATTR(attr, detail) \
+ attr.queue_id, attr.orig_rcpt, attr.recipient, \
+ attr.rcpt_offset, attr.relay, detail, attr.arrival_time
+#define OPENED_ATTR(attr) \
+ attr.queue_id, attr.sender
+#define COPY_ATTR(attr) \
+ attr.sender, attr.orig_rcpt, attr.delivered, attr.fp
#define MSG_LOG_STATE(m, p) \
msg_info("%s[%d]: local %s recip %s exten %s deliver %s exp_from %s", \
diff --git a/postfix/src/local/mailbox.c b/postfix/src/local/mailbox.c
index 7cbd8d7f0..98fc13c43 100644
--- a/postfix/src/local/mailbox.c
+++ b/postfix/src/local/mailbox.c
@@ -73,10 +73,7 @@
#include
#include
#include
-
-#ifndef EDQUOT
-#define EDQUOT EFBIG
-#endif
+#include
/* Application-specific. */
@@ -93,7 +90,7 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
char *myname = "deliver_mailbox_file";
char *spool_dir;
char *mailbox;
- VSTRING *why;
+ DSN_VSTRING *why;
MBOX *mp;
int mail_copy_status;
int deliver_status;
@@ -117,7 +114,8 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
* Don't deliver trace-only requests.
*/
if (DEL_REQ_TRACE_ONLY(state.request->flags))
- return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+ return (sent(BOUNCE_FLAGS(state.request),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivers to mailbox"));
/*
@@ -128,7 +126,7 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
msg_fatal("seek message file %s: %m", VSTREAM_PATH(state.msg_attr.fp));
state.msg_attr.delivered = state.msg_attr.recipient;
mail_copy_status = MAIL_COPY_STAT_WRITE;
- why = vstring_alloc(100);
+ why = dsn_vstring_alloc(100);
if (*var_home_mailbox) {
spool_dir = 0;
mailbox = concatenate(usr_attr.home, "/", var_home_mailbox, (char *) 0);
@@ -194,8 +192,9 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
set_eugid(usr_attr.uid, usr_attr.gid);
if (S_ISREG(st.st_mode) == 0) {
vstream_fclose(mp->fp);
- vstring_sprintf(why, "destination is not a regular file");
- errno = 0;
+ dsn_vstring_update(why, "5.2.0",
+ "destination %s is not a regular file",
+ mailbox);
} else {
end = vstream_fseek(mp->fp, (off_t) 0, SEEK_END);
mail_copy_status = mail_copy(COPY_ATTR(state.msg_attr), mp->fp,
@@ -213,14 +212,14 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
deliver_status = DEL_STAT_DEFER;
} else if (mail_copy_status != 0) {
- deliver_status = (errno == EAGAIN || errno == ENOSPC || errno == ESTALE ?
- defer_append : bounce_append)
- (BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr),
- "cannot access mailbox %s for user %s. %s",
- mailbox, state.msg_attr.user, vstring_str(why));
+ deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+ (BOUNCE_FLAGS(state.request),
+ BOUNCE_ATTR(state.msg_attr, why->dsn),
+ "cannot update mailbox %s for user %s. %s",
+ mailbox, state.msg_attr.user, vstring_str(why->vstring));
} else {
deliver_status = sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivered to mailbox");
if (var_biff) {
biff = vstring_alloc(100);
@@ -234,7 +233,7 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
* Clean up.
*/
myfree(mailbox);
- vstring_free(why);
+ dsn_vstring_free(why);
return (deliver_status);
}
diff --git a/postfix/src/local/maildir.c b/postfix/src/local/maildir.c
index 5d0ab04af..9540a2c06 100644
--- a/postfix/src/local/maildir.c
+++ b/postfix/src/local/maildir.c
@@ -65,6 +65,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -80,7 +81,7 @@ int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
char *curdir;
char *tmpfile;
char *newfile;
- VSTRING *why;
+ DSN_VSTRING *why;
VSTRING *buf;
VSTREAM *dst;
int mail_copy_status;
@@ -102,7 +103,8 @@ int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
* Don't deliver trace-only requests.
*/
if (DEL_REQ_TRACE_ONLY(state.request->flags))
- return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+ return (sent(BOUNCE_FLAGS(state.request),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivers to maildir"));
/*
@@ -114,7 +116,7 @@ int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
state.msg_attr.delivered = state.msg_attr.recipient;
mail_copy_status = MAIL_COPY_STAT_WRITE;
buf = vstring_alloc(100);
- why = vstring_alloc(100);
+ why = dsn_vstring_alloc(100);
copy_flags = MAIL_COPY_TOFILE | MAIL_COPY_RETURN_PATH | MAIL_COPY_ORIG_RCPT;
if (local_deliver_hdr_mask & DELIVER_HDR_FILE)
@@ -187,9 +189,9 @@ int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
&& (errno != ENOENT
|| make_dirs(tmpdir, 0700) < 0
|| (dst = vstream_fopen(tmpfile, O_WRONLY | O_CREAT | O_EXCL, 0600)) == 0)) {
- vstring_sprintf(why, "create %s: %m", tmpfile);
+ dsn_vstring_update(why, "5.2.0", "create maildir file %s: %m", tmpfile);
} else if (fstat(vstream_fileno(dst), &st) < 0) {
- vstring_sprintf(why, "create %s: %m", tmpfile);
+ dsn_vstring_update(why, "5.2.0", "create maildir file %s: %m", tmpfile);
} else {
vstring_sprintf(buf, "%lu.V%lxI%lxM%lu.%s",
(unsigned long) starttime.tv_sec,
@@ -204,7 +206,8 @@ int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
&& (errno != ENOENT
|| (make_dirs(curdir, 0700), make_dirs(newdir, 0700)) < 0
|| sane_link(tmpfile, newfile) < 0)) {
- vstring_sprintf(why, "link to %s: %m", newfile);
+ dsn_vstring_update(why, "5.2.0",
+ "create maildir file %s: %m", newfile);
mail_copy_status = MAIL_COPY_STAT_WRITE;
}
}
@@ -219,22 +222,23 @@ int deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
deliver_status = DEL_STAT_DEFER;
} else if (mail_copy_status != 0) {
- deliver_status = (errno == ENOSPC || errno == ESTALE ?
- defer_append : bounce_append)
- (BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr),
- "maildir delivery failed: %s", vstring_str(why));
+ deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+ (BOUNCE_FLAGS(state.request),
+ BOUNCE_ATTR(state.msg_attr, why->dsn),
+ "maildir delivery failed: %s", vstring_str(why->vstring));
if (errno == EACCES) {
msg_warn("maildir access problem for UID/GID=%lu/%lu: %s",
- (long) usr_attr.uid, (long) usr_attr.gid, vstring_str(why));
+ (long) usr_attr.uid, (long) usr_attr.gid,
+ vstring_str(why->vstring));
msg_warn("perhaps you need to create the maildirs in advance");
}
} else {
deliver_status = sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"delivered to maildir");
}
vstring_free(buf);
- vstring_free(why);
+ dsn_vstring_free(why);
myfree(newdir);
myfree(tmpdir);
myfree(curdir);
diff --git a/postfix/src/local/recipient.c b/postfix/src/local/recipient.c
index 761d58420..de8fdeef5 100644
--- a/postfix/src/local/recipient.c
+++ b/postfix/src/local/recipient.c
@@ -185,7 +185,7 @@ static int deliver_switch(LOCAL_STATE state, USER_ATTR usr_attr)
&& (mypwd = mypwnam(state.msg_attr.user)) != 0
&& stat_as(mypwd->pw_dir, &st, mypwd->pw_uid, mypwd->pw_gid) < 0)
return (defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"cannot access home directory %s: %m",
mypwd->pw_dir));
if (deliver_dotforward(state, usr_attr, &status) == 0
@@ -263,13 +263,13 @@ int deliver_recipient(LOCAL_STATE state, USER_ATTR usr_attr)
}
if (canon_owner) {
rcpt_stat = bounce_one(BOUNCE_FLAGS(state.request),
- BOUNCE_ONE_ATTR(state.msg_attr),
+ BOUNCE_ONE_ATTR(state.msg_attr, "5.4.6"),
"mail forwarding loop for %s",
state.msg_attr.recipient);
vstring_free(canon_owner);
} else {
rcpt_stat = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.4.6"),
"mail forwarding loop for %s",
state.msg_attr.recipient);
}
@@ -309,7 +309,7 @@ int deliver_recipient(LOCAL_STATE state, USER_ATTR usr_attr)
*/
if (state.msg_attr.user[0] == 0)
return (bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.1.3"),
"null username in %s", state.msg_attr.recipient));
/*
diff --git a/postfix/src/local/resolve.c b/postfix/src/local/resolve.c
index f495b6d81..f89ffcff2 100644
--- a/postfix/src/local/resolve.c
+++ b/postfix/src/local/resolve.c
@@ -119,11 +119,11 @@ int deliver_resolve_tree(LOCAL_STATE state, USER_ATTR usr_attr, TOK822 *addr
*/
if (reply.flags & RESOLVE_FLAG_FAIL) {
status = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"address resolver failure");
} else if (reply.flags & RESOLVE_FLAG_ERROR) {
status = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.1.3"),
"bad recipient address syntax: %s",
STR(reply.recipient));
} else {
diff --git a/postfix/src/local/token.c b/postfix/src/local/token.c
index 7954c39ac..35dad7149 100644
--- a/postfix/src/local/token.c
+++ b/postfix/src/local/token.c
@@ -113,11 +113,11 @@ static int deliver_token_home(LOCAL_STATE state, USER_ATTR usr_attr, char *addr)
if (addr[1] != '/') { /* disallow ~user */
status = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
"bad home directory syntax for: %s", addr);
} else if (usr_attr.home == 0) { /* require user context */
status = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.3.5"),
"unknown home directory for: %s", addr);
} else if (usr_attr.home[0] == '/' && usr_attr.home[1] == 0) {
status = deliver_file(state, usr_attr, addr + 1);
@@ -151,7 +151,7 @@ int deliver_token(LOCAL_STATE state, USER_ATTR usr_attr, TOK822 *addr)
} else if (*STR(addr_buf) == '|') {
if ((local_cmd_deliver_mask & state.msg_attr.exp_type) == 0)
status = bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.7.1"),
"mail to command is restricted");
else
status = deliver_command(state, usr_attr, STR(addr_buf) + 1);
@@ -210,8 +210,8 @@ int deliver_token_stream(LOCAL_STATE state, USER_ATTR usr_attr,
}
if (vstream_ferror(fp))
status = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
- "error reading .forward file: %m");
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
+ "error reading forwarding file: %m");
vstring_free(buf);
return (status);
}
diff --git a/postfix/src/local/unknown.c b/postfix/src/local/unknown.c
index 062a32888..702cee47c 100644
--- a/postfix/src/local/unknown.c
+++ b/postfix/src/local/unknown.c
@@ -133,7 +133,7 @@ int deliver_unknown(LOCAL_STATE state, USER_ATTR usr_attr)
|| STREQ(state.msg_attr.local, MAIL_ADDR_POSTMASTER)) {
msg_warn("required alias not found: %s", state.msg_attr.local);
return (sent(BOUNCE_FLAGS(state.request),
- SENT_ATTR(state.msg_attr),
+ SENT_ATTR(state.msg_attr, "2.0.0"),
"discarded"));
}
@@ -141,6 +141,6 @@ int deliver_unknown(LOCAL_STATE state, USER_ATTR usr_attr)
* Bounce the message when no luser relay is specified.
*/
return (bounce_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "5.1.1"),
"unknown user: \"%s\"", state.msg_attr.local));
}
diff --git a/postfix/src/master/Makefile.in b/postfix/src/master/Makefile.in
index d21f674c8..a6ae05998 100644
--- a/postfix/src/master/Makefile.in
+++ b/postfix/src/master/Makefile.in
@@ -73,239 +73,240 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-mail_flow.o: mail_flow.c
-mail_flow.o: ../../include/sys_defs.h
-mail_flow.o: ../../include/msg.h
mail_flow.o: ../../include/iostuff.h
+mail_flow.o: ../../include/msg.h
+mail_flow.o: ../../include/sys_defs.h
+mail_flow.o: mail_flow.c
mail_flow.o: mail_flow.h
mail_flow.o: master_proto.h
-master.o: master.c
-master.o: ../../include/sys_defs.h
+master.o: ../../include/argv.h
+master.o: ../../include/clean_env.h
+master.o: ../../include/debug_process.h
master.o: ../../include/events.h
+master.o: ../../include/inet_proto.h
+master.o: ../../include/iostuff.h
+master.o: ../../include/mail_conf.h
+master.o: ../../include/mail_params.h
+master.o: ../../include/mail_task.h
+master.o: ../../include/mail_version.h
master.o: ../../include/msg.h
master.o: ../../include/msg_syslog.h
-master.o: ../../include/vstring.h
-master.o: ../../include/vbuf.h
+master.o: ../../include/myflock.h
master.o: ../../include/mymalloc.h
-master.o: ../../include/iostuff.h
-master.o: ../../include/vstream.h
+master.o: ../../include/open_lock.h
+master.o: ../../include/safe.h
master.o: ../../include/stringops.h
-master.o: ../../include/myflock.h
+master.o: ../../include/sys_defs.h
+master.o: ../../include/vbuf.h
+master.o: ../../include/vstream.h
+master.o: ../../include/vstring.h
master.o: ../../include/watchdog.h
-master.o: ../../include/clean_env.h
-master.o: ../../include/argv.h
-master.o: ../../include/safe.h
-master.o: ../../include/mail_params.h
-master.o: ../../include/mail_version.h
-master.o: ../../include/debug_process.h
-master.o: ../../include/mail_task.h
-master.o: ../../include/mail_conf.h
-master.o: ../../include/open_lock.h
-master.o: ../../include/inet_proto.h
+master.o: master.c
master.o: master.h
-master_avail.o: master_avail.c
-master_avail.o: ../../include/sys_defs.h
master_avail.o: ../../include/events.h
master_avail.o: ../../include/msg.h
-master_avail.o: master_proto.h
+master_avail.o: ../../include/sys_defs.h
master_avail.o: master.h
-master_conf.o: master_conf.c
-master_conf.o: ../../include/sys_defs.h
-master_conf.o: ../../include/msg.h
+master_avail.o: master_avail.c
+master_avail.o: master_proto.h
master_conf.o: ../../include/argv.h
+master_conf.o: ../../include/msg.h
+master_conf.o: ../../include/sys_defs.h
master_conf.o: master.h
-master_ent.o: master_ent.c
-master_ent.o: ../../include/sys_defs.h
-master_ent.o: ../../include/msg.h
-master_ent.o: ../../include/mymalloc.h
-master_ent.o: ../../include/vstring.h
-master_ent.o: ../../include/vbuf.h
-master_ent.o: ../../include/vstream.h
+master_conf.o: master_conf.c
master_ent.o: ../../include/argv.h
-master_ent.o: ../../include/stringops.h
-master_ent.o: ../../include/readlline.h
-master_ent.o: ../../include/inet_addr_list.h
-master_ent.o: ../../include/myaddrinfo.h
+master_ent.o: ../../include/attr.h
master_ent.o: ../../include/host_port.h
master_ent.o: ../../include/inet_addr_host.h
-master_ent.o: ../../include/mail_proto.h
+master_ent.o: ../../include/inet_addr_list.h
master_ent.o: ../../include/iostuff.h
-master_ent.o: ../../include/attr.h
master_ent.o: ../../include/mail_params.h
+master_ent.o: ../../include/mail_proto.h
+master_ent.o: ../../include/msg.h
+master_ent.o: ../../include/myaddrinfo.h
+master_ent.o: ../../include/mymalloc.h
master_ent.o: ../../include/own_inet_addr.h
+master_ent.o: ../../include/readlline.h
+master_ent.o: ../../include/stringops.h
+master_ent.o: ../../include/sys_defs.h
+master_ent.o: ../../include/vbuf.h
+master_ent.o: ../../include/vstream.h
+master_ent.o: ../../include/vstring.h
master_ent.o: ../../include/wildcard_inet_addr.h
-master_ent.o: master_proto.h
master_ent.o: master.h
-master_flow.o: master_flow.c
-master_flow.o: ../../include/sys_defs.h
-master_flow.o: ../../include/msg.h
+master_ent.o: master_ent.c
+master_ent.o: master_proto.h
master_flow.o: ../../include/iostuff.h
+master_flow.o: ../../include/msg.h
+master_flow.o: ../../include/sys_defs.h
master_flow.o: master.h
+master_flow.o: master_flow.c
master_flow.o: master_proto.h
-master_listen.o: master_listen.c
-master_listen.o: ../../include/sys_defs.h
-master_listen.o: ../../include/msg.h
-master_listen.o: ../../include/listen.h
-master_listen.o: ../../include/iostuff.h
-master_listen.o: ../../include/mymalloc.h
-master_listen.o: ../../include/stringops.h
-master_listen.o: ../../include/vstring.h
-master_listen.o: ../../include/vbuf.h
master_listen.o: ../../include/inet_addr_list.h
+master_listen.o: ../../include/iostuff.h
+master_listen.o: ../../include/listen.h
+master_listen.o: ../../include/mail_params.h
+master_listen.o: ../../include/msg.h
master_listen.o: ../../include/myaddrinfo.h
+master_listen.o: ../../include/mymalloc.h
master_listen.o: ../../include/set_eugid.h
master_listen.o: ../../include/set_ugid.h
master_listen.o: ../../include/sock_addr.h
-master_listen.o: ../../include/mail_params.h
+master_listen.o: ../../include/stringops.h
+master_listen.o: ../../include/sys_defs.h
+master_listen.o: ../../include/vbuf.h
+master_listen.o: ../../include/vstring.h
master_listen.o: master.h
-master_proto.o: master_proto.c
-master_proto.o: ../../include/sys_defs.h
+master_listen.o: master_listen.c
master_proto.o: ../../include/msg.h
+master_proto.o: ../../include/sys_defs.h
+master_proto.o: master_proto.c
master_proto.o: master_proto.h
-master_service.o: master_service.c
-master_service.o: ../../include/sys_defs.h
master_service.o: ../../include/msg.h
master_service.o: ../../include/mymalloc.h
+master_service.o: ../../include/sys_defs.h
master_service.o: master.h
-master_sig.o: master_sig.c
-master_sig.o: ../../include/sys_defs.h
+master_service.o: master_service.c
+master_sig.o: ../../include/events.h
+master_sig.o: ../../include/iostuff.h
master_sig.o: ../../include/msg.h
master_sig.o: ../../include/posix_signals.h
+master_sig.o: ../../include/sys_defs.h
master_sig.o: master.h
-master_sig.o: ../../include/iostuff.h
-master_sig.o: ../../include/events.h
-master_spawn.o: master_spawn.c
-master_spawn.o: ../../include/sys_defs.h
-master_spawn.o: ../../include/msg.h
+master_sig.o: master_sig.c
+master_spawn.o: ../../include/argv.h
master_spawn.o: ../../include/binhash.h
-master_spawn.o: ../../include/mymalloc.h
master_spawn.o: ../../include/events.h
-master_spawn.o: ../../include/vstring.h
+master_spawn.o: ../../include/msg.h
+master_spawn.o: ../../include/mymalloc.h
+master_spawn.o: ../../include/sys_defs.h
master_spawn.o: ../../include/vbuf.h
-master_spawn.o: ../../include/argv.h
-master_spawn.o: master_proto.h
+master_spawn.o: ../../include/vstring.h
master_spawn.o: master.h
-master_status.o: master_status.c
-master_status.o: ../../include/sys_defs.h
-master_status.o: ../../include/msg.h
-master_status.o: ../../include/events.h
+master_spawn.o: master_proto.h
+master_spawn.o: master_spawn.c
master_status.o: ../../include/binhash.h
+master_status.o: ../../include/events.h
master_status.o: ../../include/iostuff.h
-master_status.o: master_proto.h
+master_status.o: ../../include/msg.h
+master_status.o: ../../include/sys_defs.h
master_status.o: master.h
-master_vars.o: master_vars.c
-master_vars.o: ../../include/sys_defs.h
+master_status.o: master_proto.h
+master_status.o: master_status.c
+master_vars.o: ../../include/mail_conf.h
+master_vars.o: ../../include/mail_params.h
master_vars.o: ../../include/msg.h
+master_vars.o: ../../include/mymalloc.h
master_vars.o: ../../include/stringops.h
-master_vars.o: ../../include/vstring.h
+master_vars.o: ../../include/sys_defs.h
master_vars.o: ../../include/vbuf.h
-master_vars.o: ../../include/mymalloc.h
-master_vars.o: ../../include/mail_conf.h
-master_vars.o: ../../include/mail_params.h
+master_vars.o: ../../include/vstring.h
master_vars.o: master.h
-master_wakeup.o: master_wakeup.c
-master_wakeup.o: ../../include/sys_defs.h
-master_wakeup.o: ../../include/msg.h
-master_wakeup.o: ../../include/trigger.h
+master_vars.o: master_vars.c
+master_wakeup.o: ../../include/attr.h
master_wakeup.o: ../../include/events.h
+master_wakeup.o: ../../include/iostuff.h
+master_wakeup.o: ../../include/mail_params.h
+master_wakeup.o: ../../include/mail_proto.h
+master_wakeup.o: ../../include/msg.h
master_wakeup.o: ../../include/set_eugid.h
master_wakeup.o: ../../include/set_ugid.h
-master_wakeup.o: ../../include/mail_proto.h
-master_wakeup.o: ../../include/vstream.h
+master_wakeup.o: ../../include/sys_defs.h
+master_wakeup.o: ../../include/trigger.h
master_wakeup.o: ../../include/vbuf.h
-master_wakeup.o: ../../include/iostuff.h
-master_wakeup.o: ../../include/attr.h
-master_wakeup.o: ../../include/mail_params.h
+master_wakeup.o: ../../include/vstream.h
master_wakeup.o: mail_server.h
master_wakeup.o: master.h
-multi_server.o: multi_server.c
-multi_server.o: ../../include/sys_defs.h
-multi_server.o: ../../include/msg.h
-multi_server.o: ../../include/msg_syslog.h
+master_wakeup.o: master_wakeup.c
multi_server.o: ../../include/chroot_uid.h
-multi_server.o: ../../include/listen.h
-multi_server.o: ../../include/iostuff.h
+multi_server.o: ../../include/debug_process.h
multi_server.o: ../../include/events.h
-multi_server.o: ../../include/vstring.h
-multi_server.o: ../../include/vbuf.h
-multi_server.o: ../../include/vstream.h
+multi_server.o: ../../include/iostuff.h
+multi_server.o: ../../include/listen.h
+multi_server.o: ../../include/mail_conf.h
+multi_server.o: ../../include/mail_dict.h
+multi_server.o: ../../include/mail_params.h
+multi_server.o: ../../include/mail_task.h
+multi_server.o: ../../include/msg.h
+multi_server.o: ../../include/msg_syslog.h
multi_server.o: ../../include/msg_vstream.h
-multi_server.o: ../../include/mymalloc.h
-multi_server.o: ../../include/stringops.h
-multi_server.o: ../../include/sane_accept.h
multi_server.o: ../../include/myflock.h
+multi_server.o: ../../include/mymalloc.h
+multi_server.o: ../../include/resolve_local.h
multi_server.o: ../../include/safe_open.h
-multi_server.o: ../../include/watchdog.h
+multi_server.o: ../../include/sane_accept.h
multi_server.o: ../../include/split_at.h
-multi_server.o: ../../include/mail_task.h
-multi_server.o: ../../include/debug_process.h
-multi_server.o: ../../include/mail_params.h
-multi_server.o: ../../include/mail_conf.h
-multi_server.o: ../../include/mail_dict.h
+multi_server.o: ../../include/stringops.h
+multi_server.o: ../../include/sys_defs.h
multi_server.o: ../../include/timed_ipc.h
-multi_server.o: ../../include/resolve_local.h
+multi_server.o: ../../include/vbuf.h
+multi_server.o: ../../include/vstream.h
+multi_server.o: ../../include/vstring.h
+multi_server.o: ../../include/watchdog.h
multi_server.o: mail_flow.h
-multi_server.o: master_proto.h
multi_server.o: mail_server.h
-single_server.o: single_server.c
-single_server.o: ../../include/sys_defs.h
-single_server.o: ../../include/msg.h
-single_server.o: ../../include/msg_syslog.h
+multi_server.o: master_proto.h
+multi_server.o: multi_server.c
single_server.o: ../../include/chroot_uid.h
-single_server.o: ../../include/vstring.h
-single_server.o: ../../include/vbuf.h
-single_server.o: ../../include/vstream.h
-single_server.o: ../../include/msg_vstream.h
-single_server.o: ../../include/mymalloc.h
+single_server.o: ../../include/debug_process.h
single_server.o: ../../include/events.h
single_server.o: ../../include/iostuff.h
-single_server.o: ../../include/stringops.h
-single_server.o: ../../include/sane_accept.h
-single_server.o: ../../include/myflock.h
-single_server.o: ../../include/safe_open.h
single_server.o: ../../include/listen.h
-single_server.o: ../../include/watchdog.h
-single_server.o: ../../include/split_at.h
-single_server.o: ../../include/mail_params.h
-single_server.o: ../../include/mail_task.h
-single_server.o: ../../include/debug_process.h
single_server.o: ../../include/mail_conf.h
single_server.o: ../../include/mail_dict.h
-single_server.o: ../../include/timed_ipc.h
+single_server.o: ../../include/mail_params.h
+single_server.o: ../../include/mail_task.h
+single_server.o: ../../include/msg.h
+single_server.o: ../../include/msg_syslog.h
+single_server.o: ../../include/msg_vstream.h
+single_server.o: ../../include/myflock.h
+single_server.o: ../../include/mymalloc.h
single_server.o: ../../include/resolve_local.h
+single_server.o: ../../include/safe_open.h
+single_server.o: ../../include/sane_accept.h
+single_server.o: ../../include/split_at.h
+single_server.o: ../../include/stringops.h
+single_server.o: ../../include/sys_defs.h
+single_server.o: ../../include/timed_ipc.h
+single_server.o: ../../include/vbuf.h
+single_server.o: ../../include/vstream.h
+single_server.o: ../../include/vstring.h
+single_server.o: ../../include/watchdog.h
single_server.o: mail_flow.h
-single_server.o: master_proto.h
single_server.o: mail_server.h
-trigger_server.o: trigger_server.c
-trigger_server.o: ../../include/sys_defs.h
-trigger_server.o: ../../include/msg.h
-trigger_server.o: ../../include/msg_syslog.h
+single_server.o: master_proto.h
+single_server.o: single_server.c
trigger_server.o: ../../include/chroot_uid.h
-trigger_server.o: ../../include/vstring.h
-trigger_server.o: ../../include/vbuf.h
-trigger_server.o: ../../include/vstream.h
-trigger_server.o: ../../include/msg_vstream.h
-trigger_server.o: ../../include/mymalloc.h
+trigger_server.o: ../../include/debug_process.h
trigger_server.o: ../../include/events.h
trigger_server.o: ../../include/iostuff.h
-trigger_server.o: ../../include/stringops.h
-trigger_server.o: ../../include/sane_accept.h
-trigger_server.o: ../../include/myflock.h
-trigger_server.o: ../../include/safe_open.h
trigger_server.o: ../../include/listen.h
-trigger_server.o: ../../include/watchdog.h
-trigger_server.o: ../../include/split_at.h
-trigger_server.o: ../../include/mail_params.h
-trigger_server.o: ../../include/mail_task.h
-trigger_server.o: ../../include/debug_process.h
trigger_server.o: ../../include/mail_conf.h
trigger_server.o: ../../include/mail_dict.h
+trigger_server.o: ../../include/mail_params.h
+trigger_server.o: ../../include/mail_task.h
+trigger_server.o: ../../include/msg.h
+trigger_server.o: ../../include/msg_syslog.h
+trigger_server.o: ../../include/msg_vstream.h
+trigger_server.o: ../../include/myflock.h
+trigger_server.o: ../../include/mymalloc.h
trigger_server.o: ../../include/resolve_local.h
+trigger_server.o: ../../include/safe_open.h
+trigger_server.o: ../../include/sane_accept.h
+trigger_server.o: ../../include/split_at.h
+trigger_server.o: ../../include/stringops.h
+trigger_server.o: ../../include/sys_defs.h
+trigger_server.o: ../../include/vbuf.h
+trigger_server.o: ../../include/vstream.h
+trigger_server.o: ../../include/vstring.h
+trigger_server.o: ../../include/watchdog.h
trigger_server.o: mail_flow.h
-trigger_server.o: master_proto.h
trigger_server.o: mail_server.h
+trigger_server.o: master_proto.h
+trigger_server.o: trigger_server.c
diff --git a/postfix/src/oqmgr/Makefile.in b/postfix/src/oqmgr/Makefile.in
index 509875b75..26ed78b79 100644
--- a/postfix/src/oqmgr/Makefile.in
+++ b/postfix/src/oqmgr/Makefile.in
@@ -52,199 +52,202 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-qmgr.o: qmgr.c
-qmgr.o: ../../include/sys_defs.h
-qmgr.o: ../../include/msg.h
-qmgr.o: ../../include/events.h
-qmgr.o: ../../include/vstream.h
-qmgr.o: ../../include/vbuf.h
-qmgr.o: ../../include/dict.h
qmgr.o: ../../include/argv.h
-qmgr.o: ../../include/mail_queue.h
-qmgr.o: ../../include/vstring.h
-qmgr.o: ../../include/recipient_list.h
+qmgr.o: ../../include/attr.h
+qmgr.o: ../../include/dict.h
+qmgr.o: ../../include/events.h
+qmgr.o: ../../include/flush_clnt.h
+qmgr.o: ../../include/iostuff.h
qmgr.o: ../../include/mail_conf.h
+qmgr.o: ../../include/mail_flow.h
qmgr.o: ../../include/mail_params.h
qmgr.o: ../../include/mail_proto.h
-qmgr.o: ../../include/iostuff.h
-qmgr.o: ../../include/attr.h
-qmgr.o: ../../include/mail_flow.h
-qmgr.o: ../../include/flush_clnt.h
-qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/mail_queue.h
qmgr.o: ../../include/mail_server.h
-qmgr.o: qmgr.h
+qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/msg.h
+qmgr.o: ../../include/recipient_list.h
qmgr.o: ../../include/scan_dir.h
-qmgr_active.o: qmgr_active.c
-qmgr_active.o: ../../include/sys_defs.h
-qmgr_active.o: ../../include/msg.h
+qmgr.o: ../../include/sys_defs.h
+qmgr.o: ../../include/vbuf.h
+qmgr.o: ../../include/vstream.h
+qmgr.o: ../../include/vstring.h
+qmgr.o: qmgr.c
+qmgr.o: qmgr.h
+qmgr_active.o: ../../include/abounce.h
+qmgr_active.o: ../../include/bounce.h
+qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/deliver_request.h
qmgr_active.o: ../../include/events.h
-qmgr_active.o: ../../include/mymalloc.h
-qmgr_active.o: ../../include/vstream.h
-qmgr_active.o: ../../include/vbuf.h
-qmgr_active.o: ../../include/mail_params.h
qmgr_active.o: ../../include/mail_open_ok.h
+qmgr_active.o: ../../include/mail_params.h
qmgr_active.o: ../../include/mail_queue.h
-qmgr_active.o: ../../include/vstring.h
+qmgr_active.o: ../../include/msg.h
+qmgr_active.o: ../../include/mymalloc.h
+qmgr_active.o: ../../include/rec_type.h
qmgr_active.o: ../../include/recipient_list.h
-qmgr_active.o: ../../include/bounce.h
-qmgr_active.o: ../../include/deliver_request.h
-qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/scan_dir.h
+qmgr_active.o: ../../include/sys_defs.h
qmgr_active.o: ../../include/trace.h
-qmgr_active.o: ../../include/abounce.h
-qmgr_active.o: ../../include/rec_type.h
+qmgr_active.o: ../../include/vbuf.h
+qmgr_active.o: ../../include/vstream.h
+qmgr_active.o: ../../include/vstring.h
qmgr_active.o: qmgr.h
-qmgr_active.o: ../../include/scan_dir.h
-qmgr_bounce.o: qmgr_bounce.c
-qmgr_bounce.o: ../../include/sys_defs.h
+qmgr_active.o: qmgr_active.c
qmgr_bounce.o: ../../include/bounce.h
+qmgr_bounce.o: ../../include/deliver_completed.h
qmgr_bounce.o: ../../include/deliver_request.h
-qmgr_bounce.o: ../../include/vstring.h
+qmgr_bounce.o: ../../include/recipient_list.h
+qmgr_bounce.o: ../../include/scan_dir.h
+qmgr_bounce.o: ../../include/sys_defs.h
qmgr_bounce.o: ../../include/vbuf.h
qmgr_bounce.o: ../../include/vstream.h
-qmgr_bounce.o: ../../include/recipient_list.h
-qmgr_bounce.o: ../../include/deliver_completed.h
+qmgr_bounce.o: ../../include/vstring.h
qmgr_bounce.o: qmgr.h
-qmgr_bounce.o: ../../include/scan_dir.h
-qmgr_defer.o: qmgr_defer.c
-qmgr_defer.o: ../../include/sys_defs.h
-qmgr_defer.o: ../../include/msg.h
-qmgr_defer.o: ../../include/vstream.h
-qmgr_defer.o: ../../include/vbuf.h
-qmgr_defer.o: ../../include/defer.h
+qmgr_bounce.o: qmgr_bounce.c
qmgr_defer.o: ../../include/bounce.h
+qmgr_defer.o: ../../include/defer.h
qmgr_defer.o: ../../include/deliver_request.h
-qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: ../../include/msg.h
qmgr_defer.o: ../../include/recipient_list.h
-qmgr_defer.o: qmgr.h
qmgr_defer.o: ../../include/scan_dir.h
-qmgr_deliver.o: qmgr_deliver.c
-qmgr_deliver.o: ../../include/sys_defs.h
-qmgr_deliver.o: ../../include/msg.h
-qmgr_deliver.o: ../../include/vstring.h
-qmgr_deliver.o: ../../include/vbuf.h
-qmgr_deliver.o: ../../include/vstream.h
-qmgr_deliver.o: ../../include/vstring_vstream.h
+qmgr_defer.o: ../../include/sys_defs.h
+qmgr_defer.o: ../../include/vbuf.h
+qmgr_defer.o: ../../include/vstream.h
+qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: qmgr.h
+qmgr_defer.o: qmgr_defer.c
+qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/dsn_util.h
qmgr_deliver.o: ../../include/events.h
qmgr_deliver.o: ../../include/iostuff.h
-qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/mail_params.h
qmgr_deliver.o: ../../include/mail_proto.h
-qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/msg.h
qmgr_deliver.o: ../../include/recipient_list.h
-qmgr_deliver.o: ../../include/mail_params.h
-qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/scan_dir.h
+qmgr_deliver.o: ../../include/stringops.h
+qmgr_deliver.o: ../../include/sys_defs.h
+qmgr_deliver.o: ../../include/vbuf.h
qmgr_deliver.o: ../../include/verp_sender.h
+qmgr_deliver.o: ../../include/vstream.h
+qmgr_deliver.o: ../../include/vstring.h
+qmgr_deliver.o: ../../include/vstring_vstream.h
qmgr_deliver.o: qmgr.h
-qmgr_deliver.o: ../../include/scan_dir.h
-qmgr_enable.o: qmgr_enable.c
-qmgr_enable.o: ../../include/sys_defs.h
+qmgr_deliver.o: qmgr_deliver.c
qmgr_enable.o: ../../include/msg.h
-qmgr_enable.o: ../../include/vstream.h
+qmgr_enable.o: ../../include/scan_dir.h
+qmgr_enable.o: ../../include/sys_defs.h
qmgr_enable.o: ../../include/vbuf.h
+qmgr_enable.o: ../../include/vstream.h
qmgr_enable.o: qmgr.h
-qmgr_enable.o: ../../include/scan_dir.h
-qmgr_entry.o: qmgr_entry.c
-qmgr_entry.o: ../../include/sys_defs.h
+qmgr_enable.o: qmgr_enable.c
+qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/events.h
+qmgr_entry.o: ../../include/mail_params.h
qmgr_entry.o: ../../include/msg.h
qmgr_entry.o: ../../include/mymalloc.h
-qmgr_entry.o: ../../include/events.h
-qmgr_entry.o: ../../include/vstream.h
+qmgr_entry.o: ../../include/recipient_list.h
+qmgr_entry.o: ../../include/scan_dir.h
+qmgr_entry.o: ../../include/sys_defs.h
qmgr_entry.o: ../../include/vbuf.h
-qmgr_entry.o: ../../include/mail_params.h
-qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/vstream.h
qmgr_entry.o: ../../include/vstring.h
-qmgr_entry.o: ../../include/recipient_list.h
qmgr_entry.o: qmgr.h
-qmgr_entry.o: ../../include/scan_dir.h
-qmgr_message.o: qmgr_message.c
-qmgr_message.o: ../../include/sys_defs.h
-qmgr_message.o: ../../include/msg.h
-qmgr_message.o: ../../include/mymalloc.h
-qmgr_message.o: ../../include/vstring.h
-qmgr_message.o: ../../include/vbuf.h
-qmgr_message.o: ../../include/vstream.h
-qmgr_message.o: ../../include/split_at.h
-qmgr_message.o: ../../include/valid_hostname.h
+qmgr_entry.o: qmgr_entry.c
qmgr_message.o: ../../include/argv.h
-qmgr_message.o: ../../include/stringops.h
-qmgr_message.o: ../../include/myflock.h
-qmgr_message.o: ../../include/dict.h
-qmgr_message.o: ../../include/mail_queue.h
-qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/attr.h
qmgr_message.o: ../../include/canon_addr.h
-qmgr_message.o: ../../include/record.h
-qmgr_message.o: ../../include/rec_type.h
-qmgr_message.o: ../../include/sent.h
-qmgr_message.o: ../../include/deliver_request.h
-qmgr_message.o: ../../include/recipient_list.h
qmgr_message.o: ../../include/deliver_completed.h
-qmgr_message.o: ../../include/opened.h
-qmgr_message.o: ../../include/verp_sender.h
-qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/deliver_request.h
+qmgr_message.o: ../../include/dict.h
qmgr_message.o: ../../include/iostuff.h
-qmgr_message.o: ../../include/attr.h
+qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/mail_queue.h
+qmgr_message.o: ../../include/msg.h
+qmgr_message.o: ../../include/myflock.h
+qmgr_message.o: ../../include/mymalloc.h
+qmgr_message.o: ../../include/opened.h
qmgr_message.o: ../../include/qmgr_user.h
-qmgr_message.o: ../../include/split_addr.h
-qmgr_message.o: ../../include/rewrite_clnt.h
+qmgr_message.o: ../../include/rec_type.h
+qmgr_message.o: ../../include/recipient_list.h
+qmgr_message.o: ../../include/record.h
qmgr_message.o: ../../include/resolve_clnt.h
-qmgr_message.o: qmgr.h
+qmgr_message.o: ../../include/rewrite_clnt.h
qmgr_message.o: ../../include/scan_dir.h
-qmgr_move.o: qmgr_move.c
-qmgr_move.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/sent.h
+qmgr_message.o: ../../include/split_addr.h
+qmgr_message.o: ../../include/split_at.h
+qmgr_message.o: ../../include/stringops.h
+qmgr_message.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/valid_hostname.h
+qmgr_message.o: ../../include/vbuf.h
+qmgr_message.o: ../../include/verp_sender.h
+qmgr_message.o: ../../include/vstream.h
+qmgr_message.o: ../../include/vstring.h
+qmgr_message.o: qmgr.h
+qmgr_message.o: qmgr_message.c
+qmgr_move.o: ../../include/mail_queue.h
+qmgr_move.o: ../../include/mail_scan_dir.h
qmgr_move.o: ../../include/msg.h
-qmgr_move.o: ../../include/scan_dir.h
qmgr_move.o: ../../include/recipient_list.h
-qmgr_move.o: ../../include/mail_queue.h
-qmgr_move.o: ../../include/vstring.h
+qmgr_move.o: ../../include/scan_dir.h
+qmgr_move.o: ../../include/sys_defs.h
qmgr_move.o: ../../include/vbuf.h
qmgr_move.o: ../../include/vstream.h
-qmgr_move.o: ../../include/mail_scan_dir.h
+qmgr_move.o: ../../include/vstring.h
qmgr_move.o: qmgr.h
-qmgr_queue.o: qmgr_queue.c
-qmgr_queue.o: ../../include/sys_defs.h
-qmgr_queue.o: ../../include/msg.h
-qmgr_queue.o: ../../include/mymalloc.h
+qmgr_move.o: qmgr_move.c
qmgr_queue.o: ../../include/events.h
qmgr_queue.o: ../../include/htable.h
qmgr_queue.o: ../../include/mail_params.h
+qmgr_queue.o: ../../include/msg.h
+qmgr_queue.o: ../../include/mymalloc.h
qmgr_queue.o: ../../include/recipient_list.h
-qmgr_queue.o: qmgr.h
-qmgr_queue.o: ../../include/vstream.h
-qmgr_queue.o: ../../include/vbuf.h
qmgr_queue.o: ../../include/scan_dir.h
-qmgr_rcpt_list.o: qmgr_rcpt_list.c
-qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/vbuf.h
+qmgr_queue.o: ../../include/vstream.h
+qmgr_queue.o: qmgr.h
+qmgr_queue.o: qmgr_queue.c
qmgr_rcpt_list.o: ../../include/mymalloc.h
-qmgr_rcpt_list.o: qmgr.h
-qmgr_rcpt_list.o: ../../include/vstream.h
-qmgr_rcpt_list.o: ../../include/vbuf.h
qmgr_rcpt_list.o: ../../include/scan_dir.h
-qmgr_scan.o: qmgr_scan.c
-qmgr_scan.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/vbuf.h
+qmgr_rcpt_list.o: ../../include/vstream.h
+qmgr_rcpt_list.o: qmgr.h
+qmgr_rcpt_list.o: qmgr_rcpt_list.c
+qmgr_scan.o: ../../include/mail_scan_dir.h
qmgr_scan.o: ../../include/msg.h
qmgr_scan.o: ../../include/mymalloc.h
qmgr_scan.o: ../../include/scan_dir.h
-qmgr_scan.o: ../../include/mail_scan_dir.h
-qmgr_scan.o: qmgr.h
-qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: ../../include/sys_defs.h
qmgr_scan.o: ../../include/vbuf.h
-qmgr_transport.o: qmgr_transport.c
-qmgr_transport.o: ../../include/sys_defs.h
-qmgr_transport.o: ../../include/msg.h
-qmgr_transport.o: ../../include/htable.h
+qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: qmgr.h
+qmgr_scan.o: qmgr_scan.c
+qmgr_transport.o: ../../include/attr.h
qmgr_transport.o: ../../include/events.h
-qmgr_transport.o: ../../include/mymalloc.h
-qmgr_transport.o: ../../include/vstream.h
-qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/htable.h
qmgr_transport.o: ../../include/iostuff.h
-qmgr_transport.o: ../../include/mail_proto.h
-qmgr_transport.o: ../../include/attr.h
-qmgr_transport.o: ../../include/recipient_list.h
qmgr_transport.o: ../../include/mail_conf.h
qmgr_transport.o: ../../include/mail_params.h
-qmgr_transport.o: qmgr.h
+qmgr_transport.o: ../../include/mail_proto.h
+qmgr_transport.o: ../../include/msg.h
+qmgr_transport.o: ../../include/mymalloc.h
+qmgr_transport.o: ../../include/recipient_list.h
qmgr_transport.o: ../../include/scan_dir.h
+qmgr_transport.o: ../../include/sys_defs.h
+qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/vstream.h
+qmgr_transport.o: qmgr.h
+qmgr_transport.o: qmgr_transport.c
diff --git a/postfix/src/oqmgr/qmgr.h b/postfix/src/oqmgr/qmgr.h
index 0cac1664d..40e5699ac 100644
--- a/postfix/src/oqmgr/qmgr.h
+++ b/postfix/src/oqmgr/qmgr.h
@@ -111,6 +111,7 @@ struct QMGR_TRANSPORT {
struct HTABLE *queue_byname; /* queues indexed by domain */
QMGR_QUEUE_LIST queue_list; /* queues, round robin order */
QMGR_TRANSPORT_LIST peers; /* linkage */
+ char *dsn; /* why unavailable */
char *reason; /* why unavailable */
};
@@ -120,7 +121,7 @@ struct QMGR_TRANSPORT {
typedef void (*QMGR_TRANSPORT_ALLOC_NOTIFY) (QMGR_TRANSPORT *, VSTREAM *);
extern QMGR_TRANSPORT *qmgr_transport_select(void);
extern void qmgr_transport_alloc(QMGR_TRANSPORT *, QMGR_TRANSPORT_ALLOC_NOTIFY);
-extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *);
+extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *, const char *);
extern void qmgr_transport_unthrottle(QMGR_TRANSPORT *);
extern QMGR_TRANSPORT *qmgr_transport_create(const char *);
extern QMGR_TRANSPORT *qmgr_transport_find(const char *);
@@ -151,6 +152,7 @@ struct QMGR_QUEUE {
QMGR_ENTRY_LIST todo; /* todo queue entries */
QMGR_ENTRY_LIST busy; /* messages on the wire */
QMGR_QUEUE_LIST peers; /* neighbor queues */
+ char *dsn; /* why unavailable */
char *reason; /* why unavailable */
time_t clog_time_to_warn; /* time of next warning */
};
@@ -163,7 +165,7 @@ extern int qmgr_queue_count;
extern QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *, const char *, const char *);
extern QMGR_QUEUE *qmgr_queue_select(QMGR_TRANSPORT *);
extern void qmgr_queue_done(QMGR_QUEUE *);
-extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *);
+extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *, const char *);
extern void qmgr_queue_unthrottle(QMGR_QUEUE *);
extern QMGR_QUEUE *qmgr_queue_find(QMGR_TRANSPORT *, const char *);
@@ -269,14 +271,15 @@ extern QMGR_MESSAGE *qmgr_message_realloc(QMGR_MESSAGE *);
/*
* qmgr_defer.c
*/
-extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *);
-extern void qmgr_defer_todo(QMGR_QUEUE *, const char *);
-extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *);
+extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *, const char *);
+extern void qmgr_defer_todo(QMGR_QUEUE *, const char *, const char *);
+extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *, const char *);
/*
* qmgr_bounce.c
*/
-extern void PRINTFLIKE(3, 4) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *,...);
+extern void PRINTFLIKE(4, 5) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *,
+ const char *, const char *,...);
/*
* qmgr_deliver.c
diff --git a/postfix/src/oqmgr/qmgr_bounce.c b/postfix/src/oqmgr/qmgr_bounce.c
index 284342d6d..ef870c610 100644
--- a/postfix/src/oqmgr/qmgr_bounce.c
+++ b/postfix/src/oqmgr/qmgr_bounce.c
@@ -6,9 +6,11 @@
/* SYNOPSIS
/* #include "qmgr.h"
/*
-/* QMGR_QUEUE *qmgr_bounce_recipient(message, recipient, format, ...)
+/* QMGR_QUEUE *qmgr_bounce_recipient(message, recipient,
+/* dsn, format, ...)
/* QMGR_MESSAGE *message;
/* QMGR_RCPT *recipient;
+/* const char *dsn;
/* const char *format;
/* DESCRIPTION
/* qmgr_bounce_recipient() produces a bounce log record.
@@ -22,6 +24,8 @@
/* Open queue file with the message being bounced.
/* .IP recipient
/* The recipient that will not be delivered.
+/* .IP dsn
+/* RFC 1893 detail code.
/* .IP format
/* Free-format text that describes why delivery will not happen.
/* DIAGNOSTICS
@@ -56,7 +60,7 @@
/* qmgr_bounce_recipient - bounce one message recipient */
void qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
- const char *format,...)
+ const char *dsn, const char *format,...)
{
va_list ap;
int status;
@@ -64,8 +68,8 @@ void qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
va_start(ap, format);
status = vbounce_append(message->tflags, message->queue_id,
recipient->orig_rcpt, recipient->address,
- recipient->offset, "none", message->arrival_time,
- format, ap);
+ recipient->offset, "none", dsn,
+ message->arrival_time, format, ap);
va_end(ap);
if (status == 0)
diff --git a/postfix/src/oqmgr/qmgr_defer.c b/postfix/src/oqmgr/qmgr_defer.c
index 2f3d89787..8e1675b7e 100644
--- a/postfix/src/oqmgr/qmgr_defer.c
+++ b/postfix/src/oqmgr/qmgr_defer.c
@@ -6,17 +6,20 @@
/* SYNOPSIS
/* #include "qmgr.h"
/*
-/* void qmgr_defer_recipient(message, recipient, reason)
+/* void qmgr_defer_recipient(message, recipient, dsn, reason)
/* QMGR_MESSAGE *message;
/* QMGR_RCPT *recipient;
+/* const char *dsn;
/* const char *reason;
/*
-/* void qmgr_defer_todo(queue, reason)
+/* void qmgr_defer_todo(queue, dsn, reason)
/* QMGR_QUEUE *queue;
+/* const char *dsn;
/* const char *reason;
/*
-/* QMGR_QUEUE *qmgr_defer_transport(transport, reason)
+/* QMGR_QUEUE *qmgr_defer_transport(transport, dsn, reason)
/* QMGR_TRANSPORT *transport;
+/* const char *dsn;
/* const char *reason;
/* DESCRIPTION
/* qmgr_defer_recipient() defers delivery of the named message to
@@ -43,6 +46,8 @@
/* host (or local user).
/* .IP transport
/* Specifies a message delivery transport.
+/* .IP dsn
+/* X.YY.ZZ Error detail as specified in RFC 1893.
/* .IP reason
/* Free-format text that describes why delivery is deferred; this
/* used for logging purposes, and for updating the message-specific
@@ -81,7 +86,8 @@
/* qmgr_defer_transport - defer todo entries for named transport */
-void qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
+void qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *dsn,
+ const char *reason)
{
char *myname = "qmgr_defer_transport";
QMGR_QUEUE *queue;
@@ -90,23 +96,25 @@ void qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
/*
* Sanity checks.
*/
- if (reason == 0)
+ if (dsn == 0 || *dsn == 0)
+ msg_panic("%s: null dsn", myname);
+ if (reason == 0 || *reason == 0)
msg_panic("%s: null reason", myname);
if (msg_verbose)
- msg_info("defer transport %s: %s", transport->name, reason);
+ msg_info("defer transport %s: %s %s", transport->name, dsn, reason);
/*
* Proceed carefully. Queues may disappear as a side effect.
*/
for (queue = transport->queue_list.next; queue; queue = next) {
next = queue->peers.next;
- qmgr_defer_todo(queue, reason);
+ qmgr_defer_todo(queue, dsn, reason);
}
}
/* qmgr_defer_todo - defer all todo queue entries for specific site */
-void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
+void qmgr_defer_todo(QMGR_QUEUE *queue, const char *dsn, const char *reason)
{
char *myname = "qmgr_defer_todo";
QMGR_ENTRY *entry;
@@ -118,10 +126,12 @@ void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
/*
* Sanity checks.
*/
- if (reason == 0)
+ if (dsn == 0 || *dsn == 0)
+ msg_panic("%s: null dsn", myname);
+ if (reason == 0 || *reason == 0)
msg_panic("%s: null reason", myname);
if (msg_verbose)
- msg_info("defer site %s: %s", queue->name, reason);
+ msg_info("defer site %s: %s %s", queue->name, dsn, reason);
/*
* Proceed carefully. Queue entries will disappear as a side effect.
@@ -131,7 +141,7 @@ void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
message = entry->message;
for (nrcpt = 0; nrcpt < entry->rcpt_list.len; nrcpt++) {
recipient = entry->rcpt_list.info + nrcpt;
- qmgr_defer_recipient(message, recipient, reason);
+ qmgr_defer_recipient(message, recipient, dsn, reason);
}
qmgr_entry_done(entry, QMGR_QUEUE_TODO);
}
@@ -140,14 +150,16 @@ void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
/* qmgr_defer_recipient - defer delivery of specific recipient */
void qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
- const char *reason)
+ const char *dsn, const char *reason)
{
char *myname = "qmgr_defer_recipient";
/*
* Sanity checks.
*/
- if (reason == 0)
+ if (dsn == 0 || *dsn == 0)
+ msg_panic("%s: null dsn", myname);
+ if (reason == 0 || *reason == 0)
msg_panic("%s: reason 0", myname);
/*
@@ -155,7 +167,7 @@ void qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
*/
message->flags |= defer_append(message->tflags, message->queue_id,
recipient->orig_rcpt, recipient->address,
- recipient->offset, "none",
+ recipient->offset, "none", dsn,
message->arrival_time,
- "delivery temporarily suspended: %s", reason);
+ "delivery temporarily suspended: %s", reason);
}
diff --git a/postfix/src/oqmgr/qmgr_deliver.c b/postfix/src/oqmgr/qmgr_deliver.c
index 058aa8a55..67be2d78e 100644
--- a/postfix/src/oqmgr/qmgr_deliver.c
+++ b/postfix/src/oqmgr/qmgr_deliver.c
@@ -55,6 +55,7 @@
#include
#include
#include
+#include
/* Global library. */
@@ -64,6 +65,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -162,9 +164,9 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
ATTR_TYPE_STR, MAIL_ATTR_PROTO_NAME, message->client_proto,
ATTR_TYPE_STR, MAIL_ATTR_HELO_NAME, message->client_helo,
ATTR_TYPE_STR, MAIL_ATTR_SASL_METHOD, message->sasl_method,
- ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
+ ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
ATTR_TYPE_STR, MAIL_ATTR_SASL_SENDER, message->sasl_sender,
- ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
+ ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
ATTR_TYPE_END);
if (sender_buf != 0)
vstring_free(sender_buf);
@@ -210,6 +212,7 @@ static void qmgr_deliver_update(int unused_event, char *context)
QMGR_MESSAGE *message = entry->message;
VSTRING *reason = vstring_alloc(1);
int status;
+ DSN_SPLIT dp;
/*
* The message transport has responded. Stop the watchdog timer.
@@ -236,10 +239,11 @@ static void qmgr_deliver_update(int unused_event, char *context)
*/
if (status == DELIVER_STAT_CRASH) {
message->flags |= DELIVER_STAT_DEFER;
- qmgr_transport_throttle(transport, "unknown mail transport error");
+ qmgr_transport_throttle(transport, "4.3.0",
+ "unknown mail transport error");
msg_warn("transport %s failure -- see a previous warning/fatal/panic logfile record for the problem description",
transport->name);
- qmgr_defer_transport(transport, transport->reason);
+ qmgr_defer_transport(transport, transport->dsn, transport->reason);
}
/*
@@ -254,9 +258,12 @@ static void qmgr_deliver_update(int unused_event, char *context)
if (status == DELIVER_STAT_DEFER) {
message->flags |= DELIVER_STAT_DEFER;
if (VSTRING_LEN(reason)) {
- qmgr_queue_throttle(queue, vstring_str(reason));
+ /* Sanitize the DSN status from delivery agent. */
+ dsn_split(&dp, "4.0.0", printable(vstring_str(reason), '?'));
+ qmgr_queue_throttle(queue, dp.dsn, *dp.text ?
+ dp.text : "unknown problem");
if (queue->window == 0)
- qmgr_defer_todo(queue, queue->reason);
+ qmgr_defer_todo(queue, queue->dsn, queue->reason);
}
}
@@ -298,8 +305,9 @@ void qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
* while some other queue manipulation is happening.
*/
if (qmgr_deliver_initial_reply(stream) != 0) {
- qmgr_transport_throttle(transport, "mail transport unavailable");
- qmgr_defer_transport(transport, transport->reason);
+ qmgr_transport_throttle(transport, "4.3.0",
+ "mail transport unavailable");
+ qmgr_defer_transport(transport, transport->dsn, transport->reason);
(void) vstream_fclose(stream);
return;
}
@@ -325,8 +333,9 @@ void qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
*/
if (qmgr_deliver_send_request(entry, stream) < 0) {
qmgr_entry_unselect(queue, entry);
- qmgr_transport_throttle(transport, "mail transport unavailable");
- qmgr_defer_transport(transport, transport->reason);
+ qmgr_transport_throttle(transport, "4.3.0",
+ "mail transport unavailable");
+ qmgr_defer_transport(transport, transport->dsn, transport->reason);
/* warning: entry and queue may be dangling pointers here */
(void) vstream_fclose(stream);
return;
diff --git a/postfix/src/oqmgr/qmgr_message.c b/postfix/src/oqmgr/qmgr_message.c
index 7b09bb233..4c8838d65 100644
--- a/postfix/src/oqmgr/qmgr_message.c
+++ b/postfix/src/oqmgr/qmgr_message.c
@@ -782,10 +782,11 @@ static int qmgr_resolve_one(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
else
resolve_clnt_verify(addr, reply);
if (reply->flags & RESOLVE_FLAG_FAIL) {
- qmgr_defer_recipient(message, recipient, "address resolver failure");
+ qmgr_defer_recipient(message, recipient,
+ "4.3.0", "address resolver failure");
return (-1);
} else if (reply->flags & RESOLVE_FLAG_ERROR) {
- qmgr_bounce_recipient(message, recipient,
+ qmgr_bounce_recipient(message, recipient, "5.1.3",
"bad address syntax: \"%s\"", addr);
return (-1);
} else {
@@ -880,7 +881,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* the queue manager process does not help.
*/
if (recipient->address[0] == 0) {
- qmgr_bounce_recipient(message, recipient,
+ qmgr_bounce_recipient(message, recipient, "5.1.3",
"null recipient address");
continue;
}
@@ -897,7 +898,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* where it cannot be bypassed.
*/
if (var_allow_min_user == 0 && recipient->address[0] == '-') {
- qmgr_bounce_recipient(message, recipient,
+ qmgr_bounce_recipient(message, recipient, "5.1.3",
"invalid recipient syntax: \"%s\"",
recipient->address);
continue;
@@ -921,7 +922,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
&& !var_double_bounce_sender[len]) {
status = sent(message->tflags, message->queue_id,
recipient->orig_rcpt, recipient->address,
- recipient->offset, "none", message->arrival_time,
+ recipient->offset, "none", "2.0.0",
+ message->arrival_time,
"undeliverable postmaster notification discarded");
if (status == 0) {
deliver_completed(message->fp, recipient->offset);
@@ -944,7 +946,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
if (strcmp(*cpp, STR(reply.transport)) == 0)
break;
if (*cpp) {
- qmgr_defer_recipient(message, recipient, "deferred transport");
+ qmgr_defer_recipient(message, recipient,
+ "4.3.2", "deferred transport");
continue;
}
}
@@ -962,7 +965,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* This transport is dead. Defer delivery to this recipient.
*/
if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) != 0) {
- qmgr_defer_recipient(message, recipient, transport->reason);
+ qmgr_defer_recipient(message, recipient, transport->dsn,
+ transport->reason);
continue;
}
@@ -1029,7 +1033,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* This queue is dead. Defer delivery to this recipient.
*/
if (queue->window == 0) {
- qmgr_defer_recipient(message, recipient, queue->reason);
+ qmgr_defer_recipient(message, recipient, queue->dsn, queue->reason);
continue;
}
diff --git a/postfix/src/oqmgr/qmgr_queue.c b/postfix/src/oqmgr/qmgr_queue.c
index 9e9bb758a..0de06e45c 100644
--- a/postfix/src/oqmgr/qmgr_queue.c
+++ b/postfix/src/oqmgr/qmgr_queue.c
@@ -23,8 +23,9 @@
/* QMGR_QUEUE *qmgr_queue_select(transport)
/* QMGR_TRANSPORT *transport;
/*
-/* void qmgr_queue_throttle(queue, reason)
+/* void qmgr_queue_throttle(queue, dsn, reason)
/* QMGR_QUEUE *queue;
+/* const char *dsn;
/* const char *reason;
/*
/* void qmgr_queue_unthrottle(queue)
@@ -133,6 +134,10 @@ void qmgr_queue_unthrottle(QMGR_QUEUE *queue)
*/
if (queue->window == 0) {
event_cancel_timer(qmgr_queue_unthrottle_wrapper, (char *) queue);
+ if (queue->dsn == 0)
+ msg_panic("%s: queue %s: window 0 dsn 0", myname, queue->name);
+ myfree(queue->dsn);
+ queue->dsn = 0;
if (queue->reason == 0)
msg_panic("%s: queue %s: window 0 reason 0", myname, queue->name);
myfree(queue->reason);
@@ -154,18 +159,22 @@ void qmgr_queue_unthrottle(QMGR_QUEUE *queue)
/* qmgr_queue_throttle - handle destination delivery failure */
-void qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
+void qmgr_queue_throttle(QMGR_QUEUE *queue, const char *dsn,
+ const char *reason)
{
char *myname = "qmgr_queue_throttle";
/*
* Sanity checks.
*/
+ if (queue->dsn)
+ msg_panic("%s: queue %s: spurious dsn %s",
+ myname, queue->name, queue->dsn);
if (queue->reason)
msg_panic("%s: queue %s: spurious reason %s",
myname, queue->name, queue->reason);
if (msg_verbose)
- msg_info("%s: queue %s: %s", myname, queue->name, reason);
+ msg_info("%s: queue %s: %s %s", myname, queue->name, dsn, reason);
/*
* Decrease the destination's concurrency limit until we reach zero, at
@@ -180,6 +189,7 @@ void qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
* Special case for a site that just was declared dead.
*/
if (queue->window == 0) {
+ queue->dsn = mystrdup(dsn);
queue->reason = mystrdup(reason);
event_request_timer(qmgr_queue_unthrottle_wrapper,
(char *) queue, var_min_backoff_time);
@@ -226,6 +236,9 @@ void qmgr_queue_done(QMGR_QUEUE *queue)
msg_panic("%s: queue not empty: %s", myname, queue->name);
if (queue->window <= 0)
msg_panic("%s: window %d", myname, queue->window);
+ if (queue->dsn)
+ msg_panic("%s: queue %s: spurious dsn %s",
+ myname, queue->name, queue->dsn);
if (queue->reason)
msg_panic("%s: queue %s: spurious reason %s",
myname, queue->name, queue->reason);
@@ -265,6 +278,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name,
queue->window = transport->init_dest_concurrency;
QMGR_LIST_INIT(queue->todo);
QMGR_LIST_INIT(queue->busy);
+ queue->dsn = 0;
queue->reason = 0;
queue->clog_time_to_warn = 0;
QMGR_LIST_PREPEND(transport->queue_list, queue);
diff --git a/postfix/src/oqmgr/qmgr_transport.c b/postfix/src/oqmgr/qmgr_transport.c
index dcb4ad1fa..cbce6179a 100644
--- a/postfix/src/oqmgr/qmgr_transport.c
+++ b/postfix/src/oqmgr/qmgr_transport.c
@@ -18,8 +18,9 @@
/* QMGR_TRANSPORT *transport;
/* void (*notify)(QMGR_TRANSPORT *transport, VSTREAM *fp);
/*
-/* void qmgr_transport_throttle(transport, reason)
+/* void qmgr_transport_throttle(transport, dsn, reason)
/* QMGR_TRANSPORT *transport;
+/* const char *dsn;
/* const char *reason;
/*
/* void qmgr_transport_unthrottle(transport)
@@ -128,6 +129,10 @@ void qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
if (msg_verbose)
msg_info("%s: transport %s", myname, transport->name);
transport->flags &= ~QMGR_TRANSPORT_STAT_DEAD;
+ if (transport->dsn == 0)
+ msg_panic("%s: transport %s: null dsn", myname, transport->name);
+ myfree(transport->dsn);
+ transport->dsn = 0;
if (transport->reason == 0)
msg_panic("%s: transport %s: null reason", myname, transport->name);
myfree(transport->reason);
@@ -139,7 +144,8 @@ void qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
/* qmgr_transport_throttle - disable delivery process allocation */
-void qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
+void qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *dsn,
+ const char *reason)
{
char *myname = "qmgr_transport_throttle";
@@ -150,9 +156,13 @@ void qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
*/
if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) == 0) {
if (msg_verbose)
- msg_info("%s: transport %s: reason: %s",
- myname, transport->name, reason);
+ msg_info("%s: transport %s: dsn: %s reason: %s",
+ myname, transport->name, dsn, reason);
transport->flags |= QMGR_TRANSPORT_STAT_DEAD;
+ if (transport->dsn)
+ msg_panic("%s: transport %s: spurious dsn: %s",
+ myname, transport->name, transport->dsn);
+ transport->dsn = mystrdup(dsn);
if (transport->reason)
msg_panic("%s: transport %s: spurious reason: %s",
myname, transport->name, transport->reason);
@@ -286,7 +296,7 @@ void qmgr_transport_alloc(QMGR_TRANSPORT *transport, QMGR_TRANSPORT_ALLOC_NOT
if ((stream = mail_connect(MAIL_CLASS_PRIVATE, transport->name, BLOCK_MODE)) == 0) {
msg_warn("connect to transport %s: %m", transport->name);
- qmgr_transport_throttle(transport, "transport is unavailable");
+ qmgr_transport_throttle(transport, "4.3.0", "transport is unavailable");
return;
}
alloc = (QMGR_TRANSPORT_ALLOC *) mymalloc(sizeof(*alloc));
@@ -333,6 +343,7 @@ QMGR_TRANSPORT *qmgr_transport_create(const char *name)
transport->queue_byname = htable_create(0);
QMGR_LIST_INIT(transport->queue_list);
+ transport->dsn = 0;
transport->reason = 0;
if (qmgr_transport_byname == 0)
qmgr_transport_byname = htable_create(10);
diff --git a/postfix/src/pickup/Makefile.in b/postfix/src/pickup/Makefile.in
index 5e7436029..b5d53ee56 100644
--- a/postfix/src/pickup/Makefile.in
+++ b/postfix/src/pickup/Makefile.in
@@ -47,33 +47,34 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-pickup.o: pickup.c
-pickup.o: ../../include/sys_defs.h
-pickup.o: ../../include/msg.h
-pickup.o: ../../include/scan_dir.h
-pickup.o: ../../include/vstring.h
-pickup.o: ../../include/vbuf.h
-pickup.o: ../../include/vstream.h
-pickup.o: ../../include/set_ugid.h
-pickup.o: ../../include/safe_open.h
-pickup.o: ../../include/watchdog.h
-pickup.o: ../../include/mail_queue.h
-pickup.o: ../../include/mail_open_ok.h
-pickup.o: ../../include/mymalloc.h
-pickup.o: ../../include/mail_proto.h
-pickup.o: ../../include/iostuff.h
pickup.o: ../../include/attr.h
pickup.o: ../../include/cleanup_user.h
+pickup.o: ../../include/input_transp.h
+pickup.o: ../../include/iostuff.h
+pickup.o: ../../include/lex_822.h
+pickup.o: ../../include/mail_conf.h
pickup.o: ../../include/mail_date.h
+pickup.o: ../../include/mail_open_ok.h
pickup.o: ../../include/mail_params.h
-pickup.o: ../../include/mail_conf.h
-pickup.o: ../../include/record.h
-pickup.o: ../../include/rec_type.h
-pickup.o: ../../include/lex_822.h
-pickup.o: ../../include/input_transp.h
+pickup.o: ../../include/mail_proto.h
+pickup.o: ../../include/mail_queue.h
pickup.o: ../../include/mail_server.h
+pickup.o: ../../include/msg.h
+pickup.o: ../../include/mymalloc.h
+pickup.o: ../../include/rec_type.h
+pickup.o: ../../include/record.h
+pickup.o: ../../include/safe_open.h
+pickup.o: ../../include/scan_dir.h
+pickup.o: ../../include/set_ugid.h
+pickup.o: ../../include/sys_defs.h
+pickup.o: ../../include/vbuf.h
+pickup.o: ../../include/vstream.h
+pickup.o: ../../include/vstring.h
+pickup.o: ../../include/watchdog.h
+pickup.o: pickup.c
diff --git a/postfix/src/pipe/Makefile.in b/postfix/src/pipe/Makefile.in
index 6a676ed8f..a3b622ffe 100644
--- a/postfix/src/pipe/Makefile.in
+++ b/postfix/src/pipe/Makefile.in
@@ -47,41 +47,43 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-pipe.o: pipe.c
-pipe.o: ../../include/sys_defs.h
-pipe.o: ../../include/msg.h
-pipe.o: ../../include/vstream.h
-pipe.o: ../../include/vbuf.h
-pipe.o: ../../include/vstring.h
pipe.o: ../../include/argv.h
-pipe.o: ../../include/htable.h
+pipe.o: ../../include/bounce.h
+pipe.o: ../../include/canon_addr.h
+pipe.o: ../../include/defer.h
+pipe.o: ../../include/deliver_completed.h
+pipe.o: ../../include/deliver_request.h
pipe.o: ../../include/dict.h
+pipe.o: ../../include/dsn_util.h
+pipe.o: ../../include/flush_clnt.h
+pipe.o: ../../include/htable.h
pipe.o: ../../include/iostuff.h
-pipe.o: ../../include/mymalloc.h
pipe.o: ../../include/mac_parse.h
-pipe.o: ../../include/set_eugid.h
-pipe.o: ../../include/split_at.h
-pipe.o: ../../include/stringops.h
-pipe.o: ../../include/recipient_list.h
-pipe.o: ../../include/deliver_request.h
-pipe.o: ../../include/mail_params.h
+pipe.o: ../../include/mail_addr.h
pipe.o: ../../include/mail_conf.h
-pipe.o: ../../include/bounce.h
-pipe.o: ../../include/defer.h
-pipe.o: ../../include/deliver_completed.h
-pipe.o: ../../include/sent.h
-pipe.o: ../../include/pipe_command.h
pipe.o: ../../include/mail_copy.h
-pipe.o: ../../include/mail_addr.h
-pipe.o: ../../include/canon_addr.h
-pipe.o: ../../include/split_addr.h
+pipe.o: ../../include/mail_params.h
+pipe.o: ../../include/mail_server.h
+pipe.o: ../../include/msg.h
+pipe.o: ../../include/mymalloc.h
pipe.o: ../../include/off_cvt.h
+pipe.o: ../../include/pipe_command.h
pipe.o: ../../include/quote_822_local.h
pipe.o: ../../include/quote_flags.h
-pipe.o: ../../include/flush_clnt.h
-pipe.o: ../../include/mail_server.h
+pipe.o: ../../include/recipient_list.h
+pipe.o: ../../include/sent.h
+pipe.o: ../../include/set_eugid.h
+pipe.o: ../../include/split_addr.h
+pipe.o: ../../include/split_at.h
+pipe.o: ../../include/stringops.h
+pipe.o: ../../include/sys_defs.h
+pipe.o: ../../include/vbuf.h
+pipe.o: ../../include/vstream.h
+pipe.o: ../../include/vstring.h
+pipe.o: pipe.c
diff --git a/postfix/src/pipe/pipe.c b/postfix/src/pipe/pipe.c
index 8aae15f4d..380641119 100644
--- a/postfix/src/pipe/pipe.c
+++ b/postfix/src/pipe/pipe.c
@@ -353,6 +353,7 @@
#include
#include
#include
+#include
/* Single server skeleton. */
@@ -822,7 +823,7 @@ static void get_service_attr(PIPE_ATTR *attr, char **argv)
static int eval_command_status(int command_status, char *service,
DELIVER_REQUEST *request, VSTREAM *src,
- char *why)
+ const char *dsn, const char *text)
{
RECIPIENT *rcpt;
int status;
@@ -840,31 +841,36 @@ static int eval_command_status(int command_status, char *service,
status = sent(DEL_REQ_TRACE_FLAGS(request->flags),
request->queue_id, rcpt->orig_addr,
rcpt->address, rcpt->offset, service,
- request->arrival_time, "%s", request->nexthop);
+ "2.0.0", request->arrival_time,
+ "%s", request->nexthop);
if (status == 0 && (request->flags & DEL_REQ_FLAG_SUCCESS))
deliver_completed(src, rcpt->offset);
result |= status;
}
break;
case PIPE_STAT_BOUNCE:
- for (n = 0; n < request->rcpt_list.len; n++) {
- rcpt = request->rcpt_list.info + n;
- status = bounce_append(DEL_REQ_TRACE_FLAGS(request->flags),
- request->queue_id, rcpt->orig_addr,
- rcpt->address, rcpt->offset, service,
- request->arrival_time, "%s", why);
- if (status == 0)
- deliver_completed(src, rcpt->offset);
- result |= status;
- }
- break;
case PIPE_STAT_DEFER:
- for (n = 0; n < request->rcpt_list.len; n++) {
- rcpt = request->rcpt_list.info + n;
- result |= defer_append(DEL_REQ_TRACE_FLAGS(request->flags),
- request->queue_id, rcpt->orig_addr,
- rcpt->address, rcpt->offset, service,
- request->arrival_time, "%s", why);
+ if (dsn[0] != '4') {
+ for (n = 0; n < request->rcpt_list.len; n++) {
+ rcpt = request->rcpt_list.info + n;
+ status = bounce_append(DEL_REQ_TRACE_FLAGS(request->flags),
+ request->queue_id, rcpt->orig_addr,
+ rcpt->address, rcpt->offset, service,
+ dsn, request->arrival_time,
+ "%s", text);
+ if (status == 0)
+ deliver_completed(src, rcpt->offset);
+ result |= status;
+ }
+ } else {
+ for (n = 0; n < request->rcpt_list.len; n++) {
+ rcpt = request->rcpt_list.info + n;
+ result |= defer_append(DEL_REQ_TRACE_FLAGS(request->flags),
+ request->queue_id, rcpt->orig_addr,
+ rcpt->address, rcpt->offset, service,
+ dsn, request->arrival_time,
+ "%s", text);
+ }
}
break;
case PIPE_STAT_CORRUPT:
@@ -885,7 +891,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
static PIPE_PARAMS conf;
static PIPE_ATTR attr;
RECIPIENT_LIST *rcpt_list = &request->rcpt_list;
- VSTRING *why = vstring_alloc(100);
+ DSN_VSTRING *why = dsn_vstring_alloc(100);
VSTRING *buf;
ARGV *expanded_argv = 0;
int deliver_status;
@@ -893,7 +899,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
ARGV *export_env;
#define DELIVER_MSG_CLEANUP() { \
- vstring_free(why); \
+ dsn_vstring_free(why); \
if (expanded_argv) argv_free(expanded_argv); \
}
@@ -936,7 +942,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
*/
if ((attr.flags & MAIL_COPY_DELIVERED) && (rcpt_list->len > 1)) {
deliver_status = eval_command_status(PIPE_STAT_DEFER, service,
- request, request->fp,
+ request, request->fp, "4.3.5",
"mailer configuration error");
msg_warn("pipe flag `D' requires %s_destination_recipient_limit = 1",
service);
@@ -949,7 +955,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
*/
if ((attr.flags & MAIL_COPY_ORIG_RCPT) && (rcpt_list->len > 1)) {
deliver_status = eval_command_status(PIPE_STAT_DEFER, service,
- request, request->fp,
+ request, request->fp, "4.3.5",
"mailer configuration error");
msg_warn("pipe flag `O' requires %s_destination_recipient_limit = 1",
service);
@@ -966,7 +972,8 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
myname, (long) attr.size_limit, request->data_size);
deliver_status = eval_command_status(PIPE_STAT_BOUNCE, service,
- request, request->fp, "message too large");
+ request, request->fp, "5.2.3",
+ "message too large");
DELIVER_MSG_CLEANUP();
return (deliver_status);
}
@@ -985,7 +992,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
status = sent(DEL_REQ_TRACE_FLAGS(request->flags),
request->queue_id, rcpt->orig_addr,
rcpt->address, rcpt->offset, service,
- request->arrival_time,
+ "2.0.0", request->arrival_time,
"delivers to command: %s", attr.command[0]);
if (status == 0 && (request->flags & DEL_REQ_FLAG_SUCCESS))
deliver_completed(request->fp, rcpt->offset);
@@ -1037,7 +1044,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
if ((expanded_argv = expand_argv(service, attr.command,
rcpt_list, attr.flags)) == 0) {
deliver_status = eval_command_status(PIPE_STAT_DEFER, service,
- request, request->fp,
+ request, request->fp, "4.3.5",
"mailer configuration error");
DELIVER_MSG_CLEANUP();
return (deliver_status);
@@ -1060,7 +1067,8 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
argv_free(export_env);
deliver_status = eval_command_status(command_status, service, request,
- request->fp, vstring_str(why));
+ request->fp, why->dsn,
+ vstring_str(why->vstring));
/*
* Clean up.
diff --git a/postfix/src/postalias/Makefile.in b/postfix/src/postalias/Makefile.in
index 2e414ad78..84029ab70 100644
--- a/postfix/src/postalias/Makefile.in
+++ b/postfix/src/postalias/Makefile.in
@@ -71,31 +71,32 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postalias.o: postalias.c
-postalias.o: ../../include/sys_defs.h
+postalias.o: ../../include/argv.h
+postalias.o: ../../include/dict.h
+postalias.o: ../../include/mail_conf.h
+postalias.o: ../../include/mail_dict.h
+postalias.o: ../../include/mail_params.h
+postalias.o: ../../include/mail_task.h
+postalias.o: ../../include/mkmap.h
postalias.o: ../../include/msg.h
-postalias.o: ../../include/mymalloc.h
-postalias.o: ../../include/vstring.h
-postalias.o: ../../include/vbuf.h
-postalias.o: ../../include/vstream.h
-postalias.o: ../../include/msg_vstream.h
postalias.o: ../../include/msg_syslog.h
+postalias.o: ../../include/msg_vstream.h
+postalias.o: ../../include/mymalloc.h
postalias.o: ../../include/readlline.h
-postalias.o: ../../include/stringops.h
-postalias.o: ../../include/split_at.h
-postalias.o: ../../include/vstring_vstream.h
+postalias.o: ../../include/resolve_clnt.h
postalias.o: ../../include/set_eugid.h
+postalias.o: ../../include/split_at.h
+postalias.o: ../../include/stringops.h
+postalias.o: ../../include/sys_defs.h
postalias.o: ../../include/tok822.h
-postalias.o: ../../include/resolve_clnt.h
-postalias.o: ../../include/mail_conf.h
-postalias.o: ../../include/mail_dict.h
-postalias.o: ../../include/mail_params.h
-postalias.o: ../../include/mkmap.h
-postalias.o: ../../include/dict.h
-postalias.o: ../../include/argv.h
-postalias.o: ../../include/mail_task.h
+postalias.o: ../../include/vbuf.h
+postalias.o: ../../include/vstream.h
+postalias.o: ../../include/vstring.h
+postalias.o: ../../include/vstring_vstream.h
+postalias.o: postalias.c
diff --git a/postfix/src/postcat/Makefile.in b/postfix/src/postcat/Makefile.in
index 4cce48332..39821d87c 100644
--- a/postfix/src/postcat/Makefile.in
+++ b/postfix/src/postcat/Makefile.in
@@ -47,21 +47,22 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postcat.o: postcat.c
-postcat.o: ../../include/sys_defs.h
+postcat.o: ../../include/mail_conf.h
+postcat.o: ../../include/mail_params.h
+postcat.o: ../../include/mail_queue.h
postcat.o: ../../include/msg.h
-postcat.o: ../../include/vstream.h
+postcat.o: ../../include/msg_vstream.h
+postcat.o: ../../include/rec_type.h
+postcat.o: ../../include/record.h
+postcat.o: ../../include/sys_defs.h
postcat.o: ../../include/vbuf.h
+postcat.o: ../../include/vstream.h
postcat.o: ../../include/vstring.h
-postcat.o: ../../include/msg_vstream.h
postcat.o: ../../include/vstring_vstream.h
-postcat.o: ../../include/record.h
-postcat.o: ../../include/rec_type.h
-postcat.o: ../../include/mail_queue.h
-postcat.o: ../../include/mail_conf.h
-postcat.o: ../../include/mail_params.h
+postcat.o: postcat.c
diff --git a/postfix/src/postconf/Makefile.in b/postfix/src/postconf/Makefile.in
index 069f951b0..ede96260c 100644
--- a/postfix/src/postconf/Makefile.in
+++ b/postfix/src/postconf/Makefile.in
@@ -61,50 +61,51 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postconf.o: postconf.c
-postconf.o: ../../include/sys_defs.h
-postconf.o: ../../include/msg.h
-postconf.o: ../../include/vstream.h
-postconf.o: ../../include/vbuf.h
-postconf.o: ../../include/msg_vstream.h
+postconf.o: ../../include/argv.h
+postconf.o: ../../include/attr.h
+postconf.o: ../../include/dict.h
postconf.o: ../../include/get_hostname.h
-postconf.o: ../../include/stringops.h
-postconf.o: ../../include/vstring.h
postconf.o: ../../include/htable.h
-postconf.o: ../../include/dict.h
-postconf.o: ../../include/argv.h
-postconf.o: ../../include/safe.h
-postconf.o: ../../include/mymalloc.h
-postconf.o: ../../include/split_at.h
-postconf.o: ../../include/vstring_vstream.h
-postconf.o: ../../include/myflock.h
postconf.o: ../../include/inet_proto.h
-postconf.o: ../../include/mynetworks.h
+postconf.o: ../../include/iostuff.h
+postconf.o: ../../include/mail_addr.h
postconf.o: ../../include/mail_conf.h
postconf.o: ../../include/mail_dict.h
+postconf.o: ../../include/mail_params.h
postconf.o: ../../include/mail_proto.h
-postconf.o: ../../include/iostuff.h
-postconf.o: ../../include/attr.h
postconf.o: ../../include/mail_version.h
-postconf.o: ../../include/mail_params.h
-postconf.o: ../../include/mail_addr.h
postconf.o: ../../include/mbox_conf.h
-postconf.o: time_vars.h
-postconf.o: bool_vars.h
-postconf.o: int_vars.h
-postconf.o: str_vars.h
-postconf.o: raw_vars.h
+postconf.o: ../../include/msg.h
+postconf.o: ../../include/msg_vstream.h
+postconf.o: ../../include/myflock.h
+postconf.o: ../../include/mymalloc.h
+postconf.o: ../../include/mynetworks.h
+postconf.o: ../../include/safe.h
+postconf.o: ../../include/split_at.h
+postconf.o: ../../include/stringops.h
+postconf.o: ../../include/sys_defs.h
+postconf.o: ../../include/vbuf.h
+postconf.o: ../../include/vstream.h
+postconf.o: ../../include/vstring.h
+postconf.o: ../../include/vstring_vstream.h
+postconf.o: auto_table.h
postconf.o: auto_vars.h
-postconf.o: install_vars.h
-postconf.o: time_table.h
postconf.o: bool_table.h
-postconf.o: int_table.h
-postconf.o: str_table.h
-postconf.o: auto_table.h
+postconf.o: bool_vars.h
postconf.o: install_table.h
+postconf.o: install_vars.h
+postconf.o: int_table.h
+postconf.o: int_vars.h
+postconf.o: postconf.c
postconf.o: raw_table.h
+postconf.o: raw_vars.h
+postconf.o: str_table.h
+postconf.o: str_vars.h
+postconf.o: time_table.h
+postconf.o: time_vars.h
diff --git a/postfix/src/postdrop/Makefile.in b/postfix/src/postdrop/Makefile.in
index 6ddcf835e..3b0b2e83a 100644
--- a/postfix/src/postdrop/Makefile.in
+++ b/postfix/src/postdrop/Makefile.in
@@ -47,32 +47,33 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postdrop.o: postdrop.c
-postdrop.o: ../../include/sys_defs.h
-postdrop.o: ../../include/msg.h
-postdrop.o: ../../include/mymalloc.h
-postdrop.o: ../../include/vstream.h
-postdrop.o: ../../include/vbuf.h
-postdrop.o: ../../include/vstring.h
-postdrop.o: ../../include/msg_vstream.h
-postdrop.o: ../../include/msg_syslog.h
postdrop.o: ../../include/argv.h
+postdrop.o: ../../include/attr.h
+postdrop.o: ../../include/clean_env.h
+postdrop.o: ../../include/cleanup_user.h
postdrop.o: ../../include/iostuff.h
-postdrop.o: ../../include/stringops.h
+postdrop.o: ../../include/mail_conf.h
+postdrop.o: ../../include/mail_params.h
postdrop.o: ../../include/mail_proto.h
-postdrop.o: ../../include/attr.h
postdrop.o: ../../include/mail_queue.h
-postdrop.o: ../../include/mail_params.h
-postdrop.o: ../../include/mail_conf.h
-postdrop.o: ../../include/mail_task.h
-postdrop.o: ../../include/clean_env.h
postdrop.o: ../../include/mail_stream.h
-postdrop.o: ../../include/cleanup_user.h
-postdrop.o: ../../include/record.h
+postdrop.o: ../../include/mail_task.h
+postdrop.o: ../../include/msg.h
+postdrop.o: ../../include/msg_syslog.h
+postdrop.o: ../../include/msg_vstream.h
+postdrop.o: ../../include/mymalloc.h
postdrop.o: ../../include/rec_type.h
+postdrop.o: ../../include/record.h
+postdrop.o: ../../include/stringops.h
+postdrop.o: ../../include/sys_defs.h
postdrop.o: ../../include/user_acl.h
+postdrop.o: ../../include/vbuf.h
+postdrop.o: ../../include/vstream.h
+postdrop.o: ../../include/vstring.h
+postdrop.o: postdrop.c
diff --git a/postfix/src/postfix/Makefile.in b/postfix/src/postfix/Makefile.in
index dad1be2c3..50415d18b 100644
--- a/postfix/src/postfix/Makefile.in
+++ b/postfix/src/postfix/Makefile.in
@@ -51,22 +51,23 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postfix.o: postfix.c
-postfix.o: ../../include/sys_defs.h
-postfix.o: ../../include/vstream.h
-postfix.o: ../../include/vbuf.h
+postfix.o: ../../include/argv.h
+postfix.o: ../../include/clean_env.h
+postfix.o: ../../include/mail_conf.h
+postfix.o: ../../include/mail_params.h
postfix.o: ../../include/msg.h
-postfix.o: ../../include/msg_vstream.h
postfix.o: ../../include/msg_syslog.h
+postfix.o: ../../include/msg_vstream.h
+postfix.o: ../../include/safe.h
postfix.o: ../../include/stringops.h
+postfix.o: ../../include/sys_defs.h
+postfix.o: ../../include/vbuf.h
+postfix.o: ../../include/vstream.h
postfix.o: ../../include/vstring.h
-postfix.o: ../../include/clean_env.h
-postfix.o: ../../include/argv.h
-postfix.o: ../../include/safe.h
-postfix.o: ../../include/mail_conf.h
-postfix.o: ../../include/mail_params.h
+postfix.o: postfix.c
diff --git a/postfix/src/postkick/Makefile.in b/postfix/src/postkick/Makefile.in
index 568edf654..afe3d565f 100644
--- a/postfix/src/postkick/Makefile.in
+++ b/postfix/src/postkick/Makefile.in
@@ -47,22 +47,23 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postkick.o: postkick.c
-postkick.o: ../../include/sys_defs.h
-postkick.o: ../../include/msg.h
-postkick.o: ../../include/mymalloc.h
-postkick.o: ../../include/vstream.h
-postkick.o: ../../include/vbuf.h
-postkick.o: ../../include/msg_vstream.h
-postkick.o: ../../include/safe.h
+postkick.o: ../../include/attr.h
postkick.o: ../../include/events.h
-postkick.o: ../../include/mail_proto.h
postkick.o: ../../include/iostuff.h
-postkick.o: ../../include/attr.h
-postkick.o: ../../include/mail_params.h
postkick.o: ../../include/mail_conf.h
+postkick.o: ../../include/mail_params.h
+postkick.o: ../../include/mail_proto.h
+postkick.o: ../../include/msg.h
+postkick.o: ../../include/msg_vstream.h
+postkick.o: ../../include/mymalloc.h
+postkick.o: ../../include/safe.h
+postkick.o: ../../include/sys_defs.h
+postkick.o: ../../include/vbuf.h
+postkick.o: ../../include/vstream.h
+postkick.o: postkick.c
diff --git a/postfix/src/postlock/Makefile.in b/postfix/src/postlock/Makefile.in
index 48853df79..c40f41da9 100644
--- a/postfix/src/postlock/Makefile.in
+++ b/postfix/src/postlock/Makefile.in
@@ -47,26 +47,28 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postlock.o: postlock.c
-postlock.o: ../../include/sys_defs.h
-postlock.o: ../../include/msg.h
-postlock.o: ../../include/vstring.h
-postlock.o: ../../include/vbuf.h
-postlock.o: ../../include/vstream.h
-postlock.o: ../../include/msg_vstream.h
-postlock.o: ../../include/iostuff.h
-postlock.o: ../../include/mail_params.h
-postlock.o: ../../include/dot_lockfile.h
+postlock.o: ../../include/argv.h
postlock.o: ../../include/deliver_flock.h
-postlock.o: ../../include/myflock.h
+postlock.o: ../../include/dot_lockfile.h
+postlock.o: ../../include/dsn_util.h
+postlock.o: ../../include/iostuff.h
postlock.o: ../../include/mail_conf.h
-postlock.o: ../../include/sys_exits.h
+postlock.o: ../../include/mail_params.h
postlock.o: ../../include/mbox_conf.h
-postlock.o: ../../include/argv.h
postlock.o: ../../include/mbox_open.h
+postlock.o: ../../include/msg.h
+postlock.o: ../../include/msg_vstream.h
+postlock.o: ../../include/myflock.h
postlock.o: ../../include/safe_open.h
+postlock.o: ../../include/sys_defs.h
+postlock.o: ../../include/sys_exits.h
+postlock.o: ../../include/vbuf.h
+postlock.o: ../../include/vstream.h
+postlock.o: ../../include/vstring.h
+postlock.o: postlock.c
diff --git a/postfix/src/postlock/postlock.c b/postfix/src/postlock/postlock.c
index dcd2b9d00..b49596008 100644
--- a/postfix/src/postlock/postlock.c
+++ b/postfix/src/postlock/postlock.c
@@ -118,6 +118,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -139,7 +140,7 @@ static void fatal_exit(void)
int main(int argc, char **argv)
{
- VSTRING *why;
+ DSN_VSTRING *why;
char *folder;
char **command;
int ch;
@@ -218,11 +219,11 @@ int main(int argc, char **argv)
* Lock the folder for exclusive access. Lose the lock upon exit. The
* command is not supposed to disappear into the background.
*/
- why = vstring_alloc(1);
+ why = dsn_vstring_alloc(1);
if ((mp = mbox_open(folder, O_APPEND | O_WRONLY | O_CREAT,
S_IRUSR | S_IWUSR, (struct stat *) 0,
-1, -1, lock_mask, why)) == 0)
- msg_fatal("open file %s: %s", folder, vstring_str(why));
+ msg_fatal("open file %s: %s", folder, vstring_str(why->vstring));
/*
* Run the command. Remove the lock after completion.
@@ -242,6 +243,7 @@ int main(int argc, char **argv)
default:
if (waitpid(pid, &status, 0) < 0)
msg_fatal("waitpid: %m");
+ vstream_fclose(mp->fp);
mbox_release(mp);
exit(WIFEXITED(status) ? WEXITSTATUS(status) : 1);
}
diff --git a/postfix/src/postlog/Makefile.in b/postfix/src/postlog/Makefile.in
index 64f32b5d4..d8f03eec0 100644
--- a/postfix/src/postlog/Makefile.in
+++ b/postfix/src/postlog/Makefile.in
@@ -51,21 +51,22 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postlog.o: postlog.c
-postlog.o: ../../include/sys_defs.h
+postlog.o: ../../include/mail_conf.h
+postlog.o: ../../include/mail_params.h
+postlog.o: ../../include/mail_task.h
postlog.o: ../../include/msg.h
-postlog.o: ../../include/vstring.h
+postlog.o: ../../include/msg_output.h
+postlog.o: ../../include/msg_syslog.h
+postlog.o: ../../include/msg_vstream.h
+postlog.o: ../../include/sys_defs.h
postlog.o: ../../include/vbuf.h
postlog.o: ../../include/vstream.h
+postlog.o: ../../include/vstring.h
postlog.o: ../../include/vstring_vstream.h
-postlog.o: ../../include/msg_output.h
-postlog.o: ../../include/msg_vstream.h
-postlog.o: ../../include/msg_syslog.h
-postlog.o: ../../include/mail_params.h
-postlog.o: ../../include/mail_conf.h
-postlog.o: ../../include/mail_task.h
+postlog.o: postlog.c
diff --git a/postfix/src/postmap/Makefile.in b/postfix/src/postmap/Makefile.in
index 7761292e4..13b7cf7f3 100644
--- a/postfix/src/postmap/Makefile.in
+++ b/postfix/src/postmap/Makefile.in
@@ -71,29 +71,30 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postmap.o: postmap.c
-postmap.o: ../../include/sys_defs.h
+postmap.o: ../../include/argv.h
+postmap.o: ../../include/dict.h
+postmap.o: ../../include/mail_conf.h
+postmap.o: ../../include/mail_dict.h
+postmap.o: ../../include/mail_params.h
+postmap.o: ../../include/mail_task.h
+postmap.o: ../../include/mkmap.h
postmap.o: ../../include/msg.h
-postmap.o: ../../include/mymalloc.h
-postmap.o: ../../include/vstring.h
-postmap.o: ../../include/vbuf.h
-postmap.o: ../../include/vstream.h
-postmap.o: ../../include/msg_vstream.h
postmap.o: ../../include/msg_syslog.h
+postmap.o: ../../include/msg_vstream.h
+postmap.o: ../../include/mymalloc.h
postmap.o: ../../include/readlline.h
-postmap.o: ../../include/stringops.h
+postmap.o: ../../include/set_eugid.h
postmap.o: ../../include/split_at.h
+postmap.o: ../../include/stringops.h
+postmap.o: ../../include/sys_defs.h
+postmap.o: ../../include/vbuf.h
+postmap.o: ../../include/vstream.h
+postmap.o: ../../include/vstring.h
postmap.o: ../../include/vstring_vstream.h
-postmap.o: ../../include/set_eugid.h
-postmap.o: ../../include/mail_conf.h
-postmap.o: ../../include/mail_dict.h
-postmap.o: ../../include/mail_params.h
-postmap.o: ../../include/mkmap.h
-postmap.o: ../../include/dict.h
-postmap.o: ../../include/argv.h
-postmap.o: ../../include/mail_task.h
+postmap.o: postmap.c
diff --git a/postfix/src/postqueue/Makefile.in b/postfix/src/postqueue/Makefile.in
index f3a523b5e..b4b9f6a4d 100644
--- a/postfix/src/postqueue/Makefile.in
+++ b/postfix/src/postqueue/Makefile.in
@@ -47,35 +47,36 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postqueue.o: postqueue.c
-postqueue.o: ../../include/sys_defs.h
-postqueue.o: ../../include/msg.h
-postqueue.o: ../../include/mymalloc.h
-postqueue.o: ../../include/clean_env.h
-postqueue.o: ../../include/vstream.h
-postqueue.o: ../../include/vbuf.h
-postqueue.o: ../../include/msg_vstream.h
-postqueue.o: ../../include/msg_syslog.h
postqueue.o: ../../include/argv.h
-postqueue.o: ../../include/safe.h
+postqueue.o: ../../include/attr.h
+postqueue.o: ../../include/clean_env.h
postqueue.o: ../../include/connect.h
+postqueue.o: ../../include/debug_process.h
+postqueue.o: ../../include/flush_clnt.h
postqueue.o: ../../include/iostuff.h
-postqueue.o: ../../include/valid_hostname.h
-postqueue.o: ../../include/mail_proto.h
-postqueue.o: ../../include/attr.h
-postqueue.o: ../../include/mail_params.h
postqueue.o: ../../include/mail_conf.h
-postqueue.o: ../../include/mail_task.h
-postqueue.o: ../../include/debug_process.h
-postqueue.o: ../../include/mail_run.h
postqueue.o: ../../include/mail_flush.h
-postqueue.o: ../../include/flush_clnt.h
+postqueue.o: ../../include/mail_params.h
+postqueue.o: ../../include/mail_proto.h
+postqueue.o: ../../include/mail_run.h
+postqueue.o: ../../include/mail_task.h
+postqueue.o: ../../include/msg.h
+postqueue.o: ../../include/msg_syslog.h
+postqueue.o: ../../include/msg_vstream.h
+postqueue.o: ../../include/mymalloc.h
+postqueue.o: ../../include/safe.h
postqueue.o: ../../include/smtp_stream.h
-postqueue.o: ../../include/vstring.h
+postqueue.o: ../../include/sys_defs.h
postqueue.o: ../../include/user_acl.h
+postqueue.o: ../../include/valid_hostname.h
postqueue.o: ../../include/valid_mailhost_addr.h
+postqueue.o: ../../include/vbuf.h
+postqueue.o: ../../include/vstream.h
+postqueue.o: ../../include/vstring.h
+postqueue.o: postqueue.c
diff --git a/postfix/src/postsuper/Makefile.in b/postfix/src/postsuper/Makefile.in
index df0dfa08a..62075eac6 100644
--- a/postfix/src/postsuper/Makefile.in
+++ b/postfix/src/postsuper/Makefile.in
@@ -47,28 +47,29 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-postsuper.o: postsuper.c
-postsuper.o: ../../include/sys_defs.h
-postsuper.o: ../../include/mymalloc.h
+postsuper.o: ../../include/argv.h
+postsuper.o: ../../include/mail_conf.h
+postsuper.o: ../../include/mail_open_ok.h
+postsuper.o: ../../include/mail_params.h
+postsuper.o: ../../include/mail_queue.h
+postsuper.o: ../../include/mail_task.h
postsuper.o: ../../include/msg.h
postsuper.o: ../../include/msg_syslog.h
-postsuper.o: ../../include/vstream.h
-postsuper.o: ../../include/vbuf.h
postsuper.o: ../../include/msg_vstream.h
-postsuper.o: ../../include/scan_dir.h
-postsuper.o: ../../include/vstring.h
+postsuper.o: ../../include/mymalloc.h
postsuper.o: ../../include/safe.h
+postsuper.o: ../../include/sane_fsops.h
+postsuper.o: ../../include/scan_dir.h
postsuper.o: ../../include/set_ugid.h
-postsuper.o: ../../include/argv.h
+postsuper.o: ../../include/sys_defs.h
+postsuper.o: ../../include/vbuf.h
+postsuper.o: ../../include/vstream.h
+postsuper.o: ../../include/vstring.h
postsuper.o: ../../include/vstring_vstream.h
-postsuper.o: ../../include/sane_fsops.h
-postsuper.o: ../../include/mail_task.h
-postsuper.o: ../../include/mail_conf.h
-postsuper.o: ../../include/mail_params.h
-postsuper.o: ../../include/mail_queue.h
-postsuper.o: ../../include/mail_open_ok.h
+postsuper.o: postsuper.c
diff --git a/postfix/src/proxymap/Makefile.in b/postfix/src/proxymap/Makefile.in
index deb28075c..bc78e18ff 100644
--- a/postfix/src/proxymap/Makefile.in
+++ b/postfix/src/proxymap/Makefile.in
@@ -47,26 +47,27 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-proxymap.o: proxymap.c
-proxymap.o: ../../include/sys_defs.h
-proxymap.o: ../../include/msg.h
-proxymap.o: ../../include/mymalloc.h
-proxymap.o: ../../include/vstring.h
-proxymap.o: ../../include/vbuf.h
-proxymap.o: ../../include/htable.h
-proxymap.o: ../../include/stringops.h
-proxymap.o: ../../include/dict.h
-proxymap.o: ../../include/vstream.h
proxymap.o: ../../include/argv.h
+proxymap.o: ../../include/attr.h
+proxymap.o: ../../include/dict.h
+proxymap.o: ../../include/dict_proxy.h
+proxymap.o: ../../include/htable.h
+proxymap.o: ../../include/iostuff.h
proxymap.o: ../../include/mail_conf.h
proxymap.o: ../../include/mail_params.h
proxymap.o: ../../include/mail_proto.h
-proxymap.o: ../../include/iostuff.h
-proxymap.o: ../../include/attr.h
-proxymap.o: ../../include/dict_proxy.h
proxymap.o: ../../include/mail_server.h
+proxymap.o: ../../include/msg.h
+proxymap.o: ../../include/mymalloc.h
+proxymap.o: ../../include/stringops.h
+proxymap.o: ../../include/sys_defs.h
+proxymap.o: ../../include/vbuf.h
+proxymap.o: ../../include/vstream.h
+proxymap.o: ../../include/vstring.h
+proxymap.o: proxymap.c
diff --git a/postfix/src/qmgr/Makefile.in b/postfix/src/qmgr/Makefile.in
index 91f19f176..6e7f13063 100644
--- a/postfix/src/qmgr/Makefile.in
+++ b/postfix/src/qmgr/Makefile.in
@@ -54,219 +54,222 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-qmgr.o: qmgr.c
-qmgr.o: ../../include/sys_defs.h
-qmgr.o: ../../include/msg.h
-qmgr.o: ../../include/events.h
-qmgr.o: ../../include/vstream.h
-qmgr.o: ../../include/vbuf.h
-qmgr.o: ../../include/dict.h
qmgr.o: ../../include/argv.h
-qmgr.o: ../../include/mail_queue.h
-qmgr.o: ../../include/vstring.h
-qmgr.o: ../../include/recipient_list.h
+qmgr.o: ../../include/attr.h
+qmgr.o: ../../include/dict.h
+qmgr.o: ../../include/events.h
+qmgr.o: ../../include/flush_clnt.h
+qmgr.o: ../../include/iostuff.h
qmgr.o: ../../include/mail_conf.h
+qmgr.o: ../../include/mail_flow.h
qmgr.o: ../../include/mail_params.h
qmgr.o: ../../include/mail_proto.h
-qmgr.o: ../../include/iostuff.h
-qmgr.o: ../../include/attr.h
-qmgr.o: ../../include/mail_flow.h
-qmgr.o: ../../include/flush_clnt.h
-qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/mail_queue.h
qmgr.o: ../../include/mail_server.h
-qmgr.o: qmgr.h
+qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/msg.h
+qmgr.o: ../../include/recipient_list.h
qmgr.o: ../../include/scan_dir.h
-qmgr_active.o: qmgr_active.c
-qmgr_active.o: ../../include/sys_defs.h
-qmgr_active.o: ../../include/msg.h
+qmgr.o: ../../include/sys_defs.h
+qmgr.o: ../../include/vbuf.h
+qmgr.o: ../../include/vstream.h
+qmgr.o: ../../include/vstring.h
+qmgr.o: qmgr.c
+qmgr.o: qmgr.h
+qmgr_active.o: ../../include/abounce.h
+qmgr_active.o: ../../include/bounce.h
+qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/deliver_request.h
qmgr_active.o: ../../include/events.h
-qmgr_active.o: ../../include/mymalloc.h
-qmgr_active.o: ../../include/vstream.h
-qmgr_active.o: ../../include/vbuf.h
-qmgr_active.o: ../../include/mail_params.h
qmgr_active.o: ../../include/mail_open_ok.h
+qmgr_active.o: ../../include/mail_params.h
qmgr_active.o: ../../include/mail_queue.h
-qmgr_active.o: ../../include/vstring.h
+qmgr_active.o: ../../include/msg.h
+qmgr_active.o: ../../include/mymalloc.h
+qmgr_active.o: ../../include/rec_type.h
qmgr_active.o: ../../include/recipient_list.h
-qmgr_active.o: ../../include/bounce.h
-qmgr_active.o: ../../include/deliver_request.h
-qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/scan_dir.h
+qmgr_active.o: ../../include/sys_defs.h
qmgr_active.o: ../../include/trace.h
-qmgr_active.o: ../../include/abounce.h
-qmgr_active.o: ../../include/rec_type.h
+qmgr_active.o: ../../include/vbuf.h
+qmgr_active.o: ../../include/vstream.h
+qmgr_active.o: ../../include/vstring.h
qmgr_active.o: qmgr.h
-qmgr_active.o: ../../include/scan_dir.h
-qmgr_bounce.o: qmgr_bounce.c
-qmgr_bounce.o: ../../include/sys_defs.h
+qmgr_active.o: qmgr_active.c
qmgr_bounce.o: ../../include/bounce.h
+qmgr_bounce.o: ../../include/deliver_completed.h
qmgr_bounce.o: ../../include/deliver_request.h
-qmgr_bounce.o: ../../include/vstring.h
+qmgr_bounce.o: ../../include/recipient_list.h
+qmgr_bounce.o: ../../include/scan_dir.h
+qmgr_bounce.o: ../../include/sys_defs.h
qmgr_bounce.o: ../../include/vbuf.h
qmgr_bounce.o: ../../include/vstream.h
-qmgr_bounce.o: ../../include/recipient_list.h
-qmgr_bounce.o: ../../include/deliver_completed.h
+qmgr_bounce.o: ../../include/vstring.h
qmgr_bounce.o: qmgr.h
-qmgr_bounce.o: ../../include/scan_dir.h
-qmgr_defer.o: qmgr_defer.c
-qmgr_defer.o: ../../include/sys_defs.h
-qmgr_defer.o: ../../include/msg.h
-qmgr_defer.o: ../../include/vstream.h
-qmgr_defer.o: ../../include/vbuf.h
-qmgr_defer.o: ../../include/defer.h
+qmgr_bounce.o: qmgr_bounce.c
qmgr_defer.o: ../../include/bounce.h
+qmgr_defer.o: ../../include/defer.h
qmgr_defer.o: ../../include/deliver_request.h
-qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: ../../include/msg.h
qmgr_defer.o: ../../include/recipient_list.h
-qmgr_defer.o: qmgr.h
qmgr_defer.o: ../../include/scan_dir.h
-qmgr_deliver.o: qmgr_deliver.c
-qmgr_deliver.o: ../../include/sys_defs.h
-qmgr_deliver.o: ../../include/msg.h
-qmgr_deliver.o: ../../include/vstring.h
-qmgr_deliver.o: ../../include/vbuf.h
-qmgr_deliver.o: ../../include/vstream.h
-qmgr_deliver.o: ../../include/vstring_vstream.h
+qmgr_defer.o: ../../include/sys_defs.h
+qmgr_defer.o: ../../include/vbuf.h
+qmgr_defer.o: ../../include/vstream.h
+qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: qmgr.h
+qmgr_defer.o: qmgr_defer.c
+qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/dsn_util.h
qmgr_deliver.o: ../../include/events.h
qmgr_deliver.o: ../../include/iostuff.h
-qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/mail_params.h
qmgr_deliver.o: ../../include/mail_proto.h
-qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/msg.h
qmgr_deliver.o: ../../include/recipient_list.h
-qmgr_deliver.o: ../../include/mail_params.h
-qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/scan_dir.h
+qmgr_deliver.o: ../../include/stringops.h
+qmgr_deliver.o: ../../include/sys_defs.h
+qmgr_deliver.o: ../../include/vbuf.h
qmgr_deliver.o: ../../include/verp_sender.h
+qmgr_deliver.o: ../../include/vstream.h
+qmgr_deliver.o: ../../include/vstring.h
+qmgr_deliver.o: ../../include/vstring_vstream.h
qmgr_deliver.o: qmgr.h
-qmgr_deliver.o: ../../include/scan_dir.h
-qmgr_enable.o: qmgr_enable.c
-qmgr_enable.o: ../../include/sys_defs.h
+qmgr_deliver.o: qmgr_deliver.c
qmgr_enable.o: ../../include/msg.h
-qmgr_enable.o: ../../include/vstream.h
+qmgr_enable.o: ../../include/scan_dir.h
+qmgr_enable.o: ../../include/sys_defs.h
qmgr_enable.o: ../../include/vbuf.h
+qmgr_enable.o: ../../include/vstream.h
qmgr_enable.o: qmgr.h
-qmgr_enable.o: ../../include/scan_dir.h
-qmgr_entry.o: qmgr_entry.c
-qmgr_entry.o: ../../include/sys_defs.h
+qmgr_enable.o: qmgr_enable.c
+qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/events.h
+qmgr_entry.o: ../../include/mail_params.h
qmgr_entry.o: ../../include/msg.h
qmgr_entry.o: ../../include/mymalloc.h
-qmgr_entry.o: ../../include/events.h
-qmgr_entry.o: ../../include/vstream.h
+qmgr_entry.o: ../../include/recipient_list.h
+qmgr_entry.o: ../../include/scan_dir.h
+qmgr_entry.o: ../../include/sys_defs.h
qmgr_entry.o: ../../include/vbuf.h
-qmgr_entry.o: ../../include/mail_params.h
-qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/vstream.h
qmgr_entry.o: ../../include/vstring.h
-qmgr_entry.o: ../../include/recipient_list.h
qmgr_entry.o: qmgr.h
-qmgr_entry.o: ../../include/scan_dir.h
-qmgr_job.o: qmgr_job.c
-qmgr_job.o: ../../include/sys_defs.h
-qmgr_job.o: ../../include/msg.h
+qmgr_entry.o: qmgr_entry.c
qmgr_job.o: ../../include/htable.h
+qmgr_job.o: ../../include/msg.h
qmgr_job.o: ../../include/mymalloc.h
qmgr_job.o: ../../include/sane_time.h
-qmgr_job.o: qmgr.h
-qmgr_job.o: ../../include/vstream.h
-qmgr_job.o: ../../include/vbuf.h
qmgr_job.o: ../../include/scan_dir.h
-qmgr_message.o: qmgr_message.c
-qmgr_message.o: ../../include/sys_defs.h
-qmgr_message.o: ../../include/msg.h
-qmgr_message.o: ../../include/mymalloc.h
-qmgr_message.o: ../../include/vstring.h
-qmgr_message.o: ../../include/vbuf.h
-qmgr_message.o: ../../include/vstream.h
-qmgr_message.o: ../../include/split_at.h
-qmgr_message.o: ../../include/valid_hostname.h
+qmgr_job.o: ../../include/sys_defs.h
+qmgr_job.o: ../../include/vbuf.h
+qmgr_job.o: ../../include/vstream.h
+qmgr_job.o: qmgr.h
+qmgr_job.o: qmgr_job.c
qmgr_message.o: ../../include/argv.h
-qmgr_message.o: ../../include/stringops.h
-qmgr_message.o: ../../include/myflock.h
-qmgr_message.o: ../../include/sane_time.h
-qmgr_message.o: ../../include/dict.h
-qmgr_message.o: ../../include/mail_queue.h
-qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/attr.h
qmgr_message.o: ../../include/canon_addr.h
-qmgr_message.o: ../../include/record.h
-qmgr_message.o: ../../include/rec_type.h
-qmgr_message.o: ../../include/sent.h
-qmgr_message.o: ../../include/deliver_request.h
-qmgr_message.o: ../../include/recipient_list.h
qmgr_message.o: ../../include/deliver_completed.h
-qmgr_message.o: ../../include/opened.h
-qmgr_message.o: ../../include/verp_sender.h
-qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/deliver_request.h
+qmgr_message.o: ../../include/dict.h
qmgr_message.o: ../../include/iostuff.h
-qmgr_message.o: ../../include/attr.h
+qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/mail_queue.h
+qmgr_message.o: ../../include/msg.h
+qmgr_message.o: ../../include/myflock.h
+qmgr_message.o: ../../include/mymalloc.h
+qmgr_message.o: ../../include/opened.h
qmgr_message.o: ../../include/qmgr_user.h
-qmgr_message.o: ../../include/split_addr.h
-qmgr_message.o: ../../include/rewrite_clnt.h
+qmgr_message.o: ../../include/rec_type.h
+qmgr_message.o: ../../include/recipient_list.h
+qmgr_message.o: ../../include/record.h
qmgr_message.o: ../../include/resolve_clnt.h
-qmgr_message.o: qmgr.h
+qmgr_message.o: ../../include/rewrite_clnt.h
+qmgr_message.o: ../../include/sane_time.h
qmgr_message.o: ../../include/scan_dir.h
-qmgr_move.o: qmgr_move.c
-qmgr_move.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/sent.h
+qmgr_message.o: ../../include/split_addr.h
+qmgr_message.o: ../../include/split_at.h
+qmgr_message.o: ../../include/stringops.h
+qmgr_message.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/valid_hostname.h
+qmgr_message.o: ../../include/vbuf.h
+qmgr_message.o: ../../include/verp_sender.h
+qmgr_message.o: ../../include/vstream.h
+qmgr_message.o: ../../include/vstring.h
+qmgr_message.o: qmgr.h
+qmgr_message.o: qmgr_message.c
+qmgr_move.o: ../../include/mail_queue.h
+qmgr_move.o: ../../include/mail_scan_dir.h
qmgr_move.o: ../../include/msg.h
-qmgr_move.o: ../../include/scan_dir.h
qmgr_move.o: ../../include/recipient_list.h
-qmgr_move.o: ../../include/mail_queue.h
-qmgr_move.o: ../../include/vstring.h
+qmgr_move.o: ../../include/scan_dir.h
+qmgr_move.o: ../../include/sys_defs.h
qmgr_move.o: ../../include/vbuf.h
qmgr_move.o: ../../include/vstream.h
-qmgr_move.o: ../../include/mail_scan_dir.h
+qmgr_move.o: ../../include/vstring.h
qmgr_move.o: qmgr.h
-qmgr_peer.o: qmgr_peer.c
-qmgr_peer.o: ../../include/sys_defs.h
-qmgr_peer.o: ../../include/msg.h
+qmgr_move.o: qmgr_move.c
qmgr_peer.o: ../../include/htable.h
+qmgr_peer.o: ../../include/msg.h
qmgr_peer.o: ../../include/mymalloc.h
-qmgr_peer.o: qmgr.h
-qmgr_peer.o: ../../include/vstream.h
-qmgr_peer.o: ../../include/vbuf.h
qmgr_peer.o: ../../include/scan_dir.h
-qmgr_queue.o: qmgr_queue.c
-qmgr_queue.o: ../../include/sys_defs.h
-qmgr_queue.o: ../../include/msg.h
-qmgr_queue.o: ../../include/mymalloc.h
+qmgr_peer.o: ../../include/sys_defs.h
+qmgr_peer.o: ../../include/vbuf.h
+qmgr_peer.o: ../../include/vstream.h
+qmgr_peer.o: qmgr.h
+qmgr_peer.o: qmgr_peer.c
qmgr_queue.o: ../../include/events.h
qmgr_queue.o: ../../include/htable.h
qmgr_queue.o: ../../include/mail_params.h
+qmgr_queue.o: ../../include/msg.h
+qmgr_queue.o: ../../include/mymalloc.h
qmgr_queue.o: ../../include/recipient_list.h
-qmgr_queue.o: qmgr.h
-qmgr_queue.o: ../../include/vstream.h
-qmgr_queue.o: ../../include/vbuf.h
qmgr_queue.o: ../../include/scan_dir.h
-qmgr_rcpt_list.o: qmgr_rcpt_list.c
-qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/vbuf.h
+qmgr_queue.o: ../../include/vstream.h
+qmgr_queue.o: qmgr.h
+qmgr_queue.o: qmgr_queue.c
qmgr_rcpt_list.o: ../../include/mymalloc.h
-qmgr_rcpt_list.o: qmgr.h
-qmgr_rcpt_list.o: ../../include/vstream.h
-qmgr_rcpt_list.o: ../../include/vbuf.h
qmgr_rcpt_list.o: ../../include/scan_dir.h
-qmgr_scan.o: qmgr_scan.c
-qmgr_scan.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/vbuf.h
+qmgr_rcpt_list.o: ../../include/vstream.h
+qmgr_rcpt_list.o: qmgr.h
+qmgr_rcpt_list.o: qmgr_rcpt_list.c
+qmgr_scan.o: ../../include/mail_scan_dir.h
qmgr_scan.o: ../../include/msg.h
qmgr_scan.o: ../../include/mymalloc.h
qmgr_scan.o: ../../include/scan_dir.h
-qmgr_scan.o: ../../include/mail_scan_dir.h
-qmgr_scan.o: qmgr.h
-qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: ../../include/sys_defs.h
qmgr_scan.o: ../../include/vbuf.h
-qmgr_transport.o: qmgr_transport.c
-qmgr_transport.o: ../../include/sys_defs.h
-qmgr_transport.o: ../../include/msg.h
-qmgr_transport.o: ../../include/htable.h
+qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: qmgr.h
+qmgr_scan.o: qmgr_scan.c
+qmgr_transport.o: ../../include/attr.h
qmgr_transport.o: ../../include/events.h
-qmgr_transport.o: ../../include/mymalloc.h
-qmgr_transport.o: ../../include/vstream.h
-qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/htable.h
qmgr_transport.o: ../../include/iostuff.h
-qmgr_transport.o: ../../include/mail_proto.h
-qmgr_transport.o: ../../include/attr.h
-qmgr_transport.o: ../../include/recipient_list.h
qmgr_transport.o: ../../include/mail_conf.h
qmgr_transport.o: ../../include/mail_params.h
-qmgr_transport.o: qmgr.h
+qmgr_transport.o: ../../include/mail_proto.h
+qmgr_transport.o: ../../include/msg.h
+qmgr_transport.o: ../../include/mymalloc.h
+qmgr_transport.o: ../../include/recipient_list.h
qmgr_transport.o: ../../include/scan_dir.h
+qmgr_transport.o: ../../include/sys_defs.h
+qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/vstream.h
+qmgr_transport.o: qmgr.h
+qmgr_transport.o: qmgr_transport.c
diff --git a/postfix/src/qmgr/qmgr.h b/postfix/src/qmgr/qmgr.h
index 976520636..6b394eab6 100644
--- a/postfix/src/qmgr/qmgr.h
+++ b/postfix/src/qmgr/qmgr.h
@@ -149,6 +149,7 @@ struct QMGR_TRANSPORT {
* updated */
int blocker_tag; /* for marking blocker jobs */
QMGR_TRANSPORT_LIST peers; /* linkage */
+ char *dsn; /* why unavailable */
char *reason; /* why unavailable */
};
@@ -158,7 +159,7 @@ struct QMGR_TRANSPORT {
typedef void (*QMGR_TRANSPORT_ALLOC_NOTIFY) (QMGR_TRANSPORT *, VSTREAM *);
extern QMGR_TRANSPORT *qmgr_transport_select(void);
extern void qmgr_transport_alloc(QMGR_TRANSPORT *, QMGR_TRANSPORT_ALLOC_NOTIFY);
-extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *);
+extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *, const char *);
extern void qmgr_transport_unthrottle(QMGR_TRANSPORT *);
extern QMGR_TRANSPORT *qmgr_transport_create(const char *);
extern QMGR_TRANSPORT *qmgr_transport_find(const char *);
@@ -187,6 +188,7 @@ struct QMGR_QUEUE {
QMGR_ENTRY_LIST todo; /* todo queue entries */
QMGR_ENTRY_LIST busy; /* messages on the wire */
QMGR_QUEUE_LIST peers; /* neighbor queues */
+ char *dsn; /* why unavailable */
char *reason; /* why unavailable */
time_t clog_time_to_warn; /* time of last warning */
int blocker_tag; /* tagged if blocks job list */
@@ -199,7 +201,7 @@ extern int qmgr_queue_count;
extern QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *, const char *, const char *);
extern void qmgr_queue_done(QMGR_QUEUE *);
-extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *);
+extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *, const char *);
extern void qmgr_queue_unthrottle(QMGR_QUEUE *);
extern QMGR_QUEUE *qmgr_queue_find(QMGR_TRANSPORT *, const char *);
@@ -371,14 +373,15 @@ extern void qmgr_peer_free(QMGR_PEER *);
/*
* qmgr_defer.c
*/
-extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *);
-extern void qmgr_defer_todo(QMGR_QUEUE *, const char *);
-extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *);
+extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *, const char *);
+extern void qmgr_defer_todo(QMGR_QUEUE *, const char *, const char *);
+extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *, const char *);
/*
* qmgr_bounce.c
*/
-extern void PRINTFLIKE(3, 4) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *,...);
+extern void PRINTFLIKE(4, 5) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *,
+ const char *, const char *,...);
/*
* qmgr_deliver.c
diff --git a/postfix/src/qmgr/qmgr_bounce.c b/postfix/src/qmgr/qmgr_bounce.c
index 92196bdaa..8daffb2d2 100644
--- a/postfix/src/qmgr/qmgr_bounce.c
+++ b/postfix/src/qmgr/qmgr_bounce.c
@@ -6,9 +6,11 @@
/* SYNOPSIS
/* #include "qmgr.h"
/*
-/* QMGR_QUEUE *qmgr_bounce_recipient(message, recipient, format, ...)
+/* QMGR_QUEUE *qmgr_bounce_recipient(message, recipient,
+/* dsn, format, ...)
/* QMGR_MESSAGE *message;
/* QMGR_RCPT *recipient;
+/* const char *dsn;
/* const char *format;
/* DESCRIPTION
/* qmgr_bounce_recipient() produces a bounce log record.
@@ -22,6 +24,8 @@
/* Open queue file with the message being bounced.
/* .IP recipient
/* The recipient that will not be delivered.
+/* .IP dsn
+/* RFC 1893 detail code.
/* .IP format
/* Free-format text that describes why delivery will not happen.
/* DIAGNOSTICS
@@ -61,7 +65,7 @@
/* qmgr_bounce_recipient - bounce one message recipient */
void qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
- const char *format,...)
+ const char *dsn, const char *format,...)
{
va_list ap;
int status;
@@ -69,8 +73,8 @@ void qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
va_start(ap, format);
status = vbounce_append(message->tflags, message->queue_id,
recipient->orig_rcpt, recipient->address,
- recipient->offset, "none", message->arrival_time,
- format, ap);
+ recipient->offset, "none", dsn,
+ message->arrival_time, format, ap);
va_end(ap);
if (status == 0)
diff --git a/postfix/src/qmgr/qmgr_defer.c b/postfix/src/qmgr/qmgr_defer.c
index 715adf435..59f1892e0 100644
--- a/postfix/src/qmgr/qmgr_defer.c
+++ b/postfix/src/qmgr/qmgr_defer.c
@@ -6,17 +6,20 @@
/* SYNOPSIS
/* #include "qmgr.h"
/*
-/* void qmgr_defer_recipient(message, recipient, reason)
+/* void qmgr_defer_recipient(message, recipient, dsn, reason)
/* QMGR_MESSAGE *message;
/* QMGR_RCPT *recipient;
+/* const char *dsn;
/* const char *reason;
/*
-/* void qmgr_defer_todo(queue, reason)
+/* void qmgr_defer_todo(queue, dsn, reason)
/* QMGR_QUEUE *queue;
+/* const char *dsn;
/* const char *reason;
/*
-/* QMGR_QUEUE *qmgr_defer_transport(transport, reason)
+/* QMGR_QUEUE *qmgr_defer_transport(transport, dsn, reason)
/* QMGR_TRANSPORT *transport;
+/* const char *dsn;
/* const char *reason;
/* DESCRIPTION
/* qmgr_defer_recipient() defers delivery of the named message to
@@ -43,6 +46,8 @@
/* host (or local user).
/* .IP transport
/* Specifies a message delivery transport.
+/* .IP dsn
+/* X.YY.ZZ Error detail as specified in RFC 1893.
/* .IP reason
/* Free-format text that describes why delivery is deferred; this
/* used for logging purposes, and for updating the message-specific
@@ -86,7 +91,8 @@
/* qmgr_defer_transport - defer todo entries for named transport */
-void qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
+void qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *dsn,
+ const char *reason)
{
char *myname = "qmgr_defer_transport";
QMGR_QUEUE *queue;
@@ -95,23 +101,25 @@ void qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
/*
* Sanity checks.
*/
- if (reason == 0)
+ if (dsn == 0 || *dsn == 0)
+ msg_panic("%s: null dsn", myname);
+ if (reason == 0 || *reason == 0)
msg_panic("%s: null reason", myname);
if (msg_verbose)
- msg_info("defer transport %s: %s", transport->name, reason);
+ msg_info("defer transport %s: %s %s", transport->name, dsn, reason);
/*
* Proceed carefully. Queues may disappear as a side effect.
*/
for (queue = transport->queue_list.next; queue; queue = next) {
next = queue->peers.next;
- qmgr_defer_todo(queue, reason);
+ qmgr_defer_todo(queue, dsn, reason);
}
}
/* qmgr_defer_todo - defer all todo queue entries for specific site */
-void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
+void qmgr_defer_todo(QMGR_QUEUE *queue, const char *dsn, const char *reason)
{
char *myname = "qmgr_defer_todo";
QMGR_ENTRY *entry;
@@ -123,10 +131,12 @@ void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
/*
* Sanity checks.
*/
- if (reason == 0)
+ if (dsn == 0 || *dsn == 0)
+ msg_panic("%s: null dsn", myname);
+ if (reason == 0 || *reason == 0)
msg_panic("%s: null reason", myname);
if (msg_verbose)
- msg_info("defer site %s: %s", queue->name, reason);
+ msg_info("defer site %s: %s %s", queue->name, dsn, reason);
/*
* Proceed carefully. Queue entries will disappear as a side effect.
@@ -136,7 +146,7 @@ void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
message = entry->message;
for (nrcpt = 0; nrcpt < entry->rcpt_list.len; nrcpt++) {
recipient = entry->rcpt_list.info + nrcpt;
- qmgr_defer_recipient(message, recipient, reason);
+ qmgr_defer_recipient(message, recipient, dsn, reason);
}
qmgr_entry_done(entry, QMGR_QUEUE_TODO);
}
@@ -145,14 +155,16 @@ void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
/* qmgr_defer_recipient - defer delivery of specific recipient */
void qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
- const char *reason)
+ const char *dsn, const char *reason)
{
char *myname = "qmgr_defer_recipient";
/*
* Sanity checks.
*/
- if (reason == 0)
+ if (dsn == 0 || *dsn == 0)
+ msg_panic("%s: null dsn", myname);
+ if (reason == 0 || *reason == 0)
msg_panic("%s: reason 0", myname);
/*
@@ -160,7 +172,7 @@ void qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
*/
message->flags |= defer_append(message->tflags, message->queue_id,
recipient->orig_rcpt, recipient->address,
- recipient->offset, "none",
+ recipient->offset, "none", dsn,
message->arrival_time,
- "delivery temporarily suspended: %s", reason);
+ "delivery temporarily suspended: %s", reason);
}
diff --git a/postfix/src/qmgr/qmgr_deliver.c b/postfix/src/qmgr/qmgr_deliver.c
index 28463a0e6..486963d53 100644
--- a/postfix/src/qmgr/qmgr_deliver.c
+++ b/postfix/src/qmgr/qmgr_deliver.c
@@ -60,6 +60,7 @@
#include
#include
#include
+#include
/* Global library. */
@@ -69,6 +70,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -167,9 +169,9 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
ATTR_TYPE_STR, MAIL_ATTR_PROTO_NAME, message->client_proto,
ATTR_TYPE_STR, MAIL_ATTR_HELO_NAME, message->client_helo,
ATTR_TYPE_STR, MAIL_ATTR_SASL_METHOD, message->sasl_method,
- ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
+ ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
ATTR_TYPE_STR, MAIL_ATTR_SASL_SENDER, message->sasl_sender,
- ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
+ ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
ATTR_TYPE_END);
if (sender_buf != 0)
vstring_free(sender_buf);
@@ -215,6 +217,7 @@ static void qmgr_deliver_update(int unused_event, char *context)
QMGR_MESSAGE *message = entry->message;
VSTRING *reason = vstring_alloc(1);
int status;
+ DSN_SPLIT dp;
/*
* The message transport has responded. Stop the watchdog timer.
@@ -241,10 +244,11 @@ static void qmgr_deliver_update(int unused_event, char *context)
*/
if (status == DELIVER_STAT_CRASH) {
message->flags |= DELIVER_STAT_DEFER;
- qmgr_transport_throttle(transport, "unknown mail transport error");
+ qmgr_transport_throttle(transport, "4.3.0",
+ "unknown mail transport error");
msg_warn("transport %s failure -- see a previous warning/fatal/panic logfile record for the problem description",
transport->name);
- qmgr_defer_transport(transport, transport->reason);
+ qmgr_defer_transport(transport, transport->dsn, transport->reason);
}
/*
@@ -259,9 +263,12 @@ static void qmgr_deliver_update(int unused_event, char *context)
if (status == DELIVER_STAT_DEFER) {
message->flags |= DELIVER_STAT_DEFER;
if (VSTRING_LEN(reason)) {
- qmgr_queue_throttle(queue, vstring_str(reason));
+ /* Sanitize the DSN status from delivery agent. */
+ dsn_split(&dp, "4.0.0", printable(vstring_str(reason), '?'));
+ qmgr_queue_throttle(queue, dp.dsn, *dp.text ?
+ dp.text : "unknown problem");
if (queue->window == 0)
- qmgr_defer_todo(queue, queue->reason);
+ qmgr_defer_todo(queue, queue->dsn, queue->reason);
}
}
@@ -302,8 +309,9 @@ void qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
* while some other queue manipulation is happening.
*/
if (qmgr_deliver_initial_reply(stream) != 0) {
- qmgr_transport_throttle(transport, "mail transport unavailable");
- qmgr_defer_transport(transport, transport->reason);
+ qmgr_transport_throttle(transport, "4.3.0",
+ "mail transport unavailable");
+ qmgr_defer_transport(transport, transport->dsn, transport->reason);
(void) vstream_fclose(stream);
return;
}
@@ -328,8 +336,9 @@ void qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
*/
if (qmgr_deliver_send_request(entry, stream) < 0) {
qmgr_entry_unselect(entry);
- qmgr_transport_throttle(transport, "mail transport unavailable");
- qmgr_defer_transport(transport, transport->reason);
+ qmgr_transport_throttle(transport, "4.3.0",
+ "mail transport unavailable");
+ qmgr_defer_transport(transport, transport->dsn, transport->reason);
/* warning: entry may be a dangling pointer here */
(void) vstream_fclose(stream);
return;
diff --git a/postfix/src/qmgr/qmgr_message.c b/postfix/src/qmgr/qmgr_message.c
index 9d341c85c..84b8d278d 100644
--- a/postfix/src/qmgr/qmgr_message.c
+++ b/postfix/src/qmgr/qmgr_message.c
@@ -826,10 +826,11 @@ static int qmgr_resolve_one(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
else
resolve_clnt_verify(addr, reply);
if (reply->flags & RESOLVE_FLAG_FAIL) {
- qmgr_defer_recipient(message, recipient, "address resolver failure");
+ qmgr_defer_recipient(message, recipient,
+ "4.3.0", "address resolver failure");
return (-1);
} else if (reply->flags & RESOLVE_FLAG_ERROR) {
- qmgr_bounce_recipient(message, recipient,
+ qmgr_bounce_recipient(message, recipient, "5.1.3",
"bad address syntax: \"%s\"", addr);
return (-1);
} else {
@@ -924,7 +925,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* the queue manager process does not help.
*/
if (recipient->address[0] == 0) {
- qmgr_bounce_recipient(message, recipient,
+ qmgr_bounce_recipient(message, recipient, "5.1.3",
"null recipient address");
continue;
}
@@ -941,7 +942,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* where it cannot be bypassed.
*/
if (var_allow_min_user == 0 && recipient->address[0] == '-') {
- qmgr_bounce_recipient(message, recipient,
+ qmgr_bounce_recipient(message, recipient, "5.1.3",
"invalid recipient syntax: \"%s\"",
recipient->address);
continue;
@@ -965,7 +966,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
&& !var_double_bounce_sender[len]) {
status = sent(message->tflags, message->queue_id,
recipient->orig_rcpt, recipient->address,
- recipient->offset, "none", message->arrival_time,
+ recipient->offset, "none", "2.0.0",
+ message->arrival_time,
"undeliverable postmaster notification discarded");
if (status == 0) {
deliver_completed(message->fp, recipient->offset);
@@ -988,7 +990,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
if (strcmp(*cpp, STR(reply.transport)) == 0)
break;
if (*cpp) {
- qmgr_defer_recipient(message, recipient, "deferred transport");
+ qmgr_defer_recipient(message, recipient,
+ "4.3.2", "deferred transport");
continue;
}
}
@@ -1006,7 +1009,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* This transport is dead. Defer delivery to this recipient.
*/
if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) != 0) {
- qmgr_defer_recipient(message, recipient, transport->reason);
+ qmgr_defer_recipient(message, recipient, transport->dsn,
+ transport->reason);
continue;
}
@@ -1073,7 +1077,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
* This queue is dead. Defer delivery to this recipient.
*/
if (queue->window == 0) {
- qmgr_defer_recipient(message, recipient, queue->reason);
+ qmgr_defer_recipient(message, recipient, queue->dsn, queue->reason);
continue;
}
diff --git a/postfix/src/qmgr/qmgr_queue.c b/postfix/src/qmgr/qmgr_queue.c
index c7d88e83d..7371a6a3d 100644
--- a/postfix/src/qmgr/qmgr_queue.c
+++ b/postfix/src/qmgr/qmgr_queue.c
@@ -20,8 +20,9 @@
/* QMGR_TRANSPORT *transport;
/* const char *name;
/*
-/* void qmgr_queue_throttle(queue, reason)
+/* void qmgr_queue_throttle(queue, dsn, reason)
/* QMGR_QUEUE *queue;
+/* const char *dsn;
/* const char *reason;
/*
/* void qmgr_queue_unthrottle(queue)
@@ -131,6 +132,10 @@ void qmgr_queue_unthrottle(QMGR_QUEUE *queue)
*/
if (queue->window == 0) {
event_cancel_timer(qmgr_queue_unthrottle_wrapper, (char *) queue);
+ if (queue->dsn == 0)
+ msg_panic("%s: queue %s: window 0 dsn 0", myname, queue->name);
+ myfree(queue->dsn);
+ queue->dsn = 0;
if (queue->reason == 0)
msg_panic("%s: queue %s: window 0 reason 0", myname, queue->name);
myfree(queue->reason);
@@ -152,18 +157,22 @@ void qmgr_queue_unthrottle(QMGR_QUEUE *queue)
/* qmgr_queue_throttle - handle destination delivery failure */
-void qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
+void qmgr_queue_throttle(QMGR_QUEUE *queue, const char *dsn,
+ const char *reason)
{
char *myname = "qmgr_queue_throttle";
/*
* Sanity checks.
*/
+ if (queue->dsn)
+ msg_panic("%s: queue %s: spurious dsn %s",
+ myname, queue->name, queue->dsn);
if (queue->reason)
msg_panic("%s: queue %s: spurious reason %s",
myname, queue->name, queue->reason);
if (msg_verbose)
- msg_info("%s: queue %s: %s", myname, queue->name, reason);
+ msg_info("%s: queue %s: %s %s", myname, queue->name, dsn, reason);
/*
* Decrease the destination's concurrency limit until we reach zero, at
@@ -178,6 +187,7 @@ void qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
* Special case for a site that just was declared dead.
*/
if (queue->window == 0) {
+ queue->dsn = mystrdup(dsn);
queue->reason = mystrdup(reason);
event_request_timer(qmgr_queue_unthrottle_wrapper,
(char *) queue, var_min_backoff_time);
@@ -203,6 +213,9 @@ void qmgr_queue_done(QMGR_QUEUE *queue)
msg_panic("%s: queue not empty: %s", myname, queue->name);
if (queue->window <= 0)
msg_panic("%s: window %d", myname, queue->window);
+ if (queue->dsn)
+ msg_panic("%s: queue %s: spurious dsn %s",
+ myname, queue->name, queue->dsn);
if (queue->reason)
msg_panic("%s: queue %s: spurious reason %s",
myname, queue->name, queue->reason);
@@ -242,6 +255,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name,
queue->window = transport->init_dest_concurrency;
QMGR_LIST_INIT(queue->todo);
QMGR_LIST_INIT(queue->busy);
+ queue->dsn = 0;
queue->reason = 0;
queue->clog_time_to_warn = 0;
queue->blocker_tag = 0;
diff --git a/postfix/src/qmgr/qmgr_transport.c b/postfix/src/qmgr/qmgr_transport.c
index 204880962..41e9c7b2b 100644
--- a/postfix/src/qmgr/qmgr_transport.c
+++ b/postfix/src/qmgr/qmgr_transport.c
@@ -18,8 +18,9 @@
/* QMGR_TRANSPORT *transport;
/* void (*notify)(QMGR_TRANSPORT *transport, VSTREAM *fp);
/*
-/* void qmgr_transport_throttle(transport, reason)
+/* void qmgr_transport_throttle(transport, dsn, reason)
/* QMGR_TRANSPORT *transport;
+/* const char *dsn;
/* const char *reason;
/*
/* void qmgr_transport_unthrottle(transport)
@@ -133,6 +134,10 @@ void qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
if (msg_verbose)
msg_info("%s: transport %s", myname, transport->name);
transport->flags &= ~QMGR_TRANSPORT_STAT_DEAD;
+ if (transport->dsn == 0)
+ msg_panic("%s: transport %s: null dsn", myname, transport->name);
+ myfree(transport->dsn);
+ transport->dsn = 0;
if (transport->reason == 0)
msg_panic("%s: transport %s: null reason", myname, transport->name);
myfree(transport->reason);
@@ -144,7 +149,8 @@ void qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
/* qmgr_transport_throttle - disable delivery process allocation */
-void qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
+void qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *dsn,
+ const char *reason)
{
char *myname = "qmgr_transport_throttle";
@@ -155,9 +161,13 @@ void qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
*/
if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) == 0) {
if (msg_verbose)
- msg_info("%s: transport %s: reason: %s",
- myname, transport->name, reason);
+ msg_info("%s: transport %s: dsn: %s reason: %s",
+ myname, transport->name, dsn, reason);
transport->flags |= QMGR_TRANSPORT_STAT_DEAD;
+ if (transport->dsn)
+ msg_panic("%s: transport %s: spurious dsn: %s",
+ myname, transport->name, transport->dsn);
+ transport->dsn = mystrdup(dsn);
if (transport->reason)
msg_panic("%s: transport %s: spurious reason: %s",
myname, transport->name, transport->reason);
@@ -291,7 +301,7 @@ void qmgr_transport_alloc(QMGR_TRANSPORT *transport, QMGR_TRANSPORT_ALLOC_NOT
if ((stream = mail_connect(MAIL_CLASS_PRIVATE, transport->name, BLOCK_MODE)) == 0) {
msg_warn("connect to transport %s: %m", transport->name);
- qmgr_transport_throttle(transport, "transport is unavailable");
+ qmgr_transport_throttle(transport, "4.3.0", "transport is unavailable");
return;
}
alloc = (QMGR_TRANSPORT_ALLOC *) mymalloc(sizeof(*alloc));
@@ -361,6 +371,7 @@ QMGR_TRANSPORT *qmgr_transport_create(const char *name)
transport->candidate_cache_current = 0;
transport->candidate_cache_time = (time_t) 0;
transport->blocker_tag = 1;
+ transport->dsn = 0;
transport->reason = 0;
if (qmgr_transport_byname == 0)
qmgr_transport_byname = htable_create(10);
diff --git a/postfix/src/qmqpd/Makefile.in b/postfix/src/qmqpd/Makefile.in
index b61043840..4b83fa5e9 100644
--- a/postfix/src/qmqpd/Makefile.in
+++ b/postfix/src/qmqpd/Makefile.in
@@ -59,70 +59,71 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-qmqpd.o: qmqpd.c
-qmqpd.o: ../../include/sys_defs.h
-qmqpd.o: ../../include/msg.h
-qmqpd.o: ../../include/mymalloc.h
-qmqpd.o: ../../include/vstring.h
-qmqpd.o: ../../include/vbuf.h
-qmqpd.o: ../../include/vstream.h
-qmqpd.o: ../../include/netstring.h
-qmqpd.o: ../../include/dict.h
qmqpd.o: ../../include/argv.h
-qmqpd.o: ../../include/mail_params.h
-qmqpd.o: ../../include/record.h
-qmqpd.o: ../../include/rec_type.h
-qmqpd.o: ../../include/mail_proto.h
-qmqpd.o: ../../include/iostuff.h
qmqpd.o: ../../include/attr.h
qmqpd.o: ../../include/cleanup_user.h
-qmqpd.o: ../../include/mail_date.h
-qmqpd.o: ../../include/mail_conf.h
qmqpd.o: ../../include/debug_peer.h
+qmqpd.o: ../../include/dict.h
+qmqpd.o: ../../include/input_transp.h
+qmqpd.o: ../../include/iostuff.h
+qmqpd.o: ../../include/lex_822.h
+qmqpd.o: ../../include/mail_conf.h
+qmqpd.o: ../../include/mail_date.h
+qmqpd.o: ../../include/mail_params.h
+qmqpd.o: ../../include/mail_proto.h
+qmqpd.o: ../../include/mail_server.h
qmqpd.o: ../../include/mail_stream.h
-qmqpd.o: ../../include/namadr_list.h
qmqpd.o: ../../include/match_list.h
qmqpd.o: ../../include/match_ops.h
+qmqpd.o: ../../include/match_parent_style.h
+qmqpd.o: ../../include/msg.h
+qmqpd.o: ../../include/mymalloc.h
+qmqpd.o: ../../include/namadr_list.h
+qmqpd.o: ../../include/netstring.h
qmqpd.o: ../../include/quote_822_local.h
qmqpd.o: ../../include/quote_flags.h
-qmqpd.o: ../../include/match_parent_style.h
-qmqpd.o: ../../include/lex_822.h
+qmqpd.o: ../../include/rec_type.h
+qmqpd.o: ../../include/record.h
+qmqpd.o: ../../include/sys_defs.h
+qmqpd.o: ../../include/vbuf.h
qmqpd.o: ../../include/verp_sender.h
-qmqpd.o: ../../include/input_transp.h
-qmqpd.o: ../../include/mail_server.h
+qmqpd.o: ../../include/vstream.h
+qmqpd.o: ../../include/vstring.h
+qmqpd.o: qmqpd.c
qmqpd.o: qmqpd.h
-qmqpd_peer.o: qmqpd_peer.c
-qmqpd_peer.o: ../../include/sys_defs.h
+qmqpd_peer.o: ../../include/attr.h
+qmqpd_peer.o: ../../include/inet_proto.h
+qmqpd_peer.o: ../../include/iostuff.h
+qmqpd_peer.o: ../../include/mail_proto.h
+qmqpd_peer.o: ../../include/mail_stream.h
qmqpd_peer.o: ../../include/msg.h
+qmqpd_peer.o: ../../include/myaddrinfo.h
qmqpd_peer.o: ../../include/mymalloc.h
+qmqpd_peer.o: ../../include/sock_addr.h
qmqpd_peer.o: ../../include/stringops.h
-qmqpd_peer.o: ../../include/vstring.h
+qmqpd_peer.o: ../../include/sys_defs.h
+qmqpd_peer.o: ../../include/valid_hostname.h
+qmqpd_peer.o: ../../include/valid_mailhost_addr.h
qmqpd_peer.o: ../../include/vbuf.h
-qmqpd_peer.o: ../../include/myaddrinfo.h
-qmqpd_peer.o: ../../include/sock_addr.h
-qmqpd_peer.o: ../../include/inet_proto.h
-qmqpd_peer.o: ../../include/mail_proto.h
qmqpd_peer.o: ../../include/vstream.h
-qmqpd_peer.o: ../../include/iostuff.h
-qmqpd_peer.o: ../../include/attr.h
-qmqpd_peer.o: ../../include/valid_mailhost_addr.h
-qmqpd_peer.o: ../../include/valid_hostname.h
+qmqpd_peer.o: ../../include/vstring.h
qmqpd_peer.o: qmqpd.h
-qmqpd_peer.o: ../../include/mail_stream.h
-qmqpd_state.o: qmqpd_state.c
-qmqpd_state.o: ../../include/sys_defs.h
+qmqpd_peer.o: qmqpd_peer.c
+qmqpd_state.o: ../../include/attr.h
+qmqpd_state.o: ../../include/cleanup_user.h
+qmqpd_state.o: ../../include/iostuff.h
+qmqpd_state.o: ../../include/mail_proto.h
+qmqpd_state.o: ../../include/mail_stream.h
qmqpd_state.o: ../../include/mymalloc.h
-qmqpd_state.o: ../../include/vstream.h
+qmqpd_state.o: ../../include/sys_defs.h
qmqpd_state.o: ../../include/vbuf.h
+qmqpd_state.o: ../../include/vstream.h
qmqpd_state.o: ../../include/vstring.h
-qmqpd_state.o: ../../include/mail_stream.h
-qmqpd_state.o: ../../include/cleanup_user.h
-qmqpd_state.o: ../../include/mail_proto.h
-qmqpd_state.o: ../../include/iostuff.h
-qmqpd_state.o: ../../include/attr.h
qmqpd_state.o: qmqpd.h
+qmqpd_state.o: qmqpd_state.c
diff --git a/postfix/src/scache/Makefile.in b/postfix/src/scache/Makefile.in
index 9ce850494..3274b4cbd 100644
--- a/postfix/src/scache/Makefile.in
+++ b/postfix/src/scache/Makefile.in
@@ -47,24 +47,25 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-scache.o: scache.c
-scache.o: ../../include/sys_defs.h
-scache.o: ../../include/msg.h
-scache.o: ../../include/iostuff.h
-scache.o: ../../include/htable.h
-scache.o: ../../include/ring.h
+scache.o: ../../include/attr.h
scache.o: ../../include/events.h
+scache.o: ../../include/htable.h
+scache.o: ../../include/iostuff.h
+scache.o: ../../include/mail_conf.h
scache.o: ../../include/mail_params.h
scache.o: ../../include/mail_proto.h
-scache.o: ../../include/vstream.h
-scache.o: ../../include/vbuf.h
-scache.o: ../../include/attr.h
+scache.o: ../../include/mail_server.h
+scache.o: ../../include/msg.h
+scache.o: ../../include/ring.h
scache.o: ../../include/scache.h
+scache.o: ../../include/sys_defs.h
+scache.o: ../../include/vbuf.h
+scache.o: ../../include/vstream.h
scache.o: ../../include/vstring.h
-scache.o: ../../include/mail_server.h
-scache.o: ../../include/mail_conf.h
+scache.o: scache.c
diff --git a/postfix/src/sendmail/Makefile.in b/postfix/src/sendmail/Makefile.in
index 364e6a15a..b084ba65e 100644
--- a/postfix/src/sendmail/Makefile.in
+++ b/postfix/src/sendmail/Makefile.in
@@ -47,49 +47,50 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-sendmail.o: sendmail.c
-sendmail.o: ../../include/sys_defs.h
-sendmail.o: ../../include/msg.h
-sendmail.o: ../../include/mymalloc.h
-sendmail.o: ../../include/vstream.h
-sendmail.o: ../../include/vbuf.h
-sendmail.o: ../../include/msg_vstream.h
-sendmail.o: ../../include/msg_syslog.h
-sendmail.o: ../../include/vstring_vstream.h
-sendmail.o: ../../include/vstring.h
-sendmail.o: ../../include/username.h
-sendmail.o: ../../include/fullname.h
sendmail.o: ../../include/argv.h
-sendmail.o: ../../include/safe.h
-sendmail.o: ../../include/iostuff.h
-sendmail.o: ../../include/stringops.h
-sendmail.o: ../../include/set_ugid.h
-sendmail.o: ../../include/connect.h
-sendmail.o: ../../include/split_at.h
-sendmail.o: ../../include/mail_queue.h
-sendmail.o: ../../include/mail_proto.h
sendmail.o: ../../include/attr.h
-sendmail.o: ../../include/mail_params.h
-sendmail.o: ../../include/record.h
-sendmail.o: ../../include/rec_type.h
-sendmail.o: ../../include/rec_streamlf.h
-sendmail.o: ../../include/mail_conf.h
sendmail.o: ../../include/cleanup_user.h
-sendmail.o: ../../include/mail_task.h
-sendmail.o: ../../include/mail_run.h
+sendmail.o: ../../include/connect.h
sendmail.o: ../../include/debug_process.h
-sendmail.o: ../../include/tok822.h
-sendmail.o: ../../include/resolve_clnt.h
+sendmail.o: ../../include/deliver_request.h
+sendmail.o: ../../include/fullname.h
+sendmail.o: ../../include/header_opts.h
+sendmail.o: ../../include/iostuff.h
+sendmail.o: ../../include/mail_conf.h
sendmail.o: ../../include/mail_flush.h
+sendmail.o: ../../include/mail_params.h
+sendmail.o: ../../include/mail_proto.h
+sendmail.o: ../../include/mail_queue.h
+sendmail.o: ../../include/mail_run.h
sendmail.o: ../../include/mail_stream.h
-sendmail.o: ../../include/verp_sender.h
-sendmail.o: ../../include/deliver_request.h
-sendmail.o: ../../include/recipient_list.h
+sendmail.o: ../../include/mail_task.h
sendmail.o: ../../include/mime_state.h
-sendmail.o: ../../include/header_opts.h
+sendmail.o: ../../include/msg.h
+sendmail.o: ../../include/msg_syslog.h
+sendmail.o: ../../include/msg_vstream.h
+sendmail.o: ../../include/mymalloc.h
+sendmail.o: ../../include/rec_streamlf.h
+sendmail.o: ../../include/rec_type.h
+sendmail.o: ../../include/recipient_list.h
+sendmail.o: ../../include/record.h
+sendmail.o: ../../include/resolve_clnt.h
+sendmail.o: ../../include/safe.h
+sendmail.o: ../../include/set_ugid.h
+sendmail.o: ../../include/split_at.h
+sendmail.o: ../../include/stringops.h
+sendmail.o: ../../include/sys_defs.h
+sendmail.o: ../../include/tok822.h
sendmail.o: ../../include/user_acl.h
+sendmail.o: ../../include/username.h
+sendmail.o: ../../include/vbuf.h
+sendmail.o: ../../include/verp_sender.h
+sendmail.o: ../../include/vstream.h
+sendmail.o: ../../include/vstring.h
+sendmail.o: ../../include/vstring_vstream.h
+sendmail.o: sendmail.c
diff --git a/postfix/src/showq/Makefile.in b/postfix/src/showq/Makefile.in
index 285d77adc..4d7c8cd93 100644
--- a/postfix/src/showq/Makefile.in
+++ b/postfix/src/showq/Makefile.in
@@ -47,35 +47,36 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-showq.o: showq.c
-showq.o: ../../include/sys_defs.h
-showq.o: ../../include/msg.h
-showq.o: ../../include/scan_dir.h
-showq.o: ../../include/vstring.h
-showq.o: ../../include/vbuf.h
-showq.o: ../../include/vstream.h
-showq.o: ../../include/vstring_vstream.h
-showq.o: ../../include/stringops.h
-showq.o: ../../include/mymalloc.h
+showq.o: ../../include/attr.h
+showq.o: ../../include/bounce_log.h
showq.o: ../../include/htable.h
-showq.o: ../../include/mail_queue.h
-showq.o: ../../include/mail_open_ok.h
-showq.o: ../../include/mail_proto.h
showq.o: ../../include/iostuff.h
-showq.o: ../../include/attr.h
+showq.o: ../../include/mail_addr.h
+showq.o: ../../include/mail_conf.h
showq.o: ../../include/mail_date.h
+showq.o: ../../include/mail_open_ok.h
showq.o: ../../include/mail_params.h
+showq.o: ../../include/mail_proto.h
+showq.o: ../../include/mail_queue.h
showq.o: ../../include/mail_scan_dir.h
-showq.o: ../../include/mail_conf.h
-showq.o: ../../include/record.h
-showq.o: ../../include/rec_type.h
+showq.o: ../../include/mail_server.h
+showq.o: ../../include/msg.h
+showq.o: ../../include/mymalloc.h
showq.o: ../../include/quote_822_local.h
showq.o: ../../include/quote_flags.h
-showq.o: ../../include/mail_addr.h
-showq.o: ../../include/bounce_log.h
-showq.o: ../../include/mail_server.h
+showq.o: ../../include/rec_type.h
+showq.o: ../../include/record.h
+showq.o: ../../include/scan_dir.h
+showq.o: ../../include/stringops.h
+showq.o: ../../include/sys_defs.h
+showq.o: ../../include/vbuf.h
+showq.o: ../../include/vstream.h
+showq.o: ../../include/vstring.h
+showq.o: ../../include/vstring_vstream.h
+showq.o: showq.c
diff --git a/postfix/src/smtp/Makefile.in b/postfix/src/smtp/Makefile.in
index 16cae7bd2..2e464af0a 100644
--- a/postfix/src/smtp/Makefile.in
+++ b/postfix/src/smtp/Makefile.in
@@ -69,405 +69,421 @@ depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \
$(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
@$(EXPORT) make -f Makefile.in Makefile 1>&2
# do not edit below this line - it is generated by 'make depend'
-smtp.o: smtp.c
-smtp.o: ../../include/sys_defs.h
-smtp.o: ../../include/dict.h
-smtp.o: ../../include/vstream.h
-smtp.o: ../../include/vbuf.h
smtp.o: ../../include/argv.h
+smtp.o: ../../include/debug_peer.h
+smtp.o: ../../include/deliver_request.h
+smtp.o: ../../include/dict.h
+smtp.o: ../../include/dsn_util.h
+smtp.o: ../../include/ext_prop.h
+smtp.o: ../../include/flush_clnt.h
+smtp.o: ../../include/htable.h
+smtp.o: ../../include/mail_conf.h
+smtp.o: ../../include/mail_params.h
+smtp.o: ../../include/mail_server.h
+smtp.o: ../../include/maps.h
+smtp.o: ../../include/match_list.h
+smtp.o: ../../include/match_ops.h
smtp.o: ../../include/msg.h
smtp.o: ../../include/mymalloc.h
smtp.o: ../../include/name_mask.h
-smtp.o: ../../include/deliver_request.h
-smtp.o: ../../include/vstring.h
smtp.o: ../../include/recipient_list.h
-smtp.o: ../../include/mail_params.h
-smtp.o: ../../include/mail_conf.h
-smtp.o: ../../include/debug_peer.h
-smtp.o: ../../include/flush_clnt.h
+smtp.o: ../../include/resolve_clnt.h
smtp.o: ../../include/scache.h
smtp.o: ../../include/string_list.h
-smtp.o: ../../include/match_list.h
-smtp.o: ../../include/match_ops.h
-smtp.o: ../../include/maps.h
-smtp.o: ../../include/ext_prop.h
-smtp.o: ../../include/mail_server.h
-smtp.o: smtp.h
-smtp.o: ../../include/htable.h
-smtp.o: ../../include/tok822.h
-smtp.o: ../../include/resolve_clnt.h
+smtp.o: ../../include/sys_defs.h
smtp.o: ../../include/tls.h
+smtp.o: ../../include/tok822.h
+smtp.o: ../../include/vbuf.h
+smtp.o: ../../include/vstream.h
+smtp.o: ../../include/vstring.h
+smtp.o: smtp.c
+smtp.o: smtp.h
smtp.o: smtp_sasl.h
-smtp_addr.o: smtp_addr.c
-smtp_addr.o: ../../include/sys_defs.h
-smtp_addr.o: ../../include/msg.h
-smtp_addr.o: ../../include/vstring.h
-smtp_addr.o: ../../include/vbuf.h
-smtp_addr.o: ../../include/mymalloc.h
+smtp_addr.o: ../../include/argv.h
+smtp_addr.o: ../../include/deliver_request.h
+smtp_addr.o: ../../include/dict.h
+smtp_addr.o: ../../include/dns.h
+smtp_addr.o: ../../include/dsn_util.h
+smtp_addr.o: ../../include/htable.h
smtp_addr.o: ../../include/inet_addr_list.h
-smtp_addr.o: ../../include/myaddrinfo.h
-smtp_addr.o: ../../include/stringops.h
smtp_addr.o: ../../include/inet_proto.h
smtp_addr.o: ../../include/mail_params.h
+smtp_addr.o: ../../include/maps.h
+smtp_addr.o: ../../include/match_list.h
+smtp_addr.o: ../../include/match_ops.h
+smtp_addr.o: ../../include/msg.h
+smtp_addr.o: ../../include/myaddrinfo.h
+smtp_addr.o: ../../include/mymalloc.h
smtp_addr.o: ../../include/own_inet_addr.h
-smtp_addr.o: ../../include/dns.h
-smtp_addr.o: ../../include/sock_addr.h
-smtp_addr.o: smtp.h
-smtp_addr.o: ../../include/vstream.h
-smtp_addr.o: ../../include/argv.h
-smtp_addr.o: ../../include/htable.h
-smtp_addr.o: ../../include/deliver_request.h
smtp_addr.o: ../../include/recipient_list.h
+smtp_addr.o: ../../include/resolve_clnt.h
smtp_addr.o: ../../include/scache.h
+smtp_addr.o: ../../include/sock_addr.h
smtp_addr.o: ../../include/string_list.h
-smtp_addr.o: ../../include/match_list.h
-smtp_addr.o: ../../include/match_ops.h
-smtp_addr.o: ../../include/maps.h
-smtp_addr.o: ../../include/dict.h
-smtp_addr.o: ../../include/tok822.h
-smtp_addr.o: ../../include/resolve_clnt.h
+smtp_addr.o: ../../include/stringops.h
+smtp_addr.o: ../../include/sys_defs.h
smtp_addr.o: ../../include/tls.h
+smtp_addr.o: ../../include/tok822.h
+smtp_addr.o: ../../include/vbuf.h
+smtp_addr.o: ../../include/vstream.h
+smtp_addr.o: ../../include/vstring.h
+smtp_addr.o: smtp.h
+smtp_addr.o: smtp_addr.c
smtp_addr.o: smtp_addr.h
-smtp_chat.o: smtp_chat.c
-smtp_chat.o: ../../include/sys_defs.h
-smtp_chat.o: ../../include/msg.h
-smtp_chat.o: ../../include/vstring.h
-smtp_chat.o: ../../include/vbuf.h
-smtp_chat.o: ../../include/vstream.h
smtp_chat.o: ../../include/argv.h
-smtp_chat.o: ../../include/stringops.h
-smtp_chat.o: ../../include/line_wrap.h
-smtp_chat.o: ../../include/mymalloc.h
-smtp_chat.o: ../../include/recipient_list.h
+smtp_chat.o: ../../include/cleanup_user.h
smtp_chat.o: ../../include/deliver_request.h
-smtp_chat.o: ../../include/smtp_stream.h
-smtp_chat.o: ../../include/mail_params.h
+smtp_chat.o: ../../include/dict.h
+smtp_chat.o: ../../include/dsn_util.h
+smtp_chat.o: ../../include/htable.h
+smtp_chat.o: ../../include/line_wrap.h
smtp_chat.o: ../../include/mail_addr.h
-smtp_chat.o: ../../include/post_mail.h
-smtp_chat.o: ../../include/cleanup_user.h
smtp_chat.o: ../../include/mail_error.h
-smtp_chat.o: ../../include/name_mask.h
-smtp_chat.o: smtp.h
-smtp_chat.o: ../../include/htable.h
-smtp_chat.o: ../../include/scache.h
-smtp_chat.o: ../../include/string_list.h
+smtp_chat.o: ../../include/mail_params.h
+smtp_chat.o: ../../include/maps.h
smtp_chat.o: ../../include/match_list.h
smtp_chat.o: ../../include/match_ops.h
-smtp_chat.o: ../../include/maps.h
-smtp_chat.o: ../../include/dict.h
-smtp_chat.o: ../../include/tok822.h
+smtp_chat.o: ../../include/msg.h
+smtp_chat.o: ../../include/mymalloc.h
+smtp_chat.o: ../../include/name_mask.h
+smtp_chat.o: ../../include/post_mail.h
+smtp_chat.o: ../../include/recipient_list.h
smtp_chat.o: ../../include/resolve_clnt.h
+smtp_chat.o: ../../include/scache.h
+smtp_chat.o: ../../include/smtp_stream.h
+smtp_chat.o: ../../include/string_list.h
+smtp_chat.o: ../../include/stringops.h
+smtp_chat.o: ../../include/sys_defs.h
smtp_chat.o: ../../include/tls.h
-smtp_connect.o: smtp_connect.c
-smtp_connect.o: ../../include/sys_defs.h
-smtp_connect.o: ../../include/msg.h
-smtp_connect.o: ../../include/vstream.h
-smtp_connect.o: ../../include/vbuf.h
-smtp_connect.o: ../../include/vstring.h
-smtp_connect.o: ../../include/split_at.h
-smtp_connect.o: ../../include/mymalloc.h
-smtp_connect.o: ../../include/inet_addr_list.h
-smtp_connect.o: ../../include/myaddrinfo.h
-smtp_connect.o: ../../include/iostuff.h
-smtp_connect.o: ../../include/timed_connect.h
-smtp_connect.o: ../../include/stringops.h
-smtp_connect.o: ../../include/host_port.h
-smtp_connect.o: ../../include/sane_connect.h
-smtp_connect.o: ../../include/sock_addr.h
-smtp_connect.o: ../../include/mail_params.h
-smtp_connect.o: ../../include/own_inet_addr.h
+smtp_chat.o: ../../include/tok822.h
+smtp_chat.o: ../../include/vbuf.h
+smtp_chat.o: ../../include/vstream.h
+smtp_chat.o: ../../include/vstring.h
+smtp_chat.o: smtp.h
+smtp_chat.o: smtp_chat.c
+smtp_connect.o: ../../include/argv.h
+smtp_connect.o: ../../include/attr.h
smtp_connect.o: ../../include/deliver_pass.h
smtp_connect.o: ../../include/deliver_request.h
-smtp_connect.o: ../../include/recipient_list.h
-smtp_connect.o: ../../include/mail_proto.h
-smtp_connect.o: ../../include/attr.h
-smtp_connect.o: ../../include/mail_error.h
-smtp_connect.o: ../../include/name_mask.h
+smtp_connect.o: ../../include/dict.h
smtp_connect.o: ../../include/dns.h
-smtp_connect.o: smtp.h
-smtp_connect.o: ../../include/argv.h
+smtp_connect.o: ../../include/dsn_util.h
+smtp_connect.o: ../../include/host_port.h
smtp_connect.o: ../../include/htable.h
-smtp_connect.o: ../../include/scache.h
-smtp_connect.o: ../../include/string_list.h
+smtp_connect.o: ../../include/inet_addr_list.h
+smtp_connect.o: ../../include/iostuff.h
+smtp_connect.o: ../../include/mail_error.h
+smtp_connect.o: ../../include/mail_params.h
+smtp_connect.o: ../../include/mail_proto.h
+smtp_connect.o: ../../include/maps.h
smtp_connect.o: ../../include/match_list.h
smtp_connect.o: ../../include/match_ops.h
-smtp_connect.o: ../../include/maps.h
-smtp_connect.o: ../../include/dict.h
-smtp_connect.o: ../../include/tok822.h
+smtp_connect.o: ../../include/msg.h
+smtp_connect.o: ../../include/myaddrinfo.h
+smtp_connect.o: ../../include/mymalloc.h
+smtp_connect.o: ../../include/name_mask.h
+smtp_connect.o: ../../include/own_inet_addr.h
+smtp_connect.o: ../../include/recipient_list.h
smtp_connect.o: ../../include/resolve_clnt.h
+smtp_connect.o: ../../include/sane_connect.h
+smtp_connect.o: ../../include/scache.h
+smtp_connect.o: ../../include/sock_addr.h
+smtp_connect.o: ../../include/split_at.h
+smtp_connect.o: ../../include/string_list.h
+smtp_connect.o: ../../include/stringops.h
+smtp_connect.o: ../../include/sys_defs.h
+smtp_connect.o: ../../include/timed_connect.h
smtp_connect.o: ../../include/tls.h
+smtp_connect.o: ../../include/tok822.h
+smtp_connect.o: ../../include/vbuf.h
+smtp_connect.o: ../../include/vstream.h
+smtp_connect.o: ../../include/vstring.h
+smtp_connect.o: smtp.h
smtp_connect.o: smtp_addr.h
+smtp_connect.o: smtp_connect.c
smtp_connect.o: smtp_reuse.h
-smtp_map11.o: smtp_map11.c
-smtp_map11.o: ../../include/sys_defs.h
-smtp_map11.o: ../../include/msg.h
-smtp_map11.o: ../../include/vstring.h
-smtp_map11.o: ../../include/vbuf.h
-smtp_map11.o: ../../include/dict.h
-smtp_map11.o: ../../include/vstream.h
smtp_map11.o: ../../include/argv.h
-smtp_map11.o: ../../include/tok822.h
-smtp_map11.o: ../../include/resolve_clnt.h
-smtp_map11.o: ../../include/valid_hostname.h
+smtp_map11.o: ../../include/deliver_request.h
+smtp_map11.o: ../../include/dict.h
+smtp_map11.o: ../../include/dsn_util.h
+smtp_map11.o: ../../include/htable.h
smtp_map11.o: ../../include/mail_addr_map.h
smtp_map11.o: ../../include/maps.h
+smtp_map11.o: ../../include/match_list.h
+smtp_map11.o: ../../include/match_ops.h
+smtp_map11.o: ../../include/msg.h
smtp_map11.o: ../../include/quote_822_local.h
smtp_map11.o: ../../include/quote_flags.h
-smtp_map11.o: smtp.h
-smtp_map11.o: ../../include/htable.h
-smtp_map11.o: ../../include/deliver_request.h
smtp_map11.o: ../../include/recipient_list.h
+smtp_map11.o: ../../include/resolve_clnt.h
smtp_map11.o: ../../include/scache.h
smtp_map11.o: ../../include/string_list.h
-smtp_map11.o: ../../include/match_list.h
-smtp_map11.o: ../../include/match_ops.h
+smtp_map11.o: ../../include/sys_defs.h
smtp_map11.o: ../../include/tls.h
-smtp_proto.o: smtp_proto.c
-smtp_proto.o: ../../include/sys_defs.h
-smtp_proto.o: ../../include/msg.h
-smtp_proto.o: ../../include/vstring.h
-smtp_proto.o: ../../include/vbuf.h
-smtp_proto.o: ../../include/vstream.h
-smtp_proto.o: ../../include/vstring_vstream.h
-smtp_proto.o: ../../include/stringops.h
-smtp_proto.o: ../../include/mymalloc.h
+smtp_map11.o: ../../include/tok822.h
+smtp_map11.o: ../../include/valid_hostname.h
+smtp_map11.o: ../../include/vbuf.h
+smtp_map11.o: ../../include/vstream.h
+smtp_map11.o: ../../include/vstring.h
+smtp_map11.o: smtp.h
+smtp_map11.o: smtp_map11.c
+smtp_proto.o: ../../include/argv.h
+smtp_proto.o: ../../include/attr.h
+smtp_proto.o: ../../include/bounce.h
+smtp_proto.o: ../../include/defer.h
+smtp_proto.o: ../../include/deliver_request.h
+smtp_proto.o: ../../include/dict.h
+smtp_proto.o: ../../include/dsn_util.h
+smtp_proto.o: ../../include/ehlo_mask.h
+smtp_proto.o: ../../include/ext_prop.h
+smtp_proto.o: ../../include/header_opts.h
+smtp_proto.o: ../../include/htable.h
smtp_proto.o: ../../include/iostuff.h
-smtp_proto.o: ../../include/split_at.h
-smtp_proto.o: ../../include/name_code.h
+smtp_proto.o: ../../include/lex_822.h
+smtp_proto.o: ../../include/mail_addr_map.h
smtp_proto.o: ../../include/mail_params.h
-smtp_proto.o: ../../include/smtp_stream.h
+smtp_proto.o: ../../include/mail_proto.h
smtp_proto.o: ../../include/mail_queue.h
-smtp_proto.o: ../../include/recipient_list.h
-smtp_proto.o: ../../include/deliver_request.h
-smtp_proto.o: ../../include/defer.h
-smtp_proto.o: ../../include/bounce.h
-smtp_proto.o: ../../include/record.h
-smtp_proto.o: ../../include/rec_type.h
-smtp_proto.o: ../../include/off_cvt.h
+smtp_proto.o: ../../include/maps.h
smtp_proto.o: ../../include/mark_corrupt.h
+smtp_proto.o: ../../include/match_list.h
+smtp_proto.o: ../../include/match_ops.h
+smtp_proto.o: ../../include/mime_state.h
+smtp_proto.o: ../../include/msg.h
+smtp_proto.o: ../../include/mymalloc.h
+smtp_proto.o: ../../include/name_code.h
+smtp_proto.o: ../../include/off_cvt.h
smtp_proto.o: ../../include/quote_821_local.h
smtp_proto.o: ../../include/quote_flags.h
-smtp_proto.o: ../../include/mail_proto.h
-smtp_proto.o: ../../include/attr.h
-smtp_proto.o: ../../include/mime_state.h
-smtp_proto.o: ../../include/header_opts.h
-smtp_proto.o: ../../include/ehlo_mask.h
-smtp_proto.o: ../../include/maps.h
-smtp_proto.o: ../../include/dict.h
-smtp_proto.o: ../../include/argv.h
-smtp_proto.o: ../../include/tok822.h
+smtp_proto.o: ../../include/rec_type.h
+smtp_proto.o: ../../include/recipient_list.h
+smtp_proto.o: ../../include/record.h
smtp_proto.o: ../../include/resolve_clnt.h
-smtp_proto.o: ../../include/mail_addr_map.h
-smtp_proto.o: ../../include/ext_prop.h
-smtp_proto.o: ../../include/lex_822.h
-smtp_proto.o: smtp.h
-smtp_proto.o: ../../include/htable.h
smtp_proto.o: ../../include/scache.h
+smtp_proto.o: ../../include/smtp_stream.h
+smtp_proto.o: ../../include/split_at.h
smtp_proto.o: ../../include/string_list.h
-smtp_proto.o: ../../include/match_list.h
-smtp_proto.o: ../../include/match_ops.h
+smtp_proto.o: ../../include/stringops.h
+smtp_proto.o: ../../include/sys_defs.h
smtp_proto.o: ../../include/tls.h
+smtp_proto.o: ../../include/tok822.h
+smtp_proto.o: ../../include/vbuf.h
+smtp_proto.o: ../../include/vstream.h
+smtp_proto.o: ../../include/vstring.h
+smtp_proto.o: ../../include/vstring_vstream.h
+smtp_proto.o: smtp.h
+smtp_proto.o: smtp_proto.c
smtp_proto.o: smtp_sasl.h
-smtp_rcpt.o: smtp_rcpt.c
-smtp_rcpt.o: ../../include/sys_defs.h
-smtp_rcpt.o: ../../include/msg.h
-smtp_rcpt.o: ../../include/deliver_request.h
-smtp_rcpt.o: ../../include/vstring.h
-smtp_rcpt.o: ../../include/vbuf.h
-smtp_rcpt.o: ../../include/vstream.h
-smtp_rcpt.o: ../../include/recipient_list.h
-smtp_rcpt.o: ../../include/deliver_completed.h
-smtp_rcpt.o: ../../include/sent.h
-smtp_rcpt.o: smtp.h
smtp_rcpt.o: ../../include/argv.h
+smtp_rcpt.o: ../../include/deliver_completed.h
+smtp_rcpt.o: ../../include/deliver_request.h
+smtp_rcpt.o: ../../include/dict.h
+smtp_rcpt.o: ../../include/dsn_util.h
smtp_rcpt.o: ../../include/htable.h
-smtp_rcpt.o: ../../include/scache.h
-smtp_rcpt.o: ../../include/string_list.h
+smtp_rcpt.o: ../../include/maps.h
smtp_rcpt.o: ../../include/match_list.h
smtp_rcpt.o: ../../include/match_ops.h
-smtp_rcpt.o: ../../include/maps.h
-smtp_rcpt.o: ../../include/dict.h
-smtp_rcpt.o: ../../include/tok822.h
+smtp_rcpt.o: ../../include/msg.h
+smtp_rcpt.o: ../../include/recipient_list.h
smtp_rcpt.o: ../../include/resolve_clnt.h
+smtp_rcpt.o: ../../include/scache.h
+smtp_rcpt.o: ../../include/sent.h
+smtp_rcpt.o: ../../include/string_list.h
+smtp_rcpt.o: ../../include/sys_defs.h
smtp_rcpt.o: ../../include/tls.h
-smtp_reuse.o: smtp_reuse.c
-smtp_reuse.o: ../../include/sys_defs.h
-smtp_reuse.o: ../../include/msg.h
-smtp_reuse.o: ../../include/mymalloc.h
-smtp_reuse.o: ../../include/vstream.h
-smtp_reuse.o: ../../include/vbuf.h
-smtp_reuse.o: ../../include/vstring.h
-smtp_reuse.o: ../../include/htable.h
-smtp_reuse.o: ../../include/stringops.h
-smtp_reuse.o: ../../include/scache.h
-smtp_reuse.o: ../../include/mail_params.h
-smtp_reuse.o: smtp.h
+smtp_rcpt.o: ../../include/tok822.h
+smtp_rcpt.o: ../../include/vbuf.h
+smtp_rcpt.o: ../../include/vstream.h
+smtp_rcpt.o: ../../include/vstring.h
+smtp_rcpt.o: smtp.h
+smtp_rcpt.o: smtp_rcpt.c
smtp_reuse.o: ../../include/argv.h
smtp_reuse.o: ../../include/deliver_request.h
-smtp_reuse.o: ../../include/recipient_list.h
-smtp_reuse.o: ../../include/string_list.h
+smtp_reuse.o: ../../include/dict.h
+smtp_reuse.o: ../../include/dns.h
+smtp_reuse.o: ../../include/dsn_util.h
+smtp_reuse.o: ../../include/htable.h
+smtp_reuse.o: ../../include/mail_params.h
+smtp_reuse.o: ../../include/maps.h
smtp_reuse.o: ../../include/match_list.h
smtp_reuse.o: ../../include/match_ops.h
-smtp_reuse.o: ../../include/maps.h
-smtp_reuse.o: ../../include/dict.h
-smtp_reuse.o: ../../include/tok822.h
+smtp_reuse.o: ../../include/msg.h
+smtp_reuse.o: ../../include/myaddrinfo.h
+smtp_reuse.o: ../../include/mymalloc.h
+smtp_reuse.o: ../../include/recipient_list.h
smtp_reuse.o: ../../include/resolve_clnt.h
+smtp_reuse.o: ../../include/scache.h
+smtp_reuse.o: ../../include/sock_addr.h
+smtp_reuse.o: ../../include/string_list.h
+smtp_reuse.o: ../../include/stringops.h
+smtp_reuse.o: ../../include/sys_defs.h
smtp_reuse.o: ../../include/tls.h
+smtp_reuse.o: ../../include/tok822.h
+smtp_reuse.o: ../../include/vbuf.h
+smtp_reuse.o: ../../include/vstream.h
+smtp_reuse.o: ../../include/vstring.h
+smtp_reuse.o: smtp.h
+smtp_reuse.o: smtp_reuse.c
smtp_reuse.o: smtp_reuse.h
-smtp_reuse.o: ../../include/dns.h
-smtp_reuse.o: ../../include/sock_addr.h
-smtp_reuse.o: ../../include/myaddrinfo.h
-smtp_sasl_glue.o: smtp_sasl_glue.c
-smtp_sasl_glue.o: ../../include/sys_defs.h
-smtp_sasl_glue.o: ../../include/msg.h
-smtp_sasl_glue.o: ../../include/mymalloc.h
-smtp_sasl_glue.o: ../../include/stringops.h
-smtp_sasl_glue.o: ../../include/vstring.h
-smtp_sasl_glue.o: ../../include/vbuf.h
-smtp_sasl_glue.o: ../../include/split_at.h
-smtp_sasl_glue.o: ../../include/name_mask.h
+smtp_sasl_glue.o: ../../include/argv.h
+smtp_sasl_glue.o: ../../include/deliver_request.h
+smtp_sasl_glue.o: ../../include/dict.h
+smtp_sasl_glue.o: ../../include/dsn_util.h
+smtp_sasl_glue.o: ../../include/htable.h
smtp_sasl_glue.o: ../../include/mail_params.h
-smtp_sasl_glue.o: ../../include/string_list.h
+smtp_sasl_glue.o: ../../include/maps.h
smtp_sasl_glue.o: ../../include/match_list.h
smtp_sasl_glue.o: ../../include/match_ops.h
-smtp_sasl_glue.o: ../../include/maps.h
-smtp_sasl_glue.o: ../../include/dict.h
-smtp_sasl_glue.o: ../../include/vstream.h
-smtp_sasl_glue.o: ../../include/argv.h
-smtp_sasl_glue.o: smtp.h
-smtp_sasl_glue.o: ../../include/htable.h
-smtp_sasl_glue.o: ../../include/deliver_request.h
+smtp_sasl_glue.o: ../../include/msg.h
+smtp_sasl_glue.o: ../../include/mymalloc.h
+smtp_sasl_glue.o: ../../include/name_mask.h
smtp_sasl_glue.o: ../../include/recipient_list.h
-smtp_sasl_glue.o: ../../include/scache.h
-smtp_sasl_glue.o: ../../include/tok822.h
smtp_sasl_glue.o: ../../include/resolve_clnt.h
+smtp_sasl_glue.o: ../../include/scache.h
+smtp_sasl_glue.o: ../../include/split_at.h
+smtp_sasl_glue.o: ../../include/string_list.h
+smtp_sasl_glue.o: ../../include/stringops.h
+smtp_sasl_glue.o: ../../include/sys_defs.h
smtp_sasl_glue.o: ../../include/tls.h
+smtp_sasl_glue.o: ../../include/tok822.h
+smtp_sasl_glue.o: ../../include/vbuf.h
+smtp_sasl_glue.o: ../../include/vstream.h
+smtp_sasl_glue.o: ../../include/vstring.h
+smtp_sasl_glue.o: smtp.h
smtp_sasl_glue.o: smtp_sasl.h
-smtp_sasl_proto.o: smtp_sasl_proto.c
-smtp_sasl_proto.o: ../../include/sys_defs.h
-smtp_sasl_proto.o: ../../include/msg.h
-smtp_sasl_proto.o: ../../include/mymalloc.h
-smtp_sasl_proto.o: ../../include/stringops.h
-smtp_sasl_proto.o: ../../include/vstring.h
-smtp_sasl_proto.o: ../../include/vbuf.h
-smtp_sasl_proto.o: ../../include/mail_params.h
-smtp_sasl_proto.o: smtp.h
-smtp_sasl_proto.o: ../../include/vstream.h
+smtp_sasl_glue.o: smtp_sasl_glue.c
smtp_sasl_proto.o: ../../include/argv.h
-smtp_sasl_proto.o: ../../include/htable.h
smtp_sasl_proto.o: ../../include/deliver_request.h
-smtp_sasl_proto.o: ../../include/recipient_list.h
-smtp_sasl_proto.o: ../../include/scache.h
-smtp_sasl_proto.o: ../../include/string_list.h
+smtp_sasl_proto.o: ../../include/dict.h
+smtp_sasl_proto.o: ../../include/dsn_util.h
+smtp_sasl_proto.o: ../../include/htable.h
+smtp_sasl_proto.o: ../../include/mail_params.h
+smtp_sasl_proto.o: ../../include/maps.h
smtp_sasl_proto.o: ../../include/match_list.h
smtp_sasl_proto.o: ../../include/match_ops.h
-smtp_sasl_proto.o: ../../include/maps.h
-smtp_sasl_proto.o: ../../include/dict.h
-smtp_sasl_proto.o: ../../include/tok822.h
+smtp_sasl_proto.o: ../../include/msg.h
+smtp_sasl_proto.o: ../../include/mymalloc.h
+smtp_sasl_proto.o: ../../include/recipient_list.h
smtp_sasl_proto.o: ../../include/resolve_clnt.h
+smtp_sasl_proto.o: ../../include/scache.h
+smtp_sasl_proto.o: ../../include/string_list.h
+smtp_sasl_proto.o: ../../include/stringops.h
+smtp_sasl_proto.o: ../../include/sys_defs.h
smtp_sasl_proto.o: ../../include/tls.h
+smtp_sasl_proto.o: ../../include/tok822.h
+smtp_sasl_proto.o: ../../include/vbuf.h
+smtp_sasl_proto.o: ../../include/vstream.h
+smtp_sasl_proto.o: ../../include/vstring.h
+smtp_sasl_proto.o: smtp.h
smtp_sasl_proto.o: smtp_sasl.h
-smtp_session.o: smtp_session.c
-smtp_session.o: ../../include/sys_defs.h
-smtp_session.o: ../../include/msg.h
-smtp_session.o: ../../include/mymalloc.h
-smtp_session.o: ../../include/vstream.h
-smtp_session.o: ../../include/vbuf.h
-smtp_session.o: ../../include/stringops.h
-smtp_session.o: ../../include/vstring.h
-smtp_session.o: ../../include/mime_state.h
-smtp_session.o: ../../include/header_opts.h
+smtp_sasl_proto.o: smtp_sasl_proto.c
+smtp_session.o: ../../include/argv.h
smtp_session.o: ../../include/debug_peer.h
-smtp_session.o: ../../include/mail_params.h
-smtp_session.o: ../../include/maps.h
+smtp_session.o: ../../include/deliver_request.h
smtp_session.o: ../../include/dict.h
-smtp_session.o: ../../include/argv.h
-smtp_session.o: smtp.h
+smtp_session.o: ../../include/dsn_util.h
+smtp_session.o: ../../include/header_opts.h
smtp_session.o: ../../include/htable.h
-smtp_session.o: ../../include/deliver_request.h
-smtp_session.o: ../../include/recipient_list.h
-smtp_session.o: ../../include/scache.h
-smtp_session.o: ../../include/string_list.h
+smtp_session.o: ../../include/mail_params.h
+smtp_session.o: ../../include/maps.h
smtp_session.o: ../../include/match_list.h
smtp_session.o: ../../include/match_ops.h
-smtp_session.o: ../../include/tok822.h
+smtp_session.o: ../../include/mime_state.h
+smtp_session.o: ../../include/msg.h
+smtp_session.o: ../../include/mymalloc.h
+smtp_session.o: ../../include/recipient_list.h
smtp_session.o: ../../include/resolve_clnt.h
+smtp_session.o: ../../include/scache.h
+smtp_session.o: ../../include/string_list.h
+smtp_session.o: ../../include/stringops.h
+smtp_session.o: ../../include/sys_defs.h
smtp_session.o: ../../include/tls.h
-smtp_state.o: smtp_state.c
-smtp_state.o: ../../include/sys_defs.h
-smtp_state.o: ../../include/mymalloc.h
-smtp_state.o: ../../include/vstring.h
-smtp_state.o: ../../include/vbuf.h
-smtp_state.o: ../../include/mail_params.h
-smtp_state.o: smtp.h
-smtp_state.o: ../../include/vstream.h
+smtp_session.o: ../../include/tok822.h
+smtp_session.o: ../../include/vbuf.h
+smtp_session.o: ../../include/vstream.h
+smtp_session.o: ../../include/vstring.h
+smtp_session.o: smtp.h
+smtp_session.o: smtp_sasl.h
+smtp_session.o: smtp_session.c
smtp_state.o: ../../include/argv.h
-smtp_state.o: ../../include/htable.h
smtp_state.o: ../../include/deliver_request.h
-smtp_state.o: ../../include/recipient_list.h
-smtp_state.o: ../../include/scache.h
-smtp_state.o: ../../include/string_list.h
+smtp_state.o: ../../include/dict.h
+smtp_state.o: ../../include/dsn_util.h
+smtp_state.o: ../../include/htable.h
+smtp_state.o: ../../include/mail_params.h
+smtp_state.o: ../../include/maps.h
smtp_state.o: ../../include/match_list.h
smtp_state.o: ../../include/match_ops.h
-smtp_state.o: ../../include/maps.h
-smtp_state.o: ../../include/dict.h
-smtp_state.o: ../../include/tok822.h
+smtp_state.o: ../../include/mymalloc.h
+smtp_state.o: ../../include/recipient_list.h
smtp_state.o: ../../include/resolve_clnt.h
+smtp_state.o: ../../include/scache.h
+smtp_state.o: ../../include/string_list.h
+smtp_state.o: ../../include/sys_defs.h
smtp_state.o: ../../include/tls.h
+smtp_state.o: ../../include/tok822.h
+smtp_state.o: ../../include/vbuf.h
+smtp_state.o: ../../include/vstream.h
+smtp_state.o: ../../include/vstring.h
+smtp_state.o: smtp.h
smtp_state.o: smtp_sasl.h
-smtp_trouble.o: smtp_trouble.c
-smtp_trouble.o: ../../include/sys_defs.h
-smtp_trouble.o: ../../include/msg.h
-smtp_trouble.o: ../../include/vstring.h
-smtp_trouble.o: ../../include/vbuf.h
-smtp_trouble.o: ../../include/stringops.h
-smtp_trouble.o: ../../include/mymalloc.h
-smtp_trouble.o: ../../include/smtp_stream.h
-smtp_trouble.o: ../../include/vstream.h
-smtp_trouble.o: ../../include/deliver_request.h
-smtp_trouble.o: ../../include/recipient_list.h
-smtp_trouble.o: ../../include/deliver_completed.h
+smtp_state.o: smtp_state.c
+smtp_trouble.o: ../../include/argv.h
smtp_trouble.o: ../../include/bounce.h
smtp_trouble.o: ../../include/defer.h
-smtp_trouble.o: ../../include/mail_error.h
-smtp_trouble.o: ../../include/name_mask.h
-smtp_trouble.o: smtp.h
-smtp_trouble.o: ../../include/argv.h
+smtp_trouble.o: ../../include/deliver_completed.h
+smtp_trouble.o: ../../include/deliver_request.h
+smtp_trouble.o: ../../include/dict.h
+smtp_trouble.o: ../../include/dsn_util.h
smtp_trouble.o: ../../include/htable.h
-smtp_trouble.o: ../../include/scache.h
-smtp_trouble.o: ../../include/string_list.h
+smtp_trouble.o: ../../include/mail_error.h
+smtp_trouble.o: ../../include/maps.h
smtp_trouble.o: ../../include/match_list.h
smtp_trouble.o: ../../include/match_ops.h
-smtp_trouble.o: ../../include/maps.h
-smtp_trouble.o: ../../include/dict.h
-smtp_trouble.o: ../../include/tok822.h
+smtp_trouble.o: ../../include/msg.h
+smtp_trouble.o: ../../include/mymalloc.h
+smtp_trouble.o: ../../include/name_mask.h
+smtp_trouble.o: ../../include/recipient_list.h
smtp_trouble.o: ../../include/resolve_clnt.h
+smtp_trouble.o: ../../include/scache.h
+smtp_trouble.o: ../../include/smtp_stream.h
+smtp_trouble.o: ../../include/string_list.h
+smtp_trouble.o: ../../include/stringops.h
+smtp_trouble.o: ../../include/sys_defs.h
smtp_trouble.o: ../../include/tls.h
-smtp_unalias.o: smtp_unalias.c
-smtp_unalias.o: ../../include/sys_defs.h
+smtp_trouble.o: ../../include/tok822.h
+smtp_trouble.o: ../../include/vbuf.h
+smtp_trouble.o: ../../include/vstream.h
+smtp_trouble.o: ../../include/vstring.h
+smtp_trouble.o: smtp.h
+smtp_trouble.o: smtp_trouble.c
+smtp_unalias.o: ../../include/argv.h
+smtp_unalias.o: ../../include/deliver_request.h
+smtp_unalias.o: ../../include/dict.h
+smtp_unalias.o: ../../include/dns.h
+smtp_unalias.o: ../../include/dsn_util.h
smtp_unalias.o: ../../include/htable.h
-smtp_unalias.o: ../../include/vstring.h
-smtp_unalias.o: ../../include/vbuf.h
+smtp_unalias.o: ../../include/maps.h
+smtp_unalias.o: ../../include/match_list.h
+smtp_unalias.o: ../../include/match_ops.h
smtp_unalias.o: ../../include/msg.h
-smtp_unalias.o: ../../include/dns.h
-smtp_unalias.o: ../../include/sock_addr.h
smtp_unalias.o: ../../include/myaddrinfo.h
-smtp_unalias.o: smtp.h
-smtp_unalias.o: ../../include/vstream.h
-smtp_unalias.o: ../../include/argv.h
-smtp_unalias.o: ../../include/deliver_request.h
smtp_unalias.o: ../../include/recipient_list.h
+smtp_unalias.o: ../../include/resolve_clnt.h
smtp_unalias.o: ../../include/scache.h
+smtp_unalias.o: ../../include/sock_addr.h
smtp_unalias.o: ../../include/string_list.h
-smtp_unalias.o: ../../include/match_list.h
-smtp_unalias.o: ../../include/match_ops.h
-smtp_unalias.o: ../../include/maps.h
-smtp_unalias.o: ../../include/dict.h
-smtp_unalias.o: ../../include/tok822.h
-smtp_unalias.o: ../../include/resolve_clnt.h
+smtp_unalias.o: ../../include/sys_defs.h
smtp_unalias.o: ../../include/tls.h
+smtp_unalias.o: ../../include/tok822.h
+smtp_unalias.o: ../../include/vbuf.h
+smtp_unalias.o: ../../include/vstream.h
+smtp_unalias.o: ../../include/vstring.h
+smtp_unalias.o: smtp.h
+smtp_unalias.o: smtp_unalias.c
diff --git a/postfix/src/smtp/smtp.c b/postfix/src/smtp/smtp.c
index b0bbf70ff..5455059fd 100644
--- a/postfix/src/smtp/smtp.c
+++ b/postfix/src/smtp/smtp.c
@@ -47,6 +47,7 @@
/* RFC 1652 (8bit-MIME transport)
/* RFC 1870 (Message Size Declaration)
/* RFC 2045 (MIME: Format of Internet Message Bodies)
+/* RFC 2034 (Enhanced Error Codes)
/* RFC 2046 (MIME: Media Types)
/* RFC 2554 (AUTH command)
/* RFC 2821 (SMTP protocol)
diff --git a/postfix/src/smtp/smtp.h b/postfix/src/smtp/smtp.h
index 2aa7a363c..4328e6426 100644
--- a/postfix/src/smtp/smtp.h
+++ b/postfix/src/smtp/smtp.h
@@ -32,6 +32,7 @@
#include
#include
#include
+#include
/*
* Postfix TLS library.
@@ -247,6 +248,7 @@ extern int smtp_quit(SMTP_STATE *);
*/
typedef struct SMTP_RESP { /* server response */
int code; /* status */
+ char dsn[DSN_BUFSIZE]; /* DSN detail */
char *str; /* text */
VSTRING *buf; /* origin of text */
} SMTP_RESP;
@@ -296,16 +298,18 @@ extern void smtp_chat_notify(SMTP_SESSION *);
#define SMTP_RCPT_LEFT(state) (state)->rcpt_left
extern void smtp_rcpt_cleanup(SMTP_STATE *);
-extern void smtp_rcpt_done(SMTP_STATE *, const char *, RECIPIENT *);
+extern void smtp_rcpt_done(SMTP_STATE *, const char *, const char *, RECIPIENT *);
/*
* smtp_trouble.c
*/
-extern int PRINTFLIKE(3, 4) smtp_conn_fail(SMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) smtp_site_fail(SMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) smtp_mesg_fail(SMTP_STATE *, int, char *,...);
-extern void PRINTFLIKE(4, 5) smtp_rcpt_fail(SMTP_STATE *, int, RECIPIENT *, char *,...);
-extern int smtp_stream_except(SMTP_STATE *, int, char *);
+extern int PRINTFLIKE(4, 5) smtp_site_fail(SMTP_STATE *, const char *, int,
+ const char *,...);
+extern int PRINTFLIKE(4, 5) smtp_mesg_fail(SMTP_STATE *, const char *, int,
+ const char *,...);
+extern void PRINTFLIKE(5, 6) smtp_rcpt_fail(SMTP_STATE *, const char *, int,
+ RECIPIENT *, const char *,...);
+extern int smtp_stream_except(SMTP_STATE *, int, const char *);
/*
* smtp_unalias.c
diff --git a/postfix/src/smtp/smtp_addr.c b/postfix/src/smtp/smtp_addr.c
index 24f08902a..7609800af 100644
--- a/postfix/src/smtp/smtp_addr.c
+++ b/postfix/src/smtp/smtp_addr.c
@@ -9,13 +9,13 @@
/* DNS_RR *smtp_domain_addr(name, misc_flags, why, found_myself)
/* char *name;
/* int misc_flags;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/* int *found_myself;
/*
/* DNS_RR *smtp_host_addr(name, misc_flags, why)
/* char *name;
/* int misc_flags;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/* DESCRIPTION
/* This module implements Internet address lookups. By default,
/* lookups are done via the Internet domain name service (DNS).
@@ -56,7 +56,7 @@
/* .IP SMTP_ERR_LOOP
/* The local machine is the best mail exchanger.
/* .PP
-/* In addition, a textual description of the problem is made available
+/* In addition, a description of the problem is made available
/* via the \fIwhy\fR argument.
/* LICENSE
/* .ad
@@ -96,6 +96,7 @@
#include
#include
+#include
/* DNS library. */
@@ -128,7 +129,8 @@ static void smtp_print_addr(char *what, DNS_RR *addr_list)
/* smtp_addr_one - address lookup for one host name */
-static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRING *why)
+static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref,
+ DSN_VSTRING *why)
{
char *myname = "smtp_addr_one";
DNS_RR *addr = 0;
@@ -146,7 +148,7 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
* Interpret a numerical name as an address.
*/
if (hostaddr_to_sockaddr(host, (char *) 0, 0, &res0) == 0
- && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
+ && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
if ((addr = dns_sa_to_rr(host, pref, res0->ai_addr)) == 0)
msg_fatal("host %s: conversion error for address family %d: %m",
host, ((struct sockaddr *) (res0->ai_addr))->sa_family);
@@ -159,21 +161,25 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
* Use DNS lookup, but keep the option open to use native name service.
*/
if (smtp_host_lookup_mask & SMTP_HOST_FLAG_DNS) {
- switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0, why,
- DNS_REQ_FLAG_ALL, proto_info->dns_atype_list)) {
+ switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0,
+ why->vstring, DNS_REQ_FLAG_ALL,
+ proto_info->dns_atype_list)) {
case DNS_OK:
for (rr = addr; rr; rr = rr->next)
rr->pref = pref;
addr_list = dns_rr_append(addr_list, addr);
return (addr_list);
default:
+ dsn_vstring_update(why, "4.4.3", "");
smtp_errno = SMTP_ERR_RETRY;
return (addr_list);
case DNS_FAIL:
+ dsn_vstring_update(why, "4.4.3", "");
if (smtp_errno != SMTP_ERR_RETRY)
smtp_errno = SMTP_ERR_FAIL;
return (addr_list);
case DNS_NOTFOUND:
+ dsn_vstring_update(why, "4.4.4", "");
if (smtp_errno != SMTP_ERR_RETRY)
smtp_errno = SMTP_ERR_FAIL;
/* maybe native naming service will succeed */
@@ -186,10 +192,19 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
*/
#define RETRY_AI_ERROR(e) \
((e) == EAI_AGAIN || (e) == EAI_MEMORY || (e) == EAI_SYSTEM)
+#ifdef EAI_NODATA
+#define DSN_NOHOST(e) \
+ ((e) == EAI_AGAIN || (e) == EAI_NODATA || (e) == EAI_NONAME)
+#else
+#define DSN_NOHOST(e) \
+ ((e) == EAI_AGAIN || (e) == EAI_NONAME)
+#endif
if (smtp_host_lookup_mask & SMTP_HOST_FLAG_NATIVE) {
if ((aierr = hostname_to_sockaddr(host, (char *) 0, 0, &res0)) != 0) {
- vstring_sprintf(why, "%s: %s", host, MAI_STRERROR(aierr));
+ dsn_vstring_update(why, DSN_NOHOST(aierr) ? "4.4.4" : "4.3.0",
+ "unable to look up host %s: %s",
+ host, MAI_STRERROR(aierr));
if (smtp_errno != SMTP_ERR_RETRY)
smtp_errno =
(RETRY_AI_ERROR(aierr) ? SMTP_ERR_RETRY : SMTP_ERR_FAIL);
@@ -208,7 +223,7 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
}
freeaddrinfo(res0);
if (found == 0) {
- vstring_sprintf(why, "%s: host not found", host);
+ dsn_vstring_update(why, "5.4.4", "%s: host not found", host);
smtp_errno = SMTP_ERR_FAIL;
}
return (addr_list);
@@ -223,7 +238,7 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
/* smtp_addr_list - address lookup for a list of mail exchangers */
-static DNS_RR *smtp_addr_list(DNS_RR *mx_names, VSTRING *why)
+static DNS_RR *smtp_addr_list(DNS_RR *mx_names, DSN_VSTRING *why)
{
DNS_RR *addr_list = 0;
DNS_RR *rr;
@@ -333,7 +348,7 @@ static int smtp_compare_pref(DNS_RR *a, DNS_RR *b)
/* smtp_domain_addr - mail exchanger address lookup */
-DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
+DNS_RR *smtp_domain_addr(char *name, int misc_flags, DSN_VSTRING *why,
int *found_myself)
{
DNS_RR *mx_names;
@@ -397,13 +412,15 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
* at hostnames provides a partial solution for MX hosts behind a NAT
* gateway.
*/
- switch (dns_lookup(name, T_MX, 0, &mx_names, (VSTRING *) 0, why)) {
+ switch (dns_lookup(name, T_MX, 0, &mx_names, (VSTRING *) 0, why->vstring)) {
default:
+ dsn_vstring_update(why, "4.4.3", "");
smtp_errno = SMTP_ERR_RETRY;
if (var_ign_mx_lookup_err)
addr_list = smtp_host_addr(name, misc_flags, why);
break;
case DNS_FAIL:
+ dsn_vstring_update(why, "5.4.3", "");
smtp_errno = SMTP_ERR_FAIL;
if (var_ign_mx_lookup_err)
addr_list = smtp_host_addr(name, misc_flags, why);
@@ -414,6 +431,7 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
addr_list = smtp_addr_list(mx_names, why);
dns_rr_free(mx_names);
if (addr_list == 0) {
+ /* DSN and text does not change. */
if (var_smtp_defer_mxaddr)
smtp_errno = SMTP_ERR_RETRY;
msg_warn("no MX host for %s has a valid address record", name);
@@ -427,12 +445,14 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
addr_list = smtp_truncate_self(addr_list, self->pref);
if (addr_list == 0) {
if (best_pref != best_found) {
- vstring_sprintf(why, "unable to find primary relay for %s",
- name);
+ dsn_vstring_update(why, "4.4.4",
+ "unable to find primary relay for %s",
+ name);
smtp_errno = SMTP_ERR_RETRY;
} else {
- vstring_sprintf(why, "mail for %s loops back to myself",
- name);
+ dsn_vstring_update(why, "5.3.5",
+ "mail for %s loops back to myself",
+ name);
smtp_errno = SMTP_ERR_LOOP;
}
}
@@ -456,7 +476,7 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
/* smtp_host_addr - direct host lookup */
-DNS_RR *smtp_host_addr(char *host, int misc_flags, VSTRING *why)
+DNS_RR *smtp_host_addr(char *host, int misc_flags, DSN_VSTRING *why)
{
DNS_RR *addr_list;
@@ -472,7 +492,8 @@ DNS_RR *smtp_host_addr(char *host, int misc_flags, VSTRING *why)
&& (misc_flags & SMTP_MISC_FLAG_LOOP_DETECT)
&& smtp_find_self(addr_list) != 0) {
dns_rr_free(addr_list);
- vstring_sprintf(why, "mail for %s loops back to myself", host);
+ dsn_vstring_update(why, "5.3.5",
+ "mail for %s loops back to myself", host);
smtp_errno = SMTP_ERR_LOOP;
return (0);
}
diff --git a/postfix/src/smtp/smtp_addr.h b/postfix/src/smtp/smtp_addr.h
index 6e211fe33..da907c8fe 100644
--- a/postfix/src/smtp/smtp_addr.h
+++ b/postfix/src/smtp/smtp_addr.h
@@ -8,6 +8,11 @@
/* DESCRIPTION
/* .nf
+ /*
+ * Global library.
+ */
+#include
+
/*
* DNS library.
*/
@@ -16,8 +21,8 @@
/*
* Internal interfaces.
*/
-extern DNS_RR *smtp_host_addr(char *, int, VSTRING *);
-extern DNS_RR *smtp_domain_addr(char *, int, VSTRING *, int *);
+extern DNS_RR *smtp_host_addr(char *, int, DSN_VSTRING *);
+extern DNS_RR *smtp_domain_addr(char *, int, DSN_VSTRING *, int *);
/* LICENSE
/* .ad
diff --git a/postfix/src/smtp/smtp_chat.c b/postfix/src/smtp/smtp_chat.c
index 4cb579498..b25647a6d 100644
--- a/postfix/src/smtp/smtp_chat.c
+++ b/postfix/src/smtp/smtp_chat.c
@@ -9,6 +9,7 @@
/* typedef struct {
/* .in +4
/* int code;
+/* char dsn[...];
/* char *str;
/* VSTRING *buf;
/* .in -4
@@ -78,6 +79,7 @@
#include
#include
#include
+#include
/* Utility library. */
@@ -98,6 +100,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -198,6 +201,8 @@ SMTP_RESP *smtp_chat_resp(SMTP_SESSION *session)
static SMTP_RESP rdata;
char *cp;
int last_char;
+ int three_digs = 0;
+ size_t len;
/*
* Initialize the response data buffer.
@@ -238,7 +243,7 @@ SMTP_RESP *smtp_chat_resp(SMTP_SESSION *session)
*/
for (cp = STR(session->buffer); *cp && ISDIGIT(*cp); cp++)
/* void */ ;
- if (cp - STR(session->buffer) == 3) {
+ if ((three_digs = (cp - STR(session->buffer) == 3)) != 0) {
if (*cp == '-')
continue;
if (*cp == ' ' || *cp == 0)
@@ -246,7 +251,25 @@ SMTP_RESP *smtp_chat_resp(SMTP_SESSION *session)
}
session->error_mask |= MAIL_ERROR_PROTOCOL;
}
- rdata.code = atoi(STR(session->buffer));
+
+ /*
+ * Extract RFC 821 reply code and RFC 2034 detail. Use a default detail
+ * code if none was given.
+ */
+ rdata.dsn[0] = 0;
+ if (three_digs != 0) {
+ rdata.code = atoi(STR(session->buffer));
+ for (cp = STR(session->buffer) + 4; *cp == ' '; cp++)
+ /* void */ ;
+ if ((len = dsn_valid(cp)) > 0 && len < sizeof(rdata.dsn)) {
+ DSN_BUF_UPDATE(rdata.dsn, cp, len);
+ } else if (strchr("245", STR(session->buffer)[0]) != 0) {
+ DSN_BUF_UPDATE(rdata.dsn, "0.0.0", sizeof("0.0.0") - 1);
+ rdata.dsn[0] = STR(session->buffer)[0];
+ }
+ } else {
+ rdata.code = 0;
+ }
VSTRING_TERMINATE(rdata.buf);
rdata.str = STR(rdata.buf);
return (&rdata);
diff --git a/postfix/src/smtp/smtp_connect.c b/postfix/src/smtp/smtp_connect.c
index ecaa2ebfa..b01c1201f 100644
--- a/postfix/src/smtp/smtp_connect.c
+++ b/postfix/src/smtp/smtp_connect.c
@@ -91,6 +91,7 @@
#include
#include
#include
+#include
/* DNS library. */
@@ -126,7 +127,7 @@ static VSTRING *smtp_salvage(VSTREAM *stream)
/* smtp_connect_addr - connect to explicit address */
static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
- unsigned port, VSTRING *why,
+ unsigned port, DSN_VSTRING *why,
int sess_flags)
{
char *myname = "smtp_connect_addr";
@@ -150,6 +151,8 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
if (dns_rr_to_sa(addr, port, sa, &salen) != 0) {
msg_warn("%s: skip address type %s: %m",
myname, dns_strtype(addr->type));
+ dsn_vstring_update(why, "4.4.0",
+ "network address conversion failed: %m");
smtp_errno = SMTP_ERR_RETRY;
return (0);
}
@@ -239,8 +242,8 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
conn_stat = sane_connect(sock, sa, salen);
}
if (conn_stat < 0) {
- vstring_sprintf(why, "connect to %s[%s]: %m",
- addr->name, hostaddr.buf);
+ dsn_vstring_update(why, "4.4.1", "connect to %s[%s]: %m",
+ addr->name, hostaddr.buf);
smtp_errno = SMTP_ERR_RETRY;
close(sock);
return (0);
@@ -250,8 +253,8 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
* Skip this host if it takes no action within some time limit.
*/
if (read_wait(sock, var_smtp_helo_tmout) < 0) {
- vstring_sprintf(why, "connect to %s[%s]: read timeout",
- addr->name, hostaddr.buf);
+ dsn_vstring_update(why, "4.4.2", "connect to %s[%s]: read timeout",
+ addr->name, hostaddr.buf);
smtp_errno = SMTP_ERR_RETRY;
close(sock);
return (0);
@@ -262,8 +265,9 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
*/
stream = vstream_fdopen(sock, O_RDWR);
if ((ch = VSTREAM_GETC(stream)) == VSTREAM_EOF) {
- vstring_sprintf(why, "connect to %s[%s]: server dropped connection without sending the initial SMTP greeting",
- addr->name, hostaddr.buf);
+ dsn_vstring_update(why, "4.4.0",
+ "connect to %s[%s]: server dropped connection without sending the initial SMTP greeting",
+ addr->name, hostaddr.buf);
smtp_errno = SMTP_ERR_RETRY;
vstream_fclose(stream);
return (0);
@@ -276,12 +280,15 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
* also means that we have to salvage the server's response ourself so
* that it can be included in logging or in non-delivery reports. It does
* not hurt if we keep the test for a 4xx or 5xx greeting in smtp_helo().
+ *
+ * Do not propagate the server's DSN code. We are skipping this problem!
*/
if (ch == '4' || (ch == '5' && var_smtp_skip_5xx_greeting)) {
VSTRING *salvage_buf = smtp_salvage(stream);
- vstring_sprintf(why, "connect to %s[%s]: server refused to talk to me: %s",
- addr->name, hostaddr.buf, STR(salvage_buf));
+ dsn_vstring_update(why, "4.3.0",
+ "connect to %s[%s]: server refused to talk to me: %s",
+ addr->name, hostaddr.buf, STR(salvage_buf));
vstring_free(salvage_buf);
smtp_errno = SMTP_ERR_RETRY;
vstream_fclose(stream);
@@ -506,7 +513,7 @@ static int smtp_reuse_session(SMTP_STATE *state, int lookup_mx,
int smtp_connect(SMTP_STATE *state)
{
DELIVER_REQUEST *request = state->request;
- VSTRING *why = vstring_alloc(10);
+ DSN_VSTRING *why = dsn_vstring_alloc(10);
char *dest_buf;
char *domain;
unsigned port;
@@ -686,7 +693,7 @@ int smtp_connect(SMTP_STATE *state)
smtp_xfer(state);
smtp_cleanup_session(state);
} else {
- msg_info("%s (port %d)", vstring_str(why), ntohs(port));
+ msg_info("%s (port %d)", STR(why->vstring), ntohs(port));
}
}
dns_rr_free(addr_list);
@@ -715,6 +722,7 @@ int smtp_connect(SMTP_STATE *state)
*/
if (IS_FALLBACK_RELAY(cpp, sites, non_fallback_sites)) {
msg_warn("%s configuration problem", VAR_FALLBACK_RELAY);
+ dsn_vstring_update(why, "4.3.5", "");
smtp_errno = SMTP_ERR_RETRY;
}
@@ -724,6 +732,7 @@ int smtp_connect(SMTP_STATE *state)
*/
else if (strcmp(sites->argv[0], var_relayhost) == 0) {
msg_warn("%s configuration problem", VAR_RELAYHOST);
+ dsn_vstring_update(why, "4.3.5", "");
smtp_errno = SMTP_ERR_RETRY;
}
@@ -744,11 +753,16 @@ int smtp_connect(SMTP_STATE *state)
/*
* We still need to bounce or defer some left-over recipients:
- * either mail loops or some backup mail server was unavailable.
+ * either mail loops or some mail server was unavailable.
*/
state->final_server = 1; /* XXX */
- smtp_site_fail(state, smtp_errno == SMTP_ERR_RETRY ? 450 : 550,
- "%s", vstring_str(why));
+ if (smtp_errno == SMTP_ERR_RETRY) {
+ why->dsn[0] = '4';
+ smtp_site_fail(state, why->dsn, 450, "%s", STR(why->vstring));
+ } else {
+ why->dsn[0] = '5';
+ smtp_site_fail(state, why->dsn, 550, "%s", STR(why->vstring));
+ }
/*
* Sanity check. Don't silently lose recipients.
@@ -765,6 +779,6 @@ int smtp_connect(SMTP_STATE *state)
if (HAVE_NEXTHOP_STATE(state))
FREE_NEXTHOP_STATE(state);
argv_free(sites);
- vstring_free(why);
+ dsn_vstring_free(why);
return (state->status);
}
diff --git a/postfix/src/smtp/smtp_proto.c b/postfix/src/smtp/smtp_proto.c
index ebbe53f1a..f360af9db 100644
--- a/postfix/src/smtp/smtp_proto.c
+++ b/postfix/src/smtp/smtp_proto.c
@@ -91,6 +91,7 @@
#include
#include
#include /* shutdown(2) */
+#include /* ntohs() */
#include
#include
#include /* 44BSD stdarg.h uses abort() */
@@ -272,10 +273,12 @@ int smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
case 2:
break;
case 5:
- if (var_smtp_skip_5xx_greeting)
+ if (var_smtp_skip_5xx_greeting) {
resp->code = 400;
+ resp->dsn[0] = '4';
+ }
default:
- return (smtp_site_fail(state, resp->code,
+ return (smtp_site_fail(state, resp->dsn, resp->code,
"host %s refused to talk to me: %s",
session->namaddr,
translit(resp->str, "\n", " ")));
@@ -333,7 +336,7 @@ int smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
if ((session->features & SMTP_FEATURE_ESMTP) == 0) {
smtp_chat_cmd(session, "HELO %s", var_smtp_helo_name);
if ((resp = smtp_chat_resp(session))->code / 100 != 2)
- return (smtp_site_fail(state, resp->code,
+ return (smtp_site_fail(state, resp->dsn, resp->code,
"host %s refused to talk to me: %s",
session->namaddr,
translit(resp->str, "\n", " ")));
@@ -372,8 +375,11 @@ int smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
&& (misc_flags & SMTP_MISC_FLAG_LOOP_DETECT) != 0) {
msg_warn("host %s replied to HELO/EHLO with my own hostname %s",
session->namaddr, var_myhostname);
- return (smtp_site_fail(state,
- (session->features & SMTP_FEATURE_BEST_MX) ? 550 : 450,
+ return ((session->features & SMTP_FEATURE_BEST_MX) ?
+ smtp_site_fail(state, "5.3.5", 550,
+ "mail for %s loops back to myself",
+ request->nexthop) :
+ smtp_site_fail(state, "4.3.5", 450,
"mail for %s loops back to myself",
request->nexthop));
}
@@ -514,7 +520,7 @@ int smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
*/
session->features &= ~SMTP_FEATURE_STARTTLS;
if (session->tls_enforce_tls)
- return (smtp_site_fail(state, resp->code,
+ return (smtp_site_fail(state, resp->dsn, resp->code,
"TLS is required, but host %s refused to start TLS: %s",
session->namaddr,
translit(resp->str, "\n", " ")));
@@ -530,16 +536,16 @@ int smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
*/
if (session->tls_enforce_tls) {
if (!(session->features & SMTP_FEATURE_STARTTLS)) {
- return (smtp_site_fail(state, 450,
+ return (smtp_site_fail(state, "4.7.4", 450,
"TLS is required, but was not offered by host %s",
session->namaddr));
} else if (smtp_tls_ctx == 0) {
- return (smtp_site_fail(state, 450,
+ return (smtp_site_fail(state, "4.7.5", 450,
"TLS is required, but our TLS engine is unavailable"));
} else {
msg_warn("%s: TLS is required but unavailable, don't know why",
myname);
- return (smtp_site_fail(state, 450,
+ return (smtp_site_fail(state, "4.7.0", 450,
"TLS is required, but not available"));
}
}
@@ -594,9 +600,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
* use TLS session caching???
*/
serverid = vstring_alloc(10);
- vstring_sprintf(serverid, "%s:%s:%u",
- session->host, session->addr,
- ntohs(session->port));
+ vstring_sprintf(serverid, "%s:%u", session->addr, ntohs(session->port));
if (session->helo && strcasecmp(session->host, session->helo) != 0)
vstring_sprintf_append(serverid, ":%s", session->helo);
session->tls_context =
@@ -608,7 +612,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
&(session->tls_info));
vstring_free(serverid);
if (session->tls_context == 0)
- return (smtp_site_fail(state, 450,
+ return (smtp_site_fail(state, "4.7.5", 450,
"Cannot start TLS: handshake failure"));
/*
@@ -630,7 +634,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
tls_client_stop(smtp_tls_ctx, session->stream,
var_smtp_starttls_tmout, 1,
&(session->tls_info));
- return (smtp_site_fail(state, 450,
+ return (smtp_site_fail(state, "4.7.5", 450,
"TLS failure: Cannot verify server certificate"));
}
}
@@ -649,7 +653,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
tls_client_stop(smtp_tls_ctx, session->stream,
var_smtp_starttls_tmout, 1,
&(session->tls_info));
- return (smtp_site_fail(state, 450,
+ return (smtp_site_fail(state, "4.7.5", 450,
"TLS failure: Cannot verify server hostname"));
}
}
@@ -1202,7 +1206,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
*/
case SMTP_STATE_MAIL:
if (resp->code / 100 != 2) {
- smtp_mesg_fail(state, resp->code,
+ smtp_mesg_fail(state, resp->dsn, resp->code,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
@@ -1227,17 +1231,21 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
case SMTP_STATE_RCPT:
if (!mail_from_rejected) {
#ifdef notdef
- if (resp->code == 552)
+ if (resp->code == 552) {
resp->code = 452;
+ resp->dsn[0] = '4';
+ }
#endif
rcpt = request->rcpt_list.info + recv_rcpt;
if (resp->code / 100 == 2) {
++nrcpt;
/* If trace-only, mark the recipient done. */
if (DEL_REQ_TRACE_ONLY(request->flags))
- smtp_rcpt_done(state, resp->str, rcpt);
+ smtp_rcpt_done(state, resp->dsn,
+ resp->str, rcpt);
} else {
- smtp_rcpt_fail(state, resp->code, rcpt,
+ smtp_rcpt_fail(state, resp->dsn,
+ resp->code, rcpt,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
@@ -1259,7 +1267,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
case SMTP_STATE_DATA:
if (resp->code / 100 != 3) {
if (nrcpt > 0)
- smtp_mesg_fail(state, resp->code,
+ smtp_mesg_fail(state, resp->dsn, resp->code,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
@@ -1281,7 +1289,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
case SMTP_STATE_DOT:
if (nrcpt > 0) {
if (resp->code / 100 != 2) {
- smtp_mesg_fail(state, resp->code,
+ smtp_mesg_fail(state, resp->dsn, resp->code,
"host %s said: %s (in reply to %s)",
session->namaddr,
translit(resp->str, "\n", " "),
@@ -1290,7 +1298,8 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
for (nrcpt = 0; nrcpt < recv_rcpt; nrcpt++) {
rcpt = request->rcpt_list.info + nrcpt;
if (!SMTP_RCPT_ISMARKED(rcpt))
- smtp_rcpt_done(state, resp->str, rcpt);
+ smtp_rcpt_done(state, resp->dsn,
+ resp->str, rcpt);
}
}
}
@@ -1410,7 +1419,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
vstring_str(session->scratch),
VSTRING_LEN(session->scratch));
if (mime_errs) {
- smtp_mesg_fail(state, 554,
+ smtp_mesg_fail(state, "5.6.5", 554,
"MIME 7-bit conversion failed: %s",
mime_state_error(mime_errs));
RETURN(0);
@@ -1432,7 +1441,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
mime_errs =
mime_state_update(session->mime_state, rec_type, "", 0);
if (mime_errs) {
- smtp_mesg_fail(state, 554,
+ smtp_mesg_fail(state, "5.6.5", 554,
"MIME 7-bit conversion failed: %s",
mime_state_error(mime_errs));
RETURN(0);
@@ -1494,7 +1503,7 @@ int smtp_xfer(SMTP_STATE *state)
* connection caching.
*/
if (session->size_limit > 0 && session->size_limit < request->data_size) {
- smtp_mesg_fail(state, 552,
+ smtp_mesg_fail(state, "5.3.4", 552,
"message size %lu exceeds size limit %.0f of server %s",
request->data_size, (double) session->size_limit,
session->namaddr);
diff --git a/postfix/src/smtp/smtp_rcpt.c b/postfix/src/smtp/smtp_rcpt.c
index 027991896..35cdda6b0 100644
--- a/postfix/src/smtp/smtp_rcpt.c
+++ b/postfix/src/smtp/smtp_rcpt.c
@@ -26,8 +26,9 @@
/* int SMTP_RCPT_LEFT(state)
/* SMTP_STATE *state;
/*
-/* void smtp_rcpt_done(state, reply, rcpt)
+/* void smtp_rcpt_done(state, dsn, reply, rcpt)
/* SMTP_STATE *state;
+/* const char *dsn;
/* const char *reply;
/* RECIPIENT *rcpt;
/* DESCRIPTION
@@ -123,7 +124,8 @@
/* smtp_rcpt_done - mark recipient as done or else */
-void smtp_rcpt_done(SMTP_STATE *state, const char *reply, RECIPIENT *rcpt)
+void smtp_rcpt_done(SMTP_STATE *state, const char *dsn,
+ const char *reply, RECIPIENT *rcpt)
{
DELIVER_REQUEST *request = state->request;
SMTP_SESSION *session = state->session;
@@ -136,7 +138,7 @@ void smtp_rcpt_done(SMTP_STATE *state, const char *reply, RECIPIENT *rcpt)
status = sent(DEL_REQ_TRACE_FLAGS(request->flags),
request->queue_id, rcpt->orig_addr,
rcpt->address, rcpt->offset,
- session->namaddr,
+ session->namaddr, dsn,
request->arrival_time,
"%s", reply);
if (status == 0)
diff --git a/postfix/src/smtp/smtp_sasl_proto.c b/postfix/src/smtp/smtp_sasl_proto.c
index 4dcd20b05..6653f5923 100644
--- a/postfix/src/smtp/smtp_sasl_proto.c
+++ b/postfix/src/smtp/smtp_sasl_proto.c
@@ -166,7 +166,7 @@ int smtp_sasl_helo_login(SMTP_STATE *state)
ret = 0;
smtp_sasl_start(session, VAR_SMTP_SASL_OPTS, var_smtp_sasl_opts);
if (smtp_sasl_authenticate(session, why) <= 0) {
- ret = smtp_site_fail(state, 450, "Authentication failed: %s",
+ ret = smtp_site_fail(state, "4.7.0", 450, "Authentication failed: %s",
vstring_str(why));
/* Session reuse is disabled. */
}
diff --git a/postfix/src/smtp/smtp_session.c b/postfix/src/smtp/smtp_session.c
index 64cb7f273..453cc9e69 100644
--- a/postfix/src/smtp/smtp_session.c
+++ b/postfix/src/smtp/smtp_session.c
@@ -129,13 +129,6 @@
/*
* Per-site policies can override main.cf settings.
- *
- * XXX 200412 This does not work as some people may expect. A policy that
- * specifies "use TLS" in a policy file while TLS is turned off in main.cf
- * cannot work, because there is no OpenSSL context for creating sessions
- * (that context exists only if TLS is enabled via main.cf settings; the
- * OpenSSL context is created at process initialization time and cannot be
- * created on the fly).
*/
typedef struct {
int dont_use; /* don't use TLS */
diff --git a/postfix/src/smtp/smtp_trouble.c b/postfix/src/smtp/smtp_trouble.c
index 435a1ae35..e8bf0e842 100644
--- a/postfix/src/smtp/smtp_trouble.c
+++ b/postfix/src/smtp/smtp_trouble.c
@@ -6,26 +6,29 @@
/* SYNOPSIS
/* #include "smtp.h"
/*
-/* int smtp_site_fail(state, code, format, ...)
+/* int smtp_site_fail(state, dsn, code, format, ...)
/* SMTP_STATE *state;
+/* const char *dsn;
/* int code;
-/* char *format;
+/* const char *format;
/*
-/* int smtp_mesg_fail(state, code, format, ...)
+/* int smtp_mesg_fail(state, dsn, code, format, ...)
/* SMTP_STATE *state;
+/* const char *dsn;
/* int code;
-/* char *format;
+/* const char *format;
/*
-/* void smtp_rcpt_fail(state, code, recipient, format, ...)
+/* void smtp_rcpt_fail(state, dsn, code, recipient, format, ...)
/* SMTP_STATE *state;
+/* const char *dsn;
/* int code;
/* RECIPIENT *recipient;
-/* char *format;
+/* const char *format;
/*
/* int smtp_stream_except(state, exception, description)
/* SMTP_STATE *state;
/* int exception;
-/* char *description;
+/* const char *description;
/* DESCRIPTION
/* This module handles all non-fatal errors that can happen while
/* attempting to deliver mail via SMTP, and implements the policy
@@ -128,6 +131,7 @@
#include
#include
#include
+#include
/* Application-specific. */
@@ -159,7 +163,8 @@ static void smtp_check_code(SMTP_SESSION *session, int code)
/* smtp_site_fail - skip site, defer or bounce all recipients */
-int smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
+int smtp_site_fail(SMTP_STATE *state, const char *dsn, int code,
+ const char *format,...)
{
DELIVER_REQUEST *request = state->request;
SMTP_SESSION *session = state->session;
@@ -174,7 +179,11 @@ int smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
* Initialize.
*/
va_start(ap, format);
- vstring_vsprintf(why, format, ap);
+ if (code < 400 || code > 599) {
+ vstring_sprintf(why, "Protocol error: ");
+ dsn = "5.5.0";
+ }
+ vstring_vsprintf_append(why, format, ap);
va_end(ap);
/*
@@ -206,7 +215,7 @@ int smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
(DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
rcpt->orig_addr, rcpt->address, rcpt->offset,
session ? session->namaddr : "none",
- request->arrival_time, "%s", vstring_str(why));
+ dsn, request->arrival_time, "%s", vstring_str(why));
if (status == 0)
deliver_completed(state->src, rcpt->offset);
SMTP_RCPT_DROP(state, rcpt);
@@ -214,7 +223,7 @@ int smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
}
/* XXX This assumes no fall-back relay. */
if (soft_error && request->hop_status == 0)
- request->hop_status = mystrdup(vstring_str(why));
+ request->hop_status = dsn_prepend(dsn, vstring_str(why));
}
if (session)
smtp_check_code(session, code);
@@ -234,7 +243,8 @@ int smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
/* smtp_mesg_fail - skip site, defer all recipients, or bounce all recipients */
-int smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
+int smtp_mesg_fail(SMTP_STATE *state, const char *dsn,
+ int code, const char *format,...)
{
DELIVER_REQUEST *request = state->request;
SMTP_SESSION *session = state->session;
@@ -249,7 +259,11 @@ int smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
* Initialize.
*/
va_start(ap, format);
- vstring_vsprintf(why, format, ap);
+ if (code < 400 || code > 599) {
+ vstring_sprintf(why, "Protocol error: ");
+ dsn = "5.5.0";
+ }
+ vstring_vsprintf_append(why, format, ap);
va_end(ap);
/*
@@ -281,7 +295,7 @@ int smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
(DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
rcpt->orig_addr, rcpt->address, rcpt->offset,
session ? session->namaddr : "none",
- request->arrival_time, "%s", vstring_str(why));
+ dsn, request->arrival_time, "%s", vstring_str(why));
if (status == 0)
deliver_completed(state->src, rcpt->offset);
SMTP_RCPT_DROP(state, rcpt);
@@ -300,14 +314,15 @@ int smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
/* smtp_rcpt_fail - skip, defer, or bounce recipient */
-void smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
- char *format,...)
+void smtp_rcpt_fail(SMTP_STATE *state, const char *dsn, int code,
+ RECIPIENT *rcpt, const char *format,...)
{
DELIVER_REQUEST *request = state->request;
SMTP_SESSION *session = state->session;
int status;
int soft_error = SMTP_SOFT(code);
va_list ap;
+ VSTRING *why = vstring_alloc(100);
/*
* Sanity check.
@@ -315,20 +330,25 @@ void smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
if (SMTP_RCPT_ISMARKED(rcpt))
msg_panic("smtp_rcpt_fail: recipient <%s> is marked", rcpt->address);
+ /*
+ * Initialize.
+ */
+ va_start(ap, format);
+ if (code < 400 || code > 599) {
+ vstring_sprintf(why, "Protocol error: ");
+ dsn = "5.5.0";
+ }
+ vstring_vsprintf_append(why, format, ap);
+ va_end(ap);
+
/*
* Don't defer this recipient record just yet when this error qualifies
* for trying other mail servers. Just log something informative to show
* why we're skipping this recipient now.
*/
if (soft_error && state->final_server == 0) {
- VSTRING *buf = vstring_alloc(100);
-
- va_start(ap, format);
- vstring_vsprintf(buf, format, ap);
- va_end(ap);
- msg_info("%s: %s", request->queue_id, vstring_str(buf));
+ msg_info("%s: %s", request->queue_id, vstring_str(why));
SMTP_RCPT_KEEP(state, rcpt);
- vstring_free(buf);
}
/*
@@ -340,13 +360,11 @@ void smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
* that did qualify for delivery to a backup server.
*/
else {
- va_start(ap, format);
- status = (soft_error ? vdefer_append : vbounce_append)
+ status = (soft_error ? defer_append : bounce_append)
(DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
rcpt->orig_addr, rcpt->address, rcpt->offset,
session ? session->namaddr : "none",
- request->arrival_time, format, ap);
- va_end(ap);
+ dsn, request->arrival_time, "%s", vstring_str(why));
if (status == 0)
deliver_completed(state->src, rcpt->offset);
SMTP_RCPT_DROP(state, rcpt);
@@ -354,17 +372,23 @@ void smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
}
if (session)
smtp_check_code(session, code);
+
+ /*
+ * Cleanup.
+ */
+ vstring_free(why);
}
/* smtp_stream_except - defer domain after I/O problem */
-int smtp_stream_except(SMTP_STATE *state, int code, char *description)
+int smtp_stream_except(SMTP_STATE *state, int code, const char *description)
{
DELIVER_REQUEST *request = state->request;
SMTP_SESSION *session = state->session;
RECIPIENT *rcpt;
int nrcpt;
VSTRING *why = vstring_alloc(100);
+ const char *dsn;
/*
* Sanity check.
@@ -381,10 +405,12 @@ int smtp_stream_except(SMTP_STATE *state, int code, char *description)
case SMTP_ERR_EOF:
vstring_sprintf(why, "lost connection with %s while %s",
session->namaddr, description);
+ dsn = "4.4.2";
break;
case SMTP_ERR_TIME:
vstring_sprintf(why, "conversation with %s timed out while %s",
session->namaddr, description);
+ dsn = "4.4.2";
break;
}
@@ -416,10 +442,13 @@ int smtp_stream_except(SMTP_STATE *state, int code, char *description)
request->queue_id,
rcpt->orig_addr, rcpt->address,
rcpt->offset, session->namaddr,
- request->arrival_time,
+ dsn, request->arrival_time,
"%s", vstring_str(why));
SMTP_RCPT_DROP(state, rcpt);
}
+ /* XXX This assumes no fall-back relay. */
+ if (request->hop_status == 0)
+ request->hop_status = dsn_prepend(dsn, vstring_str(why));
}
/*
diff --git a/postfix/src/smtpd/Makefile.in b/postfix/src/smtpd/Makefile.in
index 88a8dbe9b..b265a4474 100644
--- a/postfix/src/smtpd/Makefile.in
+++ b/postfix/src/smtpd/Makefile.in
@@ -59,14 +59,6 @@ clean:
tidy: clean
-depend: $(MAKES)
- (sed '1,/^# do not edit/!d' Makefile.in; \
- set -e; for i in [a-z][a-z0-9]*.c; do \
- $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
- -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
- done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
- @$(EXPORT) make -f Makefile.in Makefile 1>&2
-
tests: smtpd_check_test smtpd_check_test2 smtpd_acl_test smtpd_exp_test \
smtpd_token_test smtpd_check_test4
@@ -105,281 +97,292 @@ smtpd_token_test: smtpd_token smtpd_token.in smtpd_token.ref
diff smtpd_token.ref smtpd_token.tmp
rm -f smtpd_token.tmp
+depend: $(MAKES)
+ (sed '1,/^# do not edit/!d' Makefile.in; \
+ set -e; for i in [a-z][a-z0-9]*.c; do \
+ $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
+ -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+ -e 's/o: \.\//o: /' -e p -e '}' ; \
+ done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+ @$(EXPORT) make -f Makefile.in Makefile 1>&2
+
# do not edit below this line - it is generated by 'make depend'
-smtpd.o: smtpd.c
-smtpd.o: ../../include/sys_defs.h
-smtpd.o: ../../include/msg.h
-smtpd.o: ../../include/mymalloc.h
-smtpd.o: ../../include/vstring.h
-smtpd.o: ../../include/vbuf.h
-smtpd.o: ../../include/vstream.h
-smtpd.o: ../../include/vstring_vstream.h
-smtpd.o: ../../include/stringops.h
-smtpd.o: ../../include/events.h
-smtpd.o: ../../include/smtp_stream.h
-smtpd.o: ../../include/valid_hostname.h
-smtpd.o: ../../include/dict.h
+smtpd.o: ../../include/anvil_clnt.h
smtpd.o: ../../include/argv.h
-smtpd.o: ../../include/watchdog.h
-smtpd.o: ../../include/iostuff.h
-smtpd.o: ../../include/split_at.h
-smtpd.o: ../../include/name_code.h
-smtpd.o: ../../include/mail_params.h
-smtpd.o: ../../include/record.h
-smtpd.o: ../../include/rec_type.h
-smtpd.o: ../../include/mail_proto.h
smtpd.o: ../../include/attr.h
+smtpd.o: ../../include/attr_clnt.h
smtpd.o: ../../include/cleanup_user.h
-smtpd.o: ../../include/mail_date.h
-smtpd.o: ../../include/mail_conf.h
-smtpd.o: ../../include/off_cvt.h
smtpd.o: ../../include/debug_peer.h
-smtpd.o: ../../include/mail_error.h
-smtpd.o: ../../include/name_mask.h
+smtpd.o: ../../include/dict.h
+smtpd.o: ../../include/ehlo_mask.h
+smtpd.o: ../../include/events.h
smtpd.o: ../../include/flush_clnt.h
-smtpd.o: ../../include/mail_stream.h
+smtpd.o: ../../include/input_transp.h
+smtpd.o: ../../include/iostuff.h
+smtpd.o: ../../include/is_header.h
+smtpd.o: ../../include/lex_822.h
+smtpd.o: ../../include/mail_conf.h
+smtpd.o: ../../include/mail_date.h
+smtpd.o: ../../include/mail_error.h
+smtpd.o: ../../include/mail_params.h
+smtpd.o: ../../include/mail_proto.h
smtpd.o: ../../include/mail_queue.h
-smtpd.o: ../../include/tok822.h
-smtpd.o: ../../include/resolve_clnt.h
-smtpd.o: ../../include/verp_sender.h
-smtpd.o: ../../include/string_list.h
+smtpd.o: ../../include/mail_server.h
+smtpd.o: ../../include/mail_stream.h
+smtpd.o: ../../include/maps.h
smtpd.o: ../../include/match_list.h
smtpd.o: ../../include/match_ops.h
+smtpd.o: ../../include/msg.h
+smtpd.o: ../../include/myaddrinfo.h
+smtpd.o: ../../include/mymalloc.h
+smtpd.o: ../../include/namadr_list.h
+smtpd.o: ../../include/name_code.h
+smtpd.o: ../../include/name_mask.h
+smtpd.o: ../../include/off_cvt.h
smtpd.o: ../../include/quote_822_local.h
smtpd.o: ../../include/quote_flags.h
-smtpd.o: ../../include/lex_822.h
-smtpd.o: ../../include/namadr_list.h
-smtpd.o: ../../include/input_transp.h
-smtpd.o: ../../include/is_header.h
-smtpd.o: ../../include/anvil_clnt.h
-smtpd.o: ../../include/attr_clnt.h
-smtpd.o: ../../include/ehlo_mask.h
-smtpd.o: ../../include/maps.h
+smtpd.o: ../../include/rec_type.h
+smtpd.o: ../../include/record.h
+smtpd.o: ../../include/resolve_clnt.h
+smtpd.o: ../../include/smtp_stream.h
+smtpd.o: ../../include/split_at.h
+smtpd.o: ../../include/string_list.h
+smtpd.o: ../../include/stringops.h
+smtpd.o: ../../include/sys_defs.h
+smtpd.o: ../../include/tls.h
+smtpd.o: ../../include/tok822.h
+smtpd.o: ../../include/valid_hostname.h
smtpd.o: ../../include/valid_mailhost_addr.h
-smtpd.o: ../../include/mail_server.h
-smtpd.o: smtpd_token.h
+smtpd.o: ../../include/vbuf.h
+smtpd.o: ../../include/verp_sender.h
+smtpd.o: ../../include/vstream.h
+smtpd.o: ../../include/vstring.h
+smtpd.o: ../../include/vstring_vstream.h
+smtpd.o: ../../include/watchdog.h
+smtpd.o: smtpd.c
smtpd.o: smtpd.h
-smtpd.o: ../../include/myaddrinfo.h
-smtpd.o: ../../include/tls.h
-smtpd.o: smtpd_check.h
smtpd.o: smtpd_chat.h
-smtpd.o: smtpd_sasl_proto.h
-smtpd.o: smtpd_sasl_glue.h
+smtpd.o: smtpd_check.h
smtpd.o: smtpd_proxy.h
-smtpd_chat.o: smtpd_chat.c
-smtpd_chat.o: ../../include/sys_defs.h
-smtpd_chat.o: ../../include/msg.h
+smtpd.o: smtpd_sasl_glue.h
+smtpd.o: smtpd_sasl_proto.h
+smtpd.o: smtpd_token.h
smtpd_chat.o: ../../include/argv.h
-smtpd_chat.o: ../../include/vstring.h
-smtpd_chat.o: ../../include/vbuf.h
-smtpd_chat.o: ../../include/vstream.h
-smtpd_chat.o: ../../include/stringops.h
-smtpd_chat.o: ../../include/line_wrap.h
-smtpd_chat.o: ../../include/mymalloc.h
-smtpd_chat.o: ../../include/smtp_stream.h
-smtpd_chat.o: ../../include/record.h
-smtpd_chat.o: ../../include/rec_type.h
-smtpd_chat.o: ../../include/mail_proto.h
-smtpd_chat.o: ../../include/iostuff.h
smtpd_chat.o: ../../include/attr.h
-smtpd_chat.o: ../../include/mail_params.h
-smtpd_chat.o: ../../include/mail_addr.h
-smtpd_chat.o: ../../include/post_mail.h
smtpd_chat.o: ../../include/cleanup_user.h
+smtpd_chat.o: ../../include/iostuff.h
+smtpd_chat.o: ../../include/line_wrap.h
+smtpd_chat.o: ../../include/mail_addr.h
smtpd_chat.o: ../../include/mail_error.h
-smtpd_chat.o: ../../include/name_mask.h
-smtpd_chat.o: smtpd.h
-smtpd_chat.o: ../../include/myaddrinfo.h
+smtpd_chat.o: ../../include/mail_params.h
+smtpd_chat.o: ../../include/mail_proto.h
smtpd_chat.o: ../../include/mail_stream.h
+smtpd_chat.o: ../../include/msg.h
+smtpd_chat.o: ../../include/myaddrinfo.h
+smtpd_chat.o: ../../include/mymalloc.h
+smtpd_chat.o: ../../include/name_mask.h
+smtpd_chat.o: ../../include/post_mail.h
+smtpd_chat.o: ../../include/rec_type.h
+smtpd_chat.o: ../../include/record.h
+smtpd_chat.o: ../../include/smtp_stream.h
+smtpd_chat.o: ../../include/stringops.h
+smtpd_chat.o: ../../include/sys_defs.h
smtpd_chat.o: ../../include/tls.h
+smtpd_chat.o: ../../include/vbuf.h
+smtpd_chat.o: ../../include/vstream.h
+smtpd_chat.o: ../../include/vstring.h
+smtpd_chat.o: smtpd.h
+smtpd_chat.o: smtpd_chat.c
smtpd_chat.o: smtpd_chat.h
-smtpd_check.o: smtpd_check.c
-smtpd_check.o: ../../include/sys_defs.h
-smtpd_check.o: ../../include/msg.h
-smtpd_check.o: ../../include/vstring.h
-smtpd_check.o: ../../include/vbuf.h
-smtpd_check.o: ../../include/split_at.h
-smtpd_check.o: ../../include/fsspace.h
-smtpd_check.o: ../../include/stringops.h
-smtpd_check.o: ../../include/valid_hostname.h
smtpd_check.o: ../../include/argv.h
-smtpd_check.o: ../../include/mymalloc.h
+smtpd_check.o: ../../include/attr.h
+smtpd_check.o: ../../include/attr_clnt.h
+smtpd_check.o: ../../include/cleanup_user.h
+smtpd_check.o: ../../include/ctable.h
+smtpd_check.o: ../../include/deliver_request.h
smtpd_check.o: ../../include/dict.h
-smtpd_check.o: ../../include/vstream.h
+smtpd_check.o: ../../include/dns.h
+smtpd_check.o: ../../include/domain_list.h
+smtpd_check.o: ../../include/dsn_util.h
+smtpd_check.o: ../../include/fsspace.h
smtpd_check.o: ../../include/htable.h
-smtpd_check.o: ../../include/ctable.h
+smtpd_check.o: ../../include/inet_addr_list.h
+smtpd_check.o: ../../include/inet_proto.h
+smtpd_check.o: ../../include/input_transp.h
+smtpd_check.o: ../../include/iostuff.h
+smtpd_check.o: ../../include/is_header.h
smtpd_check.o: ../../include/mac_expand.h
smtpd_check.o: ../../include/mac_parse.h
-smtpd_check.o: ../../include/attr_clnt.h
-smtpd_check.o: ../../include/attr.h
-smtpd_check.o: ../../include/myaddrinfo.h
-smtpd_check.o: ../../include/inet_proto.h
-smtpd_check.o: ../../include/dns.h
-smtpd_check.o: ../../include/sock_addr.h
-smtpd_check.o: ../../include/string_list.h
+smtpd_check.o: ../../include/mail_addr.h
+smtpd_check.o: ../../include/mail_addr_find.h
+smtpd_check.o: ../../include/mail_conf.h
+smtpd_check.o: ../../include/mail_error.h
+smtpd_check.o: ../../include/mail_params.h
+smtpd_check.o: ../../include/mail_proto.h
+smtpd_check.o: ../../include/mail_stream.h
+smtpd_check.o: ../../include/maps.h
smtpd_check.o: ../../include/match_list.h
smtpd_check.o: ../../include/match_ops.h
+smtpd_check.o: ../../include/match_parent_style.h
+smtpd_check.o: ../../include/msg.h
+smtpd_check.o: ../../include/myaddrinfo.h
+smtpd_check.o: ../../include/mymalloc.h
smtpd_check.o: ../../include/namadr_list.h
-smtpd_check.o: ../../include/domain_list.h
-smtpd_check.o: ../../include/mail_params.h
-smtpd_check.o: ../../include/rewrite_clnt.h
-smtpd_check.o: ../../include/mail_proto.h
-smtpd_check.o: ../../include/iostuff.h
-smtpd_check.o: ../../include/resolve_clnt.h
-smtpd_check.o: ../../include/mail_error.h
smtpd_check.o: ../../include/name_mask.h
-smtpd_check.o: ../../include/resolve_local.h
smtpd_check.o: ../../include/own_inet_addr.h
-smtpd_check.o: ../../include/inet_addr_list.h
-smtpd_check.o: ../../include/mail_conf.h
-smtpd_check.o: ../../include/maps.h
-smtpd_check.o: ../../include/mail_addr_find.h
-smtpd_check.o: ../../include/match_parent_style.h
-smtpd_check.o: ../../include/strip_addr.h
-smtpd_check.o: ../../include/virtual8_maps.h
-smtpd_check.o: ../../include/cleanup_user.h
-smtpd_check.o: ../../include/record.h
smtpd_check.o: ../../include/rec_type.h
-smtpd_check.o: ../../include/mail_addr.h
-smtpd_check.o: ../../include/verify_clnt.h
-smtpd_check.o: ../../include/deliver_request.h
smtpd_check.o: ../../include/recipient_list.h
-smtpd_check.o: ../../include/input_transp.h
-smtpd_check.o: ../../include/is_header.h
+smtpd_check.o: ../../include/record.h
+smtpd_check.o: ../../include/resolve_clnt.h
+smtpd_check.o: ../../include/resolve_local.h
+smtpd_check.o: ../../include/rewrite_clnt.h
+smtpd_check.o: ../../include/sock_addr.h
+smtpd_check.o: ../../include/split_at.h
+smtpd_check.o: ../../include/string_list.h
+smtpd_check.o: ../../include/stringops.h
+smtpd_check.o: ../../include/strip_addr.h
+smtpd_check.o: ../../include/sys_defs.h
+smtpd_check.o: ../../include/tls.h
+smtpd_check.o: ../../include/valid_hostname.h
smtpd_check.o: ../../include/valid_mailhost_addr.h
+smtpd_check.o: ../../include/vbuf.h
+smtpd_check.o: ../../include/verify_clnt.h
+smtpd_check.o: ../../include/virtual8_maps.h
+smtpd_check.o: ../../include/vstream.h
+smtpd_check.o: ../../include/vstring.h
smtpd_check.o: smtpd.h
-smtpd_check.o: ../../include/mail_stream.h
-smtpd_check.o: ../../include/tls.h
-smtpd_check.o: smtpd_sasl_glue.h
+smtpd_check.o: smtpd_check.c
smtpd_check.o: smtpd_check.h
-smtpd_peer.o: smtpd_peer.c
-smtpd_peer.o: ../../include/sys_defs.h
+smtpd_check.o: smtpd_sasl_glue.h
+smtpd_peer.o: ../../include/argv.h
+smtpd_peer.o: ../../include/attr.h
+smtpd_peer.o: ../../include/inet_proto.h
+smtpd_peer.o: ../../include/iostuff.h
+smtpd_peer.o: ../../include/mail_proto.h
+smtpd_peer.o: ../../include/mail_stream.h
smtpd_peer.o: ../../include/msg.h
+smtpd_peer.o: ../../include/myaddrinfo.h
smtpd_peer.o: ../../include/mymalloc.h
+smtpd_peer.o: ../../include/sock_addr.h
smtpd_peer.o: ../../include/stringops.h
-smtpd_peer.o: ../../include/vstring.h
+smtpd_peer.o: ../../include/sys_defs.h
+smtpd_peer.o: ../../include/tls.h
+smtpd_peer.o: ../../include/valid_hostname.h
+smtpd_peer.o: ../../include/valid_mailhost_addr.h
smtpd_peer.o: ../../include/vbuf.h
-smtpd_peer.o: ../../include/myaddrinfo.h
-smtpd_peer.o: ../../include/sock_addr.h
-smtpd_peer.o: ../../include/inet_proto.h
-smtpd_peer.o: ../../include/mail_proto.h
smtpd_peer.o: ../../include/vstream.h
-smtpd_peer.o: ../../include/iostuff.h
-smtpd_peer.o: ../../include/attr.h
-smtpd_peer.o: ../../include/valid_mailhost_addr.h
-smtpd_peer.o: ../../include/valid_hostname.h
+smtpd_peer.o: ../../include/vstring.h
smtpd_peer.o: smtpd.h
-smtpd_peer.o: ../../include/argv.h
-smtpd_peer.o: ../../include/mail_stream.h
-smtpd_peer.o: ../../include/tls.h
-smtpd_proxy.o: smtpd_proxy.c
-smtpd_proxy.o: ../../include/sys_defs.h
-smtpd_proxy.o: ../../include/msg.h
-smtpd_proxy.o: ../../include/vstream.h
-smtpd_proxy.o: ../../include/vbuf.h
-smtpd_proxy.o: ../../include/vstring.h
-smtpd_proxy.o: ../../include/stringops.h
+smtpd_peer.o: smtpd_peer.c
+smtpd_proxy.o: ../../include/argv.h
+smtpd_proxy.o: ../../include/attr.h
+smtpd_proxy.o: ../../include/cleanup_user.h
smtpd_proxy.o: ../../include/connect.h
smtpd_proxy.o: ../../include/iostuff.h
-smtpd_proxy.o: ../../include/name_code.h
smtpd_proxy.o: ../../include/mail_error.h
-smtpd_proxy.o: ../../include/name_mask.h
-smtpd_proxy.o: ../../include/smtp_stream.h
-smtpd_proxy.o: ../../include/cleanup_user.h
smtpd_proxy.o: ../../include/mail_params.h
-smtpd_proxy.o: ../../include/rec_type.h
smtpd_proxy.o: ../../include/mail_proto.h
-smtpd_proxy.o: ../../include/attr.h
-smtpd_proxy.o: smtpd.h
-smtpd_proxy.o: ../../include/argv.h
-smtpd_proxy.o: ../../include/myaddrinfo.h
smtpd_proxy.o: ../../include/mail_stream.h
+smtpd_proxy.o: ../../include/msg.h
+smtpd_proxy.o: ../../include/myaddrinfo.h
+smtpd_proxy.o: ../../include/name_code.h
+smtpd_proxy.o: ../../include/name_mask.h
+smtpd_proxy.o: ../../include/rec_type.h
+smtpd_proxy.o: ../../include/smtp_stream.h
+smtpd_proxy.o: ../../include/stringops.h
+smtpd_proxy.o: ../../include/sys_defs.h
smtpd_proxy.o: ../../include/tls.h
+smtpd_proxy.o: ../../include/vbuf.h
+smtpd_proxy.o: ../../include/vstream.h
+smtpd_proxy.o: ../../include/vstring.h
+smtpd_proxy.o: smtpd.h
+smtpd_proxy.o: smtpd_proxy.c
smtpd_proxy.o: smtpd_proxy.h
-smtpd_sasl_glue.o: smtpd_sasl_glue.c
-smtpd_sasl_glue.o: ../../include/sys_defs.h
+smtpd_sasl_glue.o: ../../include/argv.h
+smtpd_sasl_glue.o: ../../include/mail_params.h
+smtpd_sasl_glue.o: ../../include/mail_stream.h
+smtpd_sasl_glue.o: ../../include/match_list.h
+smtpd_sasl_glue.o: ../../include/match_ops.h
smtpd_sasl_glue.o: ../../include/msg.h
+smtpd_sasl_glue.o: ../../include/myaddrinfo.h
smtpd_sasl_glue.o: ../../include/mymalloc.h
smtpd_sasl_glue.o: ../../include/namadr_list.h
-smtpd_sasl_glue.o: ../../include/match_list.h
-smtpd_sasl_glue.o: ../../include/match_ops.h
smtpd_sasl_glue.o: ../../include/name_mask.h
-smtpd_sasl_glue.o: ../../include/mail_params.h
smtpd_sasl_glue.o: ../../include/smtp_stream.h
-smtpd_sasl_glue.o: ../../include/vstring.h
+smtpd_sasl_glue.o: ../../include/stringops.h
+smtpd_sasl_glue.o: ../../include/sys_defs.h
+smtpd_sasl_glue.o: ../../include/tls.h
smtpd_sasl_glue.o: ../../include/vbuf.h
smtpd_sasl_glue.o: ../../include/vstream.h
+smtpd_sasl_glue.o: ../../include/vstring.h
smtpd_sasl_glue.o: smtpd.h
-smtpd_sasl_glue.o: ../../include/argv.h
-smtpd_sasl_glue.o: ../../include/myaddrinfo.h
-smtpd_sasl_glue.o: ../../include/mail_stream.h
-smtpd_sasl_glue.o: ../../include/tls.h
-smtpd_sasl_glue.o: smtpd_sasl_glue.h
smtpd_sasl_glue.o: smtpd_chat.h
-smtpd_sasl_proto.o: smtpd_sasl_proto.c
-smtpd_sasl_proto.o: ../../include/sys_defs.h
+smtpd_sasl_glue.o: smtpd_sasl_glue.c
+smtpd_sasl_glue.o: smtpd_sasl_glue.h
+smtpd_sasl_proto.o: ../../include/argv.h
+smtpd_sasl_proto.o: ../../include/attr.h
+smtpd_sasl_proto.o: ../../include/iostuff.h
+smtpd_sasl_proto.o: ../../include/mail_error.h
+smtpd_sasl_proto.o: ../../include/mail_params.h
+smtpd_sasl_proto.o: ../../include/mail_proto.h
+smtpd_sasl_proto.o: ../../include/mail_stream.h
smtpd_sasl_proto.o: ../../include/msg.h
+smtpd_sasl_proto.o: ../../include/myaddrinfo.h
smtpd_sasl_proto.o: ../../include/mymalloc.h
+smtpd_sasl_proto.o: ../../include/name_mask.h
smtpd_sasl_proto.o: ../../include/stringops.h
-smtpd_sasl_proto.o: ../../include/vstring.h
+smtpd_sasl_proto.o: ../../include/sys_defs.h
+smtpd_sasl_proto.o: ../../include/tls.h
smtpd_sasl_proto.o: ../../include/vbuf.h
-smtpd_sasl_proto.o: ../../include/mail_params.h
-smtpd_sasl_proto.o: ../../include/mail_proto.h
smtpd_sasl_proto.o: ../../include/vstream.h
-smtpd_sasl_proto.o: ../../include/iostuff.h
-smtpd_sasl_proto.o: ../../include/attr.h
-smtpd_sasl_proto.o: ../../include/mail_error.h
-smtpd_sasl_proto.o: ../../include/name_mask.h
+smtpd_sasl_proto.o: ../../include/vstring.h
smtpd_sasl_proto.o: smtpd.h
-smtpd_sasl_proto.o: ../../include/argv.h
-smtpd_sasl_proto.o: ../../include/myaddrinfo.h
-smtpd_sasl_proto.o: ../../include/mail_stream.h
-smtpd_sasl_proto.o: ../../include/tls.h
-smtpd_sasl_proto.o: smtpd_token.h
smtpd_sasl_proto.o: smtpd_chat.h
-smtpd_sasl_proto.o: smtpd_sasl_proto.h
smtpd_sasl_proto.o: smtpd_sasl_glue.h
-smtpd_state.o: smtpd_state.c
-smtpd_state.o: ../../include/sys_defs.h
-smtpd_state.o: ../../include/events.h
-smtpd_state.o: ../../include/mymalloc.h
-smtpd_state.o: ../../include/vstream.h
-smtpd_state.o: ../../include/vbuf.h
-smtpd_state.o: ../../include/name_mask.h
-smtpd_state.o: ../../include/msg.h
+smtpd_sasl_proto.o: smtpd_sasl_proto.c
+smtpd_sasl_proto.o: smtpd_sasl_proto.h
+smtpd_sasl_proto.o: smtpd_token.h
+smtpd_state.o: ../../include/argv.h
+smtpd_state.o: ../../include/attr.h
smtpd_state.o: ../../include/cleanup_user.h
-smtpd_state.o: ../../include/mail_params.h
+smtpd_state.o: ../../include/events.h
+smtpd_state.o: ../../include/iostuff.h
smtpd_state.o: ../../include/mail_error.h
+smtpd_state.o: ../../include/mail_params.h
smtpd_state.o: ../../include/mail_proto.h
-smtpd_state.o: ../../include/iostuff.h
-smtpd_state.o: ../../include/attr.h
-smtpd_state.o: smtpd.h
-smtpd_state.o: ../../include/vstring.h
-smtpd_state.o: ../../include/argv.h
-smtpd_state.o: ../../include/myaddrinfo.h
smtpd_state.o: ../../include/mail_stream.h
+smtpd_state.o: ../../include/msg.h
+smtpd_state.o: ../../include/myaddrinfo.h
+smtpd_state.o: ../../include/mymalloc.h
+smtpd_state.o: ../../include/name_mask.h
+smtpd_state.o: ../../include/sys_defs.h
smtpd_state.o: ../../include/tls.h
+smtpd_state.o: ../../include/vbuf.h
+smtpd_state.o: ../../include/vstream.h
+smtpd_state.o: ../../include/vstring.h
+smtpd_state.o: smtpd.h
smtpd_state.o: smtpd_chat.h
smtpd_state.o: smtpd_sasl_glue.h
-smtpd_token.o: smtpd_token.c
-smtpd_token.o: ../../include/sys_defs.h
-smtpd_token.o: ../../include/mymalloc.h
+smtpd_state.o: smtpd_state.c
smtpd_token.o: ../../include/mvect.h
-smtpd_token.o: smtpd_token.h
-smtpd_token.o: ../../include/vstring.h
+smtpd_token.o: ../../include/mymalloc.h
+smtpd_token.o: ../../include/sys_defs.h
smtpd_token.o: ../../include/vbuf.h
-smtpd_xforward.o: smtpd_xforward.c
-smtpd_xforward.o: ../../include/sys_defs.h
-smtpd_xforward.o: ../../include/mymalloc.h
-smtpd_xforward.o: ../../include/msg.h
-smtpd_xforward.o: ../../include/mail_proto.h
-smtpd_xforward.o: ../../include/vstream.h
-smtpd_xforward.o: ../../include/vbuf.h
-smtpd_xforward.o: ../../include/iostuff.h
-smtpd_xforward.o: ../../include/attr.h
-smtpd_xforward.o: smtpd.h
-smtpd_xforward.o: ../../include/vstring.h
+smtpd_token.o: ../../include/vstring.h
+smtpd_token.o: smtpd_token.c
+smtpd_token.o: smtpd_token.h
smtpd_xforward.o: ../../include/argv.h
-smtpd_xforward.o: ../../include/myaddrinfo.h
+smtpd_xforward.o: ../../include/attr.h
+smtpd_xforward.o: ../../include/iostuff.h
+smtpd_xforward.o: ../../include/mail_proto.h
smtpd_xforward.o: ../../include/mail_stream.h
+smtpd_xforward.o: ../../include/msg.h
+smtpd_xforward.o: ../../include/myaddrinfo.h
+smtpd_xforward.o: ../../include/mymalloc.h
+smtpd_xforward.o: ../../include/sys_defs.h
smtpd_xforward.o: ../../include/tls.h
+smtpd_xforward.o: ../../include/vbuf.h
+smtpd_xforward.o: ../../include/vstream.h
+smtpd_xforward.o: ../../include/vstring.h
+smtpd_xforward.o: smtpd.h
+smtpd_xforward.o: smtpd_xforward.c
diff --git a/postfix/src/smtpd/smtpd.c b/postfix/src/smtpd/smtpd.c
index 756a4cd93..f5a5eef95 100644
--- a/postfix/src/smtpd/smtpd.c
+++ b/postfix/src/smtpd/smtpd.c
@@ -36,6 +36,7 @@
/* RFC 1869 (SMTP service extensions)
/* RFC 1870 (Message Size Declaration)
/* RFC 1985 (ETRN command)
+/* RFC 2034 (Enhanced Error Codes)
/* RFC 2554 (AUTH command)
/* RFC 2821 (SMTP protocol)
/* RFC 2920 (SMTP Pipelining)
@@ -70,7 +71,7 @@
/* Disable the SMTP VRFY command.
/* .IP "\fBsmtpd_noop_commands (empty)\fR"
/* List of commands that the Postfix SMTP server replies to with "250
-/* Ok", without doing any syntax checks and without changing state.
+/* 2.0.0 Ok", without doing any syntax checks and without changing state.
/* .IP "\fBstrict_rfc821_envelopes (no)\fR"
/* Require that addresses received in SMTP MAIL FROM and RCPT TO
/* commands are enclosed with <>, and that those addresses do
@@ -1041,6 +1042,11 @@ static int helo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
{
char *err;
+ /*
+ * RFC 2034: the text part of all 2xx, 4xx, and 5xx SMTP responses other
+ * than the initial greeting and any response to HELO or EHLO are
+ * prefaced with a status code as defined in RFC 1893.
+ */
if (argc < 2) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
smtpd_chat_reply(state, "501 Syntax: HELO hostname");
@@ -1084,6 +1090,10 @@ static int ehlo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
* XXX 2821 new feature: Section 4.1.4 specifies that a server must clear
* all buffers and reset the state exactly as if a RSET command had been
* issued.
+ *
+ * RFC 2034: the text part of all 2xx, 4xx, and 5xx SMTP responses other
+ * than the initial greeting and any response to HELO or EHLO are
+ * prefaced with a status code as defined in RFC 1893.
*/
if (argc < 2) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
@@ -1330,8 +1340,8 @@ static void mail_open_stream(SMTPD_STATE *state)
/* extract_addr - extract address from rubble */
-static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
- int allow_empty_addr, int strict_rfc821)
+static int extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
+ int allow_empty_addr, int strict_rfc821)
{
char *myname = "extract_addr";
TOK822 *tree;
@@ -1339,7 +1349,7 @@ static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
TOK822 *addr = 0;
int naddr;
int non_addr;
- char *err = 0;
+ int err = 0;
char *junk = 0;
char *text;
char *colon;
@@ -1402,7 +1412,7 @@ static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
|| (strict_rfc821 && (non_addr || *STR(arg->vstrval) != '<'))) {
msg_warn("Illegal address syntax from %s in %s command: %s",
state->namaddr, state->where, STR(arg->vstrval));
- err = "501 Bad address syntax";
+ err = 1;
}
/*
@@ -1428,7 +1438,7 @@ static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
&& smtpd_check_addr(STR(arg->vstrval)) != 0)) {
msg_warn("Illegal address syntax from %s in %s command: %s",
state->namaddr, state->where, STR(arg->vstrval));
- err = "501 Bad address syntax";
+ err = 1;
}
/*
@@ -1463,20 +1473,20 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
if (var_helo_required && state->helo_name == 0) {
state->error_mask |= MAIL_ERROR_POLICY;
- smtpd_chat_reply(state, "503 Error: send HELO/EHLO first");
+ smtpd_chat_reply(state, "503 5.5.1 Error: send HELO/EHLO first");
return (-1);
}
#define IN_MAIL_TRANSACTION(state) ((state)->sender != 0)
if (IN_MAIL_TRANSACTION(state)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "503 Error: nested MAIL command");
+ smtpd_chat_reply(state, "503 5.5.1 Error: nested MAIL command");
return (-1);
}
if (argc < 3
|| strcasecmp(argv[1].strval, "from:") != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: MAIL FROM: ");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: MAIL FROM: ");
return (-1);
}
@@ -1493,7 +1503,7 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
&& anvil_clnt_mail(anvil_clnt, state->service, state->addr,
&rate) == ANVIL_STAT_OK
&& rate > var_smtpd_cmail_limit) {
- smtpd_chat_reply(state, "421 %s Error: too much mail from %s",
+ smtpd_chat_reply(state, "421 4.7.0 %s Error: too much mail from %s",
var_myhostname, state->addr);
msg_warn("Message delivery request rate limit exceeded: %d from %s for service %s",
rate, state->namaddr, state->service);
@@ -1501,12 +1511,12 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
}
if (argv[2].tokval == SMTPD_TOK_ERROR) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad sender address syntax");
+ smtpd_chat_reply(state, "501 5.1.7 Bad sender address syntax");
return (-1);
}
- if ((err = extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR, var_strict_rfc821_env)) != 0) {
+ if (extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR, var_strict_rfc821_env) != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "%s", err);
+ smtpd_chat_reply(state, "501 5.1.7 Bad sender address syntax");
return (-1);
}
for (narg = 3; narg < argc; narg++) {
@@ -1519,12 +1529,12 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
/* Reject non-numeric size. */
if (!alldig(arg + 5)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad message size syntax");
+ smtpd_chat_reply(state, "501 5.5.4 Bad message size syntax");
return (-1);
}
/* Reject size overflow. */
if ((state->msg_size = off_cvt_string(arg + 5)) < 0) {
- smtpd_chat_reply(state, "552 Message size exceeds file system imposed limit");
+ smtpd_chat_reply(state, "552 5.3.4 Message size exceeds file system imposed limit");
state->error_mask |= MAIL_ERROR_POLICY;
return (-1);
}
@@ -1544,19 +1554,20 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
verp_delims = arg + VERP_CMD_LEN + 1;
if (verp_delims_verify(verp_delims) != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Error: %s needs two characters from %s",
+ smtpd_chat_reply(state,
+ "501 5.5.4 Error: %s needs two characters from %s",
VERP_CMD, var_verp_filter);
return (-1);
}
}
} else {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "555 Unsupported option: %s", arg);
+ smtpd_chat_reply(state, "555 5.5.4 Unsupported option: %s", arg);
return (-1);
}
}
if (verp_delims && argv[2].strval[0] == 0) {
- smtpd_chat_reply(state, "503 Error: %s requires non-null sender",
+ smtpd_chat_reply(state, "503 5.5.4 Error: %s requires non-null sender",
VERP_CMD);
return (-1);
}
@@ -1590,7 +1601,7 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
state->verp_delims = mystrdup(verp_delims);
if (USE_SMTPD_PROXY(state))
state->proxy_mail = mystrdup(STR(state->buffer));
- smtpd_chat_reply(state, "250 Ok");
+ smtpd_chat_reply(state, "250 2.1.0 Ok");
return (0);
}
@@ -1679,13 +1690,13 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
if (!IN_MAIL_TRANSACTION(state)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "503 Error: need MAIL command");
+ smtpd_chat_reply(state, "503 5.5.1 Error: need MAIL command");
return (-1);
}
if (argc < 3
|| strcasecmp(argv[1].strval, "to:") != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: RCPT TO: ");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: RCPT TO: ");
return (-1);
}
@@ -1702,7 +1713,8 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
&& anvil_clnt_rcpt(anvil_clnt, state->service, state->addr,
&rate) == ANVIL_STAT_OK
&& rate > var_smtpd_crcpt_limit) {
- smtpd_chat_reply(state, "421 %s Error: too many recipients from %s",
+ smtpd_chat_reply(state,
+ "421 4.7.0 %s Error: too many recipients from %s",
var_myhostname, state->addr);
msg_warn("Recipient address rate limit exceeded: %d from %s for service %s",
rate, state->namaddr, state->service);
@@ -1710,24 +1722,24 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
}
if (argv[2].tokval == SMTPD_TOK_ERROR) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad recipient address syntax");
+ smtpd_chat_reply(state, "501 5.1.3 Bad recipient address syntax");
return (-1);
}
- if ((err = extract_addr(state, argv + 2, REJECT_EMPTY_ADDR, var_strict_rfc821_env)) != 0) {
+ if (extract_addr(state, argv + 2, REJECT_EMPTY_ADDR, var_strict_rfc821_env) != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "%s", err);
+ smtpd_chat_reply(state, "501 5.1.3 Bad recipient address syntax");
return (-1);
}
for (narg = 3; narg < argc; narg++) {
arg = argv[narg].strval;
if (1) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "555 Unsupported option: %s", arg);
+ smtpd_chat_reply(state, "555 5.5.4 Unsupported option: %s", arg);
return (-1);
}
}
if (var_smtpd_rcpt_limit && state->rcpt_count >= var_smtpd_rcpt_limit) {
- smtpd_chat_reply(state, "452 Error: too many recipients");
+ smtpd_chat_reply(state, "452 4.5.3 Error: too many recipients");
if (state->rcpt_overshoot++ < var_smtpd_rcpt_overlim)
return (0);
state->error_mask |= MAIL_ERROR_POLICY;
@@ -1794,7 +1806,7 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
rec_fputs(state->cleanup, REC_TYPE_RCPT, argv[2].strval);
vstream_fflush(state->cleanup);
}
- smtpd_chat_reply(state, "250 Ok");
+ smtpd_chat_reply(state, "250 2.1.5 Ok");
return (0);
}
@@ -1863,6 +1875,7 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
VSTREAM *out_stream;
int out_error;
char **cpp;
+ CLEANUP_STAT_DETAIL *detail;
#ifdef USE_TLS
VSTRING *peer_CN;
@@ -1878,15 +1891,15 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
if (state->rcpt_count == 0) {
if (!IN_MAIL_TRANSACTION(state)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "503 Error: need RCPT command");
+ smtpd_chat_reply(state, "503 5.5.1 Error: need RCPT command");
} else {
- smtpd_chat_reply(state, "554 Error: no valid recipients");
+ smtpd_chat_reply(state, "554 5.5.1 Error: no valid recipients");
}
return (-1);
}
if (argc != 1) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: DATA");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: DATA");
return (-1);
}
if (SMTPD_STAND_ALONE(state) == 0 && (err = smtpd_check_data(state)) != 0) {
@@ -2077,8 +2090,10 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
} else {
state->error_mask |= MAIL_ERROR_SOFTWARE;
state->err |= CLEANUP_STAT_PROXY;
+ detail = cleanup_stat_detail(CLEANUP_STAT_PROXY);
vstring_sprintf(state->proxy_buffer,
- "451 Error: queue file write error");
+ "%d %s Error: %s",
+ detail->smtp, detail->dsn, detail->text);
}
}
@@ -2113,34 +2128,49 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
state->error_mask = 0;
state->junk_cmds = 0;
if (state->queue_id)
- smtpd_chat_reply(state, "250 Ok: queued as %s", state->queue_id);
+ smtpd_chat_reply(state,
+ "250 2.0.0 Ok: queued as %s", state->queue_id);
else
smtpd_chat_reply(state, "%s", STR(state->proxy_buffer));
} else if ((state->err & CLEANUP_STAT_BAD) != 0) {
state->error_mask |= MAIL_ERROR_SOFTWARE;
- smtpd_chat_reply(state, "451 Error: internal error %d", state->err);
+ detail = cleanup_stat_detail(CLEANUP_STAT_BAD);
+ smtpd_chat_reply(state, "%d %s Error: internal error %d",
+ detail->smtp, detail->dsn, state->err);
} else if ((state->err & CLEANUP_STAT_SIZE) != 0) {
state->error_mask |= MAIL_ERROR_BOUNCE;
- smtpd_chat_reply(state, "552 Error: message too large");
+ detail = cleanup_stat_detail(CLEANUP_STAT_SIZE);
+ smtpd_chat_reply(state, "%d %s Error: %s",
+ detail->smtp, detail->dsn, detail->text);
} else if ((state->err & CLEANUP_STAT_HOPS) != 0) {
state->error_mask |= MAIL_ERROR_BOUNCE;
- smtpd_chat_reply(state, "554 Error: too many hops");
+ detail = cleanup_stat_detail(CLEANUP_STAT_HOPS);
+ smtpd_chat_reply(state, "%d %s Error: %s",
+ detail->smtp, detail->dsn, detail->text);
} else if ((state->err & CLEANUP_STAT_CONT) != 0) {
state->error_mask |= MAIL_ERROR_POLICY;
- if (state->proxy_buffer)
+ detail = cleanup_stat_detail(CLEANUP_STAT_CONT);
+ if (state->proxy_buffer) {
smtpd_chat_reply(state, "%s", STR(state->proxy_buffer));
- else
- smtpd_chat_reply(state, "550 Error: %s", LEN(why) ?
- STR(why) : "content rejected");
+ } else if (why && LEN(why) > 0) {
+ smtpd_chat_reply(state, "%d %s", detail->smtp, STR(why));
+ } else {
+ smtpd_chat_reply(state, "%d %s Error: %s",
+ detail->smtp, detail->dsn, detail->text);
+ }
} else if ((state->err & CLEANUP_STAT_WRITE) != 0) {
state->error_mask |= MAIL_ERROR_RESOURCE;
- smtpd_chat_reply(state, "451 Error: queue file write error");
+ detail = cleanup_stat_detail(CLEANUP_STAT_WRITE);
+ smtpd_chat_reply(state, "%d %s Error: %s",
+ detail->smtp, detail->dsn, detail->text);
} else if ((state->err & CLEANUP_STAT_PROXY) != 0) {
state->error_mask |= MAIL_ERROR_SOFTWARE;
smtpd_chat_reply(state, "%s", STR(state->proxy_buffer));
} else {
state->error_mask |= MAIL_ERROR_SOFTWARE;
- smtpd_chat_reply(state, "451 Error: internal error %d", state->err);
+ detail = cleanup_stat_detail(CLEANUP_STAT_BAD);
+ smtpd_chat_reply(state, "%d %s Error: internal error %d",
+ detail->smtp, detail->dsn, state->err);
}
/*
@@ -2165,7 +2195,7 @@ static int rset_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
*/
if (argc != 1) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: RSET");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: RSET");
return (-1);
}
@@ -2175,7 +2205,7 @@ static int rset_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
chat_reset(state, var_smtpd_hist_thrsh);
mail_reset(state);
rcpt_reset(state);
- smtpd_chat_reply(state, "250 Ok");
+ smtpd_chat_reply(state, "250 2.0.0 Ok");
return (0);
}
@@ -2198,11 +2228,11 @@ static int noop_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
*/
if (argc != 1) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: NOOP");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: NOOP");
return (-1);
}
#endif
- smtpd_chat_reply(state, "250 Ok");
+ smtpd_chat_reply(state, "250 2.0.0 Ok");
return (0);
}
@@ -2238,19 +2268,19 @@ static int vrfy_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
if (var_disable_vrfy_cmd) {
state->error_mask |= MAIL_ERROR_POLICY;
- smtpd_chat_reply(state, "502 VRFY command is disabled");
+ smtpd_chat_reply(state, "502 5.5.1 VRFY command is disabled");
return (-1);
}
if (argc < 2) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: VRFY address");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: VRFY address");
return (-1);
}
if (argc > 2)
collapse_args(argc - 1, argv + 1);
- if ((err = extract_addr(state, argv + 1, REJECT_EMPTY_ADDR, SLOPPY)) != 0) {
+ if (extract_addr(state, argv + 1, REJECT_EMPTY_ADDR, SLOPPY) != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "%s", err);
+ smtpd_chat_reply(state, "501 5.1.3 Bad recipient address syntax");
return (-1);
}
if (SMTPD_STAND_ALONE(state) == 0
@@ -2268,7 +2298,7 @@ static int vrfy_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
* Reply code 250 is reserved for the case where the address is verified;
* reply code 252 should be used when no definitive certainty exists.
*/
- smtpd_chat_reply(state, "252 %s", argv[1].strval);
+ smtpd_chat_reply(state, "252 2.0.0 %s", argv[1].strval);
return (0);
}
@@ -2297,7 +2327,7 @@ static int etrn_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
return (-1);
}
if (argv[1].strval[0] == '@' || argv[1].strval[0] == '#')
- argv[1].strval++;
+ argv[1].strval++;
/*
* As an extension to RFC 1985 we also allow an RFC 2821 address literal
@@ -2354,7 +2384,7 @@ static int quit_cmd(SMTPD_STATE *state, int unused_argc, SMTPD_TOKEN *unused_arg
/*
* Don't bother checking the syntax.
*/
- smtpd_chat_reply(state, "221 Bye");
+ smtpd_chat_reply(state, "221 2.0.0 Bye");
/*
* When the "." and quit replies are pipelined, make sure they are
@@ -2392,18 +2422,18 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
if (IN_MAIL_TRANSACTION(state)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "503 Error: MAIL transaction in progress");
+ smtpd_chat_reply(state, "503 5.5.1 Error: MAIL transaction in progress");
return (-1);
}
if (argc < 2) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: %s attribute=value...",
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: %s attribute=value...",
XCLIENT_CMD);
return (-1);
}
if (!xclient_allowed) {
state->error_mask |= MAIL_ERROR_POLICY;
- smtpd_chat_reply(state, "554 Error: insufficient authorization");
+ smtpd_chat_reply(state, "550 5.7.0 Error: insufficient authorization");
return (-1);
}
#define STREQ(x,y) (strcasecmp((x), (y)) == 0)
@@ -2424,7 +2454,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
if ((attr_value = split_at(attr_name, '=')) == 0 || *attr_value == 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Error: attribute=value expected");
+ smtpd_chat_reply(state, "501 5.5.4 Error: attribute=value expected");
return (-1);
}
printable(attr_value, '?');
@@ -2440,7 +2470,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
} else {
if (!valid_hostname(attr_value, DONT_GRIPE)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XCLIENT_NAME, attr_value);
return (-1);
}
@@ -2460,7 +2490,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
} else {
if ((bare_value = valid_mailhost_addr(attr_value, DONT_GRIPE)) == 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XCLIENT_ADDR, attr_value);
return (-1);
}
@@ -2480,7 +2510,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
} else {
if (strlen(attr_value) > VALID_HOSTNAME_LEN) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XCLIENT_HELO, attr_value);
return (-1);
}
@@ -2495,7 +2525,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
else if (STREQ(attr_name, XCLIENT_PROTO)) {
if (name_code(proto_names, NAME_CODE_FLAG_NONE, attr_value) < 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XCLIENT_PROTO, attr_value);
return (-1);
}
@@ -2507,7 +2537,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
else {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s attribute name: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s attribute name: %s",
XCLIENT_CMD, attr_name);
return (-1);
}
@@ -2522,7 +2552,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
state->namaddr =
concatenate(state->name, "[", state->addr, "]", (char *) 0);
}
- smtpd_chat_reply(state, "250 Ok");
+ smtpd_chat_reply(state, "250 2.0.0 Ok");
return (0);
}
@@ -2560,18 +2590,18 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
if (IN_MAIL_TRANSACTION(state)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "503 Error: MAIL transaction in progress");
+ smtpd_chat_reply(state, "503 5.5.1 Error: MAIL transaction in progress");
return (-1);
}
if (argc < 2) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: %s attribute=value...",
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: %s attribute=value...",
XFORWARD_CMD);
return (-1);
}
if (!xforward_allowed) {
state->error_mask |= MAIL_ERROR_POLICY;
- smtpd_chat_reply(state, "554 Error: insufficient authorization");
+ smtpd_chat_reply(state, "550 5.7.0 Error: insufficient authorization");
return (-1);
}
@@ -2593,12 +2623,12 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
if ((attr_value = split_at(attr_name, '=')) == 0 || *attr_value == 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Error: attribute=value expected");
+ smtpd_chat_reply(state, "501 5.5.4 Error: attribute=value expected");
return (-1);
}
if (strlen(attr_value) > 255) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Error: attribute value too long");
+ smtpd_chat_reply(state, "501 5.5.4 Error: attribute value too long");
return (-1);
}
printable(attr_value, '?');
@@ -2617,7 +2647,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
neuter(attr_value, NEUTER_CHARACTERS, '?');
if (!valid_hostname(attr_value, DONT_GRIPE)) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XFORWARD_NAME, attr_value);
return (-1);
}
@@ -2638,7 +2668,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
neuter(attr_value, NEUTER_CHARACTERS, '?');
if ((bare_value = valid_mailhost_addr(attr_value, DONT_GRIPE)) == 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XFORWARD_ADDR, attr_value);
return (-1);
}
@@ -2671,7 +2701,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
} else {
if (strlen(attr_value) > 64) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XFORWARD_PROTO, attr_value);
return (-1);
}
@@ -2690,7 +2720,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
NAME_CODE_FLAG_NONE,
attr_value)) < 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
XFORWARD_DOMAIN, attr_value);
return (-1);
}
@@ -2702,7 +2732,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
*/
default:
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Bad %s attribute name: %s",
+ smtpd_chat_reply(state, "501 5.5.4 Bad %s attribute name: %s",
XFORWARD_CMD, attr_name);
return (-1);
}
@@ -2723,7 +2753,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
state->xforward.addr, "]",
(char *) 0) : mystrdup(state->xforward.name);
}
- smtpd_chat_reply(state, "250 Ok");
+ smtpd_chat_reply(state, "250 2.0.0 Ok");
return (0);
}
@@ -2766,10 +2796,10 @@ static void smtpd_start_tls(SMTPD_STATE *state)
* verification unless TLS is required.
*/
state->tls_context =
- tls_server_start(smtpd_tls_ctx, state->client,
- var_smtpd_starttls_tmout,
- state->name, state->addr, &(state->tls_info),
- (var_smtpd_tls_req_ccert && state->tls_enforce_tls));
+ tls_server_start(smtpd_tls_ctx, state->client,
+ var_smtpd_starttls_tmout,
+ state->name, state->addr, &(state->tls_info),
+ (var_smtpd_tls_req_ccert && state->tls_enforce_tls));
/*
* When the TLS handshake fails, the conversation is in an unknown state.
@@ -2799,24 +2829,24 @@ static int starttls_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
{
if (argc != 1) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: STARTTLS");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: STARTTLS");
return (-1);
}
if (state->tls_context != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "554 Error: TLS already active");
+ smtpd_chat_reply(state, "554 5.5.1 Error: TLS already active");
return (-1);
}
if (state->tls_use_tls == 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "502 Error: command not implemented");
+ smtpd_chat_reply(state, "502 5.5.1 Error: command not implemented");
return (-1);
}
if (smtpd_tls_ctx == 0) {
- smtpd_chat_reply(state, "454 TLS not available due to local problem");
+ smtpd_chat_reply(state, "454 4.3.0 TLS not available due to local problem");
return (-1);
}
- smtpd_chat_reply(state, "220 Ready to start TLS");
+ smtpd_chat_reply(state, "220 2.0.0 Ready to start TLS");
smtp_flush(state->client);
/*
@@ -2937,7 +2967,7 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
case SMTP_ERR_TIME:
state->reason = REASON_TIMEOUT;
if (vstream_setjmp(state->client) == 0)
- smtpd_chat_reply(state, "421 %s Error: timeout exceeded",
+ smtpd_chat_reply(state, "421 4.4.2 %s Error: timeout exceeded",
var_myhostname);
break;
@@ -2979,14 +3009,14 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
&& anvil_clnt_connect(anvil_clnt, service, state->addr,
&count, &crate) == ANVIL_STAT_OK) {
if (var_smtpd_cconn_limit > 0 && count > var_smtpd_cconn_limit) {
- smtpd_chat_reply(state, "421 %s Error: too many connections from %s",
+ smtpd_chat_reply(state, "421 4.7.0 %s Error: too many connections from %s",
var_myhostname, state->addr);
msg_warn("Connection concurrency limit exceeded: %d from %s for service %s",
count, state->namaddr, service);
break;
}
if (var_smtpd_crate_limit > 0 && crate > var_smtpd_crate_limit) {
- smtpd_chat_reply(state, "421 %s Error: too many connections from %s",
+ smtpd_chat_reply(state, "421 4.7.0 %s Error: too many connections from %s",
var_myhostname, state->addr);
msg_warn("Connection rate limit exceeded: %d from %s for service %s",
crate, state->namaddr, service);
@@ -2999,7 +3029,14 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
&& (state->access_denied = smtpd_check_client(state)) != 0) {
smtpd_chat_reply(state, "%s", state->access_denied);
state->error_count++;
- } else {
+ }
+
+ /*
+ * RFC 2034: the text part of all 2xx, 4xx, and 5xx SMTP responses
+ * other than the initial greeting and any response to HELO or EHLO
+ * are prefaced with a status code as defined in RFC 1893.
+ */
+ else {
smtpd_chat_reply(state, "220 %s", var_smtpd_banner);
}
@@ -3007,7 +3044,7 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
if (state->error_count >= var_smtpd_hard_erlim) {
state->reason = REASON_ERROR_LIMIT;
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "421 %s Error: too many errors",
+ smtpd_chat_reply(state, "421 4.7.0 %s Error: too many errors",
var_myhostname);
break;
}
@@ -3015,13 +3052,13 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
smtpd_chat_query(state);
if ((argc = smtpd_token(vstring_str(state->buffer), &argv)) == 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "500 Error: bad syntax");
+ smtpd_chat_reply(state, "500 5.5.2 Error: bad syntax");
state->error_count++;
continue;
}
if (*var_smtpd_noop_cmds
&& string_list_match(smtpd_noop_cmds, argv[0].strval)) {
- smtpd_chat_reply(state, "250 Ok");
+ smtpd_chat_reply(state, "250 2.0.0 Ok");
if (state->junk_cmds++ > var_smtpd_junk_cmd_limit)
state->error_count++;
continue;
@@ -3035,17 +3072,17 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
&& string_list_match(smtpd_forbid_cmds, argv[0].strval))) {
msg_warn("%s sent non-SMTP command: %.100s",
state->namaddr, vstring_str(state->buffer));
- smtpd_chat_reply(state, "221 Error: I can break rules, too. Goodbye.");
+ smtpd_chat_reply(state, "221 2.7.0 Error: I can break rules, too. Goodbye.");
break;
}
- smtpd_chat_reply(state, "502 Error: command not implemented");
+ smtpd_chat_reply(state, "502 5.5.2 Error: command not recognized");
state->error_mask |= MAIL_ERROR_PROTOCOL;
state->error_count++;
continue;
}
/* XXX We use the real client for connect access control. */
if (state->access_denied && cmdp->action != quit_cmd) {
- smtpd_chat_reply(state, "503 Error: access denied for %s",
+ smtpd_chat_reply(state, "503 5.7.0 Error: access denied for %s",
state->namaddr); /* RFC 2821 Sec 3.1 */
state->error_count++;
continue;
@@ -3055,7 +3092,7 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
!state->tls_context &&
(cmdp->flags & SMTPD_CMD_FLAG_PRE_TLS) == 0) {
smtpd_chat_reply(state,
- "530 Must issue a STARTTLS command first");
+ "530 5.7.0 Must issue a STARTTLS command first");
state->error_count++;
continue;
}
@@ -3280,7 +3317,7 @@ static void post_jail_init(char *unused_name, char **unused_argv)
* recipient checks, address mapping, header_body_checks?.
*/
smtpd_input_transp_mask =
- input_transp_mask(VAR_INPUT_TRANSP, var_input_transp);
+ input_transp_mask(VAR_INPUT_TRANSP, var_input_transp);
/*
* Sanity checks. The queue_minfree value should be at least as large as
diff --git a/postfix/src/smtpd/smtpd.h b/postfix/src/smtpd/smtpd.h
index c17a5ba46..19aaeee9b 100644
--- a/postfix/src/smtpd/smtpd.h
+++ b/postfix/src/smtpd/smtpd.h
@@ -50,6 +50,8 @@
typedef struct SMTPD_DEFER {
int active; /* is this active */
VSTRING *reason; /* reason for deferral */
+ VSTRING *dsn; /* DSN detail */
+ int code; /* SMTP reply code */
int class; /* error notification class */
} SMTPD_DEFER;
diff --git a/postfix/src/smtpd/smtpd_acl.ref b/postfix/src/smtpd/smtpd_acl.ref
index 0613b949b..06c40f461 100644
--- a/postfix/src/smtpd/smtpd_acl.ref
+++ b/postfix/src/smtpd/smtpd_acl.ref
@@ -16,8 +16,8 @@ OK
OK
>>> # Expect: REJECT
>>> helo foo.dunno.com
-./smtpd_check: : reject: HELO from localhost[127.0.0.1]: 554 : Helo command rejected: Access denied; proto=SMTP helo=
-554 : Helo command rejected: Access denied
+./smtpd_check: : reject: HELO from localhost[127.0.0.1]: 554 5.7.1 : Helo command rejected: Access denied; proto=SMTP helo=
+554 5.7.1 : Helo command rejected: Access denied
>>> # Expect: OK
>>> helo bar.dunno.com
OK
@@ -31,8 +31,8 @@ OK
OK
>>> # Expect: REJECT
>>> client foo.dunno.com 131.155.210.17
-./smtpd_check: : reject: CONNECT from foo.dunno.com[131.155.210.17]: 554 : Client host rejected: Access denied; proto=SMTP helo=
-554 : Client host rejected: Access denied
+./smtpd_check: : reject: CONNECT from foo.dunno.com[131.155.210.17]: 554 5.7.1 : Client host rejected: Access denied; proto=SMTP helo=
+554 5.7.1 : Client host rejected: Access denied
>>> # Expect: OK
>>> client bar.dunno.com 131.155.210.17
OK
@@ -47,19 +47,19 @@ OK
OK
>>> # Expect: REJECT
>>> client bar.duno.com 131.155.210.19
-./smtpd_check: : reject: CONNECT from bar.duno.com[131.155.210.19]: 554 : Client host rejected: Access denied; proto=SMTP helo=
-554 : Client host rejected: Access denied
+./smtpd_check: : reject: CONNECT from bar.duno.com[131.155.210.19]: 554 5.7.1 : Client host rejected: Access denied; proto=SMTP helo=
+554 5.7.1 : Client host rejected: Access denied
>>> # Expect: REJECT
>>> client bar.duno.com 44.33.22.11
-./smtpd_check: : reject: CONNECT from bar.duno.com[44.33.22.11]: 554 : Client host rejected: Access denied; proto=SMTP helo=
-554 : Client host rejected: Access denied
+./smtpd_check: : reject: CONNECT from bar.duno.com[44.33.22.11]: 554 5.7.1 : Client host rejected: Access denied; proto=SMTP helo=
+554 5.7.1 : Client host rejected: Access denied
>>> # Expect: OK
>>> client bar.duno.com 44.33.22.55
OK
>>> # Expect: REJECT
>>> client bar.duno.com 44.33.44.33
-./smtpd_check: : reject: CONNECT from bar.duno.com[44.33.44.33]: 554 : Client host rejected: Access denied; proto=SMTP helo=
-554 : Client host rejected: Access denied
+./smtpd_check: : reject: CONNECT from bar.duno.com[44.33.44.33]: 554 5.7.1 : Client host rejected: Access denied; proto=SMTP helo=
+554 5.7.1 : Client host rejected: Access denied
>>> #
>>> # Test check_mail_access()
>>> #
@@ -67,8 +67,8 @@ OK
OK
>>> # Expect: REJECT
>>> mail reject@dunno.domain
-./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 : Sender address rejected: Access denied; from= proto=SMTP helo=
-554 : Sender address rejected: Access denied
+./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 : Sender address rejected: Access denied; from= proto=SMTP helo=
+554 5.7.1 : Sender address rejected: Access denied
>>> # Expect: OK
>>> mail ok@dunno.domain
OK
@@ -83,26 +83,26 @@ OK
>>> #
>>> # Expect: REJECT
>>> mail reject@reject.domain
-./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 : Sender address rejected: Access denied; from= proto=SMTP helo=
-554 : Sender address rejected: Access denied
+./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 : Sender address rejected: Access denied; from= proto=SMTP helo=
+554 5.7.1 : Sender address rejected: Access denied
>>> # Expect: OK
>>> mail ok@reject.domain
OK
>>> # Expect: REJECT
>>> mail anyone@reject.domain
-./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 : Sender address rejected: Access denied; from= proto=SMTP helo=
-554 : Sender address rejected: Access denied
+./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 : Sender address rejected: Access denied; from= proto=SMTP helo=
+554 5.7.1 : Sender address rejected: Access denied
>>> # Expect: REJECT
>>> mail good-sender@reject.domain
-./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 : Sender address rejected: Access denied; from= proto=SMTP helo=
-554 : Sender address rejected: Access denied
+./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 : Sender address rejected: Access denied; from= proto=SMTP helo=
+554 5.7.1 : Sender address rejected: Access denied
>>> #
>>> # Again, with a domain that accepts by default
>>> #
>>> # Expect: REJECT
>>> mail reject@ok.domain
-./smtpd_check: : reject: MAIL from bar.duno.com[44.33.44.33]: 554 : Sender address rejected: Access denied; from= proto=SMTP helo=