-TCFG_PARSER
-TCIDR_MATCH
-TCLEANUP_STATE
+-TCLEANUP_STAT_DETAIL
-TCLIENT_LIST
-TCLNT_STREAM
-TCONFIG_BOOL_FN_TABLE
-TDNS_REPLY
-TDNS_RR
-TDOMAIN_LIST
+-TDSN_SPLIT
+-TDSN_VSTRING
-TEXPAND_ATTR
-TFILE
-TFORWARD_INFO
-TSSL_SESSION
-TSTRING_LIST
-TSTRING_TABLE
--TSYS_EXITS_TABLE
+-TSYS_EXITS_DETAIL
-TTLS_PRNG_SEED_INFO
-TTLS_PRNG_SRC
-TTLS_SCACHE
--- /dev/null
+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.
Bugfix: when <unistd.h> 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?
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.
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.
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
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.
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
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.
-# ACCESS(5) ACCESS(5)
+# ACCESS(5) ACCESS(5)
#
# NAME
# access - Postfix access table format
# 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
# 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
# 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
# P.O. Box 704
# Yorktown Heights, NY 10598, USA
#
-# ACCESS(5)
+# ACCESS(5)
-# HEADER_CHECKS(5) HEADER_CHECKS(5)
+# HEADER_CHECKS(5) HEADER_CHECKS(5)
#
# NAME
# header_checks - Postfix built-in header/body inspection
# 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:.
#
# 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.
#
#
# 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:
# 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
# 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)
# P.O. Box 704
# Yorktown Heights, NY 10598, USA
#
-# HEADER_CHECKS(5)
+# HEADER_CHECKS(5)
<blockquote>
<pre>
% 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
</pre>
</blockquote>
-<p> The exact pathnames depend on the DB version that you installed.
-For example, Berkeley DB version 2 installs in /usr/local/BerkeleyDB.
-</p>
+<p> Solaris needs this: </p>
+
+<blockquote>
+<pre>
+% 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
+</pre>
+</blockquote>
+
+<p> The exact pathnames depend on the Berkeley DB version, and on
+how it was installed. </p>
<p> 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
tion schemes.
<b>REJECT ACTIONS</b>
+ Postfix version 2.3 and later support enhanced status
+ codes. When no code is specified at the beginning of the
+ <i>text</i> 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.
+
<b>4</b><i>NN text</i>
<b>5</b><i>NN text</i>
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 <a href="master.8.html"><b>master</b>(8)</a> process manager.
-
- The <a href="discard.8.html"><b>discard</b>(8)</a> 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
+ <a href="http://www.faqs.org/rfcs/rfc1893.html">RFC 1893</a>-compatible detail code. This program expects to
+ be run from the <a href="master.8.html"><b>master</b>(8)</a> process manager.
+
+ The <a href="discard.8.html"><b>discard</b>(8)</a> 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.
appropriate.
<b>SECURITY</b>
- The <a href="discard.8.html"><b>discard</b>(8)</a> mailer is not security-sensitive. It does
- not talk to the network, and can be run chrooted at fixed
+ The <a href="discard.8.html"><b>discard</b>(8)</a> mailer is not security-sensitive. It does
+ not talk to the network, and can be run chrooted at fixed
low privilege.
<b>STANDARDS</b>
<b>DIAGNOSTICS</b>
Problems and transactions are logged to <b>syslogd</b>(8).
- Depending on the setting of the <b><a href="postconf.5.html#notify_classes">notify_classes</a></b> parameter,
- the postmaster is notified of bounces and of other trou-
+ Depending on the setting of the <b><a href="postconf.5.html#notify_classes">notify_classes</a></b> parameter,
+ the postmaster is notified of bounces and of other trou-
ble.
<b>CONFIGURATION PARAMETERS</b>
- Changes to <b>main.cf</b> are picked up automatically as <a href="discard.8.html"><b>dis-</b></a>
- <a href="discard.8.html"><b>card</b>(8)</a> processes run for only a limited amount of time.
+ Changes to <b>main.cf</b> are picked up automatically as <a href="discard.8.html"><b>dis-</b></a>
+ <a href="discard.8.html"><b>card</b>(8)</a> processes run for only a limited amount of time.
Use the command "<b>postfix reload</b>" to speed up a change.
- The text below provides only a parameter summary. See
+ The text below provides only a parameter summary. See
<a href="postconf.5.html"><b>postconf</b>(5)</a> for more details including examples.
<b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
- The default location of the Postfix main.cf and
+ The default location of the Postfix main.cf and
master.cf configuration files.
<b><a href="postconf.5.html#daemon_timeout">daemon_timeout</a> (18000s)</b>
- 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.
<b><a href="postconf.5.html#double_bounce_sender">double_bounce_sender</a> (double-bounce)</b>
over an internal communication channel.
<b><a href="postconf.5.html#max_idle">max_idle</a> (100s)</b>
- 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.
<b><a href="postconf.5.html#max_use">max_use</a> (100)</b>
- The maximal number of connection requests before a
+ The maximal number of connection requests before a
Postfix daemon process terminates.
<b><a href="postconf.5.html#process_id">process_id</a> (read-only)</b>
- The process ID of a Postfix command or daemon
+ The process ID of a Postfix command or daemon
process.
<b><a href="postconf.5.html#process_name">process_name</a> (read-only)</b>
- The process name of a Postfix command or daemon
+ The process name of a Postfix command or daemon
process.
<b><a href="postconf.5.html#queue_directory">queue_directory</a> (see 'postconf -d' output)</b>
- The location of the Postfix top-level queue direc-
+ The location of the Postfix top-level queue direc-
tory.
<b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
The syslog facility of Postfix logging.
<b><a href="postconf.5.html#syslog_name">syslog_name</a> (postfix)</b>
- 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".
<b>SEE ALSO</b>
syslogd(8), system logging
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>HISTORY</b>
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 <a href="master.8.html"><b>mas-</b></a>
- <a href="master.8.html"><b>ter</b>(8)</a> process manager.
+ information. The reason may be prefixed with an RFC
+ 1893-compatible detail code. This program expects to be
+ run from the <a href="master.8.html"><b>master</b>(8)</a> process manager.
- The <a href="error.8.html"><b>error</b>(8)</a> 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 <a href="error.8.html"><b>error</b>(8)</a> 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 <a href="bounce.8.html"><b>bounce</b>(8)</a>,
+ Delivery status reports are sent to the <a href="bounce.8.html"><b>bounce</b>(8)</a>,
<a href="defer.8.html"><b>defer</b>(8)</a> or <a href="trace.8.html"><b>trace</b>(8)</a> daemon as appropriate.
<b>SECURITY</b>
The <a href="error.8.html"><b>error</b>(8)</a> 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.
<b>STANDARDS</b>
<b>DIAGNOSTICS</b>
Problems and transactions are logged to <b>syslogd</b>(8).
- Depending on the setting of the <b><a href="postconf.5.html#notify_classes">notify_classes</a></b> parameter,
- the postmaster is notified of bounces and of other trou-
+ Depending on the setting of the <b><a href="postconf.5.html#notify_classes">notify_classes</a></b> parameter,
+ the postmaster is notified of bounces and of other trou-
ble.
<b>CONFIGURATION PARAMETERS</b>
Changes to <b>main.cf</b> are picked up automatically as <a href="error.8.html"><b>error</b>(8)</a>
- processes run for only a limited amount of time. Use the
+ processes run for only a limited amount of time. Use the
command "<b>postfix reload</b>" to speed up a change.
- The text below provides only a parameter summary. See
+ The text below provides only a parameter summary. See
<a href="postconf.5.html"><b>postconf</b>(5)</a> for more details including examples.
<b><a href="postconf.5.html#2bounce_notice_recipient">2bounce_notice_recipient</a> (postmaster)</b>
- The recipient of undeliverable mail that cannot be
+ The recipient of undeliverable mail that cannot be
returned to the sender.
<b><a href="postconf.5.html#bounce_notice_recipient">bounce_notice_recipient</a> (postmaster)</b>
- 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.
<b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
- The default location of the Postfix main.cf and
+ The default location of the Postfix main.cf and
master.cf configuration files.
<b><a href="postconf.5.html#daemon_timeout">daemon_timeout</a> (18000s)</b>
- 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.
<b><a href="postconf.5.html#double_bounce_sender">double_bounce_sender</a> (double-bounce)</b>
over an internal communication channel.
<b><a href="postconf.5.html#max_idle">max_idle</a> (100s)</b>
- 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.
<b><a href="postconf.5.html#max_use">max_use</a> (100)</b>
- The maximal number of connection requests before a
+ The maximal number of connection requests before a
Postfix daemon process terminates.
<b><a href="postconf.5.html#notify_classes">notify_classes</a> (resource, software)</b>
- The list of error classes that are reported to the
+ The list of error classes that are reported to the
postmaster.
<b><a href="postconf.5.html#process_id">process_id</a> (read-only)</b>
- The process ID of a Postfix command or daemon
+ The process ID of a Postfix command or daemon
process.
<b><a href="postconf.5.html#process_name">process_name</a> (read-only)</b>
- The process name of a Postfix command or daemon
+ The process name of a Postfix command or daemon
process.
<b><a href="postconf.5.html#queue_directory">queue_directory</a> (see 'postconf -d' output)</b>
- The location of the Postfix top-level queue direc-
+ The location of the Postfix top-level queue direc-
tory.
<b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
The syslog facility of Postfix logging.
<b><a href="postconf.5.html#syslog_name">syslog_name</a> (postfix)</b>
- 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".
<b>SEE ALSO</b>
syslogd(8), system logging
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>AUTHOR(S)</b>
<a href="postconf.5.html#body_checks">body_checks</a> 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 <i>optional text...</i>, Postfix inserts a default
+ enhanced status code of "5.7.1".
+
<b>WARN</b> <i>optional text...</i>
- Log a warning with the <i>optional text...</i> (or log a
- generic message) and inspect the next input line.
+ Log a warning with the <i>optional text...</i> (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.
<b>BUGS</b>
- Many people overlook the main limitations of header and
- <a href="postconf.5.html#body_checks">body_checks</a> 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
+ <a href="postconf.5.html#body_checks">body_checks</a> 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 (<a href="http://www.faqs.org/rfcs/rfc2045.html">RFC 2045</a>) 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 (<a href="http://www.faqs.org/rfcs/rfc2047.html">RFC 2047</a>) then the rules
need to be specified for the encoded form.
- Message headers added by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon itself are
+ Message headers added by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon itself are
excluded from inspection. Examples of such message headers
are <b>From:</b>, <b>To:</b>, <b>Message-ID:</b>, <b>Date:</b>.
- Message headers deleted by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon will be
+ Message headers deleted by the <a href="cleanup.8.html"><b>cleanup</b>(8)</a> daemon will be
examined before they are deleted. Examples are: <b>Bcc:, Con-</b>
<b>tent-Length:</b>, <b>Return-Path:</b>.
<b><a href="postconf.5.html#body_checks">body_checks</a></b>
Lookup tables with content filter rules for message
body lines. These filters see one physical line at
- a time, in chunks of at most <b>$<a href="postconf.5.html#line_length_limit">line_length_limit</a></b>
+ a time, in chunks of at most <b>$<a href="postconf.5.html#line_length_limit">line_length_limit</a></b>
bytes.
<b><a href="postconf.5.html#body_checks_size_limit">body_checks_size_limit</a></b>
- The amount of content per message body segment
+ The amount of content per message body segment
(attachment) that is subjected to <b>$<a href="postconf.5.html#body_checks">body_checks</a></b> fil-
tering.
<b><a href="postconf.5.html#nested_header_checks">nested_header_checks</a></b> (default: <b>$<a href="postconf.5.html#header_checks">header_checks</a></b>)
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
<b>$<a href="postconf.5.html#header_size_limit">header_size_limit</a></b> characters are truncated.
<b><a href="postconf.5.html#disable_mime_input_processing">disable_mime_input_processing</a></b>
- 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 <b><a href="postconf.5.html#header_checks">header_checks</a></b> is
- applied to all the initial message headers, and
+ the message body. This means that <b><a href="postconf.5.html#header_checks">header_checks</a></b> is
+ applied to all the initial message headers, and
that <b><a href="postconf.5.html#body_checks">body_checks</a></b> is applied to the remainder of the
message.
- Note: when used in this manner, <b><a href="postconf.5.html#body_checks">body_checks</a></b> will
- process a multi-line message header one line at a
+ Note: when used in this manner, <b><a href="postconf.5.html#body_checks">body_checks</a></b> will
+ process a multi-line message header one line at a
time.
<b>EXAMPLES</b>
- Header pattern to block attachments with bad file name
+ Header pattern to block attachments with bad file name
extensions.
/etc/postfix/main.cf:
<a href="BACKSCATTER_README.html">BACKSCATTER_README</a>, blocking returned forged mail
<b>LICENSE</b>
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
<b>AUTHOR(S)</b>
<a href="http://www.faqs.org/rfcs/rfc1652.html">RFC 1652</a> (8bit-MIME transport)
<a href="http://www.faqs.org/rfcs/rfc1870.html">RFC 1870</a> (Message Size Declaration)
<a href="http://www.faqs.org/rfcs/rfc2033.html">RFC 2033</a> (LMTP protocol)
+ <a href="http://www.faqs.org/rfcs/rfc2034.html">RFC 2034</a> (Enhanced Error Codes)
<a href="http://www.faqs.org/rfcs/rfc2554.html">RFC 2554</a> (AUTH command)
<a href="http://www.faqs.org/rfcs/rfc2821.html">RFC 2821</a> (SMTP protocol)
<a href="http://www.faqs.org/rfcs/rfc2920.html">RFC 2920</a> (SMTP Pipelining)
<b>-f</b> <i>command,command,...</i>
Reject the specified commands with a hard (5xx)
- error code.
+ error code. This option implies <b>-p</b>.
<b>-F</b> Disable XFORWARD support.
<b>-r</b> <i>command,command,...</i>
Reject the specified commands with a soft (4xx)
- error code.
+ error code. This option implies <b>-p</b>.
<b>-s</b> <i>command,command,...</i>
Log the named commands to syslogd. Examples of
<a href="http://www.faqs.org/rfcs/rfc1652.html">RFC 1652</a> (8bit-MIME transport)
<a href="http://www.faqs.org/rfcs/rfc1870.html">RFC 1870</a> (Message Size Declaration)
<a href="http://www.faqs.org/rfcs/rfc2045.html">RFC 2045</a> (MIME: Format of Internet Message Bodies)
+ <a href="http://www.faqs.org/rfcs/rfc2034.html">RFC 2034</a> (Enhanced Error Codes)
<a href="http://www.faqs.org/rfcs/rfc2046.html">RFC 2046</a> (MIME: Media Types)
<a href="http://www.faqs.org/rfcs/rfc2554.html">RFC 2554</a> (AUTH command)
<a href="http://www.faqs.org/rfcs/rfc2821.html">RFC 2821</a> (SMTP protocol)
<a href="http://www.faqs.org/rfcs/rfc1869.html">RFC 1869</a> (SMTP service extensions)
<a href="http://www.faqs.org/rfcs/rfc1870.html">RFC 1870</a> (Message Size Declaration)
<a href="http://www.faqs.org/rfcs/rfc1985.html">RFC 1985</a> (ETRN command)
+ <a href="http://www.faqs.org/rfcs/rfc2034.html">RFC 2034</a> (Enhanced Error Codes)
<a href="http://www.faqs.org/rfcs/rfc2554.html">RFC 2554</a> (AUTH command)
<a href="http://www.faqs.org/rfcs/rfc2821.html">RFC 2821</a> (SMTP protocol)
<a href="http://www.faqs.org/rfcs/rfc2920.html">RFC 2920</a> (SMTP Pipelining)
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"
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,
.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
.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
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.
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.
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)
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)
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)
<blockquote>
<pre>
% 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
</pre>
</blockquote>
-<p> The exact pathnames depend on the DB version that you installed.
-For example, Berkeley DB version 2 installs in /usr/local/BerkeleyDB.
-</p>
+<p> Solaris needs this: </p>
+
+<blockquote>
+<pre>
+% 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
+</pre>
+</blockquote>
+
+<p> The exact pathnames depend on the Berkeley DB version, and on
+how it was installed. </p>
<p> 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
# 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
# .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
(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
(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
/* 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;
(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
#include <mail_params.h>
#include <mail_stream.h>
#include <hold_message.h>
+#include <dsn_util.h>
/* Application-specific. */
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.
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)) ?
#include <mail_proto.h>
#include <mime_state.h>
#include <lex_822.h>
+#include <dsn_util.h>
/* Application-specific. */
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++;
#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);
"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);
(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
/* 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.
/*
#include <deliver_completed.h>
#include <flush_clnt.h>
#include <sent.h>
+#include <dsn_util.h>
/* Single server skeleton. */
int status;
RECIPIENT *rcpt;
int nrcpt;
+ DSN_SPLIT dp;
if (msg_verbose)
msg_info("deliver_message: from %s", request->sender);
*/
#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;
(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
(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
/* 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.
/*
#include <bounce.h>
#include <deliver_completed.h>
#include <flush_clnt.h>
+#include <dsn_util.h>
/* Single server skeleton. */
int status;
RECIPIENT *rcpt;
int nrcpt;
+ DSN_SPLIT dp;
if (msg_verbose)
msg_info("deliver_message: from %s", request->sender);
*/
#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;
(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
(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
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 \
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 \
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)
(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
/* #include <bounce.h>
/*
/* 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;
/* 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;
/* 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;
/* const char *recipient;
/* long offset;
/* const char *relay;
+/* const char *dsn;
/* time_t entry;
/* const char *format;
/* va_list ap;
/* .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
#include <msg.h>
#include <vstring.h>
+#include <mymalloc.h>
/* Global library. */
#include <defer.h>
#include <trace.h>
#include <bounce.h>
+#include <dsn_util.h>
/* 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);
}
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);
}
*/
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);
}
*/
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,
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);
}
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);
}
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);
}
*/
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);
}
*/
else if (var_soft_bounce) {
return (vbounce_append(flags, id, orig_rcpt, recipient,
- offset, relay, entry, fmt, ap));
+ offset, relay, dsn, entry, fmt, ap));
}
/*
*/
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,
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);
}
/*
* 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.
/* SYNOPSIS
/* #include <cleanup_user.h>
/*
+/* 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
/* Utility library. */
#include <vstring.h>
+#include <msg.h>
/* Global library. */
-#include "cleanup_user.h"
+#include <cleanup_user.h>
/*
* 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);
}
#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
/* #include <defer.h>
/*
/* 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;
/* 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
#include <trace.h>
#include <bounce.h>
#include <defer.h>
+#include <dsn_util.h>
#define STR(x) vstring_str(x)
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);
}
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);
}
*/
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);
}
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));
/*
*/
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);
/*
* 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 *);
/* 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
--- /dev/null
+/*++
+/* NAME
+/* dsn_util 3
+/* SUMMARY
+/* DSN support routines
+/* SYNOPSIS
+/* #include <dsn_util.h>
+/*
+/* 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 <sys_defs.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+/* Utility library. */
+
+#include <msg.h>
+#include <mymalloc.h>
+#include <vstring.h>
+#include <stringops.h>
+
+/* Global library. */
+
+#include <dsn_util.h>
+
+/* 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);
+}
--- /dev/null
+#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 <vstring.h>
+
+ /*
+ * 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
/* #include <log_adhoc.h>
/*
/* 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;
/* 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
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);
}
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);
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);
}
/*
* 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
/* 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.
/* .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.
#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 */
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;
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));
#include <vstream.h>
#include <vstring.h>
+ /*
+ * Global library.
+ */
+#include <dsn_util.h>
+
/*
* 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() */
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 */
* 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"
/*
/* typedef struct {
/* .in +4
-/* /* public members... */
-/* VSTREAM *fp;
+/* /* public members... */
+/* VSTREAM *fp;
/* .in -4
/* } MBOX;
/*
/* 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.
/*
/*
/* 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.
#include <sys/stat.h>
#include <errno.h>
+#ifndef EDQUOT
+#define EDQUOT EFBIG
+#endif
+
/* Utility library. */
#include <msg.h>
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
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);
* 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);
}
* 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);
}
}
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");
+}
#include <vstring.h>
#include <safe_open.h>
+ /*
+ * Global library.
+ */
+#include <dsn_util.h>
+
/*
* External interface.
*/
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
/*
/* 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 <sysexits.h>.
+/*
/* 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
#include <pipe_command.h>
#include <exec_command.h>
#include <sys_exits.h>
+#include <dsn_util.h>
/* Application-specific. */
/* 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;
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
*/
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);
/*
* 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,
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);
}
*/
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 <sysexits.h> 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 <sysexits.h> 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);
}
* Global library.
*/
#include <mail_copy.h>
+#include <dsn_util.h>
/*
* Request arguments.
#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
/* #include <sent.h>
/*
/* 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;
/* 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
#include <trace.h>
#include <defer.h>
#include <sent.h>
+#include <dsn_util.h>
/* Application-specific. */
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);
}
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);
}
*/
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);
}
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);
*/
#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
/* SYNOPSIS
/* #include <sys_exits.h>
/*
+/* 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.
/* 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
/* 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 */
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)
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');
}
/*
* 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)
/* #include <trace.h>
/*
/* 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;
/*
/* 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.
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;
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);
}
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.
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);
*/
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 *);
/* #include <verify.h>
/*
/* 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;
/* 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
/* 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);
}
/* 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));
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 {
/*
* 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
(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
/* 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)
#include <debug_peer.h>
#include <mail_error.h>
#include <flush_clnt.h>
+#include <dsn_util.h>
/* Single server skeleton. */
static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
{
char *myname = "deliver_message";
- VSTRING *why;
+ DSN_VSTRING *why;
int result;
if (msg_verbose)
* 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;
* 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));
+ }
}
/*
/*
* Clean up.
*/
- vstring_free(why);
+ dsn_vstring_free(why);
result = state->status;
lmtp_chat_reset(state);
* Global library.
*/
#include <deliver_request.h>
+#include <dsn_util.h>
/*
* State information associated with each LMTP delivery. We're bundling the
/*
* lmtp_connect.c
*/
-extern LMTP_SESSION *lmtp_connect(const char *, VSTRING *);
+extern LMTP_SESSION *lmtp_connect(const char *, DSN_VSTRING *);
/*
* lmtp_proto.c
*/
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;
/*
* 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
/*
/* 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).
/* .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
#include <mail_params.h>
#include <own_inet_addr.h>
+#include <dsn_util.h>
/* DNS library. */
/* 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;
* 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);
*/
#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) {
}
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);
/*
* 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)
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;
}
/* 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;
/* DESCRIPTION
/* .nf
+ /*
+ * Global library.
+ */
+#include <dsn_util.h>
+
/*
* DNS library.
*/
/*
* Internal interfaces.
*/
-extern DNS_RR *lmtp_host_addr(char *, VSTRING *);
+extern DNS_RR *lmtp_host_addr(char *, DSN_VSTRING *);
/* LICENSE
/* .ad
/* typedef struct {
/* .in +4
/* int code;
+/* char dsn[...];
/* char *str;
/* VSTRING *buf;
/* .in -4
#include <ctype.h>
#include <stdlib.h>
#include <setjmp.h>
+#include <string.h>
/* Utility library. */
#include <mail_addr.h>
#include <post_mail.h>
#include <mail_error.h>
+#include <dsn_util.h>
/* Application-specific. */
static LMTP_RESP rdata;
char *cp;
int last_char;
+ int three_digs = 0;
+ size_t len;
/*
* Initialize the response data buffer.
*/
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)
}
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);
/*
/* LMTP_SESSION *lmtp_connect(destination, why)
/* char *destination;
-/* VSTRING *why;
+/* DSN_VSTRING *why;
/* DESCRIPTION
/* This module implements LMTP connection management.
/*
/* .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
/* DNS library. */
#include <dns.h>
-
+
/* Application-specific. */
#include "lmtp.h"
*/
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";
*/
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);
}
/* 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;
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);
}
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;
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);
* 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);
*/
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);
* 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);
/* 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;
/* 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;
* 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", " ")));
*/
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", " ")));
*/
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", " "),
&& 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", " "),
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", " "),
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)
}
}
} 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", " "),
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);
/* 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
#include <bounce.h>
#include <defer.h>
#include <mail_error.h>
+#include <dsn_util.h>
/* Application-specific. */
/* 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;
* 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);
/*
(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;
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.
/* 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;
* 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);
/*
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);
/* 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.
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;
}
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.
(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
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);
}
*/
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);
}
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);
}
*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
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);
*/
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 {
#include <mail_params.h>
#include <pipe_command.h>
#include <mail_copy.h>
+#include <dsn_util.h>
/* Application-specific. */
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;
* 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));
/*
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));
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 {
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;
/*
* Cleanup.
*/
- vstring_free(why);
+ dsn_vstring_free(why);
return (deliver_status);
}
*/
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) {
#include <mail_params.h>
#include <mbox_conf.h>
#include <mbox_open.h>
+#include <dsn_util.h>
/* Application-specific. */
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;
*/
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));
/*
(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
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 :
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);
}
* 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);
/*
*/
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));
/*
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)
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)
*/
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));
/*
*/
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);
}
*/
#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", \
#include <deliver_pass.h>
#include <mbox_open.h>
#include <maps.h>
-
-#ifndef EDQUOT
-#define EDQUOT EFBIG
-#endif
+#include <dsn_util.h>
/* Application-specific. */
char *myname = "deliver_mailbox_file";
char *spool_dir;
char *mailbox;
- VSTRING *why;
+ DSN_VSTRING *why;
MBOX *mp;
int mail_copy_status;
int deliver_status;
* 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"));
/*
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);
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,
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);
* Clean up.
*/
myfree(mailbox);
- vstring_free(why);
+ dsn_vstring_free(why);
return (deliver_status);
}
#include <defer.h>
#include <sent.h>
#include <mail_params.h>
+#include <dsn_util.h>
/* Application-specific. */
char *curdir;
char *tmpfile;
char *newfile;
- VSTRING *why;
+ DSN_VSTRING *why;
VSTRING *buf;
VSTREAM *dst;
int mail_copy_status;
* 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"));
/*
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)
&& (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,
&& (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;
}
}
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);
&& (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
}
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);
}
*/
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));
/*
*/
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 {
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);
} 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);
}
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);
}
|| 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"));
}
* 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));
}
(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
(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
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 */
};
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 *);
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 */
};
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 *);
/*
* 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
/* 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.
/* 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
/* 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;
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)
/* 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
/* 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
/* 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;
/*
* 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;
/*
* 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.
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);
}
/* 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);
/*
*/
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);
}
#include <vstring_vstream.h>
#include <events.h>
#include <iostuff.h>
+#include <stringops.h>
/* Global library. */
#include <mail_params.h>
#include <deliver_request.h>
#include <verp_sender.h>
+#include <dsn_util.h>
/* Application-specific. */
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);
QMGR_MESSAGE *message = entry->message;
VSTRING *reason = vstring_alloc(1);
int status;
+ DSN_SPLIT dp;
/*
* The message transport has responded. Stop the watchdog timer.
*/
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);
}
/*
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);
}
}
* 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;
}
*/
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;
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 {
* 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;
}
* 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;
&& !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);
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;
}
}
* 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;
}
* 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;
}
/* 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)
*/
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);
/* 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
* 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);
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);
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);
/* 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)
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);
/* 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";
*/
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);
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));
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);
(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
(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
#include <off_cvt.h>
#include <quote_822_local.h>
#include <flush_clnt.h>
+#include <dsn_util.h>
/* Single server skeleton. */
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;
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:
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;
ARGV *export_env;
#define DELIVER_MSG_CLEANUP() { \
- vstring_free(why); \
+ dsn_vstring_free(why); \
if (expanded_argv) argv_free(expanded_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);
*/
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);
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);
}
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);
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);
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.
(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
(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
(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
(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
(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
(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
(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
#include <sys_exits.h>
#include <mbox_conf.h>
#include <mbox_open.h>
+#include <dsn_util.h>
/* Application-specific. */
int main(int argc, char **argv)
{
- VSTRING *why;
+ DSN_VSTRING *why;
char *folder;
char **command;
int ch;
* 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.
default:
if (waitpid(pid, &status, 0) < 0)
msg_fatal("waitpid: %m");
+ vstream_fclose(mp->fp);
mbox_release(mp);
exit(WIFEXITED(status) ? WEXITSTATUS(status) : 1);
}
(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
(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
(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
(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
(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
(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
* updated */
int blocker_tag; /* for marking blocker jobs */
QMGR_TRANSPORT_LIST peers; /* linkage */
+ char *dsn; /* why unavailable */
char *reason; /* why unavailable */
};
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 *);
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 */
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 *);
/*
* 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
/* 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.
/* 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
/* 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;
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)
/* 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
/* 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
/* 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;
/*
* 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;
/*
* 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.
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);
}
/* 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);
/*
*/
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);
}
#include <vstring_vstream.h>
#include <events.h>
#include <iostuff.h>
+#include <stringops.h>
/* Global library. */
#include <mail_params.h>
#include <deliver_request.h>
#include <verp_sender.h>
+#include <dsn_util.h>
/* Application-specific. */
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);
QMGR_MESSAGE *message = entry->message;
VSTRING *reason = vstring_alloc(1);
int status;
+ DSN_SPLIT dp;
/*
* The message transport has responded. Stop the watchdog timer.
*/
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);
}
/*
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);
}
}
* 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;
}
*/
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;
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 {
* 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;
}
* 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;
&& !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);
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;
}
}
* 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;
}
* 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;
}
/* 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)
*/
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);
/* 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
* 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);
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);
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;
/* 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)
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);
/* 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";
*/
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);
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));
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);
(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
(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
(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
(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
(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
/* 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)
#include <string_list.h>
#include <maps.h>
#include <tok822.h>
+#include <dsn_util.h>
/*
* Postfix TLS library.
*/
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;
#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
/* 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).
/* .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
#include <mail_params.h>
#include <own_inet_addr.h>
+#include <dsn_util.h>
/* DNS library. */
/* 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;
* 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);
* 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 */
*/
#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);
}
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);
/* 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;
/* 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;
* 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);
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);
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;
}
}
/* 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;
&& (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);
}
/* DESCRIPTION
/* .nf
+ /*
+ * Global library.
+ */
+#include <dsn_util.h>
+
/*
* DNS library.
*/
/*
* 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
/* typedef struct {
/* .in +4
/* int code;
+/* char dsn[...];
/* char *str;
/* VSTRING *buf;
/* .in -4
#include <ctype.h>
#include <stdlib.h>
#include <setjmp.h>
+#include <string.h>
/* Utility library. */
#include <mail_addr.h>
#include <post_mail.h>
#include <mail_error.h>
+#include <dsn_util.h>
/* Application-specific. */
static SMTP_RESP rdata;
char *cp;
int last_char;
+ int three_digs = 0;
+ size_t len;
/*
* Initialize the response data buffer.
*/
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)
}
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);
#include <own_inet_addr.h>
#include <deliver_pass.h>
#include <mail_error.h>
+#include <dsn_util.h>
/* DNS library. */
/* 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";
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);
}
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);
* 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);
*/
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);
* 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);
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;
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);
*/
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;
}
*/
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;
}
/*
* 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.
if (HAVE_NEXTHOP_STATE(state))
FREE_NEXTHOP_STATE(state);
argv_free(sites);
- vstring_free(why);
+ dsn_vstring_free(why);
return (state->status);
}
#include <sys_defs.h>
#include <sys/stat.h>
#include <sys/socket.h> /* shutdown(2) */
+#include <netinet/in.h> /* ntohs() */
#include <string.h>
#include <unistd.h>
#include <stdlib.h> /* 44BSD stdarg.h uses abort() */
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", " ")));
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", " ")));
&& (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));
}
*/
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", " ")));
*/
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"));
}
}
* 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 =
&(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"));
/*
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"));
}
}
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"));
}
}
*/
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", " "),
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", " "),
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", " "),
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", " "),
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);
}
}
}
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);
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);
* 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);
/* 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
/* 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;
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)
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. */
}
/*
* 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 */
/* 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
#include <bounce.h>
#include <defer.h>
#include <mail_error.h>
+#include <dsn_util.h>
/* Application-specific. */
/* 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;
* 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);
/*
(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);
}
/* 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);
/* 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;
* 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);
/*
(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);
/* 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.
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);
}
/*
* 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);
}
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.
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;
}
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));
}
/*
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
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
/* 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)
/* 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
{
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");
* 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;
/* 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;
TOK822 *addr = 0;
int naddr;
int non_addr;
- char *err = 0;
+ int err = 0;
char *junk = 0;
char *text;
char *colon;
|| (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;
}
/*
&& 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;
}
/*
*/
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: <address>");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: MAIL FROM: <address>");
return (-1);
}
&& 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);
}
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++) {
/* 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);
}
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);
}
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);
}
*/
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: <address>");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: RCPT TO: <address>");
return (-1);
}
&& 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);
}
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;
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);
}
VSTREAM *out_stream;
int out_error;
char **cpp;
+ CLEANUP_STAT_DETAIL *detail;
#ifdef USE_TLS
VSTRING *peer_CN;
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) {
} 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);
}
}
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);
}
/*
*/
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);
}
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);
}
*/
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);
}
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
* 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);
}
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
/*
* 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
*/
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)
*/
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, '?');
} 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);
}
} 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);
}
} 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);
}
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);
}
*/
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);
}
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);
}
*/
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);
}
*/
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, '?');
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);
}
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);
}
} 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);
}
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);
}
*/
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);
}
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);
}
* 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.
{
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);
/*
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;
&& 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);
&& (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);
}
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;
}
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;
&& 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;
!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;
}
* 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
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;
OK
>>> # Expect: REJECT
>>> helo foo.dunno.com
-./smtpd_check: <queue id>: reject: HELO from localhost[127.0.0.1]: 554 <foo.dunno.com>: Helo command rejected: Access denied; proto=SMTP helo=<foo.dunno.com>
-554 <foo.dunno.com>: Helo command rejected: Access denied
+./smtpd_check: <queue id>: reject: HELO from localhost[127.0.0.1]: 554 5.7.1 <foo.dunno.com>: Helo command rejected: Access denied; proto=SMTP helo=<foo.dunno.com>
+554 5.7.1 <foo.dunno.com>: Helo command rejected: Access denied
>>> # Expect: OK
>>> helo bar.dunno.com
OK
OK
>>> # Expect: REJECT
>>> client foo.dunno.com 131.155.210.17
-./smtpd_check: <queue id>: reject: CONNECT from foo.dunno.com[131.155.210.17]: 554 <foo.dunno.com[131.155.210.17]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
-554 <foo.dunno.com[131.155.210.17]>: Client host rejected: Access denied
+./smtpd_check: <queue id>: reject: CONNECT from foo.dunno.com[131.155.210.17]: 554 5.7.1 <foo.dunno.com[131.155.210.17]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <foo.dunno.com[131.155.210.17]>: Client host rejected: Access denied
>>> # Expect: OK
>>> client bar.dunno.com 131.155.210.17
OK
OK
>>> # Expect: REJECT
>>> client bar.duno.com 131.155.210.19
-./smtpd_check: <queue id>: reject: CONNECT from bar.duno.com[131.155.210.19]: 554 <bar.duno.com[131.155.210.19]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
-554 <bar.duno.com[131.155.210.19]>: Client host rejected: Access denied
+./smtpd_check: <queue id>: reject: CONNECT from bar.duno.com[131.155.210.19]: 554 5.7.1 <bar.duno.com[131.155.210.19]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <bar.duno.com[131.155.210.19]>: Client host rejected: Access denied
>>> # Expect: REJECT
>>> client bar.duno.com 44.33.22.11
-./smtpd_check: <queue id>: reject: CONNECT from bar.duno.com[44.33.22.11]: 554 <bar.duno.com[44.33.22.11]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
-554 <bar.duno.com[44.33.22.11]>: Client host rejected: Access denied
+./smtpd_check: <queue id>: reject: CONNECT from bar.duno.com[44.33.22.11]: 554 5.7.1 <bar.duno.com[44.33.22.11]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <bar.duno.com[44.33.22.11]>: 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: <queue id>: reject: CONNECT from bar.duno.com[44.33.44.33]: 554 <bar.duno.com[44.33.44.33]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
-554 <bar.duno.com[44.33.44.33]>: Client host rejected: Access denied
+./smtpd_check: <queue id>: reject: CONNECT from bar.duno.com[44.33.44.33]: 554 5.7.1 <bar.duno.com[44.33.44.33]>: Client host rejected: Access denied; proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <bar.duno.com[44.33.44.33]>: Client host rejected: Access denied
>>> #
>>> # Test check_mail_access()
>>> #
OK
>>> # Expect: REJECT
>>> mail reject@dunno.domain
-./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 <reject@dunno.domain>: Sender address rejected: Access denied; from=<reject@dunno.domain> proto=SMTP helo=<foo.duuno.com>
-554 <reject@dunno.domain>: Sender address rejected: Access denied
+./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 <reject@dunno.domain>: Sender address rejected: Access denied; from=<reject@dunno.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <reject@dunno.domain>: Sender address rejected: Access denied
>>> # Expect: OK
>>> mail ok@dunno.domain
OK
>>> #
>>> # Expect: REJECT
>>> mail reject@reject.domain
-./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 <reject@reject.domain>: Sender address rejected: Access denied; from=<reject@reject.domain> proto=SMTP helo=<foo.duuno.com>
-554 <reject@reject.domain>: Sender address rejected: Access denied
+./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 <reject@reject.domain>: Sender address rejected: Access denied; from=<reject@reject.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <reject@reject.domain>: Sender address rejected: Access denied
>>> # Expect: OK
>>> mail ok@reject.domain
OK
>>> # Expect: REJECT
>>> mail anyone@reject.domain
-./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 <anyone@reject.domain>: Sender address rejected: Access denied; from=<anyone@reject.domain> proto=SMTP helo=<foo.duuno.com>
-554 <anyone@reject.domain>: Sender address rejected: Access denied
+./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 <anyone@reject.domain>: Sender address rejected: Access denied; from=<anyone@reject.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <anyone@reject.domain>: Sender address rejected: Access denied
>>> # Expect: REJECT
>>> mail good-sender@reject.domain
-./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 <good-sender@reject.domain>: Sender address rejected: Access denied; from=<good-sender@reject.domain> proto=SMTP helo=<foo.duuno.com>
-554 <good-sender@reject.domain>: Sender address rejected: Access denied
+./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 <good-sender@reject.domain>: Sender address rejected: Access denied; from=<good-sender@reject.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <good-sender@reject.domain>: Sender address rejected: Access denied
>>> #
>>> # Again, with a domain that accepts by default
>>> #
>>> # Expect: REJECT
>>> mail reject@ok.domain
-./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 <reject@ok.domain>: Sender address rejected: Access denied; from=<reject@ok.domain> proto=SMTP helo=<foo.duuno.com>
-554 <reject@ok.domain>: Sender address rejected: Access denied
+./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 554 5.7.1 <reject@ok.domain>: Sender address rejected: Access denied; from=<reject@ok.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <reject@ok.domain>: Sender address rejected: Access denied
>>> # Expect: OK
>>> mail ok@ok.domain
OK
OK
>>> # Expect: REJECT
>>> rcpt reject@dunno.domain
-./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 <reject@dunno.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject@dunno.domain> proto=SMTP helo=<foo.duuno.com>
-554 <reject@dunno.domain>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 5.7.1 <reject@dunno.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject@dunno.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <reject@dunno.domain>: Recipient address rejected: Access denied
>>> # Expect: REJECT
>>> recipient_delimiter +
OK
>>> rcpt reject+ext@dunno.domain
-./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 <reject+ext@dunno.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject+ext@dunno.domain> proto=SMTP helo=<foo.duuno.com>
-554 <reject+ext@dunno.domain>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 5.7.1 <reject+ext@dunno.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject+ext@dunno.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <reject+ext@dunno.domain>: Recipient address rejected: Access denied
>>> recipient_delimiter |
OK
>>> # Expect: OK
>>> #
>>> # Expect: REJECT
>>> rcpt reject@reject.domain
-./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 <reject@reject.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject@reject.domain> proto=SMTP helo=<foo.duuno.com>
-554 <reject@reject.domain>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 5.7.1 <reject@reject.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject@reject.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <reject@reject.domain>: Recipient address rejected: Access denied
>>> # Expect: OK
>>> rcpt ok@reject.domain
OK
>>> # Expect: REJECT
>>> rcpt anyone@reject.domain
-./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 <anyone@reject.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<anyone@reject.domain> proto=SMTP helo=<foo.duuno.com>
-554 <anyone@reject.domain>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 5.7.1 <anyone@reject.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<anyone@reject.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <anyone@reject.domain>: Recipient address rejected: Access denied
>>> # Expect: REJECT
>>> rcpt good-sender@reject.domain
-./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 <good-sender@reject.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<good-sender@reject.domain> proto=SMTP helo=<foo.duuno.com>
-554 <good-sender@reject.domain>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 5.7.1 <good-sender@reject.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<good-sender@reject.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <good-sender@reject.domain>: Recipient address rejected: Access denied
>>> #
>>> # Again, with a domain that accepts by default
>>> #
>>> # Expect: REJECT
>>> rcpt reject@ok.domain
-./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 <reject@ok.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject@ok.domain> proto=SMTP helo=<foo.duuno.com>
-554 <reject@ok.domain>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from bar.duno.com[44.33.44.33]: 554 5.7.1 <reject@ok.domain>: Recipient address rejected: Access denied; from=<bad-sender@ok.domain> to=<reject@ok.domain> proto=SMTP helo=<foo.duuno.com>
+554 5.7.1 <reject@ok.domain>: Recipient address rejected: Access denied
>>> # Expect: OK
>>> rcpt ok@ok.domain
OK
>>> # check_sender_access specific
>>> #
>>> mail <>
-./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 550 <>: Sender address rejected: Go away postmaster; from=<> proto=SMTP helo=<foo.duuno.com>
-550 <>: Sender address rejected: Go away postmaster
+./smtpd_check: <queue id>: reject: MAIL from bar.duno.com[44.33.44.33]: 550 5.0.0 <>: Sender address rejected: Go away postmaster; from=<> proto=SMTP helo=<foo.duuno.com>
+550 5.0.0 <>: Sender address rejected: Go away postmaster
va_start(ap, format);
vstring_vsprintf(state->buffer, format, ap);
va_end(ap);
- if (var_soft_bounce && STR(state->buffer)[0] == '5')
+ /* All 5xx replies must have a 5.xx.xx detail code. */
+ if (var_soft_bounce && STR(state->buffer)[0] == '5') {
STR(state->buffer)[0] = '4';
+ if (STR(state->buffer)[4] == '5')
+ STR(state->buffer)[4] = '4';
+ }
smtp_chat_append(state, "Out: ");
if (msg_verbose)
#include <is_header.h>
#include <rewrite_clnt.h>
#include <valid_mailhost_addr.h>
+#include <dsn_util.h>
/* Application-specific. */
static DOMAIN_LIST *relay_domains;
static NAMADR_LIST *mynetworks;
static NAMADR_LIST *perm_mx_networks;
+
#ifdef USE_TLS
static MAPS *relay_ccerts;
+
#endif
/*
* permit-style restriction fails. Otherwise, we could reject legitimate
* mail.
*/
-static void PRINTFLIKE(3, 4) defer_if(SMTPD_DEFER *, int, const char *,...);
-
-#define DEFER_IF_REJECT2(state, class, fmt, a1, a2) \
- defer_if(&(state)->defer_if_reject, (class), (fmt), (a1), (a2))
-#define DEFER_IF_REJECT3(state, class, fmt, a1, a2, a3) \
- defer_if(&(state)->defer_if_reject, (class), (fmt), (a1), (a2), (a3))
-#define DEFER_IF_REJECT4(state, class, fmt, a1, a2, a3, a4) \
- defer_if(&(state)->defer_if_reject, (class), (fmt), (a1), (a2), (a3), (a4))
-#define DEFER_IF_PERMIT2(state, class, fmt, a1, a2) do { \
+static void PRINTFLIKE(5, 6) defer_if(SMTPD_DEFER *, int, int, const char *, const char *,...);
+static int PRINTFLIKE(5, 6) smtpd_check_reject(SMTPD_STATE *, int, int, const char *, const char *,...);
+
+#define DEFER_IF_REJECT2(state, class, code, dsn, fmt, a1, a2) \
+ defer_if(&(state)->defer_if_reject, (class), (code), (dsn), (fmt), (a1), (a2))
+#define DEFER_IF_REJECT3(state, class, code, dsn, fmt, a1, a2, a3) \
+ defer_if(&(state)->defer_if_reject, (class), (code), (dsn), (fmt), (a1), (a2), (a3))
+#define DEFER_IF_REJECT4(state, class, code, dsn, fmt, a1, a2, a3, a4) \
+ defer_if(&(state)->defer_if_reject, (class), (code), (dsn), (fmt), (a1), (a2), (a3), (a4))
+#define DEFER_IF_PERMIT2(state, class, code, dsn, fmt, a1, a2) do { \
if ((state)->warn_if_reject == 0) \
- defer_if(&(state)->defer_if_permit, (class), (fmt), (a1), (a2)); \
+ defer_if(&(state)->defer_if_permit, (class), (code), (dsn), (fmt), (a1), (a2)); \
else \
- (void) smtpd_check_reject((state), (class), (fmt), (a1), (a2)); \
+ (void) smtpd_check_reject((state), (class), (code), (dsn), (fmt), (a1), (a2)); \
} while (0)
-#define DEFER_IF_PERMIT3(state, class, fmt, a1, a2, a3) do { \
+#define DEFER_IF_PERMIT3(state, class, code, dsn, fmt, a1, a2, a3) do { \
if ((state)->warn_if_reject == 0) \
- defer_if(&(state)->defer_if_permit, (class), (fmt), (a1), (a2), (a3)); \
+ defer_if(&(state)->defer_if_permit, (class), (code), (dsn), (fmt), (a1), (a2), (a3)); \
else \
- (void) smtpd_check_reject((state), (class), (fmt), (a1), (a2), (a3)); \
+ (void) smtpd_check_reject((state), (class), (code), (dsn), (fmt), (a1), (a2), (a3)); \
} while (0)
-#define DEFER_IF_PERMIT4(state, class, fmt, a1, a2, a3, a4) do { \
+#define DEFER_IF_PERMIT4(state, class, code, dsn, fmt, a1, a2, a3, a4) do { \
if ((state)->warn_if_reject == 0) \
- defer_if(&(state)->defer_if_permit, (class), (fmt), (a1), (a2), (a3), (a4)); \
+ defer_if(&(state)->defer_if_permit, (class), (code), (dsn), (fmt), (a1), (a2), (a3), (a4)); \
else \
- (void) smtpd_check_reject((state), (class), (fmt), (a1), (a2), (a3), (a4)); \
+ (void) smtpd_check_reject((state), (class), (code), (dsn), (fmt), (a1), (a2), (a3), (a4)); \
} while (0)
/*
/* smtpd_check_reject - do the boring things that must be done */
static int smtpd_check_reject(SMTPD_STATE *state, int error_class,
- char *format,...)
+ int code, const char *dsn,
+ const char *format,...)
{
va_list ap;
int warn_if_reject;
/*
* Update the error class mask, and format the response. XXX What about
* multi-line responses? For now we cheat and send whitespace.
+ *
+ * Format the response before complaining about configuration errors, so
+ * that we can show the error in context.
*/
state->error_mask |= error_class;
+ vstring_sprintf(error_text, "%d %s ", code, dsn);
va_start(ap, format);
- vstring_vsprintf(error_text, format, ap);
+ vstring_vsprintf_append(error_text, format, ap);
va_end(ap);
- /*
- * Ensure RFC compliance. We could do this inside smtpd_chat_reply() and
- * switch to multi-line for long replies.
- */
- vstring_truncate(error_text, 510);
- VSTRING_TERMINATE(error_text);
-
/*
* Validate the response, that is, the response must begin with a
* three-digit status code, and the first digit must be 4 or 5. If the
* response is bad, log a warning and send a generic response instead.
*/
- if ((STR(error_text)[0] != '4' && STR(error_text)[0] != '5')
- || !ISDIGIT(STR(error_text)[1]) || !ISDIGIT(STR(error_text)[2])
- || ISDIGIT(STR(error_text)[3])) {
- msg_warn("response code configuration error: %s", STR(error_text));
- vstring_strcpy(error_text, "450 Service unavailable");
+ if (code < 400 || code > 599) {
+ msg_warn("SMTP reply code configuration error: %s", STR(error_text));
+ vstring_strcpy(error_text, "450 4.7.1 Service unavailable");
}
+ if (!dsn_valid(STR(error_text) + 4)) {
+ msg_warn("DSN detail code configuration error: %s", STR(error_text));
+ vstring_strcpy(error_text, "450 4.7.1 Service unavailable");
+ }
+
+ /*
+ * Ensure RFC compliance. We could do this inside smtpd_chat_reply() and
+ * switch to multi-line for long replies.
+ */
+ vstring_truncate(error_text, 510);
printable(STR(error_text), ' ');
/*
if (!warn_if_reject && state->defer_if_reject.active && STR(error_text)[0] == '5') {
state->warn_if_reject = state->defer_if_reject.active = 0;
return (smtpd_check_reject(state, state->defer_if_reject.class,
+ state->defer_if_reject.code,
+ STR(state->defer_if_reject.dsn),
"%s", STR(state->defer_if_reject.reason)));
}
if (var_soft_bounce && STR(error_text)[0] == '5')
STR(error_text)[0] = '4';
+ /*
+ * In any case, enforce consistency between the SMTP code and DSN code.
+ * SMTP has the higher precedence since it came here first.
+ */
+ STR(error_text)[4] = STR(error_text)[0];
+
/*
* Log what is happening. When the sysadmin discards policy violation
* postmaster notices, this may be the only trace left that service was
/* defer_if - prepare to change our mind */
-static void defer_if(SMTPD_DEFER *defer, int error_class, const char *fmt,...)
+static void defer_if(SMTPD_DEFER *defer, int error_class,
+ int code, const char *dsn,
+ const char *fmt,...)
{
va_list ap;
if (defer->active == 0) {
defer->active = 1;
defer->class = error_class;
+ defer->code = code;
+ if (defer->dsn == 0)
+ defer->dsn = vstring_alloc(10);
+ vstring_strcpy(defer->dsn, dsn);
if (defer->reason == 0)
defer->reason = vstring_alloc(10);
va_start(ap, fmt);
static void reject_dict_retry(SMTPD_STATE *state, const char *reply_name)
{
longjmp(smtpd_check_buf, smtpd_check_reject(state, MAIL_ERROR_RESOURCE,
- "%d <%s>: Temporary lookup failure",
- 451, reply_name));
+ 451, "4.3.0",
+ "<%s>: Temporary lookup failure",
+ reply_name));
}
/* check_mail_addr_find - reject with temporary failure if dict lookup fails */
if (strcasecmp(state->name, "unknown") == 0)
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d Client host rejected: cannot find your hostname, [%s]",
state->peer_code == SMTPD_PEER_CODE_PERM ?
- var_unk_client_code : 450,
+ var_unk_client_code : 450, "4.7.1",
+ "Client host rejected: cannot find your hostname, [%s]",
state->addr));
return (SMTPD_CHECK_DUNNO);
}
*/
if (!valid_mailhost_addr(test_addr, DONT_GRIPE))
stat = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: invalid ip address",
- var_bad_name_code, reply_name, reply_class);
+ var_bad_name_code, "5.5.2",
+ "<%s>: %s rejected: invalid ip address",
+ reply_name, reply_class);
else
stat = SMTPD_CHECK_DUNNO;
if (!valid_hostname(test_name, DONT_GRIPE)
&& !valid_hostaddr(test_name, DONT_GRIPE)) /* XXX back compat */
stat = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: Invalid name",
- var_bad_name_code, reply_name, reply_class);
+ var_bad_name_code, "5.5.2",
+ "<%s>: %s rejected: Invalid name",
+ reply_name, reply_class);
else
stat = SMTPD_CHECK_DUNNO;
*/
if (!valid_hostname(test_name, DONT_GRIPE) || !strchr(test_name, '.'))
stat = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: need fully-qualified hostname",
- var_non_fqdn_code, reply_name, reply_class);
+ var_non_fqdn_code, "5.5.2",
+ "<%s>: %s rejected: need fully-qualified hostname",
+ reply_name, reply_class);
else
stat = SMTPD_CHECK_DUNNO;
RR_ADDR_TYPES, T_MX, 0);
if (dns_status == DNS_NOTFOUND)
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: Host not found",
- var_unk_name_code,
+ var_unk_name_code, "4.1.0",
+ "<%s>: %s rejected: Host not found",
reply_name, reply_class));
else if (dns_status != DNS_OK)
DEFER_IF_PERMIT2(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: Host not found",
+ 450, "4.1.0",
+ "<%s>: %s rejected: Host not found",
reply_name, reply_class);
return (SMTPD_CHECK_DUNNO);
}
RR_ADDR_TYPES, T_MX, 0);
if (dns_status == DNS_NOTFOUND)
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: Domain not found",
var_unk_addr_code,
+ strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "4.1.8" : "4.1.2",
+ "<%s>: %s rejected: Domain not found",
reply_name, reply_class));
else if (dns_status != DNS_OK)
DEFER_IF_PERMIT2(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: Domain not found",
+ 450, strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "4.1.8" : "4.1.2",
+ "<%s>: %s rejected: Domain not found",
reply_name, reply_class);
return (SMTPD_CHECK_DUNNO);
}
if (state->tls_info.peer_verified && permit_all_certs) {
if (msg_verbose)
msg_info("Relaying allowed for all verified client certificates");
- return(SMTPD_CHECK_OK);
+ return (SMTPD_CHECK_OK);
}
-
if (state->tls_info.peer_verified && state->tls_info.peer_fingerprint) {
low_name = lowercase(mystrdup(state->tls_info.peer_fingerprint));
found = maps_find(relay_ccerts, low_name, DICT_FLAG_FIXED);
}
return (SMTPD_CHECK_DUNNO);
}
+
#endif
/* check_relay_domains - OK/FAIL for message relaying */
* Deny relaying between sites that both are not in relay_domains.
*/
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: Relay access denied",
- var_relay_code, reply_name, reply_class));
+ var_relay_code, "5.7.1",
+ "<%s>: %s rejected: Relay access denied",
+ reply_name, reply_class));
}
/* permit_auth_destination - OK for message relaying */
* Reject relaying to sites that are not listed in relay_domains.
*/
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: Relay access denied",
- var_relay_code, recipient));
+ var_relay_code, "5.7.1",
+ "<%s>: Relay access denied",
+ recipient));
}
/* reject_unauth_pipelining - reject improper use of SMTP command pipelining */
&& (strcasecmp(state->protocol, MAIL_PROTO_ESMTP) != 0
|| strcasecmp(state->where, "DATA") == 0)) {
return (smtpd_check_reject(state, MAIL_ERROR_PROTOCOL,
- "503 <%s>: %s rejected: Improper use of SMTP command pipelining",
+ 503, "5.5.0",
+ "<%s>: %s rejected: Improper use of SMTP command pipelining",
reply_name, reply_class));
}
return (SMTPD_CHECK_DUNNO);
* Verify that all host addresses are within permit_mx_backup_networks.
*/
dns_status = dns_lookup_v(host, 0, &addr_list, (VSTRING *) 0, (VSTRING *) 0,
- DNS_REQ_FLAG_ALL, inet_proto_info()->dns_atype_list);
+ DNS_REQ_FLAG_ALL, inet_proto_info()->dns_atype_list);
if (dns_status != DNS_OK) {
DEFER_IF_REJECT3(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: Unable to look up host %s as mail exchanger",
+ 450, "4.4.4",
+ "<%s>: %s rejected: Unable to look up host %s as mail exchanger",
reply_name, reply_class, host);
return (NOPE);
}
aierr = hostname_to_sockaddr(host, (char *) 0, 0, &res0);
if (aierr) {
DEFER_IF_REJECT4(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: Unable to look up mail exchanger host %s: %s",
+ 450, "4.4.4",
+ "<%s>: %s rejected: Unable to look up mail exchanger host %s: %s",
reply_name, reply_class, host, MAI_STRERROR(aierr));
return (NOPE);
}
SMTPD_CHECK_OK : SMTPD_CHECK_DUNNO);
if (dns_status != DNS_OK) {
DEFER_IF_REJECT2(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: Unable to look up mail exchanger information",
+ 450, "4.4.4",
+ "<%s>: %s rejected: Unable to look up mail exchanger information",
reply_name, reply_class);
return (SMTPD_CHECK_DUNNO);
}
*/
if (!*test_dom || !valid_hostname(test_dom, DONT_GRIPE) || !strchr(test_dom, '.'))
stat = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: need fully-qualified address",
- var_non_fqdn_code, reply_name, reply_class);
+ var_non_fqdn_code, "4.5.2",
+ "<%s>: %s rejected: need fully-qualified address",
+ reply_name, reply_class);
else
stat = SMTPD_CHECK_DUNNO;
if (verify_status != VRFY_STAT_OK) {
msg_warn("%s service failure", var_verify_service);
DEFER_IF_PERMIT2(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: address verification problem",
+ 450, strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "4.1.0" : "4.1.1",
+ "<%s>: %s rejected: address verification problem",
reply_name, reply_class);
rqst_status = SMTPD_CHECK_DUNNO;
} else {
case DEL_RCPT_STAT_TODO:
case DEL_RCPT_STAT_DEFER:
DEFER_IF_PERMIT3(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: unverified address: %.250s",
+ 450, strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "4.1.0" : "4.1.1",
+ "<%s>: %s rejected: unverified address: %.250s",
reply_name, reply_class, STR(why));
rqst_status = SMTPD_CHECK_DUNNO;
break;
if (unv_addr_code / 100 == 2)
rqst_status = SMTPD_CHECK_DUNNO;
else
- rqst_status = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: undeliverable address: %s",
- unv_addr_code, reply_name, reply_class, STR(why));
+ rqst_status =
+ smtpd_check_reject(state, MAIL_ERROR_POLICY,
+ unv_addr_code,
+ strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "4.1.0" : "4.1.1",
+ "<%s>: %s rejected: undeliverable address: %s",
+ reply_name, reply_class, STR(why));
break;
}
}
/* not_in_client_helo - not in client or helo restriction context */
static int not_in_client_helo(SMTPD_STATE *state, const char *table,
- const char *action, const char *reply_class)
+ const char *action,
+ const char *unused_reply_class)
{
/*
int status;
const char *cmd_text;
int cmd_len;
+ static char def_dsn[] = "0.0.0";
+ DSN_SPLIT dp;
/*
* Parse into command and text. Do not change the input.
* response.
*/
if (STREQUAL(value, "REJECT", cmd_len)) {
+ dsn_split(&dp, "5.7.1", cmd_text);
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: %s",
- var_access_map_code, reply_name, reply_class,
- *cmd_text ? cmd_text : "Access denied"));
+ var_access_map_code, dp.dsn,
+ "<%s>: %s rejected: %s",
+ reply_name, reply_class,
+ *dp.text ? dp.text : "Access denied"));
}
/*
* generate a generic error response.
*/
if (STREQUAL(value, DEFER_IF_PERMIT, cmd_len)) {
+ dsn_split(&dp, "4.7.1", cmd_text);
DEFER_IF_PERMIT3(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: %s",
+ 450, dp.dsn,
+ "<%s>: %s rejected: %s",
reply_name, reply_class,
- *cmd_text ? cmd_text : "Service unavailable");
+ *dp.text ? dp.text : "Service unavailable");
return (SMTPD_CHECK_DUNNO);
}
* generate a generic error response.
*/
if (STREQUAL(value, DEFER_IF_REJECT, cmd_len)) {
+ dsn_split(&dp, "4.7.1", cmd_text);
DEFER_IF_REJECT3(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: %s",
+ 450, dp.dsn,
+ "<%s>: %s rejected: %s",
reply_name, reply_class,
- *cmd_text ? cmd_text : "Service unavailable");
+ *dp.text ? dp.text : "Service unavailable");
return (SMTPD_CHECK_DUNNO);
}
/*
* 4xx or 5xx means NO as well. smtpd_check_reject() will validate the
* response status code.
+ *
+ * If the caller specifies an RFC 1893 enhanced status code, put it
+ * immediately after the SMTP status code as described in RFC 2034.
*/
if (cmd_len == 3 && *cmd_text
- && ISDIGIT(value[0]) && ISDIGIT(value[1]) && ISDIGIT(value[2])) {
+ && (value[0] == '4' || value[0] == '5')
+ && ISDIGIT(value[1]) && ISDIGIT(value[2])) {
code = atoi(value);
+ def_dsn[0] = value[0];
+ dsn_split(&dp, def_dsn, cmd_text);
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: %s",
- code, reply_name, reply_class, cmd_text));
+ code, dp.dsn,
+ "<%s>: %s rejected: %s",
+ reply_name, reply_class, dp.text));
}
/*
msg_warn("do not specify lookup tables inside SMTPD access maps");
msg_warn("define a restriction class and specify its name instead.");
longjmp(smtpd_check_buf, smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
- "451 Server configuration error"));
+ 451, "4.3.5",
+ "Server configuration error"));
}
/*
msg_warn("SMTPD access map %s entry %s causes unreasonable recursion",
table, value);
longjmp(smtpd_check_buf, smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
- "451 Server configuration error"));
+ 451, "4.3.5",
+ "Server configuration error"));
}
/*
char *low_name;
SMTPD_RBL_EXPAND_CONTEXT rbl_exp;
int result;
+ DSN_SPLIT dp;
+ int code;
/*
* Use the server-specific reply template or use the default one.
myname, rbl_domain, template);
template = 0; /* pretend not found */
}
- result = smtpd_check_reject(state, MAIL_ERROR_POLICY, "%s", STR(why));
+
+ /*
+ * XXX Impedance mis-match.
+ *
+ * Validate the response, that is, the response must begin with a
+ * three-digit status code, and the first digit must be 4 or 5. If the
+ * response is bad, log a warning and send a generic response instead.
+ */
+ if ((STR(why)[0] != '4' && STR(why)[0] != '5')
+ || !ISDIGIT(STR(why)[1]) || !ISDIGIT(STR(why)[2])
+ || STR(why)[3] != ' ') {
+ msg_warn("rbl response code configuration error: %s", STR(why));
+ result = smtpd_check_reject(state, MAIL_ERROR_POLICY,
+ 450, "4.7.1", "Service unavailable");
+ } else {
+ code = atoi(STR(why));
+ dsn_split(&dp, "4.7.1", STR(why) + 4);
+ result = smtpd_check_reject(state, MAIL_ERROR_POLICY,
+ code, dp.dsn, "%s", *dp.text ?
+ dp.text : "Service unavailable");
+ }
/*
* Clean up.
myfree(saved_owners);
}
if (!found)
- return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "553 <%s>: Sender address rejected: not owned by user %s",
+ return (smtpd_check_reject(state, MAIL_ERROR_POLICY, 553, "5.7.1",
+ "<%s>: Sender address rejected: not owned by user %s",
sender, state->sasl_username));
}
return (SMTPD_CHECK_DUNNO);
reject_dict_retry(state, sender);
if (check_mail_addr_find(state, sender, smtpd_sender_login_maps,
STR(reply->recipient), (char **) 0) != 0)
- return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "553 <%s>: Sender address rejected: not logged in", sender));
+ return (smtpd_check_reject(state, MAIL_ERROR_POLICY, 553, "5.7.1",
+ "<%s>: Sender address rejected: not logged in", sender));
}
return (SMTPD_CHECK_DUNNO);
}
ATTR_TYPE_STR, MAIL_ATTR_ACTION, action,
ATTR_TYPE_END) != 1) {
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "450 Server configuration problem"));
+ 451, "4.3.5",
+ "Server configuration problem"));
} else {
/*
msg_warn("restriction %s: bad argument \"%s\": need maptype:mapname",
command, **argp);
longjmp(smtpd_check_buf, smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
- "451 Server configuration error"));
+ 451, "4.3.5",
+ "Server configuration error"));
} else {
return (1);
}
msg_warn("this is not allowed for security reasons");
msg_warn("use DUNNO instead of OK if you want to make an exception");
longjmp(smtpd_check_buf, smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
- "451 Server configuration error"));
+ 451, "4.3.5",
+ "Server configuration error"));
}
}
msg_warn("specify one of (%s, %s, %s, %s, %s) before %s restriction \"%s\"",
CHECK_CLIENT_ACL, CHECK_HELO_ACL, CHECK_SENDER_ACL,
CHECK_RECIP_ACL, CHECK_ETRN_ACL, reply_class, name);
- longjmp(smtpd_check_buf, smtpd_check_reject(state,
- MAIL_ERROR_SOFTWARE, "451 Server configuration error"));
+ longjmp(smtpd_check_buf,
+ smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
+ 451, "4.3.5",
+ "Server configuration error"));
}
name = def_acl;
cpp -= 1;
cpp[1], PERMIT_ALL);
} else if (strcasecmp(name, DEFER_ALL) == 0) {
status = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: Try again later",
- var_defer_code, reply_name, reply_class);
+ var_defer_code, "4.3.2",
+ "<%s>: %s rejected: Try again later",
+ reply_name, reply_class);
if (cpp[1] != 0 && state->warn_if_reject == 0)
msg_warn("restriction `%s' after `%s' is ignored",
cpp[1], DEFER_ALL);
} else if (strcasecmp(name, REJECT_ALL) == 0) {
status = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: Access denied",
- var_reject_code, reply_name, reply_class);
+ var_reject_code, "5.7.1",
+ "<%s>: %s rejected: Access denied",
+ reply_name, reply_class);
if (cpp[1] != 0 && state->warn_if_reject == 0)
msg_warn("restriction `%s' after `%s' is ignored",
cpp[1], REJECT_ALL);
if (cpp[1] == 0 || strchr(cpp[1], ':') == 0) {
msg_warn("restriction %s must be followed by transport:server",
CHECK_POLICY_SERVICE);
- longjmp(smtpd_check_buf, smtpd_check_reject(state,
- MAIL_ERROR_SOFTWARE, "451 Server configuration error"));
+ longjmp(smtpd_check_buf,
+ smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
+ 451, "4.3.5",
+ "Server configuration error"));
} else
status = check_policy_service(state, *++cpp, reply_name,
reply_class, def_acl);
} else if (strcasecmp(name, DEFER_IF_PERMIT) == 0) {
DEFER_IF_PERMIT2(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: defer_if_permit requested",
+ 450, "4.7.0",
+ "<%s>: %s rejected: defer_if_permit requested",
reply_name, reply_class);
} else if (strcasecmp(name, DEFER_IF_REJECT) == 0) {
DEFER_IF_REJECT2(state, MAIL_ERROR_POLICY,
- "450 <%s>: %s rejected: defer_if_reject requested",
+ 450, "4.7.0",
+ "<%s>: %s rejected: defer_if_reject requested",
reply_name, reply_class);
#ifdef SNAPSHOT
} else if (strcasecmp(name, SLEEP) == 0) {
if (cpp[1] == 0 || alldig(cpp[1]) == 0) {
msg_warn("restriction %s must be followed by number", SLEEP);
- longjmp(smtpd_check_buf, smtpd_check_reject(state,
- MAIL_ERROR_SOFTWARE, "451 Server configuration error"));
+ longjmp(smtpd_check_buf,
+ smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
+ 451, "4.3.5",
+ "Server configuration error"));
} else
sleep(atoi(*++cpp));
#endif
#endif
#ifdef USE_TLS
} else if (strcasecmp(name, PERMIT_TLS_ALL_CLIENTCERTS) == 0) {
- status = permit_tls_clientcerts(state, 1);
+ status = permit_tls_clientcerts(state, 1);
} else if (strcasecmp(name, PERMIT_TLS_CLIENTCERTS) == 0) {
- status = permit_tls_clientcerts(state, 0);
+ status = permit_tls_clientcerts(state, 0);
#endif
} else if (strcasecmp(name, REJECT_UNKNOWN_RCPTDOM) == 0) {
if (state->recipient)
if (state->sender && *state->sender == 0 && state->rcpt_count
> (strcmp(state->where, "DATA") ? 0 : 1))
status = smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "%d <%s>: %s rejected: Multi-recipient bounce",
- var_mul_rcpt_code, reply_name, reply_class);
+ var_mul_rcpt_code, "5.5.3",
+ "<%s>: %s rejected: Multi-recipient bounce",
+ reply_name, reply_class);
} else if (strcasecmp(name, REJECT_UNVERIFIED_RECIP) == 0) {
if (state->recipient && *state->recipient)
status = reject_unverified_address(state, state->recipient,
*/
else {
msg_warn("unknown smtpd restriction: \"%s\"", name);
- longjmp(smtpd_check_buf, smtpd_check_reject(state,
- MAIL_ERROR_SOFTWARE, "451 Server configuration error"));
+ longjmp(smtpd_check_buf,
+ smtpd_check_reject(state, MAIL_ERROR_SOFTWARE,
+ 451, "4.3.5",
+ "Server configuration error"));
}
if (msg_verbose)
msg_info("%s: name=%s status=%d", myname, name, status);
*/
if (status != SMTPD_CHECK_REJECT && state->defer_if_permit.active)
status = smtpd_check_reject(state, state->defer_if_permit.class,
+ state->defer_if_permit.code,
+ STR(state->defer_if_permit.dsn),
"%s", STR(state->defer_if_permit.reason));
/*
*/
if (status != SMTPD_CHECK_REJECT && state->defer_if_permit.active)
status = smtpd_check_reject(state, state->defer_if_permit.class,
+ state->defer_if_permit.code,
+ STR(state->defer_if_permit.dsn),
"%s", STR(state->defer_if_permit.reason));
SMTPD_CHECK_ETRN_RETURN(status == SMTPD_CHECK_REJECT ? STR(error_text) : 0);
*/
if (strcmp(STR(reply->transport), MAIL_SERVICE_ERROR) == 0)
return (smtpd_check_reject(state, MAIL_ERROR_BOUNCE,
- "%d <%s>: %s rejected: %s",
(reply->flags & RESOLVE_CLASS_ALIAS) ?
var_virt_alias_code : 550,
+ strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "5.1.0" : "5.1.1",
+ "<%s>: %s rejected: %s",
recipient, reply_class,
STR(reply->nexthop)));
strlen(MAIL_ADDR_MAIL_DAEMON))
&& NOMATCH(local_rcpt_maps, CONST_STR(reply->recipient)))
return (smtpd_check_reject(state, MAIL_ERROR_BOUNCE,
- "%d <%s>: %s rejected: User unknown%s",
- var_local_rcpt_code, recipient,
- reply_class, var_show_unk_rcpt_table ?
+ var_local_rcpt_code,
+ strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "5.1.0" : "5.1.1",
+ "<%s>: %s rejected: User unknown%s",
+ recipient, reply_class,
+ var_show_unk_rcpt_table ?
" in local recipient table" : ""));
break;
if (*var_virt_mailbox_maps
&& NOMATCH(virt_mailbox_maps, CONST_STR(reply->recipient)))
return (smtpd_check_reject(state, MAIL_ERROR_BOUNCE,
- "%d <%s>: %s rejected: User unknown%s",
- var_virt_mailbox_code, recipient,
- reply_class, var_show_unk_rcpt_table ?
+ var_virt_mailbox_code,
+ strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "5.1.0" : "5.1.1",
+ "<%s>: %s rejected: User unknown%s",
+ recipient, reply_class,
+ var_show_unk_rcpt_table ?
" in virtual mailbox table" : ""));
break;
if (*var_relay_rcpt_maps
&& NOMATCH(relay_rcpt_maps, CONST_STR(reply->recipient)))
return (smtpd_check_reject(state, MAIL_ERROR_BOUNCE,
- "%d <%s>: %s rejected: User unknown%s",
- var_relay_rcpt_code, recipient,
- reply_class, var_show_unk_rcpt_table ?
+ var_relay_rcpt_code,
+ strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
+ "5.1.0" : "5.1.1",
+ "<%s>: %s rejected: User unknown%s",
+ recipient, reply_class,
+ var_show_unk_rcpt_table ?
" in relay recipient table" : ""));
break;
}
if (var_message_limit > 0 && size > var_message_limit) {
(void) smtpd_check_reject(state, MAIL_ERROR_POLICY,
- "552 Message size exceeds fixed limit");
+ 552, "5.2.3",
+ "Message size exceeds fixed limit");
return (STR(error_text));
}
fsspace(".", &fsbuf);
if (BLOCKS(var_queue_minfree) >= fsbuf.block_free
|| BLOCKS(var_message_limit) >= fsbuf.block_free / 1.5) {
(void) smtpd_check_reject(state, MAIL_ERROR_RESOURCE,
- "452 Insufficient system storage");
+ 452, "4.3.1",
+ "Insufficient system storage");
msg_warn("not enough free space in mail queue: %lu bytes < "
"1.5*message size limit",
(unsigned long) fsbuf.block_free * fsbuf.block_size);
*/
if (status != SMTPD_CHECK_REJECT && state->defer_if_permit.active)
status = smtpd_check_reject(state, state->defer_if_permit.class,
+ state->defer_if_permit.code,
+ STR(state->defer_if_permit.dsn),
"%s", STR(state->defer_if_permit.reason));
if (state->rcpt_count > 1)
*/
if (status != SMTPD_CHECK_REJECT && state->defer_if_permit.active)
status = smtpd_check_reject(state, state->defer_if_permit.class,
+ state->defer_if_permit.code,
+ STR(state->defer_if_permit.dsn),
"%s", STR(state->defer_if_permit.reason));
if (state->rcpt_count > 1)
char *var_verify_sender;
char *var_smtpd_sasl_opts;
char *var_local_rwr_clients;
+char *var_smtpd_relay_ccerts;
typedef struct {
char *name;
VAR_MAIL_NAME, DEF_MAIL_NAME, &var_mail_name,
VAR_SMTPD_SASL_OPTS, DEF_SMTPD_SASL_OPTS, &var_smtpd_sasl_opts,
VAR_LOC_RWR_CLIENTS, DEF_LOC_RWR_CLIENTS, &var_local_rwr_clients,
+ VAR_RELAY_CCERTS, DEF_RELAY_CCERTS, &var_smtpd_relay_ccerts,
0,
};
>>> client_restrictions permit_mynetworks,reject_unknown_client,hash:./smtpd_check_access
OK
>>> client unknown 131.155.210.17
-./smtpd_check: <queue id>: reject: CONNECT from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: CONNECT from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client unknown 168.100.189.13
OK
>>> client random.bad.domain 123.123.123.123
-./smtpd_check: <queue id>: reject: CONNECT from random.bad.domain[123.123.123.123]: 554 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
-554 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
+./smtpd_check: <queue id>: reject: CONNECT from random.bad.domain[123.123.123.123]: 554 5.0.0 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
+554 5.0.0 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
>>> client friend.bad.domain 123.123.123.123
OK
>>> client bad.domain 123.123.123.123
-./smtpd_check: <queue id>: reject: CONNECT from bad.domain[123.123.123.123]: 554 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
-554 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
+./smtpd_check: <queue id>: reject: CONNECT from bad.domain[123.123.123.123]: 554 5.0.0 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
+554 5.0.0 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
>>> client wzv.win.tue.nl 131.155.210.17
OK
>>> client aa.win.tue.nl 131.155.210.18
-./smtpd_check: <queue id>: reject: CONNECT from aa.win.tue.nl[131.155.210.18]: 554 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210; proto=SMTP
-554 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210
+./smtpd_check: <queue id>: reject: CONNECT from aa.win.tue.nl[131.155.210.18]: 554 5.0.0 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210; proto=SMTP
+554 5.0.0 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210
>>> client_restrictions permit_mynetworks
OK
>>> #
>>> client unknown 131.155.210.17
OK
>>> helo foo.
-./smtpd_check: <queue id>: reject: HELO from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP helo=<foo.>
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: HELO from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP helo=<foo.>
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client foo 123.123.123.123
OK
>>> helo foo.
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 <foo.>: Helo command rejected: Host not found; proto=SMTP helo=<foo.>
-450 <foo.>: Helo command rejected: Host not found
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 4.1.0 <foo.>: Helo command rejected: Host not found; proto=SMTP helo=<foo.>
+450 4.1.0 <foo.>: Helo command rejected: Host not found
>>> helo foo
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 <foo>: Helo command rejected: Host not found; proto=SMTP helo=<foo>
-450 <foo>: Helo command rejected: Host not found
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 4.1.0 <foo>: Helo command rejected: Host not found; proto=SMTP helo=<foo>
+450 4.1.0 <foo>: Helo command rejected: Host not found
>>> helo spike.porcupine.org
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org; proto=SMTP helo=<spike.porcupine.org>
-554 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 5.7.1 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org; proto=SMTP helo=<spike.porcupine.org>
+554 5.7.1 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org
>>> helo_restrictions permit_mynetworks,reject_unknown_client,reject_invalid_hostname,hash:./smtpd_check_access
OK
>>> helo random.bad.domain
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 <random.bad.domain>: Helo command rejected: match bad.domain; proto=SMTP helo=<random.bad.domain>
-554 <random.bad.domain>: Helo command rejected: match bad.domain
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 5.0.0 <random.bad.domain>: Helo command rejected: match bad.domain; proto=SMTP helo=<random.bad.domain>
+554 5.0.0 <random.bad.domain>: Helo command rejected: match bad.domain
>>> helo friend.bad.domain
OK
>>> helo_restrictions reject_invalid_hostname,reject_unknown_hostname
OK
>>> helo 123.123.123.123
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 <123.123.123.123>: Helo command rejected: Host not found; proto=SMTP helo=<123.123.123.123>
-450 <123.123.123.123>: Helo command rejected: Host not found
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 4.1.0 <123.123.123.123>: Helo command rejected: Host not found; proto=SMTP helo=<123.123.123.123>
+450 4.1.0 <123.123.123.123>: Helo command rejected: Host not found
>>> helo [123.123.123.123]
OK
>>> helo [::]
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 501 <[::]>: Helo command rejected: invalid ip address; proto=SMTP helo=<[::]>
-501 <[::]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 501 5.5.2 <[::]>: Helo command rejected: invalid ip address; proto=SMTP helo=<[::]>
+501 5.5.2 <[::]>: Helo command rejected: invalid ip address
>>> helo [ipv6:::]
OK
>>> helo [ipv6::::]
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 501 <[ipv6::::]>: Helo command rejected: invalid ip address; proto=SMTP helo=<[ipv6::::]>
-501 <[ipv6::::]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 501 5.5.2 <[ipv6::::]>: Helo command rejected: invalid ip address; proto=SMTP helo=<[ipv6::::]>
+501 5.5.2 <[ipv6::::]>: Helo command rejected: invalid ip address
>>> helo_restrictions permit_naked_ip_address,reject_invalid_hostname,reject_unknown_hostname
OK
>>> helo 123.123.123.123
>>> client unknown 131.155.210.17
OK
>>> mail foo@watson.ibm.com
-./smtpd_check: <queue id>: reject: MAIL from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: MAIL from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client unknown 168.100.189.13
OK
>>> mail foo@watson.ibm.com
>>> mail foo@watson.ibm.com
OK
>>> mail foo@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 450 <foo@bad.domain>: Sender address rejected: Domain not found; from=<foo@bad.domain> proto=SMTP helo=<123.123.123.123>
-450 <foo@bad.domain>: Sender address rejected: Domain not found
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 450 4.1.8 <foo@bad.domain>: Sender address rejected: Domain not found; from=<foo@bad.domain> proto=SMTP helo=<123.123.123.123>
+450 4.1.8 <foo@bad.domain>: Sender address rejected: Domain not found
>>> sender_restrictions hash:./smtpd_check_access
OK
>>> mail bad-sender@any.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<123.123.123.123>
-554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
>>> mail bad-sender@good.domain
OK
>>> mail reject@this.address
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<123.123.123.123>
-554 <reject@this.address>: Sender address rejected: match reject@this.address
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address
>>> mail Reject@this.address
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <Reject@this.address>: Sender address rejected: match reject@this.address; from=<Reject@this.address> proto=SMTP helo=<123.123.123.123>
-554 <Reject@this.address>: Sender address rejected: match reject@this.address
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <Reject@this.address>: Sender address rejected: match reject@this.address; from=<Reject@this.address> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <Reject@this.address>: Sender address rejected: match reject@this.address
>>> mail foo@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<123.123.123.123>
-554 <foo@bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@Bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@Bad.domain>: Sender address rejected: match bad.domain; from=<foo@Bad.domain> proto=SMTP helo=<123.123.123.123>
-554 <foo@Bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@Bad.domain>: Sender address rejected: match bad.domain; from=<foo@Bad.domain> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <foo@Bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@random.bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<123.123.123.123>
-554 <foo@random.bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@friend.bad.domain
OK
>>> #
>>> client unknown 131.155.210.17
OK
>>> rcpt foo@watson.ibm.com
-./smtpd_check: <queue id>: reject: RCPT from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: RCPT from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client unknown 168.100.189.13
OK
>>> rcpt foo@watson.ibm.com
OK
>>> rcpt foo@watson.ibm.com
./smtpd_check: warning: support for restriction "check_relay_domains" will be removed from Postfix; use "reject_unauth_destination" instead
-./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
-554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
+./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
+554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
>>> rcpt foo@porcupine.org
OK
>>> recipient_restrictions check_relay_domains
>>> client foo 123.123.123.123
OK
>>> rcpt foo@watson.ibm.com
-./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
-554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
+./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
+554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
>>> rcpt foo@porcupine.org
OK
>>> recipient_restrictions hash:./smtpd_check_access
OK
>>> mail bad-sender@any.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<123.123.123.123>
-554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
>>> mail bad-sender@good.domain
OK
>>> mail reject@this.address
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<123.123.123.123>
-554 <reject@this.address>: Sender address rejected: match reject@this.address
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address
>>> mail foo@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<123.123.123.123>
-554 <foo@bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@random.bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<123.123.123.123>
-554 <foo@random.bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<123.123.123.123>
+554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@friend.bad.domain
OK
>>> #
./smtpd_check: warning: support for restriction "reject_maps_rbl" will be removed from Postfix; use "reject_rbl_client domain-name" instead
OK
>>> client foo 127.0.0.2
-./smtpd_check: <queue id>: reject: CONNECT from foo[127.0.0.2]: 554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<foo@friend.bad.domain> proto=SMTP helo=<123.123.123.123>
-554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
+./smtpd_check: <queue id>: reject: CONNECT from foo[127.0.0.2]: 554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<foo@friend.bad.domain> proto=SMTP helo=<123.123.123.123>
+554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
>>> #
>>> # Hybrids
>>> #
>>> client foo 131.155.210.17
OK
>>> rcpt foo@watson.ibm.com
-./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
-554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
+./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<123.123.123.123>
+554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
>>> recipient_restrictions check_client_access,hash:./smtpd_check_access,check_relay_domains
OK
>>> client foo 131.155.210.17
>>> recipient_restrictions check_helo_access,hash:./smtpd_check_access,check_relay_domains
OK
>>> helo bad.domain
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 554 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@friend.bad.domain> proto=SMTP helo=<bad.domain>
-554 <bad.domain>: Helo command rejected: match bad.domain
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 554 5.0.0 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@friend.bad.domain> proto=SMTP helo=<bad.domain>
+554 5.0.0 <bad.domain>: Helo command rejected: match bad.domain
>>> rcpt foo@porcupine.org
-./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@friend.bad.domain> to=<foo@porcupine.org> proto=SMTP helo=<bad.domain>
-554 <bad.domain>: Helo command rejected: match bad.domain
+./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 5.0.0 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@friend.bad.domain> to=<foo@porcupine.org> proto=SMTP helo=<bad.domain>
+554 5.0.0 <bad.domain>: Helo command rejected: match bad.domain
>>> helo 131.155.210.17
OK
>>> rcpt foo@porcupine.org
>>> recipient_restrictions check_sender_access,hash:./smtpd_check_access,check_relay_domains
OK
>>> mail foo@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[131.155.210.17]: 554 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<131.155.210.17>
-554 <foo@bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[131.155.210.17]: 554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<131.155.210.17>
+554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain
>>> rcpt foo@porcupine.org
-./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> to=<foo@porcupine.org> proto=SMTP helo=<131.155.210.17>
-554 <foo@bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> to=<foo@porcupine.org> proto=SMTP helo=<131.155.210.17>
+554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@friend.bad.domain
OK
>>> rcpt foo@porcupine.org
>>> mail foo@good.domain
OK
>>> rcpt foo@porcupine.org
-./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@good.domain> to=<foo@porcupine.org> proto=SMTP helo=<bad.domain>
-554 <bad.domain>: Helo command rejected: match bad.domain
+./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 5.0.0 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@good.domain> to=<foo@porcupine.org> proto=SMTP helo=<bad.domain>
+554 5.0.0 <bad.domain>: Helo command rejected: match bad.domain
>>> helo good.domain
OK
>>> mail foo@bad.domain
OK
>>> rcpt foo@porcupine.org
-./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> to=<foo@porcupine.org> proto=SMTP helo=<good.domain>
-554 <foo@bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> to=<foo@porcupine.org> proto=SMTP helo=<good.domain>
+554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain
>>> #
>>> # FQDN restrictions
>>> #
>>> helo foo.bar
OK
>>> helo foo
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 504 <foo>: Helo command rejected: need fully-qualified hostname; from=<foo@bad.domain> proto=SMTP helo=<foo>
-504 <foo>: Helo command rejected: need fully-qualified hostname
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 504 5.5.2 <foo>: Helo command rejected: need fully-qualified hostname; from=<foo@bad.domain> proto=SMTP helo=<foo>
+504 5.5.2 <foo>: Helo command rejected: need fully-qualified hostname
>>> mail foo@foo.bar.
OK
>>> mail foo@foo.bar
OK
>>> mail foo@foo
-./smtpd_check: <queue id>: reject: MAIL from foo[131.155.210.17]: 504 <foo@foo>: Sender address rejected: need fully-qualified address; from=<foo@foo> proto=SMTP helo=<foo>
-504 <foo@foo>: Sender address rejected: need fully-qualified address
+./smtpd_check: <queue id>: reject: MAIL from foo[131.155.210.17]: 504 5.5.2 <foo@foo>: Sender address rejected: need fully-qualified address; from=<foo@foo> proto=SMTP helo=<foo>
+504 5.5.2 <foo@foo>: Sender address rejected: need fully-qualified address
>>> mail foo
-./smtpd_check: <queue id>: reject: MAIL from foo[131.155.210.17]: 504 <foo>: Sender address rejected: need fully-qualified address; from=<foo> proto=SMTP helo=<foo>
-504 <foo>: Sender address rejected: need fully-qualified address
+./smtpd_check: <queue id>: reject: MAIL from foo[131.155.210.17]: 504 5.5.2 <foo>: Sender address rejected: need fully-qualified address; from=<foo> proto=SMTP helo=<foo>
+504 5.5.2 <foo>: Sender address rejected: need fully-qualified address
>>> rcpt foo@foo.bar.
OK
>>> rcpt foo@foo.bar
OK
>>> rcpt foo@foo
-./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 504 <foo@foo>: Recipient address rejected: need fully-qualified address; from=<foo> to=<foo@foo> proto=SMTP helo=<foo>
-504 <foo@foo>: Recipient address rejected: need fully-qualified address
+./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 504 5.5.2 <foo@foo>: Recipient address rejected: need fully-qualified address; from=<foo> to=<foo@foo> proto=SMTP helo=<foo>
+504 5.5.2 <foo@foo>: Recipient address rejected: need fully-qualified address
>>> rcpt foo
-./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 504 <foo>: Recipient address rejected: need fully-qualified address; from=<foo> to=<foo> proto=SMTP helo=<foo>
-504 <foo>: Recipient address rejected: need fully-qualified address
+./smtpd_check: <queue id>: reject: RCPT from foo[131.155.210.17]: 504 5.5.2 <foo>: Recipient address rejected: need fully-qualified address; from=<foo> to=<foo> proto=SMTP helo=<foo>
+504 5.5.2 <foo>: Recipient address rejected: need fully-qualified address
>>> #
>>> # Numerical HELO checks
>>> #
OK
>>> helo [321.255.255.255]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[321.255.255.255]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[321.255.255.255]>
-501 <[321.255.255.255]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[321.255.255.255]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[321.255.255.255]>
+501 5.5.2 <[321.255.255.255]>: Helo command rejected: invalid ip address
>>> helo [0.255.255.255]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[0.255.255.255]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[0.255.255.255]>
-501 <[0.255.255.255]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[0.255.255.255]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[0.255.255.255]>
+501 5.5.2 <[0.255.255.255]>: Helo command rejected: invalid ip address
>>> helo [1.2.3.321]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.321]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3.321]>
-501 <[1.2.3.321]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[1.2.3.321]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3.321]>
+501 5.5.2 <[1.2.3.321]>: Helo command rejected: invalid ip address
>>> helo [1.2.3]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3]>
-501 <[1.2.3]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[1.2.3]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3]>
+501 5.5.2 <[1.2.3]>: Helo command rejected: invalid ip address
>>> helo [1.2.3.4.5]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.4.5]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3.4.5]>
-501 <[1.2.3.4.5]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[1.2.3.4.5]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3.4.5]>
+501 5.5.2 <[1.2.3.4.5]>: Helo command rejected: invalid ip address
>>> helo [1..2.3.4]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[1..2.3.4]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1..2.3.4]>
-501 <[1..2.3.4]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[1..2.3.4]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1..2.3.4]>
+501 5.5.2 <[1..2.3.4]>: Helo command rejected: invalid ip address
>>> helo [.1.2.3.4]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[.1.2.3.4]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[.1.2.3.4]>
-501 <[.1.2.3.4]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[.1.2.3.4]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[.1.2.3.4]>
+501 5.5.2 <[.1.2.3.4]>: Helo command rejected: invalid ip address
>>> helo [1.2.3.4.5.]
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3.4.5.]>
-501 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<[1.2.3.4.5.]>
+501 5.5.2 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address
>>> helo 1.2.3.4
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
OK
>>> helo 321.255.255.255
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <321.255.255.255>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<321.255.255.255>
-501 <321.255.255.255>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <321.255.255.255>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<321.255.255.255>
+501 5.5.2 <321.255.255.255>: Helo command rejected: invalid ip address
>>> helo 0.255.255.255
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <0.255.255.255>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<0.255.255.255>
-501 <0.255.255.255>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <0.255.255.255>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<0.255.255.255>
+501 5.5.2 <0.255.255.255>: Helo command rejected: invalid ip address
>>> helo 1.2.3.321
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.321>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3.321>
-501 <1.2.3.321>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <1.2.3.321>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3.321>
+501 5.5.2 <1.2.3.321>: Helo command rejected: invalid ip address
>>> helo 1.2.3
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <1.2.3>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3>
-501 <1.2.3>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <1.2.3>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3>
+501 5.5.2 <1.2.3>: Helo command rejected: invalid ip address
>>> helo 1.2.3.4.5
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.4.5>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3.4.5>
-501 <1.2.3.4.5>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <1.2.3.4.5>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3.4.5>
+501 5.5.2 <1.2.3.4.5>: Helo command rejected: invalid ip address
>>> helo 1..2.3.4
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <1..2.3.4>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1..2.3.4>
-501 <1..2.3.4>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <1..2.3.4>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1..2.3.4>
+501 5.5.2 <1..2.3.4>: Helo command rejected: invalid ip address
>>> helo .1.2.3.4
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <.1.2.3.4>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<.1.2.3.4>
-501 <.1.2.3.4>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <.1.2.3.4>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<.1.2.3.4>
+501 5.5.2 <.1.2.3.4>: Helo command rejected: invalid ip address
>>> helo 1.2.3.4.5.
./smtpd_check: warning: restriction permit_naked_ip_address is deprecated. Use permit_mynetworks instead
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.4.5.>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3.4.5.>
-501 <1.2.3.4.5.>: Helo command rejected: invalid ip address
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 501 5.5.2 <1.2.3.4.5.>: Helo command rejected: invalid ip address; from=<foo> proto=SMTP helo=<1.2.3.4.5.>
+501 5.5.2 <1.2.3.4.5.>: Helo command rejected: invalid ip address
>>> #
>>> # The defer restriction
>>> #
>>> helo_restrictions defer
OK
>>> helo foobar
-./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 444 <foobar>: Helo command rejected: Try again later; from=<foo> proto=SMTP helo=<foobar>
-444 <foobar>: Helo command rejected: Try again later
+./smtpd_check: <queue id>: reject: HELO from foo[131.155.210.17]: 444 4.3.2 <foobar>: Helo command rejected: Try again later; from=<foo> proto=SMTP helo=<foobar>
+444 4.3.2 <foobar>: Helo command rejected: Try again later
>>> client_restrictions permit_mynetworks,reject_unknown_client,check_client_access,hash:./smtpd_check_access
OK
>>> client unknown 131.155.210.17
-./smtpd_check: <queue id>: reject: CONNECT from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: CONNECT from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client unknown 168.100.189.13
OK
>>> client random.bad.domain 123.123.123.123
-./smtpd_check: <queue id>: reject: CONNECT from random.bad.domain[123.123.123.123]: 554 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
-554 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
+./smtpd_check: <queue id>: reject: CONNECT from random.bad.domain[123.123.123.123]: 554 5.0.0 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
+554 5.0.0 <random.bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
>>> client friend.bad.domain 123.123.123.123
OK
>>> client bad.domain 123.123.123.123
-./smtpd_check: <queue id>: reject: CONNECT from bad.domain[123.123.123.123]: 554 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
-554 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
+./smtpd_check: <queue id>: reject: CONNECT from bad.domain[123.123.123.123]: 554 5.0.0 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain; proto=SMTP
+554 5.0.0 <bad.domain[123.123.123.123]>: Client host rejected: match bad.domain
>>> client wzv.win.tue.nl 131.155.210.17
OK
>>> client aa.win.tue.nl 131.155.210.18
-./smtpd_check: <queue id>: reject: CONNECT from aa.win.tue.nl[131.155.210.18]: 554 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210; proto=SMTP
-554 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210
+./smtpd_check: <queue id>: reject: CONNECT from aa.win.tue.nl[131.155.210.18]: 554 5.0.0 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210; proto=SMTP
+554 5.0.0 <aa.win.tue.nl[131.155.210.18]>: Client host rejected: match 131.155.210
>>> client_restrictions permit_mynetworks
OK
>>> #
>>> client unknown 131.155.210.17
OK
>>> helo foo.
-./smtpd_check: <queue id>: reject: HELO from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP helo=<foo.>
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: HELO from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; proto=SMTP helo=<foo.>
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client foo 123.123.123.123
OK
>>> helo foo.
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 <foo.>: Helo command rejected: Host not found; proto=SMTP helo=<foo.>
-450 <foo.>: Helo command rejected: Host not found
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 4.1.0 <foo.>: Helo command rejected: Host not found; proto=SMTP helo=<foo.>
+450 4.1.0 <foo.>: Helo command rejected: Host not found
>>> helo foo
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 <foo>: Helo command rejected: Host not found; proto=SMTP helo=<foo>
-450 <foo>: Helo command rejected: Host not found
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 450 4.1.0 <foo>: Helo command rejected: Host not found; proto=SMTP helo=<foo>
+450 4.1.0 <foo>: Helo command rejected: Host not found
>>> helo spike.porcupine.org
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org; proto=SMTP helo=<spike.porcupine.org>
-554 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 5.7.1 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org; proto=SMTP helo=<spike.porcupine.org>
+554 5.7.1 <spike.porcupine.org>: Helo command rejected: name server spike.porcupine.org
>>> helo_restrictions permit_mynetworks,reject_unknown_client,reject_invalid_hostname,check_helo_access,hash:./smtpd_check_access
OK
>>> helo random.bad.domain
-./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 <random.bad.domain>: Helo command rejected: match bad.domain; proto=SMTP helo=<random.bad.domain>
-554 <random.bad.domain>: Helo command rejected: match bad.domain
+./smtpd_check: <queue id>: reject: HELO from foo[123.123.123.123]: 554 5.0.0 <random.bad.domain>: Helo command rejected: match bad.domain; proto=SMTP helo=<random.bad.domain>
+554 5.0.0 <random.bad.domain>: Helo command rejected: match bad.domain
>>> helo friend.bad.domain
OK
>>> #
>>> client unknown 131.155.210.17
OK
>>> mail foo@watson.ibm.com
-./smtpd_check: <queue id>: reject: MAIL from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: MAIL from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client unknown 168.100.189.13
OK
>>> mail foo@watson.ibm.com
>>> mail foo@watson.ibm.com
OK
>>> mail foo@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 450 <foo@bad.domain>: Sender address rejected: Domain not found; from=<foo@bad.domain> proto=SMTP helo=<friend.bad.domain>
-450 <foo@bad.domain>: Sender address rejected: Domain not found
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 450 4.1.8 <foo@bad.domain>: Sender address rejected: Domain not found; from=<foo@bad.domain> proto=SMTP helo=<friend.bad.domain>
+450 4.1.8 <foo@bad.domain>: Sender address rejected: Domain not found
>>> sender_restrictions check_sender_access,hash:./smtpd_check_access
OK
>>> mail bad-sender@any.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<friend.bad.domain>
-554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
>>> mail bad-sender@good.domain
OK
>>> mail reject@this.address
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<friend.bad.domain>
-554 <reject@this.address>: Sender address rejected: match reject@this.address
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address
>>> mail Reject@this.address
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <Reject@this.address>: Sender address rejected: match reject@this.address; from=<Reject@this.address> proto=SMTP helo=<friend.bad.domain>
-554 <Reject@this.address>: Sender address rejected: match reject@this.address
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <Reject@this.address>: Sender address rejected: match reject@this.address; from=<Reject@this.address> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <Reject@this.address>: Sender address rejected: match reject@this.address
>>> mail foo@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<friend.bad.domain>
-554 <foo@bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@Bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@Bad.domain>: Sender address rejected: match bad.domain; from=<foo@Bad.domain> proto=SMTP helo=<friend.bad.domain>
-554 <foo@Bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@Bad.domain>: Sender address rejected: match bad.domain; from=<foo@Bad.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <foo@Bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@random.bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<friend.bad.domain>
-554 <foo@random.bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@friend.bad.domain
OK
>>> #
>>> client unknown 131.155.210.17
OK
>>> rcpt foo@watson.ibm.com
-./smtpd_check: <queue id>: reject: RCPT from unknown[131.155.210.17]: 450 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
-450 Client host rejected: cannot find your hostname, [131.155.210.17]
+./smtpd_check: <queue id>: reject: RCPT from unknown[131.155.210.17]: 450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
+450 4.7.1 Client host rejected: cannot find your hostname, [131.155.210.17]
>>> client unknown 168.100.189.13
OK
>>> rcpt foo@watson.ibm.com
OK
>>> rcpt foo@watson.ibm.com
./smtpd_check: warning: support for restriction "check_relay_domains" will be removed from Postfix; use "reject_unauth_destination" instead
-./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
-554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
+./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
+554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
>>> rcpt foo@porcupine.org
OK
>>> recipient_restrictions check_relay_domains
>>> client foo 123.123.123.123
OK
>>> rcpt foo@watson.ibm.com
-./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
-554 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
+./smtpd_check: <queue id>: reject: RCPT from foo[123.123.123.123]: 554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied; from=<foo@friend.bad.domain> to=<foo@watson.ibm.com> proto=SMTP helo=<friend.bad.domain>
+554 5.7.1 <foo@watson.ibm.com>: Recipient address rejected: Relay access denied
>>> rcpt foo@porcupine.org
OK
>>> recipient_restrictions check_recipient_access,hash:./smtpd_check_access
OK
>>> mail bad-sender@any.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<friend.bad.domain>
-554 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@; from=<bad-sender@any.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <bad-sender@any.domain>: Sender address rejected: match bad-sender@
>>> mail bad-sender@good.domain
OK
>>> mail reject@this.address
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<friend.bad.domain>
-554 <reject@this.address>: Sender address rejected: match reject@this.address
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address; from=<reject@this.address> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <reject@this.address>: Sender address rejected: match reject@this.address
>>> mail foo@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<friend.bad.domain>
-554 <foo@bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain; from=<foo@bad.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <foo@bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@random.bad.domain
-./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<friend.bad.domain>
-554 <foo@random.bad.domain>: Sender address rejected: match bad.domain
+./smtpd_check: <queue id>: reject: MAIL from foo[123.123.123.123]: 554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain; from=<foo@random.bad.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.0.0 <foo@random.bad.domain>: Sender address rejected: match bad.domain
>>> mail foo@friend.bad.domain
OK
>>> #
./smtpd_check: warning: support for restriction "reject_maps_rbl" will be removed from Postfix; use "reject_rbl_client domain-name" instead
OK
>>> client foo 127.0.0.2
-./smtpd_check: <queue id>: reject: CONNECT from foo[127.0.0.2]: 554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<foo@friend.bad.domain> proto=SMTP helo=<friend.bad.domain>
-554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
+./smtpd_check: <queue id>: reject: CONNECT from foo[127.0.0.2]: 554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<foo@friend.bad.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
>>> #
>>> # unknown sender/recipient domain
>>> #
>>> rcpt wietse@porcupine.org
OK
>>> rcpt wietse@no.recipient.domain
-./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 <wietse@no.recipient.domain>: Recipient address rejected: Domain not found; from=<wietse@porcupine.org> to=<wietse@no.recipient.domain> proto=SMTP helo=<friend.bad.domain>
-554 <wietse@no.recipient.domain>: Recipient address rejected: Domain not found
+./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 5.1.2 <wietse@no.recipient.domain>: Recipient address rejected: Domain not found; from=<wietse@porcupine.org> to=<wietse@no.recipient.domain> proto=SMTP helo=<friend.bad.domain>
+554 5.1.2 <wietse@no.recipient.domain>: Recipient address rejected: Domain not found
>>> mail wietse@no.sender.domain
OK
>>> rcpt wietse@porcupine.org
-./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 <wietse@no.sender.domain>: Sender address rejected: Domain not found; from=<wietse@no.sender.domain> to=<wietse@porcupine.org> proto=SMTP helo=<friend.bad.domain>
-554 <wietse@no.sender.domain>: Sender address rejected: Domain not found
+./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 5.1.8 <wietse@no.sender.domain>: Sender address rejected: Domain not found; from=<wietse@no.sender.domain> to=<wietse@porcupine.org> proto=SMTP helo=<friend.bad.domain>
+554 5.1.8 <wietse@no.sender.domain>: Sender address rejected: Domain not found
>>> #
>>> # {permit_auth,reject_unauth}_destination
>>> #
>>> recipient_restrictions permit_auth_destination,reject
OK
>>> rcpt user@foo.org
-./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 <user@foo.org>: Recipient address rejected: Access denied; from=<user@some.where> to=<user@foo.org> proto=SMTP helo=<friend.bad.domain>
-554 <user@foo.org>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 5.7.1 <user@foo.org>: Recipient address rejected: Access denied; from=<user@some.where> to=<user@foo.org> proto=SMTP helo=<friend.bad.domain>
+554 5.7.1 <user@foo.org>: Recipient address rejected: Access denied
>>> rcpt user@foo.com
OK
>>> recipient_restrictions reject_unauth_destination,permit
OK
>>> rcpt user@foo.org
-./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 <user@foo.org>: Relay access denied; from=<user@some.where> to=<user@foo.org> proto=SMTP helo=<friend.bad.domain>
-554 <user@foo.org>: Relay access denied
+./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 5.7.1 <user@foo.org>: Relay access denied; from=<user@some.where> to=<user@foo.org> proto=SMTP helo=<friend.bad.domain>
+554 5.7.1 <user@foo.org>: Relay access denied
>>> rcpt user@foo.com
OK
>>> #
>>> client spike.porcupine.org 160.100.189.2 2
OK
>>> client unknown 1.1.1.1 4
-./smtpd_check: <queue id>: reject: CONNECT from unknown[1.1.1.1]: 450 Client host rejected: cannot find your hostname, [1.1.1.1]; from=<user@some.where> proto=SMTP helo=<friend.bad.domain>
-450 Client host rejected: cannot find your hostname, [1.1.1.1]
+./smtpd_check: <queue id>: reject: CONNECT from unknown[1.1.1.1]: 450 4.7.1 Client host rejected: cannot find your hostname, [1.1.1.1]; from=<user@some.where> proto=SMTP helo=<friend.bad.domain>
+450 4.7.1 Client host rejected: cannot find your hostname, [1.1.1.1]
>>> client unknown 1.1.1.1 5
-./smtpd_check: <queue id>: reject: CONNECT from unknown[1.1.1.1]: 550 Client host rejected: cannot find your hostname, [1.1.1.1]; from=<user@some.where> proto=SMTP helo=<friend.bad.domain>
-550 Client host rejected: cannot find your hostname, [1.1.1.1]
+./smtpd_check: <queue id>: reject: CONNECT from unknown[1.1.1.1]: 550 5.7.1 Client host rejected: cannot find your hostname, [1.1.1.1]; from=<user@some.where> proto=SMTP helo=<friend.bad.domain>
+550 5.7.1 Client host rejected: cannot find your hostname, [1.1.1.1]
>>> sender_restrictions hash:./smtpd_check_access
OK
>>> mail rejecttext@bad.domain
-./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 554 <rejecttext@bad.domain>: Sender address rejected: text; from=<rejecttext@bad.domain> proto=SMTP
-554 <rejecttext@bad.domain>: Sender address rejected: text
+./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 554 5.7.1 <rejecttext@bad.domain>: Sender address rejected: text; from=<rejecttext@bad.domain> proto=SMTP
+554 5.7.1 <rejecttext@bad.domain>: Sender address rejected: text
>>> mail filter@filter.domain
./smtpd_check: warning: access map hash:./smtpd_check_access entry "filter@filter.domain" has FILTER entry without value
OK
>>> client foo 127.0.0.2
OK
>>> rcpt rname@rdomain
-./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
-554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
+./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
+554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
>>> #
>>> recipient_restrictions reject_rbl_client,relays.mail-abuse.org
OK
>>> client foo 127.0.0.2
OK
>>> rcpt rname@rdomain
-./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
-554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
+./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
+554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org
>>> recipient_restrictions reject_rbl_client,relays.mail-abuse.org=127.0.0.2
OK
>>> client foo 127.0.0.2
OK
>>> rcpt rname@rdomain
-./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org=127.0.0.2; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
-554 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org=127.0.0.2
+./smtpd_check: <queue id>: reject: RCPT from foo[127.0.0.2]: 554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org=127.0.0.2; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
+554 5.7.1 Service unavailable; Client host [127.0.0.2] blocked using relays.mail-abuse.org=127.0.0.2
>>> client foo 127.0.0.1
OK
>>> rcpt rname@rdomain
>>> mail sname@example.tld
OK
>>> rcpt rname@rdomain
-./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@example.tld sender_name=sname sender_domain=example.tld recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=sname@example.tld rbl_class=Sender address; from=<sname@example.tld> to=<rname@rdomain> proto=SMTP helo=<foobar>
-554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@example.tld sender_name=sname sender_domain=example.tld recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=sname@example.tld rbl_class=Sender address
+./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 5.7.1 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@example.tld sender_name=sname sender_domain=example.tld recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=sname@example.tld rbl_class=Sender address; from=<sname@example.tld> to=<rname@rdomain> proto=SMTP helo=<foobar>
+554 5.7.1 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@example.tld sender_name=sname sender_domain=example.tld recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=sname@example.tld rbl_class=Sender address
>>> mail sname@sdomain
OK
>>> rcpt rname@rdomain
>>> mail sname@sdomain
OK
>>> rcpt rname@rdomain
-./smtpd_check: <queue id>: reject: RCPT from example.tld[1.2.3.4]: 554 client=example.tld[1.2.3.4] client_address=1.2.3.4 client_name=example.tld helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=example.tld rbl_class=Client host; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
-554 client=example.tld[1.2.3.4] client_address=1.2.3.4 client_name=example.tld helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=example.tld rbl_class=Client host
+./smtpd_check: <queue id>: reject: RCPT from example.tld[1.2.3.4]: 554 5.7.1 client=example.tld[1.2.3.4] client_address=1.2.3.4 client_name=example.tld helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=example.tld rbl_class=Client host; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<foobar>
+554 5.7.1 client=example.tld[1.2.3.4] client_address=1.2.3.4 client_name=example.tld helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@rdomain recipient_name=rname recipient_domain=rdomain rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=example.tld rbl_class=Client host
>>> #
>>> # RHSBL recipient domain name
>>> #
>>> rcpt rname@rdomain
OK
>>> rcpt rname@example.tld
-./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address; from=<sname@sdomain> to=<rname@example.tld> proto=SMTP helo=<foobar>
-554 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address
+./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 5.7.1 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address; from=<sname@sdomain> to=<rname@example.tld> proto=SMTP helo=<foobar>
+554 5.7.1 client=spike.porcupine.org[168.100.189.2] client_address=168.100.189.2 client_name=spike.porcupine.org helo_name=foobar sender=sname@sdomain sender_name=sname sender_domain=sdomain recipient=rname@example.tld recipient_name=rname recipient_domain=example.tld rbl_code=554 rbl_domain=dsn.rfc-ignorant.org rbl_txt=Not supporting null originator (DSN) rbl_what=rname@example.tld rbl_class=Recipient address
>>> #
>>> # RHSBL helo domain name
>>> #
>>> mail sname@sdomain
OK
>>> rcpt rname@rdomain
-./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 Service unavailable; Helo command [example.tld] blocked using abuse.rfc-ignorant.org; Not supporting abuse@domain; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<example.tld>
-554 Service unavailable; Helo command [example.tld] blocked using abuse.rfc-ignorant.org; Not supporting abuse@domain
+./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 5.7.1 Service unavailable; Helo command [example.tld] blocked using abuse.rfc-ignorant.org; Not supporting abuse@domain; from=<sname@sdomain> to=<rname@rdomain> proto=SMTP helo=<example.tld>
+554 5.7.1 Service unavailable; Helo command [example.tld] blocked using abuse.rfc-ignorant.org; Not supporting abuse@domain
>>> #
>>> # Check MX access
>>> #
>>> rcpt foo@verisign.com
OK
>>> rcpt foo@1.2.3.porcupine.org
-./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 <foo@1.2.3.porcupine.org>: Recipient address rejected: mail server 10.10.10.10; from=<foo@verisign.com> to=<foo@1.2.3.porcupine.org> proto=SMTP helo=<example.tld>
-554 <foo@1.2.3.porcupine.org>: Recipient address rejected: mail server 10.10.10.10
+./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <foo@1.2.3.porcupine.org>: Recipient address rejected: mail server 10.10.10.10; from=<foo@verisign.com> to=<foo@1.2.3.porcupine.org> proto=SMTP helo=<example.tld>
+554 5.7.1 <foo@1.2.3.porcupine.org>: Recipient address rejected: mail server 10.10.10.10
>>> #
>>> # Check NS access
>>> #
>>> helo_restrictions check_helo_ns_access,hash:smtpd_check_access
OK
>>> helo email-publisher.com
-./smtpd_check: <queue id>: reject: HELO from spike.porcupine.org[168.100.189.2]: 554 <email-publisher.com>: Helo command rejected: Access denied; from=<foo@verisign.com> proto=SMTP helo=<email-publisher.com>
-554 <email-publisher.com>: Helo command rejected: Access denied
+./smtpd_check: <queue id>: reject: HELO from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <email-publisher.com>: Helo command rejected: Access denied; from=<foo@verisign.com> proto=SMTP helo=<email-publisher.com>
+554 5.7.1 <email-publisher.com>: Helo command rejected: Access denied
>>> helo ns1.topica.com
-./smtpd_check: <queue id>: reject: HELO from spike.porcupine.org[168.100.189.2]: 554 <ns1.topica.com>: Helo command rejected: Access denied; from=<foo@verisign.com> proto=SMTP helo=<ns1.topica.com>
-554 <ns1.topica.com>: Helo command rejected: Access denied
+./smtpd_check: <queue id>: reject: HELO from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <ns1.topica.com>: Helo command rejected: Access denied; from=<foo@verisign.com> proto=SMTP helo=<ns1.topica.com>
+554 5.7.1 <ns1.topica.com>: Helo command rejected: Access denied
>>> #helo verisign-wildcard.com
>>> helo example.tld
./smtpd_check: warning: Unable to look up NS host for example.tld: Host not found
>>> sender_restrictions check_sender_ns_access,hash:smtpd_check_access
OK
>>> mail foo@email-publisher.com
-./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 554 <foo@email-publisher.com>: Sender address rejected: Access denied; from=<foo@email-publisher.com> proto=SMTP helo=<example.tld>
-554 <foo@email-publisher.com>: Sender address rejected: Access denied
+./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <foo@email-publisher.com>: Sender address rejected: Access denied; from=<foo@email-publisher.com> proto=SMTP helo=<example.tld>
+554 5.7.1 <foo@email-publisher.com>: Sender address rejected: Access denied
>>> mail foo@ns1.topica.com
-./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 554 <foo@ns1.topica.com>: Sender address rejected: Access denied; from=<foo@ns1.topica.com> proto=SMTP helo=<example.tld>
-554 <foo@ns1.topica.com>: Sender address rejected: Access denied
+./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <foo@ns1.topica.com>: Sender address rejected: Access denied; from=<foo@ns1.topica.com> proto=SMTP helo=<example.tld>
+554 5.7.1 <foo@ns1.topica.com>: Sender address rejected: Access denied
>>> #mail foo@verisign-wildcard.com
>>> recipient_restrictions check_recipient_ns_access,hash:smtpd_check_access
OK
>>> rcpt foo@email-publisher.com
-./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 <foo@email-publisher.com>: Recipient address rejected: Access denied; from=<foo@ns1.topica.com> to=<foo@email-publisher.com> proto=SMTP helo=<example.tld>
-554 <foo@email-publisher.com>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <foo@email-publisher.com>: Recipient address rejected: Access denied; from=<foo@ns1.topica.com> to=<foo@email-publisher.com> proto=SMTP helo=<example.tld>
+554 5.7.1 <foo@email-publisher.com>: Recipient address rejected: Access denied
>>> rcpt foo@ns1.topica.com
-./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 <foo@ns1.topica.com>: Recipient address rejected: Access denied; from=<foo@ns1.topica.com> to=<foo@ns1.topica.com> proto=SMTP helo=<example.tld>
-554 <foo@ns1.topica.com>: Recipient address rejected: Access denied
+./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <foo@ns1.topica.com>: Recipient address rejected: Access denied; from=<foo@ns1.topica.com> to=<foo@ns1.topica.com> proto=SMTP helo=<example.tld>
+554 5.7.1 <foo@ns1.topica.com>: Recipient address rejected: Access denied
>>> #rcpt foo@verisign-wildcard.com
>>> rcpt foo@1.2.3.porcupine.org
-./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 <foo@1.2.3.porcupine.org>: Recipient address rejected: name server spike.porcupine.org; from=<foo@ns1.topica.com> to=<foo@1.2.3.porcupine.org> proto=SMTP helo=<example.tld>
-554 <foo@1.2.3.porcupine.org>: Recipient address rejected: name server spike.porcupine.org
+./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 554 5.7.1 <foo@1.2.3.porcupine.org>: Recipient address rejected: name server spike.porcupine.org; from=<foo@ns1.topica.com> to=<foo@1.2.3.porcupine.org> proto=SMTP helo=<example.tld>
+554 5.7.1 <foo@1.2.3.porcupine.org>: Recipient address rejected: name server spike.porcupine.org
XFORWARD_DOMAIN, SMTPD_PROXY_XFORWARD_DOMAIN,
0, 0,
};
+ CLEANUP_STAT_DETAIL *detail;
/*
* This buffer persists beyond the end of a proxy session so we can
state->error_mask |= MAIL_ERROR_SOFTWARE;
state->err |= CLEANUP_STAT_PROXY;
msg_warn("connect to proxy service %s: %m", service);
+ 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);
return (-1);
}
state->proxy = vstream_fdopen(fd, O_RDWR);
* that the client expects a MAIL FROM or RCPT TO reply.
*/
if (smtpd_proxy_cmd(state, SMTPD_PROX_WANT_OK, SMTPD_PROXY_CONNECT) != 0) {
+ 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);
smtpd_proxy_close(state);
return (-1);
}
* RCPT TO reply.
*/
if (smtpd_proxy_cmd(state, SMTPD_PROX_WANT_OK, "EHLO %s", ehlo_name) != 0) {
+ 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);
smtpd_proxy_close(state);
return (-1);
}
bad = smtpd_xforward_flush(state, buf);
vstring_free(buf);
if (bad) {
+ 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);
smtpd_proxy_close(state);
return (-1);
}
int last_char;
int err = 0;
static VSTRING *buffer = 0;
+ CLEANUP_STAT_DETAIL *detail;
/*
* Errors first. Be prepared for delayed errors from the DATA phase.
&& smtpd_proxy_rdwr_error(state->proxy, err))) {
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);
return (-1);
}
dec_buffer = STR(state->sasl_decoded);
if (SASL_DECODE64(init_response, reply_len,
dec_buffer, reply_len, &dec_length) != SASL_OK)
- return ("501 Authentication failed: malformed initial response");
+ return ("501 5.7.0 Authentication failed: malformed initial response");
if (msg_verbose)
msg_info("%s: decoded initial response %s", myname, dec_buffer);
} else {
*/
smtpd_chat_query(state);
if (strcmp(vstring_str(state->buffer), "*") == 0)
- return ("501 Authentication aborted"); /* XXX */
+ return ("501 5.7.0 Authentication aborted"); /* XXX */
reply_len = VSTRING_LEN(state->buffer);
VSTRING_SPACE(state->sasl_decoded, reply_len);
if (SASL_DECODE64(vstring_str(state->buffer), reply_len,
STR(state->sasl_decoded), reply_len,
&dec_length) != SASL_OK)
- return ("501 Error: malformed authentication response");
+ return ("501 5.7.0 Error: malformed authentication response");
if (msg_verbose)
msg_info("%s: decoded response: %.*s",
myname, (int) dec_length, STR(state->sasl_decoded));
* The authentication protocol was completed.
*/
if (result != SASL_OK)
- return ("535 Error: authentication failed");
+ return ("535 5.7.0 Error: authentication failed");
/*
* Authentication succeeded. Find out the login name for logging and for
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);
}
if (SMTPD_STAND_ALONE(state) || !var_smtpd_sasl_enable) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "503 Error: authentication not enabled");
+ smtpd_chat_reply(state, "503 5.5.1 Error: authentication not enabled");
return (-1);
}
#ifdef USE_TLS
if (state->tls_auth_only && !state->tls_context) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "538 Encryption required for requested authentication mechanism");
+ smtpd_chat_reply(state, "538 5.7.0 Encryption required for requested authentication mechanism");
return (-1);
}
#endif
if (state->sasl_username) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "503 Error: already authenticated");
+ smtpd_chat_reply(state, "503 5.5.1 Error: already authenticated");
return (-1);
}
if (argc < 2 || argc > 3) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- smtpd_chat_reply(state, "501 Syntax: AUTH mechanism");
+ smtpd_chat_reply(state, "501 5.5.4 Syntax: AUTH mechanism");
return (-1);
}
smtpd_chat_reply(state, "%s", err);
return (-1);
}
- smtpd_chat_reply(state, "235 Authentication successful");
+ smtpd_chat_reply(state, "235 2.0.0 Authentication successful");
return (0);
}
*/
if (!var_smtpd_sasl_enable) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- return ("503 Error: authentication disabled");
+ return ("503 5.5.4 Error: authentication disabled");
}
#if 0
if (state->sasl_username == 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- return ("503 Error: send AUTH command first");
+ return ("503 5.5.4 Error: send AUTH command first");
}
#endif
if (state->sasl_sender != 0) {
state->error_mask |= MAIL_ERROR_PROTOCOL;
- return ("503 Error: multiple AUTH= options");
+ return ("503 5.5.4 Error: multiple AUTH= options");
}
if (strcmp(addr, "<>") != 0) {
state->sasl_sender = mystrdup(addr);
state->defer_if_permit_client = 0;
state->defer_if_permit_helo = 0;
state->defer_if_permit_sender = 0;
+ state->defer_if_reject.dsn = 0;
state->defer_if_reject.reason = 0;
+ state->defer_if_permit.dsn = 0;
state->defer_if_permit.reason = 0;
state->discard = 0;
state->expand_buf = 0;
* Buffers that are created on the fly and that may be shared among mail
* deliveries within the same SMTP session.
*/
+ if (state->defer_if_permit.dsn)
+ vstring_free(state->defer_if_permit.dsn);
if (state->defer_if_permit.reason)
vstring_free(state->defer_if_permit.reason);
+ if (state->defer_if_reject.dsn)
+ vstring_free(state->defer_if_reject.dsn);
if (state->defer_if_reject.reason)
vstring_free(state->defer_if_reject.reason);
if (state->expand_buf)
(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'
-qmqp-sink.o: qmqp-sink.c
-qmqp-sink.o: ../../include/sys_defs.h
-qmqp-sink.o: ../../include/msg.h
-qmqp-sink.o: ../../include/vstring.h
-qmqp-sink.o: ../../include/vbuf.h
-qmqp-sink.o: ../../include/vstream.h
-qmqp-sink.o: ../../include/listen.h
-qmqp-sink.o: ../../include/iostuff.h
qmqp-sink.o: ../../include/events.h
-qmqp-sink.o: ../../include/mymalloc.h
+qmqp-sink.o: ../../include/inet_proto.h
+qmqp-sink.o: ../../include/iostuff.h
+qmqp-sink.o: ../../include/listen.h
+qmqp-sink.o: ../../include/msg.h
qmqp-sink.o: ../../include/msg_vstream.h
+qmqp-sink.o: ../../include/mymalloc.h
qmqp-sink.o: ../../include/netstring.h
-qmqp-sink.o: ../../include/inet_proto.h
qmqp-sink.o: ../../include/qmqp_proto.h
-qmqp-source.o: qmqp-source.c
-qmqp-source.o: ../../include/sys_defs.h
-qmqp-source.o: ../../include/msg.h
-qmqp-source.o: ../../include/msg_vstream.h
-qmqp-source.o: ../../include/vstream.h
-qmqp-source.o: ../../include/vbuf.h
-qmqp-source.o: ../../include/vstring.h
-qmqp-source.o: ../../include/get_hostname.h
-qmqp-source.o: ../../include/split_at.h
+qmqp-sink.o: ../../include/sys_defs.h
+qmqp-sink.o: ../../include/vbuf.h
+qmqp-sink.o: ../../include/vstream.h
+qmqp-sink.o: ../../include/vstring.h
+qmqp-sink.o: qmqp-sink.c
qmqp-source.o: ../../include/connect.h
-qmqp-source.o: ../../include/iostuff.h
-qmqp-source.o: ../../include/mymalloc.h
qmqp-source.o: ../../include/events.h
-qmqp-source.o: ../../include/netstring.h
-qmqp-source.o: ../../include/sane_connect.h
+qmqp-source.o: ../../include/get_hostname.h
qmqp-source.o: ../../include/host_port.h
-qmqp-source.o: ../../include/myaddrinfo.h
qmqp-source.o: ../../include/inet_proto.h
+qmqp-source.o: ../../include/iostuff.h
qmqp-source.o: ../../include/mail_date.h
+qmqp-source.o: ../../include/msg.h
+qmqp-source.o: ../../include/msg_vstream.h
+qmqp-source.o: ../../include/myaddrinfo.h
+qmqp-source.o: ../../include/mymalloc.h
+qmqp-source.o: ../../include/netstring.h
qmqp-source.o: ../../include/qmqp_proto.h
-smtp-sink.o: smtp-sink.c
-smtp-sink.o: ../../include/sys_defs.h
-smtp-sink.o: ../../include/msg.h
-smtp-sink.o: ../../include/vstring.h
-smtp-sink.o: ../../include/vbuf.h
-smtp-sink.o: ../../include/vstream.h
-smtp-sink.o: ../../include/vstring_vstream.h
+qmqp-source.o: ../../include/sane_connect.h
+qmqp-source.o: ../../include/split_at.h
+qmqp-source.o: ../../include/sys_defs.h
+qmqp-source.o: ../../include/vbuf.h
+qmqp-source.o: ../../include/vstream.h
+qmqp-source.o: ../../include/vstring.h
+qmqp-source.o: qmqp-source.c
+smtp-sink.o: ../../include/events.h
smtp-sink.o: ../../include/get_hostname.h
-smtp-sink.o: ../../include/listen.h
+smtp-sink.o: ../../include/inet_proto.h
smtp-sink.o: ../../include/iostuff.h
-smtp-sink.o: ../../include/events.h
-smtp-sink.o: ../../include/mymalloc.h
+smtp-sink.o: ../../include/listen.h
+smtp-sink.o: ../../include/msg.h
smtp-sink.o: ../../include/msg_vstream.h
-smtp-sink.o: ../../include/stringops.h
+smtp-sink.o: ../../include/mymalloc.h
smtp-sink.o: ../../include/sane_accept.h
-smtp-sink.o: ../../include/inet_proto.h
smtp-sink.o: ../../include/smtp_stream.h
-smtp-source.o: smtp-source.c
-smtp-source.o: ../../include/sys_defs.h
-smtp-source.o: ../../include/msg.h
-smtp-source.o: ../../include/msg_vstream.h
-smtp-source.o: ../../include/vstream.h
-smtp-source.o: ../../include/vbuf.h
-smtp-source.o: ../../include/vstring.h
-smtp-source.o: ../../include/vstring_vstream.h
-smtp-source.o: ../../include/get_hostname.h
-smtp-source.o: ../../include/split_at.h
+smtp-sink.o: ../../include/stringops.h
+smtp-sink.o: ../../include/sys_defs.h
+smtp-sink.o: ../../include/vbuf.h
+smtp-sink.o: ../../include/vstream.h
+smtp-sink.o: ../../include/vstring.h
+smtp-sink.o: ../../include/vstring_vstream.h
+smtp-sink.o: smtp-sink.c
smtp-source.o: ../../include/connect.h
-smtp-source.o: ../../include/iostuff.h
-smtp-source.o: ../../include/mymalloc.h
smtp-source.o: ../../include/events.h
-smtp-source.o: ../../include/sane_connect.h
+smtp-source.o: ../../include/get_hostname.h
smtp-source.o: ../../include/host_port.h
-smtp-source.o: ../../include/myaddrinfo.h
smtp-source.o: ../../include/inet_proto.h
-smtp-source.o: ../../include/smtp_stream.h
+smtp-source.o: ../../include/iostuff.h
smtp-source.o: ../../include/mail_date.h
+smtp-source.o: ../../include/msg.h
+smtp-source.o: ../../include/msg_vstream.h
+smtp-source.o: ../../include/myaddrinfo.h
+smtp-source.o: ../../include/mymalloc.h
+smtp-source.o: ../../include/sane_connect.h
+smtp-source.o: ../../include/smtp_stream.h
+smtp-source.o: ../../include/split_at.h
+smtp-source.o: ../../include/sys_defs.h
+smtp-source.o: ../../include/vbuf.h
+smtp-source.o: ../../include/vstream.h
+smtp-source.o: ../../include/vstring.h
+smtp-source.o: ../../include/vstring_vstream.h
+smtp-source.o: smtp-source.c
/* 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"
/* 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,
break;
case 'f':
set_cmds_flags(optarg, FLAG_HARD_ERR);
+ disable_pipelining = 1;
break;
case 'F':
disable_xforward = 1;
break;
case 'r':
set_cmds_flags(optarg, FLAG_SOFT_ERR);
+ disable_pipelining = 1;
break;
case 's':
openlog(basename(argv[0]), LOG_PID, LOG_MAIL);
(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'
-spawn.o: spawn.c
-spawn.o: ../../include/sys_defs.h
-spawn.o: ../../include/msg.h
spawn.o: ../../include/argv.h
spawn.o: ../../include/dict.h
-spawn.o: ../../include/vstream.h
-spawn.o: ../../include/vbuf.h
+spawn.o: ../../include/mail_conf.h
+spawn.o: ../../include/mail_params.h
+spawn.o: ../../include/mail_server.h
+spawn.o: ../../include/msg.h
spawn.o: ../../include/mymalloc.h
+spawn.o: ../../include/set_eugid.h
spawn.o: ../../include/spawn_command.h
spawn.o: ../../include/split_at.h
+spawn.o: ../../include/sys_defs.h
spawn.o: ../../include/timed_wait.h
-spawn.o: ../../include/set_eugid.h
-spawn.o: ../../include/mail_params.h
-spawn.o: ../../include/mail_server.h
-spawn.o: ../../include/mail_conf.h
+spawn.o: ../../include/vbuf.h
+spawn.o: ../../include/vstream.h
+spawn.o: spawn.c
(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'
-tls_bio_ops.o: tls_bio_ops.c
-tls_bio_ops.o: ../../include/sys_defs.h
-tls_bio_ops.o: ../../include/msg.h
tls_bio_ops.o: ../../include/iostuff.h
-tls_bio_ops.o: tls.h
-tls_bio_ops.o: ../../include/vstream.h
+tls_bio_ops.o: ../../include/msg.h
+tls_bio_ops.o: ../../include/sys_defs.h
tls_bio_ops.o: ../../include/vbuf.h
+tls_bio_ops.o: ../../include/vstream.h
tls_bio_ops.o: ../../include/vstring.h
-tls_certkey.o: tls_certkey.c
-tls_certkey.o: ../../include/sys_defs.h
+tls_bio_ops.o: tls.h
+tls_bio_ops.o: tls_bio_ops.c
tls_certkey.o: ../../include/msg.h
-tls_certkey.o: tls.h
-tls_certkey.o: ../../include/vstream.h
+tls_certkey.o: ../../include/sys_defs.h
tls_certkey.o: ../../include/vbuf.h
+tls_certkey.o: ../../include/vstream.h
tls_certkey.o: ../../include/vstring.h
-tls_client.o: tls_client.c
-tls_client.o: ../../include/sys_defs.h
+tls_certkey.o: tls.h
+tls_certkey.o: tls_certkey.c
+tls_client.o: ../../include/mail_params.h
+tls_client.o: ../../include/msg.h
tls_client.o: ../../include/mymalloc.h
-tls_client.o: ../../include/vstring.h
+tls_client.o: ../../include/stringops.h
+tls_client.o: ../../include/sys_defs.h
tls_client.o: ../../include/vbuf.h
tls_client.o: ../../include/vstream.h
-tls_client.o: ../../include/stringops.h
-tls_client.o: ../../include/msg.h
-tls_client.o: ../../include/mail_params.h
-tls_client.o: tls_mgr.h
+tls_client.o: ../../include/vstring.h
tls_client.o: tls.h
-tls_dh.o: tls_dh.c
-tls_dh.o: ../../include/sys_defs.h
+tls_client.o: tls_client.c
+tls_client.o: tls_mgr.h
tls_dh.o: ../../include/msg.h
-tls_dh.o: tls.h
-tls_dh.o: ../../include/vstream.h
+tls_dh.o: ../../include/sys_defs.h
tls_dh.o: ../../include/vbuf.h
+tls_dh.o: ../../include/vstream.h
tls_dh.o: ../../include/vstring.h
-tls_mgr.o: tls_mgr.c
-tls_mgr.o: ../../include/sys_defs.h
-tls_mgr.o: ../../include/msg.h
-tls_mgr.o: ../../include/vstream.h
-tls_mgr.o: ../../include/vbuf.h
-tls_mgr.o: ../../include/vstring.h
+tls_dh.o: tls.h
+tls_dh.o: tls_dh.c
tls_mgr.o: ../../include/attr.h
tls_mgr.o: ../../include/attr_clnt.h
+tls_mgr.o: ../../include/iostuff.h
tls_mgr.o: ../../include/mail_params.h
tls_mgr.o: ../../include/mail_proto.h
-tls_mgr.o: ../../include/iostuff.h
+tls_mgr.o: ../../include/msg.h
+tls_mgr.o: ../../include/sys_defs.h
+tls_mgr.o: ../../include/vbuf.h
+tls_mgr.o: ../../include/vstream.h
+tls_mgr.o: ../../include/vstring.h
+tls_mgr.o: tls_mgr.c
tls_mgr.o: tls_mgr.h
-tls_misc.o: tls_misc.c
-tls_misc.o: ../../include/sys_defs.h
-tls_misc.o: ../../include/vstream.h
-tls_misc.o: ../../include/vbuf.h
tls_misc.o: ../../include/msg.h
tls_misc.o: ../../include/mymalloc.h
+tls_misc.o: ../../include/sys_defs.h
+tls_misc.o: ../../include/vbuf.h
+tls_misc.o: ../../include/vstream.h
tls_misc.o: ../../include/vstring.h
tls_misc.o: tls.h
-tls_prng_dev.o: tls_prng_dev.c
-tls_prng_dev.o: ../../include/sys_defs.h
-tls_prng_dev.o: ../../include/msg.h
-tls_prng_dev.o: ../../include/mymalloc.h
+tls_misc.o: tls_misc.c
tls_prng_dev.o: ../../include/connect.h
tls_prng_dev.o: ../../include/iostuff.h
+tls_prng_dev.o: ../../include/msg.h
+tls_prng_dev.o: ../../include/mymalloc.h
+tls_prng_dev.o: ../../include/sys_defs.h
tls_prng_dev.o: tls_prng.h
-tls_prng_egd.o: tls_prng_egd.c
-tls_prng_egd.o: ../../include/sys_defs.h
-tls_prng_egd.o: ../../include/msg.h
-tls_prng_egd.o: ../../include/mymalloc.h
+tls_prng_dev.o: tls_prng_dev.c
tls_prng_egd.o: ../../include/connect.h
tls_prng_egd.o: ../../include/iostuff.h
+tls_prng_egd.o: ../../include/msg.h
+tls_prng_egd.o: ../../include/mymalloc.h
+tls_prng_egd.o: ../../include/sys_defs.h
tls_prng_egd.o: tls_prng.h
-tls_prng_exch.o: tls_prng_exch.c
-tls_prng_exch.o: ../../include/sys_defs.h
-tls_prng_exch.o: ../../include/msg.h
-tls_prng_exch.o: ../../include/mymalloc.h
+tls_prng_egd.o: tls_prng_egd.c
tls_prng_exch.o: ../../include/iostuff.h
+tls_prng_exch.o: ../../include/msg.h
tls_prng_exch.o: ../../include/myflock.h
+tls_prng_exch.o: ../../include/mymalloc.h
+tls_prng_exch.o: ../../include/sys_defs.h
tls_prng_exch.o: tls_prng.h
-tls_prng_file.o: tls_prng_file.c
-tls_prng_file.o: ../../include/sys_defs.h
-tls_prng_file.o: ../../include/msg.h
-tls_prng_file.o: ../../include/mymalloc.h
+tls_prng_exch.o: tls_prng_exch.c
tls_prng_file.o: ../../include/connect.h
tls_prng_file.o: ../../include/iostuff.h
+tls_prng_file.o: ../../include/msg.h
+tls_prng_file.o: ../../include/mymalloc.h
+tls_prng_file.o: ../../include/sys_defs.h
tls_prng_file.o: tls_prng.h
-tls_rsa.o: tls_rsa.c
+tls_prng_file.o: tls_prng_file.c
tls_rsa.o: ../../include/sys_defs.h
-tls_rsa.o: tls.h
-tls_rsa.o: ../../include/vstream.h
tls_rsa.o: ../../include/vbuf.h
+tls_rsa.o: ../../include/vstream.h
tls_rsa.o: ../../include/vstring.h
-tls_scache.o: tls_scache.c
-tls_scache.o: ../../include/sys_defs.h
-tls_scache.o: ../../include/msg.h
-tls_scache.o: ../../include/dict.h
-tls_scache.o: ../../include/vstream.h
-tls_scache.o: ../../include/vbuf.h
+tls_rsa.o: tls.h
+tls_rsa.o: tls_rsa.c
tls_scache.o: ../../include/argv.h
-tls_scache.o: ../../include/stringops.h
-tls_scache.o: ../../include/vstring.h
-tls_scache.o: ../../include/mymalloc.h
+tls_scache.o: ../../include/dict.h
tls_scache.o: ../../include/hex_code.h
+tls_scache.o: ../../include/msg.h
tls_scache.o: ../../include/myflock.h
+tls_scache.o: ../../include/mymalloc.h
+tls_scache.o: ../../include/stringops.h
+tls_scache.o: ../../include/sys_defs.h
+tls_scache.o: ../../include/vbuf.h
+tls_scache.o: ../../include/vstream.h
+tls_scache.o: ../../include/vstring.h
+tls_scache.o: tls_scache.c
tls_scache.o: tls_scache.h
-tls_seed.o: tls_seed.c
-tls_seed.o: ../../include/sys_defs.h
tls_seed.o: ../../include/msg.h
-tls_seed.o: ../../include/vstring.h
+tls_seed.o: ../../include/sys_defs.h
tls_seed.o: ../../include/vbuf.h
-tls_seed.o: tls_mgr.h
-tls_seed.o: tls.h
tls_seed.o: ../../include/vstream.h
-tls_server.o: tls_server.c
-tls_server.o: ../../include/sys_defs.h
-tls_server.o: ../../include/mymalloc.h
-tls_server.o: ../../include/vstring.h
-tls_server.o: ../../include/vbuf.h
-tls_server.o: ../../include/vstream.h
-tls_server.o: ../../include/dict.h
+tls_seed.o: ../../include/vstring.h
+tls_seed.o: tls.h
+tls_seed.o: tls_mgr.h
+tls_seed.o: tls_seed.c
tls_server.o: ../../include/argv.h
-tls_server.o: ../../include/stringops.h
-tls_server.o: ../../include/msg.h
+tls_server.o: ../../include/dict.h
tls_server.o: ../../include/hex_code.h
tls_server.o: ../../include/mail_params.h
-tls_server.o: tls_mgr.h
+tls_server.o: ../../include/msg.h
+tls_server.o: ../../include/mymalloc.h
+tls_server.o: ../../include/stringops.h
+tls_server.o: ../../include/sys_defs.h
+tls_server.o: ../../include/vbuf.h
+tls_server.o: ../../include/vstream.h
+tls_server.o: ../../include/vstring.h
tls_server.o: tls.h
-tls_session.o: tls_session.c
-tls_session.o: ../../include/sys_defs.h
-tls_session.o: ../../include/vstream.h
-tls_session.o: ../../include/vbuf.h
+tls_server.o: tls_mgr.h
+tls_server.o: tls_server.c
tls_session.o: ../../include/msg.h
tls_session.o: ../../include/mymalloc.h
-tls_session.o: tls.h
+tls_session.o: ../../include/sys_defs.h
+tls_session.o: ../../include/vbuf.h
+tls_session.o: ../../include/vstream.h
tls_session.o: ../../include/vstring.h
-tls_stream.o: tls_stream.c
-tls_stream.o: ../../include/sys_defs.h
+tls_session.o: tls.h
+tls_session.o: tls_session.c
tls_stream.o: ../../include/iostuff.h
-tls_stream.o: ../../include/vstream.h
-tls_stream.o: ../../include/vbuf.h
tls_stream.o: ../../include/msg.h
-tls_stream.o: tls.h
+tls_stream.o: ../../include/sys_defs.h
+tls_stream.o: ../../include/vbuf.h
+tls_stream.o: ../../include/vstream.h
tls_stream.o: ../../include/vstring.h
-tls_temp.o: tls_temp.c
+tls_stream.o: tls.h
+tls_stream.o: tls_stream.c
tls_temp.o: ../../include/sys_defs.h
-tls_temp.o: tls.h
-tls_temp.o: ../../include/vstream.h
tls_temp.o: ../../include/vbuf.h
+tls_temp.o: ../../include/vstream.h
tls_temp.o: ../../include/vstring.h
-tls_verify.o: tls_verify.c
-tls_verify.o: ../../include/sys_defs.h
+tls_temp.o: tls.h
+tls_temp.o: tls_temp.c
tls_verify.o: ../../include/msg.h
-tls_verify.o: tls.h
-tls_verify.o: ../../include/vstream.h
+tls_verify.o: ../../include/sys_defs.h
tls_verify.o: ../../include/vbuf.h
+tls_verify.o: ../../include/vstream.h
tls_verify.o: ../../include/vstring.h
+tls_verify.o: tls.h
+tls_verify.o: tls_verify.c
tidy: clean
+tests:
+
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
-tests:
-
# do not edit below this line - it is generated by 'make depend'
-tlsmgr.o: tlsmgr.c
-tlsmgr.o: ../../include/sys_defs.h
-tlsmgr.o: ../../include/msg.h
+tlsmgr.o: ../../include/argv.h
+tlsmgr.o: ../../include/attr.h
+tlsmgr.o: ../../include/dict.h
tlsmgr.o: ../../include/events.h
-tlsmgr.o: ../../include/stringops.h
-tlsmgr.o: ../../include/vstring.h
-tlsmgr.o: ../../include/vbuf.h
-tlsmgr.o: ../../include/mymalloc.h
tlsmgr.o: ../../include/iostuff.h
-tlsmgr.o: ../../include/vstream.h
-tlsmgr.o: ../../include/vstring_vstream.h
-tlsmgr.o: ../../include/attr.h
tlsmgr.o: ../../include/mail_conf.h
tlsmgr.o: ../../include/mail_params.h
-tlsmgr.o: ../../include/tls_mgr.h
tlsmgr.o: ../../include/mail_proto.h
-tlsmgr.o: ../../include/master_proto.h
tlsmgr.o: ../../include/mail_server.h
+tlsmgr.o: ../../include/master_proto.h
+tlsmgr.o: ../../include/msg.h
+tlsmgr.o: ../../include/mymalloc.h
+tlsmgr.o: ../../include/stringops.h
+tlsmgr.o: ../../include/sys_defs.h
+tlsmgr.o: ../../include/tls_mgr.h
tlsmgr.o: ../../include/tls_prng.h
tlsmgr.o: ../../include/tls_scache.h
-tlsmgr.o: ../../include/dict.h
-tlsmgr.o: ../../include/argv.h
+tlsmgr.o: ../../include/vbuf.h
+tlsmgr.o: ../../include/vstream.h
+tlsmgr.o: ../../include/vstring.h
+tlsmgr.o: ../../include/vstring_vstream.h
+tlsmgr.o: tlsmgr.c
(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'
-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
-resolve.o: ../../include/vstream.h
-resolve.o: ../../include/vstring_vstream.h
-resolve.o: ../../include/split_at.h
-resolve.o: ../../include/valid_hostname.h
-resolve.o: ../../include/stringops.h
-resolve.o: ../../include/mymalloc.h
-resolve.o: ../../include/mail_params.h
-resolve.o: ../../include/mail_proto.h
-resolve.o: ../../include/iostuff.h
+resolve.o: ../../include/argv.h
resolve.o: ../../include/attr.h
-resolve.o: ../../include/resolve_local.h
+resolve.o: ../../include/dict.h
+resolve.o: ../../include/domain_list.h
+resolve.o: ../../include/iostuff.h
+resolve.o: ../../include/mail_addr_find.h
resolve.o: ../../include/mail_conf.h
+resolve.o: ../../include/mail_params.h
+resolve.o: ../../include/mail_proto.h
+resolve.o: ../../include/maps.h
+resolve.o: ../../include/match_list.h
+resolve.o: ../../include/match_ops.h
+resolve.o: ../../include/match_parent_style.h
+resolve.o: ../../include/msg.h
+resolve.o: ../../include/mymalloc.h
resolve.o: ../../include/quote_822_local.h
resolve.o: ../../include/quote_flags.h
-resolve.o: ../../include/tok822.h
resolve.o: ../../include/resolve_clnt.h
-resolve.o: ../../include/domain_list.h
-resolve.o: ../../include/match_list.h
-resolve.o: ../../include/match_ops.h
+resolve.o: ../../include/resolve_local.h
+resolve.o: ../../include/split_at.h
resolve.o: ../../include/string_list.h
-resolve.o: ../../include/match_parent_style.h
-resolve.o: ../../include/maps.h
-resolve.o: ../../include/dict.h
-resolve.o: ../../include/argv.h
-resolve.o: ../../include/mail_addr_find.h
+resolve.o: ../../include/stringops.h
+resolve.o: ../../include/sys_defs.h
+resolve.o: ../../include/tok822.h
+resolve.o: ../../include/valid_hostname.h
resolve.o: ../../include/valid_mailhost_addr.h
-resolve.o: trivial-rewrite.h
+resolve.o: ../../include/vbuf.h
+resolve.o: ../../include/vstream.h
+resolve.o: ../../include/vstring.h
+resolve.o: ../../include/vstring_vstream.h
+resolve.o: resolve.c
resolve.o: transport.h
-rewrite.o: rewrite.c
-rewrite.o: ../../include/sys_defs.h
-rewrite.o: ../../include/msg.h
-rewrite.o: ../../include/vstring.h
-rewrite.o: ../../include/vbuf.h
-rewrite.o: ../../include/vstream.h
-rewrite.o: ../../include/vstring_vstream.h
-rewrite.o: ../../include/split_at.h
+resolve.o: trivial-rewrite.h
+rewrite.o: ../../include/attr.h
+rewrite.o: ../../include/iostuff.h
+rewrite.o: ../../include/mail_conf.h
rewrite.o: ../../include/mail_params.h
rewrite.o: ../../include/mail_proto.h
-rewrite.o: ../../include/iostuff.h
-rewrite.o: ../../include/attr.h
+rewrite.o: ../../include/msg.h
+rewrite.o: ../../include/resolve_clnt.h
rewrite.o: ../../include/resolve_local.h
+rewrite.o: ../../include/split_at.h
+rewrite.o: ../../include/sys_defs.h
rewrite.o: ../../include/tok822.h
-rewrite.o: ../../include/resolve_clnt.h
-rewrite.o: ../../include/mail_conf.h
+rewrite.o: ../../include/vbuf.h
+rewrite.o: ../../include/vstream.h
+rewrite.o: ../../include/vstring.h
+rewrite.o: ../../include/vstring_vstream.h
+rewrite.o: rewrite.c
rewrite.o: trivial-rewrite.h
-transport.o: transport.c
-transport.o: ../../include/sys_defs.h
-transport.o: ../../include/msg.h
-transport.o: ../../include/stringops.h
-transport.o: ../../include/vstring.h
-transport.o: ../../include/vbuf.h
-transport.o: ../../include/mymalloc.h
-transport.o: ../../include/split_at.h
-transport.o: ../../include/dict.h
-transport.o: ../../include/vstream.h
transport.o: ../../include/argv.h
-transport.o: ../../include/strip_addr.h
+transport.o: ../../include/attr.h
+transport.o: ../../include/dict.h
+transport.o: ../../include/iostuff.h
transport.o: ../../include/mail_params.h
+transport.o: ../../include/mail_proto.h
transport.o: ../../include/maps.h
-transport.o: ../../include/match_parent_style.h
transport.o: ../../include/match_ops.h
-transport.o: ../../include/mail_proto.h
-transport.o: ../../include/iostuff.h
-transport.o: ../../include/attr.h
+transport.o: ../../include/match_parent_style.h
+transport.o: ../../include/msg.h
+transport.o: ../../include/mymalloc.h
+transport.o: ../../include/split_at.h
+transport.o: ../../include/stringops.h
+transport.o: ../../include/strip_addr.h
+transport.o: ../../include/sys_defs.h
+transport.o: ../../include/vbuf.h
+transport.o: ../../include/vstream.h
+transport.o: ../../include/vstring.h
+transport.o: transport.c
transport.o: transport.h
-trivial-rewrite.o: trivial-rewrite.c
-trivial-rewrite.o: ../../include/sys_defs.h
-trivial-rewrite.o: ../../include/msg.h
-trivial-rewrite.o: ../../include/vstring.h
-trivial-rewrite.o: ../../include/vbuf.h
-trivial-rewrite.o: ../../include/vstream.h
-trivial-rewrite.o: ../../include/vstring_vstream.h
-trivial-rewrite.o: ../../include/split_at.h
-trivial-rewrite.o: ../../include/stringops.h
-trivial-rewrite.o: ../../include/dict.h
trivial-rewrite.o: ../../include/argv.h
+trivial-rewrite.o: ../../include/attr.h
+trivial-rewrite.o: ../../include/dict.h
trivial-rewrite.o: ../../include/events.h
-trivial-rewrite.o: ../../include/mail_params.h
-trivial-rewrite.o: ../../include/mail_proto.h
trivial-rewrite.o: ../../include/iostuff.h
-trivial-rewrite.o: ../../include/attr.h
-trivial-rewrite.o: ../../include/resolve_local.h
+trivial-rewrite.o: ../../include/mail_addr.h
trivial-rewrite.o: ../../include/mail_conf.h
+trivial-rewrite.o: ../../include/mail_params.h
+trivial-rewrite.o: ../../include/mail_proto.h
+trivial-rewrite.o: ../../include/mail_server.h
+trivial-rewrite.o: ../../include/maps.h
+trivial-rewrite.o: ../../include/msg.h
trivial-rewrite.o: ../../include/resolve_clnt.h
+trivial-rewrite.o: ../../include/resolve_local.h
trivial-rewrite.o: ../../include/rewrite_clnt.h
+trivial-rewrite.o: ../../include/split_at.h
+trivial-rewrite.o: ../../include/stringops.h
+trivial-rewrite.o: ../../include/sys_defs.h
trivial-rewrite.o: ../../include/tok822.h
-trivial-rewrite.o: ../../include/mail_addr.h
-trivial-rewrite.o: ../../include/mail_server.h
-trivial-rewrite.o: trivial-rewrite.h
+trivial-rewrite.o: ../../include/vbuf.h
+trivial-rewrite.o: ../../include/vstream.h
+trivial-rewrite.o: ../../include/vstring.h
+trivial-rewrite.o: ../../include/vstring_vstream.h
trivial-rewrite.o: transport.h
-trivial-rewrite.o: ../../include/maps.h
+trivial-rewrite.o: trivial-rewrite.c
+trivial-rewrite.o: trivial-rewrite.h
$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(SYSLIBS)
mv junk $@.o
-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
-
stream_test: stream_test.c $(LIB)
$(CC) $(CFLAGS) -o $@ $@.c $(LIB) $(SYSLIBS)
diff myaddrinfo4.ref2 myaddrinfo4.tmp
rm -f myaddrinfo4.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'
alldig.o: alldig.c
-alldig.o: sys_defs.h
alldig.o: stringops.h
-alldig.o: vstring.h
+alldig.o: sys_defs.h
alldig.o: vbuf.h
+alldig.o: vstring.h
argv.o: argv.c
-argv.o: sys_defs.h
-argv.o: mymalloc.h
-argv.o: msg.h
argv.o: argv.h
+argv.o: msg.h
+argv.o: mymalloc.h
+argv.o: sys_defs.h
+argv_split.o: argv.h
argv_split.o: argv_split.c
-argv_split.o: sys_defs.h
argv_split.o: mymalloc.h
argv_split.o: stringops.h
-argv_split.o: vstring.h
+argv_split.o: sys_defs.h
argv_split.o: vbuf.h
-argv_split.o: argv.h
+argv_split.o: vstring.h
+attr_clnt.o: attr.h
attr_clnt.o: attr_clnt.c
-attr_clnt.o: sys_defs.h
+attr_clnt.o: attr_clnt.h
+attr_clnt.o: auto_clnt.h
+attr_clnt.o: connect.h
+attr_clnt.o: htable.h
+attr_clnt.o: iostuff.h
attr_clnt.o: msg.h
attr_clnt.o: mymalloc.h
attr_clnt.o: split_at.h
-attr_clnt.o: vstream.h
+attr_clnt.o: sys_defs.h
attr_clnt.o: vbuf.h
-attr_clnt.o: connect.h
-attr_clnt.o: iostuff.h
-attr_clnt.o: htable.h
-attr_clnt.o: attr.h
-attr_clnt.o: auto_clnt.h
-attr_clnt.o: attr_clnt.h
+attr_clnt.o: vstream.h
+attr_print0.o: attr.h
attr_print0.o: attr_print0.c
-attr_print0.o: sys_defs.h
+attr_print0.o: base64_code.h
+attr_print0.o: htable.h
attr_print0.o: msg.h
attr_print0.o: mymalloc.h
-attr_print0.o: vstream.h
+attr_print0.o: sys_defs.h
attr_print0.o: vbuf.h
-attr_print0.o: htable.h
-attr_print0.o: attr.h
-attr_print0.o: base64_code.h
+attr_print0.o: vstream.h
attr_print0.o: vstring.h
+attr_print64.o: attr.h
attr_print64.o: attr_print64.c
-attr_print64.o: sys_defs.h
+attr_print64.o: base64_code.h
+attr_print64.o: htable.h
attr_print64.o: msg.h
attr_print64.o: mymalloc.h
-attr_print64.o: vstream.h
+attr_print64.o: sys_defs.h
attr_print64.o: vbuf.h
-attr_print64.o: htable.h
-attr_print64.o: base64_code.h
+attr_print64.o: vstream.h
attr_print64.o: vstring.h
-attr_print64.o: attr.h
+attr_print_plain.o: attr.h
attr_print_plain.o: attr_print_plain.c
-attr_print_plain.o: sys_defs.h
+attr_print_plain.o: base64_code.h
+attr_print_plain.o: htable.h
attr_print_plain.o: msg.h
attr_print_plain.o: mymalloc.h
-attr_print_plain.o: vstream.h
+attr_print_plain.o: sys_defs.h
attr_print_plain.o: vbuf.h
-attr_print_plain.o: htable.h
-attr_print_plain.o: base64_code.h
+attr_print_plain.o: vstream.h
attr_print_plain.o: vstring.h
-attr_print_plain.o: attr.h
+attr_scan0.o: attr.h
attr_scan0.o: attr_scan0.c
-attr_scan0.o: sys_defs.h
+attr_scan0.o: base64_code.h
+attr_scan0.o: htable.h
attr_scan0.o: msg.h
attr_scan0.o: mymalloc.h
-attr_scan0.o: vstream.h
+attr_scan0.o: sys_defs.h
attr_scan0.o: vbuf.h
+attr_scan0.o: vstream.h
attr_scan0.o: vstring.h
attr_scan0.o: vstring_vstream.h
-attr_scan0.o: htable.h
-attr_scan0.o: base64_code.h
-attr_scan0.o: attr.h
+attr_scan64.o: attr.h
attr_scan64.o: attr_scan64.c
-attr_scan64.o: sys_defs.h
+attr_scan64.o: base64_code.h
+attr_scan64.o: htable.h
attr_scan64.o: msg.h
attr_scan64.o: mymalloc.h
-attr_scan64.o: vstream.h
+attr_scan64.o: sys_defs.h
attr_scan64.o: vbuf.h
+attr_scan64.o: vstream.h
attr_scan64.o: vstring.h
-attr_scan64.o: htable.h
-attr_scan64.o: base64_code.h
-attr_scan64.o: attr.h
+attr_scan_plain.o: attr.h
attr_scan_plain.o: attr_scan_plain.c
-attr_scan_plain.o: sys_defs.h
+attr_scan_plain.o: base64_code.h
+attr_scan_plain.o: htable.h
attr_scan_plain.o: msg.h
attr_scan_plain.o: mymalloc.h
-attr_scan_plain.o: vstream.h
+attr_scan_plain.o: sys_defs.h
attr_scan_plain.o: vbuf.h
+attr_scan_plain.o: vstream.h
attr_scan_plain.o: vstring.h
-attr_scan_plain.o: htable.h
-attr_scan_plain.o: base64_code.h
-attr_scan_plain.o: attr.h
auto_clnt.o: auto_clnt.c
-auto_clnt.o: sys_defs.h
+auto_clnt.o: auto_clnt.h
+auto_clnt.o: events.h
+auto_clnt.o: iostuff.h
auto_clnt.o: msg.h
auto_clnt.o: mymalloc.h
-auto_clnt.o: vstream.h
+auto_clnt.o: sys_defs.h
auto_clnt.o: vbuf.h
-auto_clnt.o: events.h
-auto_clnt.o: iostuff.h
-auto_clnt.o: auto_clnt.h
+auto_clnt.o: vstream.h
base64_code.o: base64_code.c
-base64_code.o: sys_defs.h
+base64_code.o: base64_code.h
base64_code.o: msg.h
base64_code.o: mymalloc.h
-base64_code.o: vstring.h
+base64_code.o: sys_defs.h
base64_code.o: vbuf.h
-base64_code.o: base64_code.h
+base64_code.o: vstring.h
basename.o: basename.c
-basename.o: sys_defs.h
basename.o: stringops.h
-basename.o: vstring.h
+basename.o: sys_defs.h
basename.o: vbuf.h
+basename.o: vstring.h
binhash.o: binhash.c
-binhash.o: sys_defs.h
-binhash.o: mymalloc.h
-binhash.o: msg.h
binhash.o: binhash.h
+binhash.o: msg.h
+binhash.o: mymalloc.h
+binhash.o: sys_defs.h
chroot_uid.o: chroot_uid.c
-chroot_uid.o: sys_defs.h
-chroot_uid.o: msg.h
chroot_uid.o: chroot_uid.h
+chroot_uid.o: msg.h
+chroot_uid.o: sys_defs.h
cidr_match.o: cidr_match.c
-cidr_match.o: sys_defs.h
+cidr_match.o: cidr_match.h
+cidr_match.o: mask_addr.h
cidr_match.o: msg.h
-cidr_match.o: vstring.h
-cidr_match.o: vbuf.h
-cidr_match.o: stringops.h
-cidr_match.o: split_at.h
cidr_match.o: myaddrinfo.h
-cidr_match.o: mask_addr.h
-cidr_match.o: cidr_match.h
+cidr_match.o: split_at.h
+cidr_match.o: stringops.h
+cidr_match.o: sys_defs.h
+cidr_match.o: vbuf.h
+cidr_match.o: vstring.h
+clean_env.o: argv.h
clean_env.o: clean_env.c
-clean_env.o: sys_defs.h
+clean_env.o: clean_env.h
clean_env.o: msg.h
-clean_env.o: argv.h
clean_env.o: safe.h
-clean_env.o: clean_env.h
+clean_env.o: sys_defs.h
close_on_exec.o: close_on_exec.c
-close_on_exec.o: sys_defs.h
-close_on_exec.o: msg.h
close_on_exec.o: iostuff.h
+close_on_exec.o: msg.h
+close_on_exec.o: sys_defs.h
concatenate.o: concatenate.c
-concatenate.o: sys_defs.h
concatenate.o: mymalloc.h
concatenate.o: stringops.h
-concatenate.o: vstring.h
+concatenate.o: sys_defs.h
concatenate.o: vbuf.h
+concatenate.o: vstring.h
ctable.o: ctable.c
-ctable.o: sys_defs.h
+ctable.o: ctable.h
+ctable.o: htable.h
ctable.o: msg.h
ctable.o: mymalloc.h
ctable.o: ring.h
-ctable.o: htable.h
-ctable.o: ctable.h
+ctable.o: sys_defs.h
+dict.o: argv.h
dict.o: dict.c
-dict.o: sys_defs.h
-dict.o: msg.h
+dict.o: dict.h
+dict.o: dict_ht.h
dict.o: htable.h
+dict.o: iostuff.h
+dict.o: mac_expand.h
+dict.o: mac_parse.h
+dict.o: msg.h
dict.o: mymalloc.h
-dict.o: vstream.h
-dict.o: vbuf.h
-dict.o: vstring.h
dict.o: readlline.h
-dict.o: mac_parse.h
dict.o: stringops.h
-dict.o: iostuff.h
-dict.o: dict.h
-dict.o: argv.h
-dict.o: dict_ht.h
+dict.o: sys_defs.h
+dict.o: vbuf.h
+dict.o: vstream.h
+dict.o: vstring.h
+dict_alloc.o: argv.h
+dict_alloc.o: dict.h
dict_alloc.o: dict_alloc.c
-dict_alloc.o: sys_defs.h
dict_alloc.o: msg.h
dict_alloc.o: mymalloc.h
-dict_alloc.o: dict.h
-dict_alloc.o: vstream.h
+dict_alloc.o: sys_defs.h
dict_alloc.o: vbuf.h
-dict_alloc.o: argv.h
+dict_alloc.o: vstream.h
+dict_cdb.o: argv.h
+dict_cdb.o: dict.h
dict_cdb.o: dict_cdb.c
-dict_cdb.o: sys_defs.h
+dict_cdb.o: dict_cdb.h
+dict_cdb.o: iostuff.h
dict_cdb.o: msg.h
+dict_cdb.o: myflock.h
dict_cdb.o: mymalloc.h
-dict_cdb.o: vstring.h
-dict_cdb.o: vbuf.h
dict_cdb.o: stringops.h
-dict_cdb.o: iostuff.h
-dict_cdb.o: myflock.h
-dict_cdb.o: dict.h
+dict_cdb.o: sys_defs.h
+dict_cdb.o: vbuf.h
dict_cdb.o: vstream.h
-dict_cdb.o: argv.h
-dict_cdb.o: dict_cdb.h
+dict_cdb.o: vstring.h
+dict_cidr.o: argv.h
+dict_cidr.o: cidr_match.h
+dict_cidr.o: dict.h
dict_cidr.o: dict_cidr.c
-dict_cidr.o: sys_defs.h
-dict_cidr.o: mymalloc.h
+dict_cidr.o: dict_cidr.h
dict_cidr.o: msg.h
-dict_cidr.o: vstream.h
+dict_cidr.o: myaddrinfo.h
+dict_cidr.o: mymalloc.h
+dict_cidr.o: readlline.h
+dict_cidr.o: stringops.h
+dict_cidr.o: sys_defs.h
dict_cidr.o: vbuf.h
+dict_cidr.o: vstream.h
dict_cidr.o: vstring.h
-dict_cidr.o: stringops.h
-dict_cidr.o: readlline.h
-dict_cidr.o: dict.h
-dict_cidr.o: argv.h
-dict_cidr.o: myaddrinfo.h
-dict_cidr.o: cidr_match.h
-dict_cidr.o: dict_cidr.h
+dict_db.o: argv.h
+dict_db.o: dict.h
dict_db.o: dict_db.c
-dict_db.o: sys_defs.h
+dict_db.o: dict_db.h
+dict_db.o: iostuff.h
dict_db.o: msg.h
+dict_db.o: myflock.h
dict_db.o: mymalloc.h
-dict_db.o: vstring.h
-dict_db.o: vbuf.h
dict_db.o: stringops.h
-dict_db.o: iostuff.h
-dict_db.o: myflock.h
-dict_db.o: dict.h
+dict_db.o: sys_defs.h
+dict_db.o: vbuf.h
dict_db.o: vstream.h
-dict_db.o: argv.h
-dict_db.o: dict_db.h
+dict_db.o: vstring.h
dict_dbm.o: dict_dbm.c
dict_dbm.o: sys_defs.h
+dict_debug.o: argv.h
+dict_debug.o: dict.h
dict_debug.o: dict_debug.c
-dict_debug.o: sys_defs.h
dict_debug.o: msg.h
dict_debug.o: mymalloc.h
-dict_debug.o: dict.h
-dict_debug.o: vstream.h
+dict_debug.o: sys_defs.h
dict_debug.o: vbuf.h
-dict_debug.o: argv.h
-dict_env.o: dict_env.c
-dict_env.o: sys_defs.h
-dict_env.o: mymalloc.h
+dict_debug.o: vstream.h
+dict_env.o: argv.h
+dict_env.o: dict.h
+dict_env.o: dict_env.c
+dict_env.o: dict_env.h
dict_env.o: msg.h
+dict_env.o: mymalloc.h
dict_env.o: safe.h
-dict_env.o: dict.h
-dict_env.o: vstream.h
+dict_env.o: sys_defs.h
dict_env.o: vbuf.h
-dict_env.o: argv.h
-dict_env.o: dict_env.h
+dict_env.o: vstream.h
+dict_ht.o: argv.h
+dict_ht.o: dict.h
dict_ht.o: dict_ht.c
-dict_ht.o: sys_defs.h
-dict_ht.o: mymalloc.h
+dict_ht.o: dict_ht.h
dict_ht.o: htable.h
-dict_ht.o: dict.h
-dict_ht.o: vstream.h
+dict_ht.o: mymalloc.h
+dict_ht.o: sys_defs.h
dict_ht.o: vbuf.h
-dict_ht.o: argv.h
-dict_ht.o: dict_ht.h
+dict_ht.o: vstream.h
dict_ni.o: dict_ni.c
dict_ni.o: sys_defs.h
+dict_nis.o: argv.h
+dict_nis.o: dict.h
dict_nis.o: dict_nis.c
-dict_nis.o: sys_defs.h
+dict_nis.o: dict_nis.h
dict_nis.o: msg.h
dict_nis.o: mymalloc.h
-dict_nis.o: vstring.h
+dict_nis.o: sys_defs.h
dict_nis.o: vbuf.h
-dict_nis.o: dict.h
dict_nis.o: vstream.h
-dict_nis.o: argv.h
-dict_nis.o: dict_nis.h
+dict_nis.o: vstring.h
+dict_nisplus.o: argv.h
+dict_nisplus.o: dict.h
dict_nisplus.o: dict_nisplus.c
-dict_nisplus.o: sys_defs.h
+dict_nisplus.o: dict_nisplus.h
dict_nisplus.o: msg.h
dict_nisplus.o: mymalloc.h
-dict_nisplus.o: vstring.h
-dict_nisplus.o: vbuf.h
dict_nisplus.o: stringops.h
-dict_nisplus.o: dict.h
+dict_nisplus.o: sys_defs.h
+dict_nisplus.o: vbuf.h
dict_nisplus.o: vstream.h
-dict_nisplus.o: argv.h
-dict_nisplus.o: dict_nisplus.h
-dict_open.o: dict_open.c
-dict_open.o: sys_defs.h
+dict_nisplus.o: vstring.h
dict_open.o: argv.h
-dict_open.o: mymalloc.h
-dict_open.o: msg.h
dict_open.o: dict.h
-dict_open.o: vstream.h
-dict_open.o: vbuf.h
dict_open.o: dict_cdb.h
-dict_open.o: dict_env.h
-dict_open.o: dict_unix.h
-dict_open.o: dict_tcp.h
-dict_open.o: dict_sdbm.h
-dict_open.o: dict_dbm.h
+dict_open.o: dict_cidr.h
dict_open.o: dict_db.h
+dict_open.o: dict_dbm.h
+dict_open.o: dict_env.h
+dict_open.o: dict_ni.h
dict_open.o: dict_nis.h
dict_open.o: dict_nisplus.h
-dict_open.o: dict_ni.h
+dict_open.o: dict_open.c
dict_open.o: dict_pcre.h
dict_open.o: dict_regexp.h
+dict_open.o: dict_sdbm.h
dict_open.o: dict_static.h
-dict_open.o: dict_cidr.h
+dict_open.o: dict_tcp.h
+dict_open.o: dict_unix.h
+dict_open.o: htable.h
+dict_open.o: msg.h
+dict_open.o: mymalloc.h
+dict_open.o: split_at.h
dict_open.o: stringops.h
+dict_open.o: sys_defs.h
+dict_open.o: vbuf.h
+dict_open.o: vstream.h
dict_open.o: vstring.h
-dict_open.o: split_at.h
-dict_open.o: htable.h
+dict_pcre.o: argv.h
+dict_pcre.o: dict.h
dict_pcre.o: dict_pcre.c
-dict_pcre.o: sys_defs.h
-dict_pcre.o: mymalloc.h
+dict_pcre.o: dict_pcre.h
+dict_pcre.o: mac_parse.h
dict_pcre.o: msg.h
+dict_pcre.o: mymalloc.h
+dict_pcre.o: readlline.h
dict_pcre.o: safe.h
-dict_pcre.o: vstream.h
+dict_pcre.o: stringops.h
+dict_pcre.o: sys_defs.h
dict_pcre.o: vbuf.h
+dict_pcre.o: vstream.h
dict_pcre.o: vstring.h
-dict_pcre.o: stringops.h
-dict_pcre.o: readlline.h
-dict_pcre.o: dict.h
-dict_pcre.o: argv.h
-dict_pcre.o: dict_pcre.h
-dict_pcre.o: mac_parse.h
+dict_regexp.o: argv.h
+dict_regexp.o: dict.h
dict_regexp.o: dict_regexp.c
-dict_regexp.o: sys_defs.h
-dict_regexp.o: mymalloc.h
+dict_regexp.o: dict_regexp.h
+dict_regexp.o: mac_parse.h
dict_regexp.o: msg.h
+dict_regexp.o: mymalloc.h
+dict_regexp.o: readlline.h
dict_regexp.o: safe.h
-dict_regexp.o: vstream.h
+dict_regexp.o: stringops.h
+dict_regexp.o: sys_defs.h
dict_regexp.o: vbuf.h
+dict_regexp.o: vstream.h
dict_regexp.o: vstring.h
-dict_regexp.o: stringops.h
-dict_regexp.o: readlline.h
-dict_regexp.o: dict.h
-dict_regexp.o: argv.h
-dict_regexp.o: dict_regexp.h
-dict_regexp.o: mac_parse.h
+dict_sdbm.o: argv.h
+dict_sdbm.o: dict.h
dict_sdbm.o: dict_sdbm.c
-dict_sdbm.o: sys_defs.h
-dict_sdbm.o: msg.h
-dict_sdbm.o: mymalloc.h
+dict_sdbm.o: dict_sdbm.h
dict_sdbm.o: htable.h
dict_sdbm.o: iostuff.h
-dict_sdbm.o: vstring.h
-dict_sdbm.o: vbuf.h
+dict_sdbm.o: msg.h
dict_sdbm.o: myflock.h
+dict_sdbm.o: mymalloc.h
dict_sdbm.o: stringops.h
-dict_sdbm.o: dict.h
+dict_sdbm.o: sys_defs.h
+dict_sdbm.o: vbuf.h
dict_sdbm.o: vstream.h
-dict_sdbm.o: argv.h
-dict_sdbm.o: dict_sdbm.h
+dict_sdbm.o: vstring.h
+dict_static.o: argv.h
+dict_static.o: dict.h
dict_static.o: dict_static.c
-dict_static.o: sys_defs.h
-dict_static.o: mymalloc.h
+dict_static.o: dict_static.h
dict_static.o: msg.h
-dict_static.o: dict.h
-dict_static.o: vstream.h
+dict_static.o: mymalloc.h
+dict_static.o: sys_defs.h
dict_static.o: vbuf.h
-dict_static.o: argv.h
-dict_static.o: dict_static.h
+dict_static.o: vstream.h
+dict_tcp.o: argv.h
+dict_tcp.o: connect.h
+dict_tcp.o: dict.h
dict_tcp.o: dict_tcp.c
-dict_tcp.o: sys_defs.h
+dict_tcp.o: dict_tcp.h
+dict_tcp.o: hex_quote.h
+dict_tcp.o: iostuff.h
dict_tcp.o: msg.h
dict_tcp.o: mymalloc.h
-dict_tcp.o: vstring.h
+dict_tcp.o: stringops.h
+dict_tcp.o: sys_defs.h
dict_tcp.o: vbuf.h
dict_tcp.o: vstream.h
+dict_tcp.o: vstring.h
dict_tcp.o: vstring_vstream.h
-dict_tcp.o: connect.h
-dict_tcp.o: iostuff.h
-dict_tcp.o: hex_quote.h
-dict_tcp.o: dict.h
-dict_tcp.o: argv.h
-dict_tcp.o: stringops.h
-dict_tcp.o: dict_tcp.h
+dict_unix.o: argv.h
+dict_unix.o: dict.h
dict_unix.o: dict_unix.c
-dict_unix.o: sys_defs.h
+dict_unix.o: dict_unix.h
dict_unix.o: msg.h
dict_unix.o: mymalloc.h
-dict_unix.o: vstring.h
+dict_unix.o: sys_defs.h
dict_unix.o: vbuf.h
-dict_unix.o: dict.h
dict_unix.o: vstream.h
-dict_unix.o: argv.h
-dict_unix.o: dict_unix.h
+dict_unix.o: vstring.h
dir_forest.o: dir_forest.c
-dir_forest.o: sys_defs.h
-dir_forest.o: msg.h
dir_forest.o: dir_forest.h
-dir_forest.o: vstring.h
+dir_forest.o: msg.h
+dir_forest.o: sys_defs.h
dir_forest.o: vbuf.h
+dir_forest.o: vstring.h
doze.o: doze.c
-doze.o: sys_defs.h
-doze.o: msg.h
doze.o: iostuff.h
+doze.o: msg.h
+doze.o: sys_defs.h
dummy_read.o: dummy_read.c
-dummy_read.o: sys_defs.h
-dummy_read.o: msg.h
dummy_read.o: iostuff.h
+dummy_read.o: msg.h
+dummy_read.o: sys_defs.h
dummy_write.o: dummy_write.c
-dummy_write.o: sys_defs.h
-dummy_write.o: msg.h
dummy_write.o: iostuff.h
+dummy_write.o: msg.h
+dummy_write.o: sys_defs.h
dup2_pass_on_exec.o: dup2_pass_on_exec.c
duplex_pipe.o: duplex_pipe.c
-duplex_pipe.o: sys_defs.h
duplex_pipe.o: iostuff.h
duplex_pipe.o: sane_socketpair.h
+duplex_pipe.o: sys_defs.h
environ.o: environ.c
environ.o: sys_defs.h
events.o: events.c
-events.o: sys_defs.h
-events.o: mymalloc.h
-events.o: msg.h
+events.o: events.h
events.o: iostuff.h
+events.o: msg.h
+events.o: mymalloc.h
events.o: ring.h
-events.o: events.h
-exec_command.o: exec_command.c
-exec_command.o: sys_defs.h
-exec_command.o: msg.h
+events.o: sys_defs.h
exec_command.o: argv.h
+exec_command.o: exec_command.c
exec_command.o: exec_command.h
+exec_command.o: msg.h
+exec_command.o: sys_defs.h
fifo_listen.o: fifo_listen.c
-fifo_listen.o: sys_defs.h
-fifo_listen.o: msg.h
fifo_listen.o: iostuff.h
fifo_listen.o: listen.h
+fifo_listen.o: msg.h
+fifo_listen.o: sys_defs.h
fifo_open.o: fifo_open.c
fifo_rdonly_bug.o: fifo_rdonly_bug.c
fifo_rdonly_bug.o: sys_defs.h
fifo_rdwr_bug.o: fifo_rdwr_bug.c
fifo_rdwr_bug.o: sys_defs.h
fifo_trigger.o: fifo_trigger.c
-fifo_trigger.o: sys_defs.h
-fifo_trigger.o: msg.h
fifo_trigger.o: iostuff.h
+fifo_trigger.o: msg.h
fifo_trigger.o: safe_open.h
-fifo_trigger.o: vstream.h
+fifo_trigger.o: sys_defs.h
+fifo_trigger.o: trigger.h
fifo_trigger.o: vbuf.h
+fifo_trigger.o: vstream.h
fifo_trigger.o: vstring.h
-fifo_trigger.o: trigger.h
file_limit.o: file_limit.c
-file_limit.o: sys_defs.h
-file_limit.o: msg.h
file_limit.o: iostuff.h
+file_limit.o: msg.h
+file_limit.o: sys_defs.h
find_inet.o: find_inet.c
-find_inet.o: sys_defs.h
+find_inet.o: find_inet.h
find_inet.o: msg.h
find_inet.o: stringops.h
-find_inet.o: vstring.h
+find_inet.o: sys_defs.h
find_inet.o: vbuf.h
-find_inet.o: find_inet.h
+find_inet.o: vstring.h
fsspace.o: fsspace.c
-fsspace.o: sys_defs.h
-fsspace.o: msg.h
fsspace.o: fsspace.h
+fsspace.o: msg.h
+fsspace.o: sys_defs.h
fullname.o: fullname.c
+fullname.o: fullname.h
+fullname.o: safe.h
fullname.o: sys_defs.h
-fullname.o: vstring.h
fullname.o: vbuf.h
-fullname.o: safe.h
-fullname.o: fullname.h
+fullname.o: vstring.h
get_domainname.o: get_domainname.c
-get_domainname.o: sys_defs.h
-get_domainname.o: mymalloc.h
-get_domainname.o: get_hostname.h
get_domainname.o: get_domainname.h
+get_domainname.o: get_hostname.h
+get_domainname.o: mymalloc.h
+get_domainname.o: sys_defs.h
get_hostname.o: get_hostname.c
-get_hostname.o: sys_defs.h
-get_hostname.o: mymalloc.h
+get_hostname.o: get_hostname.h
get_hostname.o: msg.h
+get_hostname.o: mymalloc.h
+get_hostname.o: sys_defs.h
get_hostname.o: valid_hostname.h
-get_hostname.o: get_hostname.h
hex_code.o: hex_code.c
-hex_code.o: sys_defs.h
+hex_code.o: hex_code.h
hex_code.o: msg.h
hex_code.o: mymalloc.h
-hex_code.o: vstring.h
+hex_code.o: sys_defs.h
hex_code.o: vbuf.h
-hex_code.o: hex_code.h
+hex_code.o: vstring.h
hex_quote.o: hex_quote.c
-hex_quote.o: sys_defs.h
+hex_quote.o: hex_quote.h
hex_quote.o: msg.h
-hex_quote.o: vstring.h
+hex_quote.o: sys_defs.h
hex_quote.o: vbuf.h
-hex_quote.o: hex_quote.h
+hex_quote.o: vstring.h
host_port.o: host_port.c
-host_port.o: sys_defs.h
+host_port.o: host_port.h
host_port.o: msg.h
host_port.o: split_at.h
host_port.o: stringops.h
-host_port.o: vstring.h
-host_port.o: vbuf.h
+host_port.o: sys_defs.h
host_port.o: valid_hostname.h
-host_port.o: host_port.h
+host_port.o: vbuf.h
+host_port.o: vstring.h
htable.o: htable.c
-htable.o: sys_defs.h
-htable.o: mymalloc.h
-htable.o: msg.h
htable.o: htable.h
+htable.o: msg.h
+htable.o: mymalloc.h
+htable.o: sys_defs.h
inet_addr_host.o: inet_addr_host.c
-inet_addr_host.o: sys_defs.h
-inet_addr_host.o: mymalloc.h
-inet_addr_host.o: inet_addr_list.h
-inet_addr_host.o: myaddrinfo.h
inet_addr_host.o: inet_addr_host.h
-inet_addr_host.o: sock_addr.h
+inet_addr_host.o: inet_addr_list.h
inet_addr_host.o: inet_proto.h
inet_addr_host.o: msg.h
+inet_addr_host.o: myaddrinfo.h
+inet_addr_host.o: mymalloc.h
+inet_addr_host.o: sock_addr.h
+inet_addr_host.o: sys_defs.h
inet_addr_list.o: inet_addr_list.c
-inet_addr_list.o: sys_defs.h
+inet_addr_list.o: inet_addr_list.h
inet_addr_list.o: msg.h
-inet_addr_list.o: mymalloc.h
inet_addr_list.o: myaddrinfo.h
+inet_addr_list.o: mymalloc.h
inet_addr_list.o: sock_addr.h
-inet_addr_list.o: inet_addr_list.h
+inet_addr_list.o: sys_defs.h
+inet_addr_local.o: hex_code.h
+inet_addr_local.o: inet_addr_list.h
inet_addr_local.o: inet_addr_local.c
-inet_addr_local.o: sys_defs.h
+inet_addr_local.o: inet_addr_local.h
+inet_addr_local.o: mask_addr.h
inet_addr_local.o: msg.h
-inet_addr_local.o: mymalloc.h
-inet_addr_local.o: vstring.h
-inet_addr_local.o: vbuf.h
-inet_addr_local.o: inet_addr_list.h
inet_addr_local.o: myaddrinfo.h
-inet_addr_local.o: inet_addr_local.h
+inet_addr_local.o: mymalloc.h
inet_addr_local.o: sock_addr.h
-inet_addr_local.o: mask_addr.h
-inet_addr_local.o: hex_code.h
+inet_addr_local.o: sys_defs.h
+inet_addr_local.o: vbuf.h
+inet_addr_local.o: vstring.h
+inet_connect.o: connect.h
+inet_connect.o: host_port.h
inet_connect.o: inet_connect.c
-inet_connect.o: sys_defs.h
-inet_connect.o: mymalloc.h
-inet_connect.o: msg.h
+inet_connect.o: inet_proto.h
inet_connect.o: iostuff.h
-inet_connect.o: host_port.h
-inet_connect.o: sane_connect.h
-inet_connect.o: connect.h
-inet_connect.o: timed_connect.h
+inet_connect.o: msg.h
inet_connect.o: myaddrinfo.h
+inet_connect.o: mymalloc.h
+inet_connect.o: sane_connect.h
inet_connect.o: sock_addr.h
-inet_connect.o: inet_proto.h
-inet_listen.o: inet_listen.c
-inet_listen.o: sys_defs.h
-inet_listen.o: mymalloc.h
-inet_listen.o: msg.h
+inet_connect.o: sys_defs.h
+inet_connect.o: timed_connect.h
inet_listen.o: host_port.h
+inet_listen.o: inet_listen.c
+inet_listen.o: inet_proto.h
inet_listen.o: iostuff.h
inet_listen.o: listen.h
-inet_listen.o: sane_accept.h
+inet_listen.o: msg.h
inet_listen.o: myaddrinfo.h
+inet_listen.o: mymalloc.h
+inet_listen.o: sane_accept.h
inet_listen.o: sock_addr.h
-inet_listen.o: inet_proto.h
+inet_listen.o: sys_defs.h
inet_proto.o: inet_proto.c
-inet_proto.o: sys_defs.h
-inet_proto.o: mymalloc.h
+inet_proto.o: inet_proto.h
inet_proto.o: msg.h
inet_proto.o: myaddrinfo.h
+inet_proto.o: mymalloc.h
inet_proto.o: name_mask.h
-inet_proto.o: inet_proto.h
-inet_trigger.o: inet_trigger.c
-inet_trigger.o: sys_defs.h
-inet_trigger.o: msg.h
+inet_proto.o: sys_defs.h
inet_trigger.o: connect.h
+inet_trigger.o: events.h
+inet_trigger.o: inet_trigger.c
inet_trigger.o: iostuff.h
+inet_trigger.o: msg.h
inet_trigger.o: mymalloc.h
-inet_trigger.o: events.h
+inet_trigger.o: sys_defs.h
inet_trigger.o: trigger.h
line_wrap.o: line_wrap.c
-line_wrap.o: sys_defs.h
line_wrap.o: line_wrap.h
+line_wrap.o: sys_defs.h
lowercase.o: lowercase.c
-lowercase.o: sys_defs.h
lowercase.o: stringops.h
-lowercase.o: vstring.h
+lowercase.o: sys_defs.h
lowercase.o: vbuf.h
+lowercase.o: vstring.h
lstat_as.o: lstat_as.c
-lstat_as.o: sys_defs.h
+lstat_as.o: lstat_as.h
lstat_as.o: msg.h
lstat_as.o: set_eugid.h
-lstat_as.o: lstat_as.h
+lstat_as.o: sys_defs.h
mac_expand.o: mac_expand.c
-mac_expand.o: sys_defs.h
+mac_expand.o: mac_expand.h
+mac_expand.o: mac_parse.h
mac_expand.o: msg.h
-mac_expand.o: vstring.h
-mac_expand.o: vbuf.h
mac_expand.o: mymalloc.h
-mac_expand.o: mac_parse.h
-mac_expand.o: mac_expand.h
+mac_expand.o: sys_defs.h
+mac_expand.o: vbuf.h
+mac_expand.o: vstring.h
mac_parse.o: mac_parse.c
-mac_parse.o: sys_defs.h
-mac_parse.o: msg.h
mac_parse.o: mac_parse.h
-mac_parse.o: vstring.h
+mac_parse.o: msg.h
+mac_parse.o: sys_defs.h
mac_parse.o: vbuf.h
+mac_parse.o: vstring.h
make_dirs.o: make_dirs.c
-make_dirs.o: sys_defs.h
+make_dirs.o: make_dirs.h
make_dirs.o: msg.h
make_dirs.o: mymalloc.h
make_dirs.o: stringops.h
-make_dirs.o: vstring.h
+make_dirs.o: sys_defs.h
make_dirs.o: vbuf.h
-make_dirs.o: make_dirs.h
+make_dirs.o: vstring.h
mask_addr.o: mask_addr.c
-mask_addr.o: sys_defs.h
-mask_addr.o: msg.h
mask_addr.o: mask_addr.h
+mask_addr.o: msg.h
+mask_addr.o: sys_defs.h
+match_list.o: argv.h
+match_list.o: dict.h
match_list.o: match_list.c
-match_list.o: sys_defs.h
+match_list.o: match_list.h
+match_list.o: match_ops.h
match_list.o: msg.h
match_list.o: mymalloc.h
-match_list.o: vstring.h
+match_list.o: stringops.h
+match_list.o: sys_defs.h
match_list.o: vbuf.h
match_list.o: vstream.h
+match_list.o: vstring.h
match_list.o: vstring_vstream.h
-match_list.o: stringops.h
-match_list.o: argv.h
-match_list.o: dict.h
-match_list.o: match_ops.h
-match_list.o: match_list.h
+match_ops.o: argv.h
+match_ops.o: cidr_match.h
+match_ops.o: dict.h
match_ops.o: match_ops.c
-match_ops.o: sys_defs.h
+match_ops.o: match_ops.h
match_ops.o: msg.h
+match_ops.o: myaddrinfo.h
match_ops.o: mymalloc.h
match_ops.o: split_at.h
-match_ops.o: dict.h
-match_ops.o: vstream.h
-match_ops.o: vbuf.h
-match_ops.o: argv.h
-match_ops.o: match_ops.h
match_ops.o: stringops.h
+match_ops.o: sys_defs.h
+match_ops.o: vbuf.h
+match_ops.o: vstream.h
match_ops.o: vstring.h
-match_ops.o: cidr_match.h
-match_ops.o: myaddrinfo.h
msg.o: msg.c
-msg.o: sys_defs.h
msg.o: msg.h
msg.o: msg_output.h
+msg.o: sys_defs.h
msg_output.o: msg_output.c
-msg_output.o: sys_defs.h
+msg_output.o: msg_output.h
+msg_output.o: msg_vstream.h
msg_output.o: mymalloc.h
-msg_output.o: vstring.h
+msg_output.o: percentm.h
+msg_output.o: stringops.h
+msg_output.o: sys_defs.h
msg_output.o: vbuf.h
msg_output.o: vstream.h
-msg_output.o: msg_vstream.h
-msg_output.o: stringops.h
-msg_output.o: percentm.h
-msg_output.o: msg_output.h
-msg_syslog.o: msg_syslog.c
-msg_syslog.o: sys_defs.h
-msg_syslog.o: vstring.h
-msg_syslog.o: vbuf.h
-msg_syslog.o: stringops.h
+msg_output.o: vstring.h
msg_syslog.o: msg.h
msg_syslog.o: msg_output.h
+msg_syslog.o: msg_syslog.c
msg_syslog.o: msg_syslog.h
msg_syslog.o: safe.h
-msg_vstream.o: msg_vstream.c
-msg_vstream.o: sys_defs.h
-msg_vstream.o: vstream.h
-msg_vstream.o: vbuf.h
+msg_syslog.o: stringops.h
+msg_syslog.o: sys_defs.h
+msg_syslog.o: vbuf.h
+msg_syslog.o: vstring.h
msg_vstream.o: msg.h
msg_vstream.o: msg_output.h
+msg_vstream.o: msg_vstream.c
msg_vstream.o: msg_vstream.h
+msg_vstream.o: sys_defs.h
+msg_vstream.o: vbuf.h
+msg_vstream.o: vstream.h
mvect.o: mvect.c
-mvect.o: sys_defs.h
-mvect.o: mymalloc.h
mvect.o: mvect.h
+mvect.o: mymalloc.h
+mvect.o: sys_defs.h
+myaddrinfo.o: inet_proto.h
+myaddrinfo.o: msg.h
myaddrinfo.o: myaddrinfo.c
-myaddrinfo.o: sys_defs.h
+myaddrinfo.o: myaddrinfo.h
myaddrinfo.o: mymalloc.h
-myaddrinfo.o: valid_hostname.h
myaddrinfo.o: sock_addr.h
myaddrinfo.o: stringops.h
-myaddrinfo.o: vstring.h
+myaddrinfo.o: sys_defs.h
+myaddrinfo.o: valid_hostname.h
myaddrinfo.o: vbuf.h
-myaddrinfo.o: msg.h
-myaddrinfo.o: inet_proto.h
-myaddrinfo.o: myaddrinfo.h
-myflock.o: myflock.c
-myflock.o: sys_defs.h
+myaddrinfo.o: vstring.h
myflock.o: msg.h
+myflock.o: myflock.c
myflock.o: myflock.h
-mymalloc.o: mymalloc.c
-mymalloc.o: sys_defs.h
+myflock.o: sys_defs.h
mymalloc.o: msg.h
+mymalloc.o: mymalloc.c
mymalloc.o: mymalloc.h
+mymalloc.o: sys_defs.h
myrand.o: myrand.c
-myrand.o: sys_defs.h
myrand.o: myrand.h
+myrand.o: sys_defs.h
mystrtok.o: mystrtok.c
-mystrtok.o: sys_defs.h
mystrtok.o: stringops.h
-mystrtok.o: vstring.h
+mystrtok.o: sys_defs.h
mystrtok.o: vbuf.h
+mystrtok.o: vstring.h
name_code.o: name_code.c
-name_code.o: sys_defs.h
name_code.o: name_code.h
-name_mask.o: name_mask.c
-name_mask.o: sys_defs.h
+name_code.o: sys_defs.h
name_mask.o: msg.h
name_mask.o: mymalloc.h
+name_mask.o: name_mask.c
+name_mask.o: name_mask.h
name_mask.o: stringops.h
-name_mask.o: vstring.h
+name_mask.o: sys_defs.h
name_mask.o: vbuf.h
-name_mask.o: name_mask.h
+name_mask.o: vstring.h
+netstring.o: msg.h
netstring.o: netstring.c
+netstring.o: netstring.h
netstring.o: sys_defs.h
-netstring.o: msg.h
-netstring.o: vstream.h
netstring.o: vbuf.h
+netstring.o: vstream.h
netstring.o: vstring.h
-netstring.o: netstring.h
neuter.o: neuter.c
-neuter.o: sys_defs.h
neuter.o: stringops.h
-neuter.o: vstring.h
+neuter.o: sys_defs.h
neuter.o: vbuf.h
+neuter.o: vstring.h
+non_blocking.o: iostuff.h
+non_blocking.o: msg.h
non_blocking.o: non_blocking.c
non_blocking.o: sys_defs.h
-non_blocking.o: msg.h
-non_blocking.o: iostuff.h
-nvtable.o: nvtable.c
-nvtable.o: sys_defs.h
-nvtable.o: mymalloc.h
nvtable.o: htable.h
+nvtable.o: mymalloc.h
+nvtable.o: nvtable.c
nvtable.o: nvtable.h
-open_as.o: open_as.c
-open_as.o: sys_defs.h
+nvtable.o: sys_defs.h
open_as.o: msg.h
-open_as.o: set_eugid.h
+open_as.o: open_as.c
open_as.o: open_as.h
-open_limit.o: open_limit.c
-open_limit.o: sys_defs.h
+open_as.o: set_eugid.h
+open_as.o: sys_defs.h
open_limit.o: iostuff.h
+open_limit.o: open_limit.c
+open_limit.o: sys_defs.h
+open_lock.o: msg.h
+open_lock.o: myflock.h
open_lock.o: open_lock.c
+open_lock.o: open_lock.h
+open_lock.o: safe_open.h
open_lock.o: sys_defs.h
-open_lock.o: msg.h
-open_lock.o: vstream.h
open_lock.o: vbuf.h
+open_lock.o: vstream.h
open_lock.o: vstring.h
-open_lock.o: safe_open.h
-open_lock.o: myflock.h
-open_lock.o: open_lock.h
+peekfd.o: iostuff.h
peekfd.o: peekfd.c
peekfd.o: sys_defs.h
-peekfd.o: iostuff.h
percentm.o: percentm.c
+percentm.o: percentm.h
percentm.o: sys_defs.h
-percentm.o: vstring.h
percentm.o: vbuf.h
-percentm.o: percentm.h
+percentm.o: vstring.h
posix_signals.o: posix_signals.c
-posix_signals.o: sys_defs.h
posix_signals.o: posix_signals.h
+posix_signals.o: sys_defs.h
printable.o: printable.c
-printable.o: sys_defs.h
printable.o: stringops.h
-printable.o: vstring.h
+printable.o: sys_defs.h
printable.o: vbuf.h
-rand_sleep.o: rand_sleep.c
-rand_sleep.o: sys_defs.h
+printable.o: vstring.h
+rand_sleep.o: iostuff.h
rand_sleep.o: msg.h
rand_sleep.o: myrand.h
-rand_sleep.o: iostuff.h
+rand_sleep.o: rand_sleep.c
+rand_sleep.o: sys_defs.h
+read_wait.o: iostuff.h
+read_wait.o: msg.h
read_wait.o: read_wait.c
read_wait.o: sys_defs.h
-read_wait.o: msg.h
-read_wait.o: iostuff.h
+readable.o: iostuff.h
+readable.o: msg.h
readable.o: readable.c
readable.o: sys_defs.h
-readable.o: msg.h
-readable.o: iostuff.h
+readlline.o: msg.h
readlline.o: readlline.c
+readlline.o: readlline.h
readlline.o: sys_defs.h
-readlline.o: msg.h
-readlline.o: vstream.h
readlline.o: vbuf.h
+readlline.o: vstream.h
readlline.o: vstring.h
-readlline.o: readlline.h
ring.o: ring.c
ring.o: ring.h
+safe_getenv.o: safe.h
safe_getenv.o: safe_getenv.c
safe_getenv.o: sys_defs.h
-safe_getenv.o: safe.h
+safe_open.o: msg.h
safe_open.o: safe_open.c
+safe_open.o: safe_open.h
safe_open.o: sys_defs.h
-safe_open.o: msg.h
-safe_open.o: vstream.h
safe_open.o: vbuf.h
+safe_open.o: vstream.h
safe_open.o: vstring.h
-safe_open.o: safe_open.h
-sane_accept.o: sane_accept.c
-sane_accept.o: sys_defs.h
sane_accept.o: msg.h
+sane_accept.o: sane_accept.c
sane_accept.o: sane_accept.h
-sane_connect.o: sane_connect.c
-sane_connect.o: sys_defs.h
+sane_accept.o: sys_defs.h
sane_connect.o: msg.h
+sane_connect.o: sane_connect.c
sane_connect.o: sane_connect.h
-sane_link.o: sane_link.c
-sane_link.o: sys_defs.h
+sane_connect.o: sys_defs.h
sane_link.o: msg.h
sane_link.o: sane_fsops.h
-sane_rename.o: sane_rename.c
-sane_rename.o: sys_defs.h
+sane_link.o: sane_link.c
+sane_link.o: sys_defs.h
sane_rename.o: msg.h
sane_rename.o: sane_fsops.h
-sane_socketpair.o: sane_socketpair.c
-sane_socketpair.o: sys_defs.h
+sane_rename.o: sane_rename.c
+sane_rename.o: sys_defs.h
sane_socketpair.o: msg.h
+sane_socketpair.o: sane_socketpair.c
sane_socketpair.o: sane_socketpair.h
-sane_time.o: sane_time.c
-sane_time.o: sys_defs.h
+sane_socketpair.o: sys_defs.h
sane_time.o: msg.h
+sane_time.o: sane_time.c
sane_time.o: sane_time.h
-scan_dir.o: scan_dir.c
-scan_dir.o: sys_defs.h
+sane_time.o: sys_defs.h
scan_dir.o: msg.h
scan_dir.o: mymalloc.h
+scan_dir.o: scan_dir.c
+scan_dir.o: scan_dir.h
scan_dir.o: stringops.h
-scan_dir.o: vstring.h
+scan_dir.o: sys_defs.h
scan_dir.o: vbuf.h
-scan_dir.o: scan_dir.h
+scan_dir.o: vstring.h
+select_bug.o: msg.h
+select_bug.o: msg_vstream.h
select_bug.o: select_bug.c
select_bug.o: sys_defs.h
-select_bug.o: msg.h
-select_bug.o: vstream.h
select_bug.o: vbuf.h
-select_bug.o: msg_vstream.h
-set_eugid.o: set_eugid.c
-set_eugid.o: sys_defs.h
+select_bug.o: vstream.h
set_eugid.o: msg.h
+set_eugid.o: set_eugid.c
set_eugid.o: set_eugid.h
-set_ugid.o: set_ugid.c
-set_ugid.o: sys_defs.h
+set_eugid.o: sys_defs.h
set_ugid.o: msg.h
+set_ugid.o: set_ugid.c
set_ugid.o: set_ugid.h
-sigdelay.o: sigdelay.c
-sigdelay.o: sys_defs.h
+set_ugid.o: sys_defs.h
sigdelay.o: msg.h
sigdelay.o: posix_signals.h
+sigdelay.o: sigdelay.c
sigdelay.o: sigdelay.h
+sigdelay.o: sys_defs.h
skipblanks.o: skipblanks.c
-skipblanks.o: sys_defs.h
skipblanks.o: stringops.h
-skipblanks.o: vstring.h
+skipblanks.o: sys_defs.h
skipblanks.o: vbuf.h
-sock_addr.o: sock_addr.c
-sock_addr.o: sys_defs.h
+skipblanks.o: vstring.h
sock_addr.o: msg.h
+sock_addr.o: sock_addr.c
sock_addr.o: sock_addr.h
-spawn_command.o: spawn_command.c
-spawn_command.o: sys_defs.h
+sock_addr.o: sys_defs.h
+spawn_command.o: argv.h
+spawn_command.o: clean_env.h
+spawn_command.o: exec_command.h
spawn_command.o: msg.h
-spawn_command.o: timed_wait.h
spawn_command.o: set_ugid.h
-spawn_command.o: argv.h
+spawn_command.o: spawn_command.c
spawn_command.o: spawn_command.h
-spawn_command.o: exec_command.h
-spawn_command.o: clean_env.h
+spawn_command.o: sys_defs.h
+spawn_command.o: timed_wait.h
split_at.o: split_at.c
-split_at.o: sys_defs.h
split_at.o: split_at.h
-split_nameval.o: split_nameval.c
-split_nameval.o: sys_defs.h
+split_at.o: sys_defs.h
split_nameval.o: msg.h
+split_nameval.o: split_nameval.c
split_nameval.o: stringops.h
-split_nameval.o: vstring.h
+split_nameval.o: sys_defs.h
split_nameval.o: vbuf.h
-stat_as.o: stat_as.c
-stat_as.o: sys_defs.h
+split_nameval.o: vstring.h
stat_as.o: msg.h
stat_as.o: set_eugid.h
+stat_as.o: stat_as.c
stat_as.o: stat_as.h
+stat_as.o: sys_defs.h
strcasecmp.o: strcasecmp.c
strcasecmp.o: sys_defs.h
-stream_connect.o: stream_connect.c
-stream_connect.o: sys_defs.h
-stream_connect.o: msg.h
stream_connect.o: connect.h
stream_connect.o: iostuff.h
+stream_connect.o: msg.h
+stream_connect.o: stream_connect.c
+stream_connect.o: sys_defs.h
+stream_listen.o: iostuff.h
+stream_listen.o: listen.h
+stream_listen.o: msg.h
stream_listen.o: stream_listen.c
stream_listen.o: sys_defs.h
-stream_listen.o: msg.h
-stream_listen.o: listen.h
-stream_listen.o: iostuff.h
+stream_recv_fd.o: iostuff.h
+stream_recv_fd.o: msg.h
stream_recv_fd.o: stream_recv_fd.c
stream_recv_fd.o: sys_defs.h
-stream_recv_fd.o: msg.h
-stream_recv_fd.o: iostuff.h
+stream_send_fd.o: iostuff.h
+stream_send_fd.o: msg.h
stream_send_fd.o: stream_send_fd.c
stream_send_fd.o: sys_defs.h
-stream_send_fd.o: msg.h
-stream_send_fd.o: iostuff.h
-stream_test.o: stream_test.c
-stream_test.o: sys_defs.h
-stream_test.o: stream_test.c
+stream_test.o: connect.h
stream_test.o: iostuff.h
+stream_test.o: listen.h
stream_test.o: msg.h
stream_test.o: msg_vstream.h
-stream_test.o: vstream.h
+stream_test.o: stream_test.c
+stream_test.o: sys_defs.h
stream_test.o: vbuf.h
-stream_test.o: listen.h
-stream_test.o: connect.h
-stream_trigger.o: stream_trigger.c
-stream_trigger.o: sys_defs.h
-stream_trigger.o: msg.h
+stream_test.o: vstream.h
stream_trigger.o: connect.h
+stream_trigger.o: events.h
stream_trigger.o: iostuff.h
+stream_trigger.o: msg.h
stream_trigger.o: mymalloc.h
-stream_trigger.o: events.h
+stream_trigger.o: stream_trigger.c
+stream_trigger.o: sys_defs.h
stream_trigger.o: trigger.h
+sys_compat.o: iostuff.h
sys_compat.o: sys_compat.c
sys_compat.o: sys_defs.h
-sys_compat.o: iostuff.h
-timed_connect.o: timed_connect.c
-timed_connect.o: sys_defs.h
-timed_connect.o: msg.h
timed_connect.o: iostuff.h
+timed_connect.o: msg.h
timed_connect.o: sane_connect.h
+timed_connect.o: sys_defs.h
+timed_connect.o: timed_connect.c
timed_connect.o: timed_connect.h
-timed_read.o: timed_read.c
-timed_read.o: sys_defs.h
-timed_read.o: msg.h
timed_read.o: iostuff.h
-timed_wait.o: timed_wait.c
-timed_wait.o: sys_defs.h
+timed_read.o: msg.h
+timed_read.o: sys_defs.h
+timed_read.o: timed_read.c
timed_wait.o: msg.h
timed_wait.o: posix_signals.h
+timed_wait.o: sys_defs.h
+timed_wait.o: timed_wait.c
timed_wait.o: timed_wait.h
-timed_write.o: timed_write.c
-timed_write.o: sys_defs.h
-timed_write.o: msg.h
timed_write.o: iostuff.h
-translit.o: translit.c
-translit.o: sys_defs.h
+timed_write.o: msg.h
+timed_write.o: sys_defs.h
+timed_write.o: timed_write.c
translit.o: stringops.h
-translit.o: vstring.h
+translit.o: sys_defs.h
+translit.o: translit.c
translit.o: vbuf.h
-trimblanks.o: trimblanks.c
-trimblanks.o: sys_defs.h
+translit.o: vstring.h
trimblanks.o: stringops.h
-trimblanks.o: vstring.h
+trimblanks.o: sys_defs.h
+trimblanks.o: trimblanks.c
trimblanks.o: vbuf.h
-unescape.o: unescape.c
+trimblanks.o: vstring.h
+unescape.o: stringops.h
unescape.o: sys_defs.h
-unescape.o: vstring.h
+unescape.o: unescape.c
unescape.o: vbuf.h
-unescape.o: stringops.h
-unix_connect.o: unix_connect.c
-unix_connect.o: sys_defs.h
-unix_connect.o: msg.h
+unescape.o: vstring.h
+unix_connect.o: connect.h
unix_connect.o: iostuff.h
+unix_connect.o: msg.h
unix_connect.o: sane_connect.h
-unix_connect.o: connect.h
+unix_connect.o: sys_defs.h
unix_connect.o: timed_connect.h
-unix_listen.o: unix_listen.c
-unix_listen.o: sys_defs.h
-unix_listen.o: msg.h
+unix_connect.o: unix_connect.c
unix_listen.o: iostuff.h
unix_listen.o: listen.h
+unix_listen.o: msg.h
unix_listen.o: sane_accept.h
-unix_recv_fd.o: unix_recv_fd.c
-unix_recv_fd.o: sys_defs.h
-unix_recv_fd.o: msg.h
+unix_listen.o: sys_defs.h
+unix_listen.o: unix_listen.c
unix_recv_fd.o: iostuff.h
-unix_send_fd.o: unix_send_fd.c
-unix_send_fd.o: sys_defs.h
-unix_send_fd.o: msg.h
+unix_recv_fd.o: msg.h
+unix_recv_fd.o: sys_defs.h
+unix_recv_fd.o: unix_recv_fd.c
unix_send_fd.o: iostuff.h
-unix_trigger.o: unix_trigger.c
-unix_trigger.o: sys_defs.h
-unix_trigger.o: msg.h
+unix_send_fd.o: msg.h
+unix_send_fd.o: sys_defs.h
+unix_send_fd.o: unix_send_fd.c
unix_trigger.o: connect.h
+unix_trigger.o: events.h
unix_trigger.o: iostuff.h
+unix_trigger.o: msg.h
unix_trigger.o: mymalloc.h
-unix_trigger.o: events.h
+unix_trigger.o: sys_defs.h
unix_trigger.o: trigger.h
-unsafe.o: unsafe.c
-unsafe.o: sys_defs.h
+unix_trigger.o: unix_trigger.c
unsafe.o: safe.h
-upass_listen.o: upass_listen.c
-upass_listen.o: sys_defs.h
+unsafe.o: sys_defs.h
+unsafe.o: unsafe.c
+upass_listen.o: iostuff.h
+upass_listen.o: listen.h
upass_listen.o: msg.h
upass_listen.o: sane_accept.h
-upass_listen.o: listen.h
-upass_listen.o: iostuff.h
-uppercase.o: uppercase.c
-uppercase.o: sys_defs.h
+upass_listen.o: sys_defs.h
+upass_listen.o: upass_listen.c
uppercase.o: stringops.h
-uppercase.o: vstring.h
+uppercase.o: sys_defs.h
+uppercase.o: uppercase.c
uppercase.o: vbuf.h
-username.o: username.c
+uppercase.o: vstring.h
username.o: sys_defs.h
+username.o: username.c
username.o: username.h
-valid_hostname.o: valid_hostname.c
-valid_hostname.o: sys_defs.h
valid_hostname.o: msg.h
valid_hostname.o: mymalloc.h
valid_hostname.o: stringops.h
-valid_hostname.o: vstring.h
-valid_hostname.o: vbuf.h
+valid_hostname.o: sys_defs.h
+valid_hostname.o: valid_hostname.c
valid_hostname.o: valid_hostname.h
-vbuf.o: vbuf.c
+valid_hostname.o: vbuf.h
+valid_hostname.o: vstring.h
vbuf.o: sys_defs.h
+vbuf.o: vbuf.c
vbuf.o: vbuf.h
-vbuf_print.o: vbuf_print.c
-vbuf_print.o: sys_defs.h
vbuf_print.o: msg.h
+vbuf_print.o: sys_defs.h
vbuf_print.o: vbuf.h
-vbuf_print.o: vstring.h
+vbuf_print.o: vbuf_print.c
vbuf_print.o: vbuf_print.h
-vstream.o: vstream.c
-vstream.o: sys_defs.h
-vstream.o: mymalloc.h
+vbuf_print.o: vstring.h
+vstream.o: iostuff.h
vstream.o: msg.h
-vstream.o: vbuf_print.h
+vstream.o: mymalloc.h
+vstream.o: sys_defs.h
vstream.o: vbuf.h
-vstream.o: iostuff.h
-vstream.o: vstring.h
+vstream.o: vbuf_print.h
+vstream.o: vstream.c
vstream.o: vstream.h
-vstream_popen.o: vstream_popen.c
-vstream_popen.o: sys_defs.h
-vstream_popen.o: msg.h
-vstream_popen.o: exec_command.h
-vstream_popen.o: vstream.h
-vstream_popen.o: vbuf.h
+vstream.o: vstring.h
vstream_popen.o: argv.h
-vstream_popen.o: set_ugid.h
vstream_popen.o: clean_env.h
+vstream_popen.o: exec_command.h
vstream_popen.o: iostuff.h
-vstring.o: vstring.c
-vstring.o: sys_defs.h
-vstring.o: mymalloc.h
+vstream_popen.o: msg.h
+vstream_popen.o: set_ugid.h
+vstream_popen.o: sys_defs.h
+vstream_popen.o: vbuf.h
+vstream_popen.o: vstream.h
+vstream_popen.o: vstream_popen.c
vstring.o: msg.h
-vstring.o: vbuf_print.h
+vstring.o: mymalloc.h
+vstring.o: sys_defs.h
vstring.o: vbuf.h
+vstring.o: vbuf_print.h
+vstring.o: vstring.c
vstring.o: vstring.h
-vstring_vstream.o: vstring_vstream.c
-vstring_vstream.o: sys_defs.h
vstring_vstream.o: msg.h
-vstring_vstream.o: vstring.h
+vstring_vstream.o: sys_defs.h
vstring_vstream.o: vbuf.h
vstring_vstream.o: vstream.h
+vstring_vstream.o: vstring.h
+vstring_vstream.o: vstring_vstream.c
vstring_vstream.o: vstring_vstream.h
-watchdog.o: watchdog.c
-watchdog.o: sys_defs.h
-watchdog.o: posix_signals.h
watchdog.o: msg.h
watchdog.o: mymalloc.h
+watchdog.o: posix_signals.h
+watchdog.o: sys_defs.h
+watchdog.o: watchdog.c
watchdog.o: watchdog.h
-writable.o: writable.c
-writable.o: sys_defs.h
-writable.o: msg.h
writable.o: iostuff.h
-write_buf.o: write_buf.c
-write_buf.o: sys_defs.h
-write_buf.o: msg.h
+writable.o: msg.h
+writable.o: sys_defs.h
+writable.o: writable.c
write_buf.o: iostuff.h
-write_wait.o: write_wait.c
-write_wait.o: sys_defs.h
-write_wait.o: msg.h
+write_buf.o: msg.h
+write_buf.o: sys_defs.h
+write_buf.o: write_buf.c
write_wait.o: iostuff.h
+write_wait.o: msg.h
+write_wait.o: sys_defs.h
+write_wait.o: write_wait.c
./dict_open: warning: cidr map dict_cidr.map, line 16: missing ']' character after "[1234": skipping this rule
./dict_open: warning: cidr map dict_cidr.map, line 17: garbage after "[1234]": skipping this rule
./dict_open: warning: cidr map dict_cidr.map, line 18: bad net/mask pattern: "172.16.1.3/3x": skipping this rule
+> get 172.16.0.0
172.16.0.0=554 match bad netblock 172.16.0.0/21
+> get 172.16.0.1
172.16.0.1=554 match bad netblock 172.16.0.0/21
+> get 172.16.7.255
172.16.7.255=554 match bad netblock 172.16.0.0/21
+> get 172.16.8.1
172.16.8.1=554 match bad netblock 172.16.8.0/21
+> get 172.16.17.1
172.16.17.1=554 match bad netblock 172.16.0.0/16
+> get 172.17.1.1
172.17.1.1=554 match bad naked address
+> get 172.17.1.2
172.17.1.2=match 0.0.0.0/0
+> get 2001:240:5c7:0:2d0:b7ff:fe88:2ca7
2001:240:5c7:0:2d0:b7ff:fe88:2ca7=match 2001:240:5c7:0:2d0:b7ff:fe88:2ca7
+> get 2001:240:5c7:0:2d0:b7ff:febe:ca9f
2001:240:5c7:0:2d0:b7ff:febe:ca9f=match netblock 2001:240:5c7::/64
+> get 1.1.1.1
1.1.1.1=match 0.0.0.0/0
+> get 1:1:1:1:1:1:1:1
1:1:1:1:1:1:1:1=match ::/0
DICT *dict;
if ((dict_name = split_at(saved_dict_spec, ':')) == 0)
- msg_fatal("open dictionary: need \"type:name\" form instead of: \"%s\"",
+ msg_fatal("open dictionary: expecting \"type:name\" form instead of \"%s\"",
dict_spec);
dict = dict_open3(saved_dict_spec, dict_name, open_flags, dict_flags);
DICT_OPEN_INFO *dp;
DICT *dict;
+ if (*dict_type == 0 || *dict_name == 0)
+ msg_fatal("open dictionary: expecting \"type:name\" form instead of \"%s:%s\"",
+ dict_type, dict_name);
if (dict_open_hash == 0)
dict_open_init();
if ((dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type)) == 0)
static void dict_pcre_exec_error(const char *mapname, int lineno, int errval)
{
switch (errval) {
- case 0:
+ case 0:
msg_warn("pcre map %s, line %d: too many (...)",
mapname, lineno);
return;
case PCRE_ERROR_UNKNOWN_NODE:
msg_fatal("pcre map %s, line %d: corrupt compiled regexp",
mapname, lineno);
+#ifdef PCRE_ERROR_NOMEMORY
+ case PCRE_ERROR_NOMEMORY:
+ msg_fatal("pcre map %s, line %d: out of memory",
+ mapname, lineno);
+#endif
+#ifdef PCRE_ERROR_MATCHLIMIT
+ case PCRE_ERROR_MATCHLIMIT:
+ msg_fatal("pcre map %s, line %d: matched text exceeds buffer limit",
+ mapname, lineno);
+#endif
+#ifdef PCRE_ERROR_BADUTF8
+ case PCRE_ERROR_BADUTF8:
+ msg_fatal("pcre map %s, line %d: bad UTF-8 sequence in search string",
+ mapname, lineno);
+#endif
+#ifdef PCRE_ERROR_BADUTF8_OFFSET
+ case PCRE_ERROR_BADUTF8_OFFSET:
+ msg_fatal("pcre map %s, line %d: bad UTF-8 start offset in search string",
+ mapname, lineno);
+#endif
default:
msg_fatal("pcre map %s, line %d: unknown re_exec error: %d",
mapname, lineno, errval);
./dict_open: warning: dict_pcre.map, line 9: no replacement text: using empty string
./dict_open: warning: pcre map dict_pcre.map, line 17: $number found in negative match replacement text: skipping this rule
./dict_open: warning: pcre map dict_pcre.map, line 22: no regexp: skipping this rule
+> get true
true: not found
+> get true1
true1=1
+> get true2
true2: not found
+> get truefalse2
truefalse2=2
+> get 3
3: not found
+> get true3
true3=3
+> get c
c=
+> get d
d: not found
+> get 1234
1234=(1)(2)(3)(4)
+> get 123
123=(1)(2)(3)
+> get bar/find
bar/find: not found
+> get bar/whynot
bar/whynot=Don't have a liquor license
+> get bar/elbereth
bar/elbereth=(elbereth)
+> get say/elbereth
say/elbereth: not found
+> del bar
bar: deleted
+> get bar
bar: not found
+> get nonexist
nonexist: not found
+> del nonexist
nonexist: not found
+> get foo
foo=fooval
+> del foo
foo: deleted
+> put baz bazval
baz=bazval
+> get baz
baz=bazval
+> del baz
baz: deleted
+> get baz
baz: not found
>> hh.
unknown: warning: valid hostname or network address required in hh.
>> 999
-host 999 port default-service
+unknown: warning: valid hostname or network address required in 999
./myaddrinfo: === hostname null.porcupine.org ===
-./myaddrinfo: hostname_to_sockaddr(null.porcupine.org): No address associated with hostname
+./myaddrinfo: hostname_to_sockaddr(null.porcupine.org): hostname nor servname provided, or not known
./myaddrinfo: === host address 10.0.0.0 ===
./myaddrinfo: 10.0.0.0 -> family=2 sock=1 proto=6 10.0.0.0
./myaddrinfo: sockaddr_to_hostname: hostname nor servname provided, or not known
-0000000 007 \b c d e \f g h i j k l m \n o p
- 007 010 143 144 145 014 147 150 151 152 153 154 155 012 157 160
-0000020 q \r s \t u 013 w x y z 001 002 003 004 005 006
- 161 015 163 011 165 013 167 170 171 172 001 002 003 004 005 006
-0000040 007 8 9 S 4 234 5 345 6 . 7
- 007 070 071 123 064 234 065 345 066 056 067
+0000000 \a \b c d e \f g h i j k l m \n o p
+ 007 010 143 144 145 014 147 150 151 152 153 154 155 012 157 160
+0000020 q \r s \t u \v w x y z 001 002 003 004 005 006
+ 161 015 163 011 165 013 167 170 171 172 001 002 003 004 005 006
+0000040 \a 8 9 S 4 234 5 345 6 . 7
+ 007 070 071 123 064 234 065 345 066 056 067
0000053
(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'
-verify.o: verify.c
-verify.o: ../../include/sys_defs.h
-verify.o: ../../include/msg.h
-verify.o: ../../include/mymalloc.h
-verify.o: ../../include/htable.h
-verify.o: ../../include/dict_ht.h
-verify.o: ../../include/dict.h
-verify.o: ../../include/vstream.h
-verify.o: ../../include/vbuf.h
verify.o: ../../include/argv.h
-verify.o: ../../include/split_at.h
-verify.o: ../../include/stringops.h
-verify.o: ../../include/vstring.h
+verify.o: ../../include/attr.h
+verify.o: ../../include/cleanup_user.h
+verify.o: ../../include/deliver_request.h
+verify.o: ../../include/dict.h
+verify.o: ../../include/dict_ht.h
+verify.o: ../../include/htable.h
+verify.o: ../../include/iostuff.h
verify.o: ../../include/mail_conf.h
verify.o: ../../include/mail_params.h
verify.o: ../../include/mail_proto.h
-verify.o: ../../include/iostuff.h
-verify.o: ../../include/attr.h
+verify.o: ../../include/mail_server.h
+verify.o: ../../include/msg.h
+verify.o: ../../include/mymalloc.h
verify.o: ../../include/post_mail.h
-verify.o: ../../include/cleanup_user.h
-verify.o: ../../include/verify_clnt.h
-verify.o: ../../include/deliver_request.h
verify.o: ../../include/recipient_list.h
-verify.o: ../../include/mail_server.h
+verify.o: ../../include/split_at.h
+verify.o: ../../include/stringops.h
+verify.o: ../../include/sys_defs.h
+verify.o: ../../include/vbuf.h
+verify.o: ../../include/verify_clnt.h
+verify.o: ../../include/vstream.h
+verify.o: ../../include/vstring.h
+verify.o: verify.c
(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
+ -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'
-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: virtual.h
-deliver_attr.o: ../../include/vstring.h
+deliver_attr.o: ../../include/argv.h
deliver_attr.o: ../../include/deliver_request.h
-deliver_attr.o: ../../include/recipient_list.h
-deliver_attr.o: ../../include/maps.h
deliver_attr.o: ../../include/dict.h
-deliver_attr.o: ../../include/argv.h
+deliver_attr.o: ../../include/maps.h
deliver_attr.o: ../../include/mbox_conf.h
-mailbox.o: mailbox.c
-mailbox.o: ../../include/sys_defs.h
-mailbox.o: ../../include/msg.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/mbox_open.h
-mailbox.o: ../../include/safe_open.h
-mailbox.o: ../../include/defer.h
+deliver_attr.o: ../../include/msg.h
+deliver_attr.o: ../../include/recipient_list.h
+deliver_attr.o: ../../include/sys_defs.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: virtual.h
+mailbox.o: ../../include/argv.h
mailbox.o: ../../include/bounce.h
+mailbox.o: ../../include/defer.h
mailbox.o: ../../include/deliver_request.h
-mailbox.o: ../../include/recipient_list.h
-mailbox.o: ../../include/sent.h
-mailbox.o: ../../include/mail_params.h
+mailbox.o: ../../include/dict.h
+mailbox.o: ../../include/dsn_util.h
mailbox.o: ../../include/mail_addr_find.h
+mailbox.o: ../../include/mail_copy.h
+mailbox.o: ../../include/mail_params.h
mailbox.o: ../../include/maps.h
-mailbox.o: ../../include/dict.h
-mailbox.o: ../../include/argv.h
-mailbox.o: virtual.h
mailbox.o: ../../include/mbox_conf.h
-maildir.o: maildir.c
-maildir.o: ../../include/sys_defs.h
+mailbox.o: ../../include/mbox_open.h
+mailbox.o: ../../include/msg.h
+mailbox.o: ../../include/mymalloc.h
+mailbox.o: ../../include/recipient_list.h
+mailbox.o: ../../include/safe_open.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/vbuf.h
+mailbox.o: ../../include/vstream.h
+mailbox.o: ../../include/vstring.h
+mailbox.o: mailbox.c
+mailbox.o: virtual.h
+maildir.o: ../../include/argv.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/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/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/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: maildir.c
maildir.o: virtual.h
-maildir.o: ../../include/maps.h
-maildir.o: ../../include/dict.h
-maildir.o: ../../include/argv.h
-maildir.o: ../../include/mbox_conf.h
-recipient.o: recipient.c
-recipient.o: ../../include/sys_defs.h
+recipient.o: ../../include/argv.h
+recipient.o: ../../include/bounce.h
+recipient.o: ../../include/deliver_request.h
+recipient.o: ../../include/dict.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/recipient_list.h
recipient.o: ../../include/stringops.h
-recipient.o: ../../include/vstring.h
+recipient.o: ../../include/sys_defs.h
recipient.o: ../../include/vbuf.h
-recipient.o: ../../include/bounce.h
-recipient.o: ../../include/deliver_request.h
recipient.o: ../../include/vstream.h
-recipient.o: ../../include/recipient_list.h
+recipient.o: ../../include/vstring.h
+recipient.o: recipient.c
recipient.o: virtual.h
-recipient.o: ../../include/maps.h
-recipient.o: ../../include/dict.h
-recipient.o: ../../include/argv.h
-recipient.o: ../../include/mbox_conf.h
-unknown.o: unknown.c
-unknown.o: ../../include/sys_defs.h
-unknown.o: ../../include/msg.h
+unknown.o: ../../include/argv.h
unknown.o: ../../include/bounce.h
unknown.o: ../../include/deliver_request.h
-unknown.o: ../../include/vstring.h
+unknown.o: ../../include/dict.h
+unknown.o: ../../include/maps.h
+unknown.o: ../../include/mbox_conf.h
+unknown.o: ../../include/msg.h
+unknown.o: ../../include/recipient_list.h
+unknown.o: ../../include/sys_defs.h
unknown.o: ../../include/vbuf.h
unknown.o: ../../include/vstream.h
-unknown.o: ../../include/recipient_list.h
+unknown.o: ../../include/vstring.h
+unknown.o: unknown.c
unknown.o: virtual.h
-unknown.o: ../../include/maps.h
-unknown.o: ../../include/dict.h
-unknown.o: ../../include/argv.h
-unknown.o: ../../include/mbox_conf.h
-virtual.o: virtual.c
-virtual.o: ../../include/sys_defs.h
-virtual.o: ../../include/msg.h
-virtual.o: ../../include/vstring.h
-virtual.o: ../../include/vbuf.h
-virtual.o: ../../include/vstream.h
-virtual.o: ../../include/iostuff.h
-virtual.o: ../../include/set_eugid.h
-virtual.o: ../../include/dict.h
virtual.o: ../../include/argv.h
-virtual.o: ../../include/mail_queue.h
-virtual.o: ../../include/recipient_list.h
-virtual.o: ../../include/deliver_request.h
virtual.o: ../../include/deliver_completed.h
-virtual.o: ../../include/mail_params.h
-virtual.o: ../../include/mail_conf.h
-virtual.o: ../../include/mail_addr_find.h
-virtual.o: ../../include/maps.h
+virtual.o: ../../include/deliver_request.h
+virtual.o: ../../include/dict.h
virtual.o: ../../include/flush_clnt.h
+virtual.o: ../../include/iostuff.h
+virtual.o: ../../include/mail_addr_find.h
+virtual.o: ../../include/mail_conf.h
+virtual.o: ../../include/mail_params.h
+virtual.o: ../../include/mail_queue.h
virtual.o: ../../include/mail_server.h
-virtual.o: virtual.h
+virtual.o: ../../include/maps.h
virtual.o: ../../include/mbox_conf.h
+virtual.o: ../../include/msg.h
+virtual.o: ../../include/recipient_list.h
+virtual.o: ../../include/set_eugid.h
+virtual.o: ../../include/sys_defs.h
+virtual.o: ../../include/vbuf.h
+virtual.o: ../../include/vstream.h
+virtual.o: ../../include/vstring.h
+virtual.o: virtual.c
+virtual.o: virtual.h
#include <mail_params.h>
#include <mail_addr_find.h>
-#ifndef EDQUOT
-#define EDQUOT EFBIG
-#endif
-
/* Application-specific. */
#include "virtual.h"
static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
{
char *myname = "deliver_mailbox_file";
- VSTRING *why;
+ DSN_VSTRING *why;
MBOX *mp;
int mail_copy_status;
int deliver_status;
* 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"));
/*
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);
/*
* Lock the mailbox and open/create the mailbox file.
if (mp != 0) {
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",
+ usr_attr.mailbox);
} else {
end = vstream_fseek(mp->fp, (off_t) 0, SEEK_END);
mail_copy_status = mail_copy(COPY_ATTR(state.msg_attr), mp->fp,
if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
deliver_status = DEL_STAT_DEFER;
} else if (mail_copy_status != 0) {
- deliver_status = (errno == EDQUOT || errno == EFBIG ?
- bounce_append : defer_append)
- (BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr),
- "mailbox %s: %s", usr_attr.mailbox, vstring_str(why));
+ deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+ (BOUNCE_FLAGS(state.request),
+ BOUNCE_ATTR(state.msg_attr, why->dsn),
+ "mailbox %s: %s", usr_attr.mailbox, 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");
}
- vstring_free(why);
+ dsn_vstring_free(why);
return (deliver_status);
}
return (NO);
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.0"),
"%s: lookup %s: %m",
virtual_mailbox_maps->title, state.msg_attr.user);
return (YES);
IGNORE_EXTENSION);
if (uid_res == 0) {
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.5"),
"recipient %s: uid not found in %s",
state.msg_attr.user, virtual_uid_maps->title);
RETURN(YES);
}
if ((n = atol(uid_res)) < var_virt_minimum_uid) {
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.5"),
"recipient %s: bad uid %s in %s",
state.msg_attr.user, uid_res, virtual_uid_maps->title);
RETURN(YES);
IGNORE_EXTENSION);
if (gid_res == 0) {
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.5"),
"recipient %s: gid not found in %s",
state.msg_attr.user, virtual_gid_maps->title);
RETURN(YES);
}
if ((n = atol(gid_res)) <= 0) {
*statusp = defer_append(BOUNCE_FLAGS(state.request),
- BOUNCE_ATTR(state.msg_attr),
+ BOUNCE_ATTR(state.msg_attr, "4.3.5"),
"recipient %s: bad gid %s in %s",
state.msg_attr.user, gid_res, virtual_gid_maps->title);
RETURN(YES);
#include <time.h>
#include <errno.h>
-#ifndef EDQUOT
-#define EDQUOT EFBIG
-#endif
-
/* Utility library. */
#include <msg.h>
char *curdir;
char *tmpfile;
char *newfile;
- VSTRING *why;
+ DSN_VSTRING *why;
VSTRING *buf;
VSTREAM *dst;
int mail_copy_status;
* 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"));
/*
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_DELIVERED | MAIL_COPY_ORIG_RCPT;
&& (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,
&& (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;
}
}
if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
deliver_status = DEL_STAT_DEFER;
} else if (mail_copy_status != 0) {
- deliver_status = (errno == EDQUOT || errno == EFBIG ?
- bounce_append : defer_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);
MSG_LOG_STATE(myname, state);
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.user));
}
*/
#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 SENT_ATTR(attr) attr.queue_id, attr.orig_rcpt, attr.recipient, \
- attr.rcpt_offset, attr.relay, \
- attr.arrival_time
-#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 SENT_ATTR(attr, detail) \
+ attr.queue_id, attr.orig_rcpt, attr.recipient, \
+ attr.rcpt_offset, attr.relay, detail, attr.arrival_time
+#define COPY_ATTR(attr) \
+ attr.sender, attr.orig_rcpt, attr.delivered, attr.fp
#define MSG_LOG_STATE(m, p) \
msg_info("%s[%d]: recip %s deliver %s", m, \