]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.3-20050327
authorWietse Venema <wietse@porcupine.org>
Sun, 27 Mar 2005 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 06:30:54 +0000 (06:30 +0000)
177 files changed:
postfix/.indent.pro
postfix/ENHANCED_STATUS_README [new file with mode: 0644]
postfix/HISTORY
postfix/README_FILES/DB_README
postfix/RELEASE_NOTES
postfix/conf/access
postfix/conf/header_checks
postfix/html/DB_README.html
postfix/html/access.5.html
postfix/html/discard.8.html
postfix/html/error.8.html
postfix/html/header_checks.5.html
postfix/html/lmtp.8.html
postfix/html/smtp-sink.1.html
postfix/html/smtp.8.html
postfix/html/smtpd.8.html
postfix/man/man1/smtp-sink.1
postfix/man/man5/access.5
postfix/man/man5/header_checks.5
postfix/man/man8/discard.8
postfix/man/man8/error.8
postfix/man/man8/lmtp.8
postfix/man/man8/smtp.8
postfix/man/man8/smtpd.8
postfix/proto/DB_README.html
postfix/proto/access
postfix/proto/header_checks
postfix/src/anvil/Makefile.in
postfix/src/bounce/Makefile.in
postfix/src/bounce/bounce_append_service.c
postfix/src/cleanup/Makefile.in
postfix/src/cleanup/cleanup_api.c
postfix/src/cleanup/cleanup_message.c
postfix/src/discard/Makefile.in
postfix/src/discard/discard.c
postfix/src/dns/Makefile.in
postfix/src/error/Makefile.in
postfix/src/error/error.c
postfix/src/flush/Makefile.in
postfix/src/fsstone/Makefile.in
postfix/src/global/Makefile.in
postfix/src/global/bounce.c
postfix/src/global/bounce.h
postfix/src/global/cleanup_strerror.c
postfix/src/global/cleanup_user.h
postfix/src/global/defer.c
postfix/src/global/defer.h
postfix/src/global/deliver_request.c
postfix/src/global/dsn_util.c [new file with mode: 0644]
postfix/src/global/dsn_util.h [new file with mode: 0644]
postfix/src/global/log_adhoc.c
postfix/src/global/log_adhoc.h
postfix/src/global/mail_copy.c
postfix/src/global/mail_copy.h
postfix/src/global/mail_params.h
postfix/src/global/mail_version.h
postfix/src/global/mbox_open.c
postfix/src/global/mbox_open.h
postfix/src/global/pipe_command.c
postfix/src/global/pipe_command.h
postfix/src/global/sent.c
postfix/src/global/sent.h
postfix/src/global/sys_exits.c
postfix/src/global/sys_exits.h
postfix/src/global/trace.c
postfix/src/global/trace.h
postfix/src/global/verify.c
postfix/src/global/verify.h
postfix/src/lmtp/Makefile.in
postfix/src/lmtp/lmtp.c
postfix/src/lmtp/lmtp.h
postfix/src/lmtp/lmtp_addr.c
postfix/src/lmtp/lmtp_addr.h
postfix/src/lmtp/lmtp_chat.c
postfix/src/lmtp/lmtp_connect.c
postfix/src/lmtp/lmtp_proto.c
postfix/src/lmtp/lmtp_sasl_proto.c
postfix/src/lmtp/lmtp_trouble.c
postfix/src/local/Makefile.in
postfix/src/local/alias.c
postfix/src/local/command.c
postfix/src/local/dotforward.c
postfix/src/local/file.c
postfix/src/local/forward.c
postfix/src/local/include.c
postfix/src/local/indirect.c
postfix/src/local/local.h
postfix/src/local/mailbox.c
postfix/src/local/maildir.c
postfix/src/local/recipient.c
postfix/src/local/resolve.c
postfix/src/local/token.c
postfix/src/local/unknown.c
postfix/src/master/Makefile.in
postfix/src/oqmgr/Makefile.in
postfix/src/oqmgr/qmgr.h
postfix/src/oqmgr/qmgr_bounce.c
postfix/src/oqmgr/qmgr_defer.c
postfix/src/oqmgr/qmgr_deliver.c
postfix/src/oqmgr/qmgr_message.c
postfix/src/oqmgr/qmgr_queue.c
postfix/src/oqmgr/qmgr_transport.c
postfix/src/pickup/Makefile.in
postfix/src/pipe/Makefile.in
postfix/src/pipe/pipe.c
postfix/src/postalias/Makefile.in
postfix/src/postcat/Makefile.in
postfix/src/postconf/Makefile.in
postfix/src/postdrop/Makefile.in
postfix/src/postfix/Makefile.in
postfix/src/postkick/Makefile.in
postfix/src/postlock/Makefile.in
postfix/src/postlock/postlock.c
postfix/src/postlog/Makefile.in
postfix/src/postmap/Makefile.in
postfix/src/postqueue/Makefile.in
postfix/src/postsuper/Makefile.in
postfix/src/proxymap/Makefile.in
postfix/src/qmgr/Makefile.in
postfix/src/qmgr/qmgr.h
postfix/src/qmgr/qmgr_bounce.c
postfix/src/qmgr/qmgr_defer.c
postfix/src/qmgr/qmgr_deliver.c
postfix/src/qmgr/qmgr_message.c
postfix/src/qmgr/qmgr_queue.c
postfix/src/qmgr/qmgr_transport.c
postfix/src/qmqpd/Makefile.in
postfix/src/scache/Makefile.in
postfix/src/sendmail/Makefile.in
postfix/src/showq/Makefile.in
postfix/src/smtp/Makefile.in
postfix/src/smtp/smtp.c
postfix/src/smtp/smtp.h
postfix/src/smtp/smtp_addr.c
postfix/src/smtp/smtp_addr.h
postfix/src/smtp/smtp_chat.c
postfix/src/smtp/smtp_connect.c
postfix/src/smtp/smtp_proto.c
postfix/src/smtp/smtp_rcpt.c
postfix/src/smtp/smtp_sasl_proto.c
postfix/src/smtp/smtp_session.c
postfix/src/smtp/smtp_trouble.c
postfix/src/smtpd/Makefile.in
postfix/src/smtpd/smtpd.c
postfix/src/smtpd/smtpd.h
postfix/src/smtpd/smtpd_acl.ref
postfix/src/smtpd/smtpd_chat.c
postfix/src/smtpd/smtpd_check.c
postfix/src/smtpd/smtpd_check.ref
postfix/src/smtpd/smtpd_check.ref2
postfix/src/smtpd/smtpd_check.ref4
postfix/src/smtpd/smtpd_exp.ref
postfix/src/smtpd/smtpd_proxy.c
postfix/src/smtpd/smtpd_sasl_glue.c
postfix/src/smtpd/smtpd_sasl_proto.c
postfix/src/smtpd/smtpd_state.c
postfix/src/smtpstone/Makefile.in
postfix/src/smtpstone/smtp-sink.c
postfix/src/spawn/Makefile.in
postfix/src/tls/Makefile.in
postfix/src/tlsmgr/Makefile.in
postfix/src/trivial-rewrite/Makefile.in
postfix/src/util/Makefile.in
postfix/src/util/dict_cidr.ref
postfix/src/util/dict_open.c
postfix/src/util/dict_pcre.c
postfix/src/util/dict_pcre.ref
postfix/src/util/dict_test.ref
postfix/src/util/host_port.ref
postfix/src/util/myaddrinfo.ref2
postfix/src/util/unescape.ref
postfix/src/verify/Makefile.in
postfix/src/virtual/Makefile.in
postfix/src/virtual/mailbox.c
postfix/src/virtual/maildir.c
postfix/src/virtual/unknown.c
postfix/src/virtual/virtual.h

index 7b958be895021bff51e63cc2e2729fd2ac51178d..06d5e25382dc3ce6a4b31bcd0cdf3e7cc76ea4f4 100644 (file)
@@ -20,6 +20,7 @@
 -TCFG_PARSER
 -TCIDR_MATCH
 -TCLEANUP_STATE
+-TCLEANUP_STAT_DETAIL
 -TCLIENT_LIST
 -TCLNT_STREAM
 -TCONFIG_BOOL_FN_TABLE
@@ -76,6 +77,8 @@
 -TDNS_REPLY
 -TDNS_RR
 -TDOMAIN_LIST
+-TDSN_SPLIT
+-TDSN_VSTRING
 -TEXPAND_ATTR
 -TFILE
 -TFORWARD_INFO
 -TSSL_SESSION
 -TSTRING_LIST
 -TSTRING_TABLE
--TSYS_EXITS_TABLE
+-TSYS_EXITS_DETAIL
 -TTLS_PRNG_SEED_INFO
 -TTLS_PRNG_SRC
 -TTLS_SCACHE
diff --git a/postfix/ENHANCED_STATUS_README b/postfix/ENHANCED_STATUS_README
new file mode 100644 (file)
index 0000000..73451f3
--- /dev/null
@@ -0,0 +1,61 @@
+Postfix enhanced status code implementation notes
+=================================================
+
+Enhanced status code support is implemented in stages. In the first
+stage, the goal is to minimize code changes (it's several hundred
+pages of context diffs already). For this reason, the pre-existing
+status variables (success, defer, etc.) are not updated atomically
+with the enhanced status code; instead, enhanced status codes are
+updated separately. This means one has to be careful when making
+updates to the code, so that things won't go out of sync.
+
+Specific issues that one should be aware of:
+
+- In the SMTP client, either update the enhanced status code and
+text whenever smtp_errno or resp->code are updated, or place an
+explicit comment that no update is needed.
+
+- In the SMTP client, don't worry about the first enhanced status
+digit when reporting failure to look up or connect to a host. For
+convenience, the SMTP client top-level code automatically changes
+it into '4' or '5' as appropriate.
+
+- The above two points also apply to the LMTP client; this delivery
+agent is on life support until its functionality is merged with the
+SMTP client.
+
+- In the SMTP server, don't worry about the first enhanced status
+digit when a restriction rejects access. For convenience, the
+smtpd_check_reject() routine automatically changes it into '4' or
+'5' as appropriate.
+
+- The pipe, local and virtual delivery agents never update the
+diagnostic text without also updating the enhanced status code. The
+main chore here is to choose appropriate enhanced status codes.
+
+- Don't rely on the system errno value after calling a routine that
+updates the enhanced status code upon failure. Use the enhanced
+status code (and diagnostic text) instead. Currently there are two
+exceptions to this rule: mail_copy() for historical reasons may or
+may not return explicit error reports (fixing this requires that
+pipe_command() be restructured); and the maildir delivery routines
+log a helpful warning when delivery fails with EACCES. This just
+happens to work because maildir needs no file locking.
+
+- Some low-level support routines update the diagnostic text but
+not the enhanced status code. To identify these, search for functions
+that are called with why->vstring as output parameter, and make
+sure that the caller updates the enhanced status code in all
+appropriate cases.
+
+- Avoid passing around strings that combine enhanced status code
+and diagnostic text, because the compiler can't help to enforce
+consistency.  Currently there are two exceptions to this rule: the
+cleanup server status reply, and the delivery agent status reply.
+Once these protocols are updated we can remove the dns_prepend()
+routine.
+
+- The bounce/defer/sent modules will catch the cases where an
+enhanced status code does not match the reject/defer/success status.
+These discrepancies are logged as a warning, and the enhanced status
+code is replaced by a generic one.
index 1a4ff531d39c3de0c624b83fdab24df5ecb0b5a1..7cc78da8ec8684b75102e7fc197a3ca9272bd26e 100644 (file)
@@ -10485,6 +10485,62 @@ Apologies for any names omitted.
        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?
@@ -10521,8 +10577,8 @@ Open problems:
        really try all the possibilities that one might expect to
        be tried. For now, this gotcha is documented in access(5).
 
-       Med: the TLS certificate verification depth parameters
-       never worked.
+       Med: the TLS certificate verification depth parameters never
+       worked.
 
        Med: eliminate the tls_info data structure.
 
@@ -10533,8 +10589,8 @@ Open problems:
 
        Low: make mail_addr_find() lookup configurable.
 
-       Low: update events.c so that 1-second timer requests do
-       not suffer from rounding errors. This is needed for 1-second
+       Low: update events.c so that 1-second timer requests do not
+       suffer from rounding errors. This is needed for 1-second
        SMTP session caching time limits. A 1-second interval would
        become arbitrarily short when an event is scheduled just
        before the current second rolls over.
@@ -10596,8 +10652,8 @@ Open problems:
 
        Low: all table lookups should consistently use internalized
        (unquoted) or externalized (quoted) forms as lookup keys.
-       smtpd, qmgr, local, etc. use unquoted address forms as
-       keys.  cleanup uses quoted forms.
+       smtpd, qmgr, local, etc. use unquoted address forms as keys.
+       cleanup uses quoted forms.
 
        Low: have a configurable list of errno values for mailbox
        or maildir delivery that result in deferral rather than
@@ -10606,9 +10662,9 @@ Open problems:
        Low: after reorganizing configuration parameters, add flags
        to all parameters whose value can be read from file.
 
-       Medium: need in-process caching for map lookups. LDAP
-       servers seem to need this in particular. Need a way to
-       expire cached results that are too old.
+       Medium: need in-process caching for map lookups. LDAP servers
+       seem to need this in particular. Need a way to expire cached
+       results that are too old.
 
        Low: generic showq protocol, to allow for more intelligent
        processing than just mailq. Maybe marry this with postsuper.
index 2f2638fd3fe1681c4d93d1b2ccc29ad634041d1f..3d2236971a7d6d34090ec1fe4ea9d0b70d30d250 100644 (file)
@@ -44,12 +44,19 @@ To build Postfix after you installed the Berkeley DB from http://
 www.sleepycat.com/, use something like:
 
     % make tidy
-    % make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB.3.1/include" \
-        AUXLIBS="-L/usr/local/BerkeleyDB.3.1/lib -ldb"
+    % make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+        AUXLIBS="-L/usr/local/BerkeleyDB/lib -ldb"
     % make
 
-The exact pathnames depend on the DB version that you installed. For example,
-Berkeley DB version 2 installs in /usr/local/BerkeleyDB.
+Solaris needs this:
+
+    % make tidy
+    % make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
+        AUXLIBS="-R/usr/local/BerkeleyDB/lib -L/usr/local/BerkeleyDB/lib -ldb"
+    % make
+
+The exact pathnames depend on the Berkeley DB version, and on how it was
+installed.
 
 Warning: the file format produced by Berkeley DB version 1 is not compatible
 with that of versions 2 and 3 (versions 2 and 3 have the same format). If you
index e5df963590704e51036abfa3c41a2da7d5b661a0..63b26e4a5890b4643250724df4c9eeec05a43789 100644 (file)
@@ -13,3 +13,36 @@ specifies the release date of a stable release or snapshot release.
 
 See RELEASE_NOTES-2.2 for changes introduced during the development
 of Postfix version 2.2.
+
+Incompatible changes with snapshot 20050327
+===========================================
+
+local(8) and virtual(8) now handle the same errors in the same way.
+This means that local(8) will defer some mail that it older versions
+would bounce, and that virtual(8) will bounce some mail that older
+versions would defer.
+
+Specifically, error codes EACCES, EAGAIN, ESTALE are soft (4.2.0)
+errors, ENOSPC is a soft (4.3.0) error, EDQUOT and EFBIG are hard
+(5.2.2) errors, and everything else is a hard (5.2.0) error.
+
+Major changes with snapshot 20050327
+====================================
+
+This release introduces support for RFC 1893 enhanced status codes.
+For example, status code "5.1.1" means "recipient unknown". Postfix
+recognizes enhanced status codes in remote server replies, and
+generates enhanced status codes when it responds to mail delivery
+requests. This improves the communication with mail clients that
+hide error messages from users.
+
+You can, but don't have to, specify RFC 1893 enhanced status codes
+in Postfix access maps or header/body_checks. Example:
+
+    REJECT 5.7.1 You can't go here from there
+
+(5.7.1 means "no authorization, message refused").  Enhanced status
+code support is also available in RBL reply templates.
+
+If you do specify an enhanced status code, Postfix will automatically
+change the first digit into a '4' or '5' as appropriate.
index a424ea59876835eadae2333d4b29ad519b6a189f..112b136642d95fc7483d8a5e2e0ebf1f80a37db6 100644 (file)
@@ -1,4 +1,4 @@
-# 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)
index 14b7d6f3c8433aba7ff54ab8e58a6b9466318fdb..b48bac2e24a701406f4871a0c10d7e83d86690c4 100644 (file)
@@ -1,4 +1,4 @@
-# HEADER_CHECKS(5)                                 HEADER_CHECKS(5)
+# HEADER_CHECKS(5)                                              HEADER_CHECKS(5)
 # 
 # NAME
 #        header_checks - Postfix built-in header/body inspection
 #               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)
index 514590933cda6e12eb31169b18fd52ad60e72a48..3c803d07777ee7bae6b121b760fe2bf1a93fdbc3 100644 (file)
@@ -72,15 +72,25 @@ falling apart. </p>
 <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
index efed8c1b9f1bc1afb2774858190d2f012bd285b5..0405bb40def5ee4640b3573819b8b8db40c24b1c 100644 (file)
@@ -173,6 +173,12 @@ ACCESS(5)                                                            ACCESS(5)
               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>
index 61b2f5494e3fec170d22e6c3ab673c56ab247084..29a31494397eac25905d2472123a96443a1f4f84 100644 (file)
@@ -17,13 +17,14 @@ DISCARD(8)                                                          DISCARD(8)
        requests from the queue manager. Each request specifies  a
        queue  file,  a sender address, a domain or host name that
        is treated as the reason  for  discarding  the  mail,  and
-       recipient  information.   This  program  expects to be run
-       from the <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.
 
@@ -31,8 +32,8 @@ DISCARD(8)                                                          DISCARD(8)
        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>
@@ -41,25 +42,25 @@ DISCARD(8)                                                          DISCARD(8)
 <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>
@@ -71,32 +72,32 @@ DISCARD(8)                                                          DISCARD(8)
               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>
@@ -109,7 +110,7 @@ DISCARD(8)                                                          DISCARD(8)
        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>
index 9dfadec5e2b3c7dd45efa1a6a0f35cb14843d689..cc17b34883a2283dd22a9912b8db9787a50d3787 100644 (file)
@@ -17,22 +17,23 @@ ERROR(8)                                                              ERROR(8)
        requests from the queue manager. Each request specifies  a
        queue  file,  a sender address, a domain or host name that
        is treated as the reason for non-delivery,  and  recipient
-       information.  This program expects to be run from the <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>
@@ -41,35 +42,35 @@ ERROR(8)                                                              ERROR(8)
 <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>
@@ -81,36 +82,36 @@ ERROR(8)                                                              ERROR(8)
               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>
@@ -123,7 +124,7 @@ ERROR(8)                                                              ERROR(8)
        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>
index 9354d3b2547da2f15cb352d91ece8a1085197130..d372a9019467706fb38fc9ff125cff02534e4e72 100644 (file)
@@ -249,27 +249,32 @@ HEADER_CHECKS(5)                                              HEADER_CHECKS(5)
               <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>.
 
@@ -277,11 +282,11 @@ HEADER_CHECKS(5)                                              HEADER_CHECKS(5)
        <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.
 
@@ -291,32 +296,32 @@ HEADER_CHECKS(5)                                              HEADER_CHECKS(5)
 
        <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:
@@ -354,7 +359,7 @@ HEADER_CHECKS(5)                                              HEADER_CHECKS(5)
        <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>
index 3ba0eddd41fe0be6ce6dcb65a2f491d3603ca7e9..2a36548b9589bec506a9d187606a001152a85aa6 100644 (file)
@@ -63,6 +63,7 @@ LMTP(8)                                                                LMTP(8)
        <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)
index 7e977c7a80a66bfe4441e62db82e5453ccf99058..cedecd4b3df7ae0e716855bc1ce1ad22bd78b9f3 100644 (file)
@@ -44,7 +44,7 @@ SMTP-SINK(1)                                                      SMTP-SINK(1)
 
        <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.
 
@@ -71,7 +71,7 @@ SMTP-SINK(1)                                                      SMTP-SINK(1)
 
        <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
index 95c51c2a9d3551367fcb1319ff8a6470574695ed..6d2f13dc8916cfcccc6a918a4099bfcd937e183a 100644 (file)
@@ -56,6 +56,7 @@ SMTP(8)                                                                SMTP(8)
        <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)
index a6362559e657d54054cb58926649b7b57ee92fab..7eedc495c2ef27d3b022c64a4c7ada42561aa3ad 100644 (file)
@@ -43,6 +43,7 @@ SMTPD(8)                                                              SMTPD(8)
        <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)
index e2b845449790cf1715cc96554277f6abc02f4f45..c24833afb2ecc4ee5069f6ffa42d69b7a588e0f9 100644 (file)
@@ -44,6 +44,7 @@ Disable XCLIENT support.
 Do not announce ESMTP support.
 .IP "\fB-f \fIcommand,command,...\fR"
 Reject the specified commands with a hard (5xx) error code.
+This option implies \fB-p\fR.
 .IP \fB-F\fR
 Disable XFORWARD support.
 .IP "\fB-h\fI hostname\fR"
@@ -63,6 +64,7 @@ Disconnect (without replying) after receiving one of the
 specified commands.
 .IP "\fB-r \fIcommand,command,...\fR"
 Reject the specified commands with a soft (4xx) error code.
+This option implies \fB-p\fR.
 .IP "\fB-s \fIcommand,command,...\fR"
 Log the named commands to syslogd.
 Examples of commands that can be logged are HELO, EHLO, LHLO, MAIL,
index 7f9cfb82174ee339ca6ac8607244a8b2643695e1..00d336bc7046ac7412df7f160af72967781cd195 100644 (file)
@@ -165,6 +165,11 @@ generated by address-based relay authorization schemes.
 .nf
 .ad
 .fi
+Postfix version 2.3 and later support enhanced status codes.
+When no code is specified at the beginning of the \fItext\fR
+below, Postfix inserts a default enhanced status code of "5.7.1"
+in the case of reject actions, and "4.7.1" in the case of
+defer actions.
 .IP "\fB4\fINN text\fR"
 .IP "\fB5\fINN text\fR"
 Reject the address etc. that matches the pattern, and respond with
index 71a48372dd2eaf0665b2bca73fce6b07eba6b797..bd794663d0818052bfcffb625e6cca1ccfe47c1c 100644 (file)
@@ -227,6 +227,11 @@ message.
 .sp
 Note: this action disables further header or body_checks inspection
 of the current message and affects all recipients.
+.sp
+Postfix version 2.3 and later support enhanced status codes.
+When no code is specified at the beginning of \fIoptional
+text...\fR, Postfix inserts a default enhanced status code of
+"5.7.1".
 .IP "\fBWARN \fIoptional text...\fR
 Log a warning with the \fIoptional text...\fR (or log a
 generic message) and inspect the next input line. This
index 19be8c370fe5dcb96daf89424e03e29095058963..215ee975dbd44e9f919f6592a8f5220757ee3a44 100644 (file)
@@ -17,6 +17,7 @@ delivery requests from
 the queue manager. Each request specifies a queue file, a sender
 address, a domain or host name that is treated as the reason for
 discarding the mail, and recipient information.
+The reason may be prefixed with an RFC 1893-compatible detail code.
 This program expects to be run from the \fBmaster\fR(8) process
 manager.
 
index 45df1316378a8b9e5f69245c195fcb1a67929c2b..a0f0b996f2c97968cc565c932ed84813388e07d8 100644 (file)
@@ -17,6 +17,7 @@ requests from
 the queue manager. Each request specifies a queue file, a sender
 address, a domain or host name that is treated as the reason for
 non-delivery, and recipient information.
+The reason may be prefixed with an RFC 1893-compatible detail code.
 This program expects to be run from the \fBmaster\fR(8) process
 manager.
 
index 725338f25e6520f049d1dd89339f69bf67ae2acd..13077bd88e809658da14c6749642d8bad39ceb8c 100644 (file)
@@ -60,6 +60,7 @@ RFC 1651 (SMTP service extensions)
 RFC 1652 (8bit-MIME transport)
 RFC 1870 (Message Size Declaration)
 RFC 2033 (LMTP protocol)
+RFC 2034 (Enhanced Error Codes)
 RFC 2554 (AUTH command)
 RFC 2821 (SMTP protocol)
 RFC 2920 (SMTP Pipelining)
index 136b509a82d78ecbf73e8d730d5e5d24cf837fb1..8cbc7ca51f0f26578e25a1cf87c831c222babec2 100644 (file)
@@ -57,6 +57,7 @@ RFC 1651 (SMTP service extensions)
 RFC 1652 (8bit-MIME transport)
 RFC 1870 (Message Size Declaration)
 RFC 2045 (MIME: Format of Internet Message Bodies)
+RFC 2034 (Enhanced Error Codes)
 RFC 2046 (MIME: Media Types)
 RFC 2554 (AUTH command)
 RFC 2821 (SMTP protocol)
index 1a5b2b35ae897081d685fd7fd6b26b01cc99dac4..f6fb56d4e0be03d6449385321336a3adedf87667 100644 (file)
@@ -46,6 +46,7 @@ RFC 1652 (8bit-MIME transport)
 RFC 1869 (SMTP service extensions)
 RFC 1870 (Message Size Declaration)
 RFC 1985 (ETRN command)
+RFC 2034 (Enhanced Error Codes)
 RFC 2554 (AUTH command)
 RFC 2821 (SMTP protocol)
 RFC 2920 (SMTP Pipelining)
index 886789887eb5a8ce9527e9b4d3c0383bd2a497a1..505cbba8cda6ec491929d0ab07faa158ff4e4433 100644 (file)
@@ -72,15 +72,25 @@ http://www.sleepycat.com/, use something like: </p>
 <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
index 405ba1f3f60171271c19c08f6da42a6f0ceb1277..783786fdf89ba392bc093598a15d794d9fcf048c 100644 (file)
 # 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
index 289acac2584d0361d9cd92f5df6e2498641ac322..51220d4e60393de7019fcc7c92bd953484ebd37c 100644 (file)
 # .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
index 5e4035fb1bfe790fc4b01e20fbba71dc807dbfa1..5ff109e3a2c70f9d569e461d3684d06b29fd0357 100644 (file)
@@ -47,26 +47,27 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-anvil.o: anvil.c
-anvil.o: ../../include/sys_defs.h
-anvil.o: ../../include/msg.h
-anvil.o: ../../include/mymalloc.h
-anvil.o: ../../include/htable.h
-anvil.o: ../../include/stringops.h
-anvil.o: ../../include/vstring.h
-anvil.o: ../../include/vbuf.h
+anvil.o: ../../include/anvil_clnt.h
+anvil.o: ../../include/attr.h
+anvil.o: ../../include/attr_clnt.h
 anvil.o: ../../include/events.h
+anvil.o: ../../include/htable.h
+anvil.o: ../../include/iostuff.h
 anvil.o: ../../include/mail_conf.h
 anvil.o: ../../include/mail_params.h
 anvil.o: ../../include/mail_proto.h
-anvil.o: ../../include/vstream.h
-anvil.o: ../../include/iostuff.h
-anvil.o: ../../include/attr.h
-anvil.o: ../../include/anvil_clnt.h
-anvil.o: ../../include/attr_clnt.h
 anvil.o: ../../include/mail_server.h
+anvil.o: ../../include/msg.h
+anvil.o: ../../include/mymalloc.h
+anvil.o: ../../include/stringops.h
+anvil.o: ../../include/sys_defs.h
+anvil.o: ../../include/vbuf.h
+anvil.o: ../../include/vstream.h
+anvil.o: ../../include/vstring.h
+anvil.o: anvil.c
index 7c802a6da8015167dca3849f9226ad8ed81ce18e..1d89b537be9e5b9bce3bd51f63f752e995f6c32d 100644 (file)
@@ -52,172 +52,173 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-bounce.o: bounce.c
-bounce.o: ../../include/sys_defs.h
-bounce.o: ../../include/msg.h
-bounce.o: ../../include/vstring.h
-bounce.o: ../../include/vbuf.h
-bounce.o: ../../include/vstream.h
-bounce.o: ../../include/stringops.h
-bounce.o: ../../include/mail_proto.h
-bounce.o: ../../include/iostuff.h
 bounce.o: ../../include/attr.h
-bounce.o: ../../include/mail_queue.h
-bounce.o: ../../include/mail_params.h
-bounce.o: ../../include/mail_conf.h
 bounce.o: ../../include/bounce.h
+bounce.o: ../../include/bounce_log.h
 bounce.o: ../../include/deliver_request.h
-bounce.o: ../../include/recipient_list.h
+bounce.o: ../../include/iostuff.h
 bounce.o: ../../include/mail_addr.h
+bounce.o: ../../include/mail_conf.h
+bounce.o: ../../include/mail_params.h
+bounce.o: ../../include/mail_proto.h
+bounce.o: ../../include/mail_queue.h
 bounce.o: ../../include/mail_server.h
+bounce.o: ../../include/msg.h
+bounce.o: ../../include/recipient_list.h
+bounce.o: ../../include/stringops.h
+bounce.o: ../../include/sys_defs.h
+bounce.o: ../../include/vbuf.h
+bounce.o: ../../include/vstream.h
+bounce.o: ../../include/vstring.h
+bounce.o: bounce.c
 bounce.o: bounce_service.h
-bounce.o: ../../include/bounce_log.h
-bounce_append_service.o: bounce_append_service.c
-bounce_append_service.o: ../../include/sys_defs.h
-bounce_append_service.o: ../../include/msg.h
-bounce_append_service.o: ../../include/vstring.h
-bounce_append_service.o: ../../include/vbuf.h
-bounce_append_service.o: ../../include/vstream.h
-bounce_append_service.o: ../../include/stringops.h
+bounce_append_service.o: ../../include/attr.h
+bounce_append_service.o: ../../include/bounce_log.h
+bounce_append_service.o: ../../include/deliver_flock.h
+bounce_append_service.o: ../../include/iostuff.h
 bounce_append_service.o: ../../include/mail_params.h
+bounce_append_service.o: ../../include/mail_proto.h
 bounce_append_service.o: ../../include/mail_queue.h
+bounce_append_service.o: ../../include/msg.h
+bounce_append_service.o: ../../include/myflock.h
 bounce_append_service.o: ../../include/quote_822_local.h
 bounce_append_service.o: ../../include/quote_flags.h
-bounce_append_service.o: ../../include/deliver_flock.h
-bounce_append_service.o: ../../include/myflock.h
-bounce_append_service.o: ../../include/mail_proto.h
-bounce_append_service.o: ../../include/iostuff.h
-bounce_append_service.o: ../../include/attr.h
+bounce_append_service.o: ../../include/stringops.h
+bounce_append_service.o: ../../include/sys_defs.h
+bounce_append_service.o: ../../include/vbuf.h
+bounce_append_service.o: ../../include/vstream.h
+bounce_append_service.o: ../../include/vstring.h
+bounce_append_service.o: bounce_append_service.c
 bounce_append_service.o: bounce_service.h
-bounce_append_service.o: ../../include/bounce_log.h
-bounce_cleanup.o: bounce_cleanup.c
-bounce_cleanup.o: ../../include/sys_defs.h
+bounce_cleanup.o: ../../include/bounce_log.h
+bounce_cleanup.o: ../../include/mail_queue.h
 bounce_cleanup.o: ../../include/msg.h
 bounce_cleanup.o: ../../include/mymalloc.h
-bounce_cleanup.o: ../../include/vstring.h
+bounce_cleanup.o: ../../include/sys_defs.h
 bounce_cleanup.o: ../../include/vbuf.h
-bounce_cleanup.o: ../../include/mail_queue.h
 bounce_cleanup.o: ../../include/vstream.h
+bounce_cleanup.o: ../../include/vstring.h
+bounce_cleanup.o: bounce_cleanup.c
 bounce_cleanup.o: bounce_service.h
-bounce_cleanup.o: ../../include/bounce_log.h
-bounce_notify_service.o: bounce_notify_service.c
-bounce_notify_service.o: ../../include/sys_defs.h
-bounce_notify_service.o: ../../include/msg.h
-bounce_notify_service.o: ../../include/vstream.h
-bounce_notify_service.o: ../../include/vbuf.h
-bounce_notify_service.o: ../../include/name_mask.h
-bounce_notify_service.o: ../../include/mail_params.h
-bounce_notify_service.o: ../../include/mail_queue.h
-bounce_notify_service.o: ../../include/vstring.h
-bounce_notify_service.o: ../../include/post_mail.h
+bounce_notify_service.o: ../../include/bounce.h
+bounce_notify_service.o: ../../include/bounce_log.h
 bounce_notify_service.o: ../../include/cleanup_user.h
+bounce_notify_service.o: ../../include/deliver_request.h
 bounce_notify_service.o: ../../include/mail_addr.h
 bounce_notify_service.o: ../../include/mail_error.h
-bounce_notify_service.o: ../../include/bounce.h
-bounce_notify_service.o: ../../include/deliver_request.h
+bounce_notify_service.o: ../../include/mail_params.h
+bounce_notify_service.o: ../../include/mail_queue.h
+bounce_notify_service.o: ../../include/msg.h
+bounce_notify_service.o: ../../include/name_mask.h
+bounce_notify_service.o: ../../include/post_mail.h
 bounce_notify_service.o: ../../include/recipient_list.h
+bounce_notify_service.o: ../../include/sys_defs.h
+bounce_notify_service.o: ../../include/vbuf.h
+bounce_notify_service.o: ../../include/vstream.h
+bounce_notify_service.o: ../../include/vstring.h
+bounce_notify_service.o: bounce_notify_service.c
 bounce_notify_service.o: bounce_service.h
-bounce_notify_service.o: ../../include/bounce_log.h
-bounce_notify_util.o: bounce_notify_util.c
-bounce_notify_util.o: ../../include/sys_defs.h
-bounce_notify_util.o: ../../include/msg.h
-bounce_notify_util.o: ../../include/mymalloc.h
+bounce_notify_util.o: ../../include/attr.h
+bounce_notify_util.o: ../../include/bounce_log.h
+bounce_notify_util.o: ../../include/cleanup_user.h
+bounce_notify_util.o: ../../include/deliver_completed.h
 bounce_notify_util.o: ../../include/events.h
-bounce_notify_util.o: ../../include/vstring.h
-bounce_notify_util.o: ../../include/vbuf.h
-bounce_notify_util.o: ../../include/vstream.h
+bounce_notify_util.o: ../../include/iostuff.h
+bounce_notify_util.o: ../../include/is_header.h
+bounce_notify_util.o: ../../include/lex_822.h
 bounce_notify_util.o: ../../include/line_wrap.h
-bounce_notify_util.o: ../../include/stringops.h
-bounce_notify_util.o: ../../include/xtext.h
-bounce_notify_util.o: ../../include/myflock.h
+bounce_notify_util.o: ../../include/mail_addr.h
+bounce_notify_util.o: ../../include/mail_date.h
+bounce_notify_util.o: ../../include/mail_error.h
+bounce_notify_util.o: ../../include/mail_params.h
+bounce_notify_util.o: ../../include/mail_proto.h
 bounce_notify_util.o: ../../include/mail_queue.h
+bounce_notify_util.o: ../../include/msg.h
+bounce_notify_util.o: ../../include/myflock.h
+bounce_notify_util.o: ../../include/mymalloc.h
+bounce_notify_util.o: ../../include/name_mask.h
+bounce_notify_util.o: ../../include/post_mail.h
 bounce_notify_util.o: ../../include/quote_822_local.h
 bounce_notify_util.o: ../../include/quote_flags.h
-bounce_notify_util.o: ../../include/mail_params.h
-bounce_notify_util.o: ../../include/is_header.h
-bounce_notify_util.o: ../../include/record.h
 bounce_notify_util.o: ../../include/rec_type.h
-bounce_notify_util.o: ../../include/post_mail.h
-bounce_notify_util.o: ../../include/cleanup_user.h
-bounce_notify_util.o: ../../include/mail_addr.h
-bounce_notify_util.o: ../../include/mail_error.h
-bounce_notify_util.o: ../../include/name_mask.h
-bounce_notify_util.o: ../../include/bounce_log.h
-bounce_notify_util.o: ../../include/mail_date.h
-bounce_notify_util.o: ../../include/mail_proto.h
-bounce_notify_util.o: ../../include/iostuff.h
-bounce_notify_util.o: ../../include/attr.h
-bounce_notify_util.o: ../../include/lex_822.h
-bounce_notify_util.o: ../../include/deliver_completed.h
+bounce_notify_util.o: ../../include/record.h
+bounce_notify_util.o: ../../include/stringops.h
+bounce_notify_util.o: ../../include/sys_defs.h
+bounce_notify_util.o: ../../include/vbuf.h
+bounce_notify_util.o: ../../include/vstream.h
+bounce_notify_util.o: ../../include/vstring.h
+bounce_notify_util.o: ../../include/xtext.h
+bounce_notify_util.o: bounce_notify_util.c
 bounce_notify_util.o: bounce_service.h
-bounce_notify_verp.o: bounce_notify_verp.c
-bounce_notify_verp.o: ../../include/sys_defs.h
-bounce_notify_verp.o: ../../include/msg.h
-bounce_notify_verp.o: ../../include/vstream.h
-bounce_notify_verp.o: ../../include/vbuf.h
-bounce_notify_verp.o: ../../include/name_mask.h
-bounce_notify_verp.o: ../../include/mail_params.h
-bounce_notify_verp.o: ../../include/mail_queue.h
-bounce_notify_verp.o: ../../include/vstring.h
-bounce_notify_verp.o: ../../include/post_mail.h
+bounce_notify_verp.o: ../../include/bounce.h
+bounce_notify_verp.o: ../../include/bounce_log.h
 bounce_notify_verp.o: ../../include/cleanup_user.h
+bounce_notify_verp.o: ../../include/deliver_request.h
 bounce_notify_verp.o: ../../include/mail_addr.h
 bounce_notify_verp.o: ../../include/mail_error.h
-bounce_notify_verp.o: ../../include/verp_sender.h
-bounce_notify_verp.o: ../../include/bounce.h
-bounce_notify_verp.o: ../../include/deliver_request.h
+bounce_notify_verp.o: ../../include/mail_params.h
+bounce_notify_verp.o: ../../include/mail_queue.h
+bounce_notify_verp.o: ../../include/msg.h
+bounce_notify_verp.o: ../../include/name_mask.h
+bounce_notify_verp.o: ../../include/post_mail.h
 bounce_notify_verp.o: ../../include/recipient_list.h
+bounce_notify_verp.o: ../../include/sys_defs.h
+bounce_notify_verp.o: ../../include/vbuf.h
+bounce_notify_verp.o: ../../include/verp_sender.h
+bounce_notify_verp.o: ../../include/vstream.h
+bounce_notify_verp.o: ../../include/vstring.h
+bounce_notify_verp.o: bounce_notify_verp.c
 bounce_notify_verp.o: bounce_service.h
-bounce_notify_verp.o: ../../include/bounce_log.h
-bounce_one_service.o: bounce_one_service.c
-bounce_one_service.o: ../../include/sys_defs.h
-bounce_one_service.o: ../../include/msg.h
-bounce_one_service.o: ../../include/vstream.h
-bounce_one_service.o: ../../include/vbuf.h
-bounce_one_service.o: ../../include/name_mask.h
-bounce_one_service.o: ../../include/mail_params.h
-bounce_one_service.o: ../../include/post_mail.h
+bounce_one_service.o: ../../include/bounce.h
+bounce_one_service.o: ../../include/bounce_log.h
 bounce_one_service.o: ../../include/cleanup_user.h
+bounce_one_service.o: ../../include/deliver_request.h
 bounce_one_service.o: ../../include/mail_addr.h
 bounce_one_service.o: ../../include/mail_error.h
-bounce_one_service.o: ../../include/bounce.h
-bounce_one_service.o: ../../include/deliver_request.h
-bounce_one_service.o: ../../include/vstring.h
+bounce_one_service.o: ../../include/mail_params.h
+bounce_one_service.o: ../../include/msg.h
+bounce_one_service.o: ../../include/name_mask.h
+bounce_one_service.o: ../../include/post_mail.h
 bounce_one_service.o: ../../include/recipient_list.h
+bounce_one_service.o: ../../include/sys_defs.h
+bounce_one_service.o: ../../include/vbuf.h
+bounce_one_service.o: ../../include/vstream.h
+bounce_one_service.o: ../../include/vstring.h
+bounce_one_service.o: bounce_one_service.c
 bounce_one_service.o: bounce_service.h
-bounce_one_service.o: ../../include/bounce_log.h
-bounce_trace_service.o: bounce_trace_service.c
-bounce_trace_service.o: ../../include/sys_defs.h
-bounce_trace_service.o: ../../include/msg.h
-bounce_trace_service.o: ../../include/vstream.h
-bounce_trace_service.o: ../../include/vbuf.h
-bounce_trace_service.o: ../../include/mail_params.h
-bounce_trace_service.o: ../../include/mail_queue.h
-bounce_trace_service.o: ../../include/vstring.h
-bounce_trace_service.o: ../../include/post_mail.h
+bounce_trace_service.o: ../../include/bounce_log.h
 bounce_trace_service.o: ../../include/cleanup_user.h
 bounce_trace_service.o: ../../include/mail_addr.h
 bounce_trace_service.o: ../../include/mail_error.h
+bounce_trace_service.o: ../../include/mail_params.h
+bounce_trace_service.o: ../../include/mail_queue.h
+bounce_trace_service.o: ../../include/msg.h
 bounce_trace_service.o: ../../include/name_mask.h
+bounce_trace_service.o: ../../include/post_mail.h
+bounce_trace_service.o: ../../include/sys_defs.h
+bounce_trace_service.o: ../../include/vbuf.h
+bounce_trace_service.o: ../../include/vstream.h
+bounce_trace_service.o: ../../include/vstring.h
 bounce_trace_service.o: bounce_service.h
-bounce_trace_service.o: ../../include/bounce_log.h
-bounce_warn_service.o: bounce_warn_service.c
-bounce_warn_service.o: ../../include/sys_defs.h
-bounce_warn_service.o: ../../include/msg.h
-bounce_warn_service.o: ../../include/vstream.h
-bounce_warn_service.o: ../../include/vbuf.h
-bounce_warn_service.o: ../../include/name_mask.h
-bounce_warn_service.o: ../../include/mail_params.h
-bounce_warn_service.o: ../../include/mail_queue.h
-bounce_warn_service.o: ../../include/vstring.h
-bounce_warn_service.o: ../../include/post_mail.h
+bounce_trace_service.o: bounce_trace_service.c
+bounce_warn_service.o: ../../include/bounce_log.h
 bounce_warn_service.o: ../../include/cleanup_user.h
 bounce_warn_service.o: ../../include/mail_addr.h
 bounce_warn_service.o: ../../include/mail_error.h
+bounce_warn_service.o: ../../include/mail_params.h
+bounce_warn_service.o: ../../include/mail_queue.h
+bounce_warn_service.o: ../../include/msg.h
+bounce_warn_service.o: ../../include/name_mask.h
+bounce_warn_service.o: ../../include/post_mail.h
+bounce_warn_service.o: ../../include/sys_defs.h
+bounce_warn_service.o: ../../include/vbuf.h
+bounce_warn_service.o: ../../include/vstream.h
+bounce_warn_service.o: ../../include/vstring.h
 bounce_warn_service.o: bounce_service.h
-bounce_warn_service.o: ../../include/bounce_log.h
+bounce_warn_service.o: bounce_warn_service.c
index a72b92c9567884574a40e34c33aa29a1bdfc8f1d..69970cea61b4ec06b14818c85220731e1614d5b2 100644 (file)
@@ -6,12 +6,14 @@
 /* SYNOPSIS
 /*     #include "bounce_service.h"
 /*
-/*     int     bounce_append_service(flags, queue_id, orig_rcpt, recipient,
-/*                                     status, action, why)
+/*     int     bounce_append_service(flags, service, queue_id, orig_rcpt,
+/*                                     recipient, offset, status, action, why)
 /*     int     flags;
+/*     char    *service;
 /*     char    *queue_id;
 /*     char    *orig_rcpt;
 /*     char    *recipient;
+/*     long    offset;
 /*     char    *status;
 /*     char    *action;
 /*     char    *why;
index 233baab1677a4d314853a18bfb7f4df0bd1b4d3b..66212f8e59c4eeeb7edaee9d0ecdec349bac4b60 100644 (file)
@@ -76,428 +76,431 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-cleanup.o: cleanup.c
-cleanup.o: ../../include/sys_defs.h
-cleanup.o: ../../include/msg.h
-cleanup.o: ../../include/vstring.h
-cleanup.o: ../../include/vbuf.h
-cleanup.o: ../../include/dict.h
-cleanup.o: ../../include/vstream.h
 cleanup.o: ../../include/argv.h
-cleanup.o: ../../include/mail_conf.h
+cleanup.o: ../../include/attr.h
+cleanup.o: ../../include/been_here.h
 cleanup.o: ../../include/cleanup_user.h
-cleanup.o: ../../include/mail_proto.h
+cleanup.o: ../../include/dict.h
+cleanup.o: ../../include/header_opts.h
+cleanup.o: ../../include/htable.h
 cleanup.o: ../../include/iostuff.h
-cleanup.o: ../../include/attr.h
+cleanup.o: ../../include/mail_conf.h
 cleanup.o: ../../include/mail_params.h
-cleanup.o: ../../include/record.h
-cleanup.o: ../../include/rec_type.h
+cleanup.o: ../../include/mail_proto.h
 cleanup.o: ../../include/mail_server.h
-cleanup.o: cleanup.h
-cleanup.o: ../../include/nvtable.h
-cleanup.o: ../../include/htable.h
-cleanup.o: ../../include/mymalloc.h
-cleanup.o: ../../include/maps.h
-cleanup.o: ../../include/tok822.h
-cleanup.o: ../../include/resolve_clnt.h
-cleanup.o: ../../include/been_here.h
 cleanup.o: ../../include/mail_stream.h
-cleanup.o: ../../include/mime_state.h
-cleanup.o: ../../include/header_opts.h
-cleanup.o: ../../include/string_list.h
+cleanup.o: ../../include/maps.h
 cleanup.o: ../../include/match_list.h
 cleanup.o: ../../include/match_ops.h
-cleanup_addr.o: cleanup_addr.c
-cleanup_addr.o: ../../include/sys_defs.h
-cleanup_addr.o: ../../include/msg.h
-cleanup_addr.o: ../../include/vstring.h
-cleanup_addr.o: ../../include/vbuf.h
-cleanup_addr.o: ../../include/vstream.h
-cleanup_addr.o: ../../include/mymalloc.h
-cleanup_addr.o: ../../include/stringops.h
-cleanup_addr.o: ../../include/rec_type.h
+cleanup.o: ../../include/mime_state.h
+cleanup.o: ../../include/msg.h
+cleanup.o: ../../include/mymalloc.h
+cleanup.o: ../../include/nvtable.h
+cleanup.o: ../../include/rec_type.h
+cleanup.o: ../../include/record.h
+cleanup.o: ../../include/resolve_clnt.h
+cleanup.o: ../../include/string_list.h
+cleanup.o: ../../include/sys_defs.h
+cleanup.o: ../../include/tok822.h
+cleanup.o: ../../include/vbuf.h
+cleanup.o: ../../include/vstream.h
+cleanup.o: ../../include/vstring.h
+cleanup.o: cleanup.c
+cleanup.o: cleanup.h
+cleanup_addr.o: ../../include/argv.h
+cleanup_addr.o: ../../include/attr.h
+cleanup_addr.o: ../../include/been_here.h
+cleanup_addr.o: ../../include/canon_addr.h
 cleanup_addr.o: ../../include/cleanup_user.h
-cleanup_addr.o: ../../include/mail_params.h
+cleanup_addr.o: ../../include/dict.h
 cleanup_addr.o: ../../include/ext_prop.h
+cleanup_addr.o: ../../include/header_opts.h
+cleanup_addr.o: ../../include/htable.h
+cleanup_addr.o: ../../include/iostuff.h
 cleanup_addr.o: ../../include/mail_addr.h
-cleanup_addr.o: ../../include/canon_addr.h
 cleanup_addr.o: ../../include/mail_addr_find.h
-cleanup_addr.o: ../../include/maps.h
-cleanup_addr.o: ../../include/dict.h
-cleanup_addr.o: ../../include/argv.h
+cleanup_addr.o: ../../include/mail_conf.h
+cleanup_addr.o: ../../include/mail_params.h
 cleanup_addr.o: ../../include/mail_proto.h
-cleanup_addr.o: ../../include/iostuff.h
-cleanup_addr.o: ../../include/attr.h
-cleanup_addr.o: cleanup.h
-cleanup_addr.o: ../../include/nvtable.h
-cleanup_addr.o: ../../include/htable.h
-cleanup_addr.o: ../../include/tok822.h
-cleanup_addr.o: ../../include/resolve_clnt.h
-cleanup_addr.o: ../../include/been_here.h
 cleanup_addr.o: ../../include/mail_stream.h
-cleanup_addr.o: ../../include/mail_conf.h
-cleanup_addr.o: ../../include/mime_state.h
-cleanup_addr.o: ../../include/header_opts.h
-cleanup_addr.o: ../../include/string_list.h
+cleanup_addr.o: ../../include/maps.h
 cleanup_addr.o: ../../include/match_list.h
 cleanup_addr.o: ../../include/match_ops.h
-cleanup_api.o: cleanup_api.c
-cleanup_api.o: ../../include/sys_defs.h
-cleanup_api.o: ../../include/msg.h
-cleanup_api.o: ../../include/vstring.h
-cleanup_api.o: ../../include/vbuf.h
-cleanup_api.o: ../../include/mymalloc.h
-cleanup_api.o: ../../include/cleanup_user.h
-cleanup_api.o: ../../include/mail_queue.h
-cleanup_api.o: ../../include/vstream.h
-cleanup_api.o: ../../include/mail_proto.h
-cleanup_api.o: ../../include/iostuff.h
+cleanup_addr.o: ../../include/mime_state.h
+cleanup_addr.o: ../../include/msg.h
+cleanup_addr.o: ../../include/mymalloc.h
+cleanup_addr.o: ../../include/nvtable.h
+cleanup_addr.o: ../../include/rec_type.h
+cleanup_addr.o: ../../include/resolve_clnt.h
+cleanup_addr.o: ../../include/string_list.h
+cleanup_addr.o: ../../include/stringops.h
+cleanup_addr.o: ../../include/sys_defs.h
+cleanup_addr.o: ../../include/tok822.h
+cleanup_addr.o: ../../include/vbuf.h
+cleanup_addr.o: ../../include/vstream.h
+cleanup_addr.o: ../../include/vstring.h
+cleanup_addr.o: cleanup.h
+cleanup_addr.o: cleanup_addr.c
+cleanup_api.o: ../../include/argv.h
 cleanup_api.o: ../../include/attr.h
+cleanup_api.o: ../../include/been_here.h
 cleanup_api.o: ../../include/bounce.h
+cleanup_api.o: ../../include/cleanup_user.h
 cleanup_api.o: ../../include/deliver_request.h
-cleanup_api.o: ../../include/recipient_list.h
-cleanup_api.o: ../../include/mail_params.h
-cleanup_api.o: ../../include/mail_stream.h
+cleanup_api.o: ../../include/dict.h
+cleanup_api.o: ../../include/dsn_util.h
+cleanup_api.o: ../../include/header_opts.h
 cleanup_api.o: ../../include/hold_message.h
-cleanup_api.o: cleanup.h
-cleanup_api.o: ../../include/argv.h
-cleanup_api.o: ../../include/nvtable.h
 cleanup_api.o: ../../include/htable.h
-cleanup_api.o: ../../include/maps.h
-cleanup_api.o: ../../include/dict.h
-cleanup_api.o: ../../include/tok822.h
-cleanup_api.o: ../../include/resolve_clnt.h
-cleanup_api.o: ../../include/been_here.h
+cleanup_api.o: ../../include/iostuff.h
 cleanup_api.o: ../../include/mail_conf.h
-cleanup_api.o: ../../include/mime_state.h
-cleanup_api.o: ../../include/header_opts.h
-cleanup_api.o: ../../include/string_list.h
+cleanup_api.o: ../../include/mail_params.h
+cleanup_api.o: ../../include/mail_proto.h
+cleanup_api.o: ../../include/mail_queue.h
+cleanup_api.o: ../../include/mail_stream.h
+cleanup_api.o: ../../include/maps.h
 cleanup_api.o: ../../include/match_list.h
 cleanup_api.o: ../../include/match_ops.h
-cleanup_envelope.o: cleanup_envelope.c
-cleanup_envelope.o: ../../include/sys_defs.h
-cleanup_envelope.o: ../../include/msg.h
-cleanup_envelope.o: ../../include/vstring.h
-cleanup_envelope.o: ../../include/vbuf.h
-cleanup_envelope.o: ../../include/vstream.h
-cleanup_envelope.o: ../../include/mymalloc.h
-cleanup_envelope.o: ../../include/stringops.h
-cleanup_envelope.o: ../../include/nvtable.h
-cleanup_envelope.o: ../../include/htable.h
-cleanup_envelope.o: ../../include/record.h
-cleanup_envelope.o: ../../include/rec_type.h
+cleanup_api.o: ../../include/mime_state.h
+cleanup_api.o: ../../include/msg.h
+cleanup_api.o: ../../include/mymalloc.h
+cleanup_api.o: ../../include/nvtable.h
+cleanup_api.o: ../../include/recipient_list.h
+cleanup_api.o: ../../include/resolve_clnt.h
+cleanup_api.o: ../../include/string_list.h
+cleanup_api.o: ../../include/sys_defs.h
+cleanup_api.o: ../../include/tok822.h
+cleanup_api.o: ../../include/vbuf.h
+cleanup_api.o: ../../include/vstream.h
+cleanup_api.o: ../../include/vstring.h
+cleanup_api.o: cleanup.h
+cleanup_api.o: cleanup_api.c
+cleanup_envelope.o: ../../include/argv.h
+cleanup_envelope.o: ../../include/attr.h
+cleanup_envelope.o: ../../include/been_here.h
 cleanup_envelope.o: ../../include/cleanup_user.h
-cleanup_envelope.o: ../../include/qmgr_user.h
+cleanup_envelope.o: ../../include/dict.h
+cleanup_envelope.o: ../../include/header_opts.h
+cleanup_envelope.o: ../../include/htable.h
+cleanup_envelope.o: ../../include/iostuff.h
+cleanup_envelope.o: ../../include/mail_conf.h
 cleanup_envelope.o: ../../include/mail_params.h
-cleanup_envelope.o: ../../include/verp_sender.h
 cleanup_envelope.o: ../../include/mail_proto.h
-cleanup_envelope.o: ../../include/iostuff.h
-cleanup_envelope.o: ../../include/attr.h
-cleanup_envelope.o: cleanup.h
-cleanup_envelope.o: ../../include/argv.h
-cleanup_envelope.o: ../../include/maps.h
-cleanup_envelope.o: ../../include/dict.h
-cleanup_envelope.o: ../../include/tok822.h
-cleanup_envelope.o: ../../include/resolve_clnt.h
-cleanup_envelope.o: ../../include/been_here.h
 cleanup_envelope.o: ../../include/mail_stream.h
-cleanup_envelope.o: ../../include/mail_conf.h
-cleanup_envelope.o: ../../include/mime_state.h
-cleanup_envelope.o: ../../include/header_opts.h
-cleanup_envelope.o: ../../include/string_list.h
+cleanup_envelope.o: ../../include/maps.h
 cleanup_envelope.o: ../../include/match_list.h
 cleanup_envelope.o: ../../include/match_ops.h
-cleanup_extracted.o: cleanup_extracted.c
-cleanup_extracted.o: ../../include/sys_defs.h
+cleanup_envelope.o: ../../include/mime_state.h
+cleanup_envelope.o: ../../include/msg.h
+cleanup_envelope.o: ../../include/mymalloc.h
+cleanup_envelope.o: ../../include/nvtable.h
+cleanup_envelope.o: ../../include/qmgr_user.h
+cleanup_envelope.o: ../../include/rec_type.h
+cleanup_envelope.o: ../../include/record.h
+cleanup_envelope.o: ../../include/resolve_clnt.h
+cleanup_envelope.o: ../../include/string_list.h
+cleanup_envelope.o: ../../include/stringops.h
+cleanup_envelope.o: ../../include/sys_defs.h
+cleanup_envelope.o: ../../include/tok822.h
+cleanup_envelope.o: ../../include/vbuf.h
+cleanup_envelope.o: ../../include/verp_sender.h
+cleanup_envelope.o: ../../include/vstream.h
+cleanup_envelope.o: ../../include/vstring.h
+cleanup_envelope.o: cleanup.h
+cleanup_envelope.o: cleanup_envelope.c
+cleanup_extracted.o: ../../include/argv.h
+cleanup_extracted.o: ../../include/attr.h
+cleanup_extracted.o: ../../include/been_here.h
+cleanup_extracted.o: ../../include/cleanup_user.h
+cleanup_extracted.o: ../../include/dict.h
+cleanup_extracted.o: ../../include/header_opts.h
+cleanup_extracted.o: ../../include/htable.h
+cleanup_extracted.o: ../../include/iostuff.h
+cleanup_extracted.o: ../../include/mail_conf.h
+cleanup_extracted.o: ../../include/mail_params.h
+cleanup_extracted.o: ../../include/mail_proto.h
+cleanup_extracted.o: ../../include/mail_stream.h
+cleanup_extracted.o: ../../include/maps.h
+cleanup_extracted.o: ../../include/match_list.h
+cleanup_extracted.o: ../../include/match_ops.h
+cleanup_extracted.o: ../../include/mime_state.h
 cleanup_extracted.o: ../../include/msg.h
-cleanup_extracted.o: ../../include/vstring.h
-cleanup_extracted.o: ../../include/vbuf.h
-cleanup_extracted.o: ../../include/vstream.h
 cleanup_extracted.o: ../../include/mymalloc.h
 cleanup_extracted.o: ../../include/nvtable.h
-cleanup_extracted.o: ../../include/htable.h
-cleanup_extracted.o: ../../include/cleanup_user.h
 cleanup_extracted.o: ../../include/qmgr_user.h
-cleanup_extracted.o: ../../include/record.h
 cleanup_extracted.o: ../../include/rec_type.h
-cleanup_extracted.o: ../../include/mail_params.h
-cleanup_extracted.o: ../../include/mail_proto.h
-cleanup_extracted.o: ../../include/iostuff.h
-cleanup_extracted.o: ../../include/attr.h
-cleanup_extracted.o: cleanup.h
-cleanup_extracted.o: ../../include/argv.h
-cleanup_extracted.o: ../../include/maps.h
-cleanup_extracted.o: ../../include/dict.h
-cleanup_extracted.o: ../../include/tok822.h
+cleanup_extracted.o: ../../include/record.h
 cleanup_extracted.o: ../../include/resolve_clnt.h
-cleanup_extracted.o: ../../include/been_here.h
-cleanup_extracted.o: ../../include/mail_stream.h
-cleanup_extracted.o: ../../include/mail_conf.h
-cleanup_extracted.o: ../../include/mime_state.h
-cleanup_extracted.o: ../../include/header_opts.h
 cleanup_extracted.o: ../../include/string_list.h
-cleanup_extracted.o: ../../include/match_list.h
-cleanup_extracted.o: ../../include/match_ops.h
-cleanup_init.o: cleanup_init.c
-cleanup_init.o: ../../include/sys_defs.h
-cleanup_init.o: ../../include/msg.h
-cleanup_init.o: ../../include/iostuff.h
-cleanup_init.o: ../../include/name_mask.h
-cleanup_init.o: ../../include/mail_addr.h
-cleanup_init.o: ../../include/mail_params.h
-cleanup_init.o: ../../include/ext_prop.h
-cleanup_init.o: ../../include/flush_clnt.h
-cleanup_init.o: cleanup.h
-cleanup_init.o: ../../include/vstring.h
-cleanup_init.o: ../../include/vbuf.h
-cleanup_init.o: ../../include/vstream.h
+cleanup_extracted.o: ../../include/sys_defs.h
+cleanup_extracted.o: ../../include/tok822.h
+cleanup_extracted.o: ../../include/vbuf.h
+cleanup_extracted.o: ../../include/vstream.h
+cleanup_extracted.o: ../../include/vstring.h
+cleanup_extracted.o: cleanup.h
+cleanup_extracted.o: cleanup_extracted.c
 cleanup_init.o: ../../include/argv.h
-cleanup_init.o: ../../include/nvtable.h
-cleanup_init.o: ../../include/htable.h
-cleanup_init.o: ../../include/mymalloc.h
-cleanup_init.o: ../../include/maps.h
-cleanup_init.o: ../../include/dict.h
-cleanup_init.o: ../../include/tok822.h
-cleanup_init.o: ../../include/resolve_clnt.h
 cleanup_init.o: ../../include/been_here.h
-cleanup_init.o: ../../include/mail_stream.h
-cleanup_init.o: ../../include/mail_conf.h
-cleanup_init.o: ../../include/mime_state.h
+cleanup_init.o: ../../include/dict.h
+cleanup_init.o: ../../include/ext_prop.h
+cleanup_init.o: ../../include/flush_clnt.h
 cleanup_init.o: ../../include/header_opts.h
-cleanup_init.o: ../../include/string_list.h
+cleanup_init.o: ../../include/htable.h
+cleanup_init.o: ../../include/iostuff.h
+cleanup_init.o: ../../include/mail_addr.h
+cleanup_init.o: ../../include/mail_conf.h
+cleanup_init.o: ../../include/mail_params.h
+cleanup_init.o: ../../include/mail_stream.h
+cleanup_init.o: ../../include/maps.h
 cleanup_init.o: ../../include/match_list.h
 cleanup_init.o: ../../include/match_ops.h
-cleanup_map11.o: cleanup_map11.c
-cleanup_map11.o: ../../include/sys_defs.h
-cleanup_map11.o: ../../include/msg.h
-cleanup_map11.o: ../../include/vstring.h
-cleanup_map11.o: ../../include/vbuf.h
-cleanup_map11.o: ../../include/dict.h
-cleanup_map11.o: ../../include/vstream.h
+cleanup_init.o: ../../include/mime_state.h
+cleanup_init.o: ../../include/msg.h
+cleanup_init.o: ../../include/mymalloc.h
+cleanup_init.o: ../../include/name_mask.h
+cleanup_init.o: ../../include/nvtable.h
+cleanup_init.o: ../../include/resolve_clnt.h
+cleanup_init.o: ../../include/string_list.h
+cleanup_init.o: ../../include/sys_defs.h
+cleanup_init.o: ../../include/tok822.h
+cleanup_init.o: ../../include/vbuf.h
+cleanup_init.o: ../../include/vstream.h
+cleanup_init.o: ../../include/vstring.h
+cleanup_init.o: cleanup.h
+cleanup_init.o: cleanup_init.c
 cleanup_map11.o: ../../include/argv.h
-cleanup_map11.o: ../../include/mymalloc.h
+cleanup_map11.o: ../../include/been_here.h
 cleanup_map11.o: ../../include/cleanup_user.h
+cleanup_map11.o: ../../include/dict.h
+cleanup_map11.o: ../../include/header_opts.h
+cleanup_map11.o: ../../include/htable.h
 cleanup_map11.o: ../../include/mail_addr_map.h
+cleanup_map11.o: ../../include/mail_conf.h
+cleanup_map11.o: ../../include/mail_stream.h
 cleanup_map11.o: ../../include/maps.h
+cleanup_map11.o: ../../include/match_list.h
+cleanup_map11.o: ../../include/match_ops.h
+cleanup_map11.o: ../../include/mime_state.h
+cleanup_map11.o: ../../include/msg.h
+cleanup_map11.o: ../../include/mymalloc.h
+cleanup_map11.o: ../../include/nvtable.h
 cleanup_map11.o: ../../include/quote_822_local.h
 cleanup_map11.o: ../../include/quote_flags.h
-cleanup_map11.o: cleanup.h
-cleanup_map11.o: ../../include/nvtable.h
-cleanup_map11.o: ../../include/htable.h
-cleanup_map11.o: ../../include/tok822.h
 cleanup_map11.o: ../../include/resolve_clnt.h
-cleanup_map11.o: ../../include/been_here.h
-cleanup_map11.o: ../../include/mail_stream.h
-cleanup_map11.o: ../../include/mail_conf.h
-cleanup_map11.o: ../../include/mime_state.h
-cleanup_map11.o: ../../include/header_opts.h
 cleanup_map11.o: ../../include/string_list.h
-cleanup_map11.o: ../../include/match_list.h
-cleanup_map11.o: ../../include/match_ops.h
-cleanup_map1n.o: cleanup_map1n.c
-cleanup_map1n.o: ../../include/sys_defs.h
-cleanup_map1n.o: ../../include/mymalloc.h
-cleanup_map1n.o: ../../include/msg.h
+cleanup_map11.o: ../../include/sys_defs.h
+cleanup_map11.o: ../../include/tok822.h
+cleanup_map11.o: ../../include/vbuf.h
+cleanup_map11.o: ../../include/vstream.h
+cleanup_map11.o: ../../include/vstring.h
+cleanup_map11.o: cleanup.h
+cleanup_map11.o: cleanup_map11.c
 cleanup_map1n.o: ../../include/argv.h
-cleanup_map1n.o: ../../include/vstring.h
-cleanup_map1n.o: ../../include/vbuf.h
+cleanup_map1n.o: ../../include/been_here.h
+cleanup_map1n.o: ../../include/cleanup_user.h
 cleanup_map1n.o: ../../include/dict.h
-cleanup_map1n.o: ../../include/vstream.h
-cleanup_map1n.o: ../../include/mail_params.h
+cleanup_map1n.o: ../../include/header_opts.h
+cleanup_map1n.o: ../../include/htable.h
 cleanup_map1n.o: ../../include/mail_addr_map.h
+cleanup_map1n.o: ../../include/mail_conf.h
+cleanup_map1n.o: ../../include/mail_params.h
+cleanup_map1n.o: ../../include/mail_stream.h
 cleanup_map1n.o: ../../include/maps.h
-cleanup_map1n.o: ../../include/cleanup_user.h
+cleanup_map1n.o: ../../include/match_list.h
+cleanup_map1n.o: ../../include/match_ops.h
+cleanup_map1n.o: ../../include/mime_state.h
+cleanup_map1n.o: ../../include/msg.h
+cleanup_map1n.o: ../../include/mymalloc.h
+cleanup_map1n.o: ../../include/nvtable.h
 cleanup_map1n.o: ../../include/quote_822_local.h
 cleanup_map1n.o: ../../include/quote_flags.h
-cleanup_map1n.o: ../../include/been_here.h
-cleanup_map1n.o: cleanup.h
-cleanup_map1n.o: ../../include/nvtable.h
-cleanup_map1n.o: ../../include/htable.h
-cleanup_map1n.o: ../../include/tok822.h
 cleanup_map1n.o: ../../include/resolve_clnt.h
-cleanup_map1n.o: ../../include/mail_stream.h
-cleanup_map1n.o: ../../include/mail_conf.h
-cleanup_map1n.o: ../../include/mime_state.h
-cleanup_map1n.o: ../../include/header_opts.h
 cleanup_map1n.o: ../../include/string_list.h
-cleanup_map1n.o: ../../include/match_list.h
-cleanup_map1n.o: ../../include/match_ops.h
-cleanup_masquerade.o: cleanup_masquerade.c
-cleanup_masquerade.o: ../../include/sys_defs.h
-cleanup_masquerade.o: ../../include/msg.h
-cleanup_masquerade.o: ../../include/vstring.h
-cleanup_masquerade.o: ../../include/vbuf.h
+cleanup_map1n.o: ../../include/sys_defs.h
+cleanup_map1n.o: ../../include/tok822.h
+cleanup_map1n.o: ../../include/vbuf.h
+cleanup_map1n.o: ../../include/vstream.h
+cleanup_map1n.o: ../../include/vstring.h
+cleanup_map1n.o: cleanup.h
+cleanup_map1n.o: cleanup_map1n.c
 cleanup_masquerade.o: ../../include/argv.h
+cleanup_masquerade.o: ../../include/been_here.h
+cleanup_masquerade.o: ../../include/dict.h
+cleanup_masquerade.o: ../../include/header_opts.h
 cleanup_masquerade.o: ../../include/htable.h
-cleanup_masquerade.o: ../../include/mymalloc.h
-cleanup_masquerade.o: ../../include/stringops.h
+cleanup_masquerade.o: ../../include/mail_conf.h
 cleanup_masquerade.o: ../../include/mail_params.h
-cleanup_masquerade.o: ../../include/tok822.h
-cleanup_masquerade.o: ../../include/resolve_clnt.h
-cleanup_masquerade.o: ../../include/quote_822_local.h
-cleanup_masquerade.o: ../../include/quote_flags.h
-cleanup_masquerade.o: cleanup.h
-cleanup_masquerade.o: ../../include/vstream.h
-cleanup_masquerade.o: ../../include/nvtable.h
-cleanup_masquerade.o: ../../include/maps.h
-cleanup_masquerade.o: ../../include/dict.h
-cleanup_masquerade.o: ../../include/been_here.h
 cleanup_masquerade.o: ../../include/mail_stream.h
-cleanup_masquerade.o: ../../include/mail_conf.h
-cleanup_masquerade.o: ../../include/mime_state.h
-cleanup_masquerade.o: ../../include/header_opts.h
-cleanup_masquerade.o: ../../include/string_list.h
+cleanup_masquerade.o: ../../include/maps.h
 cleanup_masquerade.o: ../../include/match_list.h
 cleanup_masquerade.o: ../../include/match_ops.h
-cleanup_message.o: cleanup_message.c
-cleanup_message.o: ../../include/sys_defs.h
-cleanup_message.o: ../../include/msg.h
-cleanup_message.o: ../../include/vstring.h
-cleanup_message.o: ../../include/vbuf.h
-cleanup_message.o: ../../include/vstream.h
+cleanup_masquerade.o: ../../include/mime_state.h
+cleanup_masquerade.o: ../../include/msg.h
+cleanup_masquerade.o: ../../include/mymalloc.h
+cleanup_masquerade.o: ../../include/nvtable.h
+cleanup_masquerade.o: ../../include/quote_822_local.h
+cleanup_masquerade.o: ../../include/quote_flags.h
+cleanup_masquerade.o: ../../include/resolve_clnt.h
+cleanup_masquerade.o: ../../include/string_list.h
+cleanup_masquerade.o: ../../include/stringops.h
+cleanup_masquerade.o: ../../include/sys_defs.h
+cleanup_masquerade.o: ../../include/tok822.h
+cleanup_masquerade.o: ../../include/vbuf.h
+cleanup_masquerade.o: ../../include/vstream.h
+cleanup_masquerade.o: ../../include/vstring.h
+cleanup_masquerade.o: cleanup.h
+cleanup_masquerade.o: cleanup_masquerade.c
 cleanup_message.o: ../../include/argv.h
-cleanup_message.o: ../../include/split_at.h
-cleanup_message.o: ../../include/mymalloc.h
-cleanup_message.o: ../../include/stringops.h
-cleanup_message.o: ../../include/nvtable.h
-cleanup_message.o: ../../include/htable.h
-cleanup_message.o: ../../include/record.h
-cleanup_message.o: ../../include/rec_type.h
+cleanup_message.o: ../../include/attr.h
+cleanup_message.o: ../../include/been_here.h
 cleanup_message.o: ../../include/cleanup_user.h
-cleanup_message.o: ../../include/tok822.h
-cleanup_message.o: ../../include/resolve_clnt.h
-cleanup_message.o: ../../include/header_opts.h
-cleanup_message.o: ../../include/quote_822_local.h
-cleanup_message.o: ../../include/quote_flags.h
-cleanup_message.o: ../../include/mail_params.h
-cleanup_message.o: ../../include/mail_date.h
-cleanup_message.o: ../../include/mail_addr.h
-cleanup_message.o: ../../include/is_header.h
+cleanup_message.o: ../../include/dict.h
+cleanup_message.o: ../../include/dsn_util.h
 cleanup_message.o: ../../include/ext_prop.h
-cleanup_message.o: ../../include/mail_proto.h
+cleanup_message.o: ../../include/header_opts.h
+cleanup_message.o: ../../include/htable.h
 cleanup_message.o: ../../include/iostuff.h
-cleanup_message.o: ../../include/attr.h
-cleanup_message.o: ../../include/mime_state.h
+cleanup_message.o: ../../include/is_header.h
 cleanup_message.o: ../../include/lex_822.h
-cleanup_message.o: cleanup.h
-cleanup_message.o: ../../include/maps.h
-cleanup_message.o: ../../include/dict.h
-cleanup_message.o: ../../include/been_here.h
-cleanup_message.o: ../../include/mail_stream.h
+cleanup_message.o: ../../include/mail_addr.h
 cleanup_message.o: ../../include/mail_conf.h
-cleanup_message.o: ../../include/string_list.h
+cleanup_message.o: ../../include/mail_date.h
+cleanup_message.o: ../../include/mail_params.h
+cleanup_message.o: ../../include/mail_proto.h
+cleanup_message.o: ../../include/mail_stream.h
+cleanup_message.o: ../../include/maps.h
 cleanup_message.o: ../../include/match_list.h
 cleanup_message.o: ../../include/match_ops.h
-cleanup_out.o: cleanup_out.c
-cleanup_out.o: ../../include/sys_defs.h
-cleanup_out.o: ../../include/msg.h
-cleanup_out.o: ../../include/vstring.h
-cleanup_out.o: ../../include/vbuf.h
-cleanup_out.o: ../../include/vstream.h
-cleanup_out.o: ../../include/record.h
-cleanup_out.o: ../../include/rec_type.h
-cleanup_out.o: ../../include/cleanup_user.h
-cleanup_out.o: ../../include/mail_params.h
-cleanup_out.o: cleanup.h
+cleanup_message.o: ../../include/mime_state.h
+cleanup_message.o: ../../include/msg.h
+cleanup_message.o: ../../include/mymalloc.h
+cleanup_message.o: ../../include/nvtable.h
+cleanup_message.o: ../../include/quote_822_local.h
+cleanup_message.o: ../../include/quote_flags.h
+cleanup_message.o: ../../include/rec_type.h
+cleanup_message.o: ../../include/record.h
+cleanup_message.o: ../../include/resolve_clnt.h
+cleanup_message.o: ../../include/split_at.h
+cleanup_message.o: ../../include/string_list.h
+cleanup_message.o: ../../include/stringops.h
+cleanup_message.o: ../../include/sys_defs.h
+cleanup_message.o: ../../include/tok822.h
+cleanup_message.o: ../../include/vbuf.h
+cleanup_message.o: ../../include/vstream.h
+cleanup_message.o: ../../include/vstring.h
+cleanup_message.o: cleanup.h
+cleanup_message.o: cleanup_message.c
 cleanup_out.o: ../../include/argv.h
-cleanup_out.o: ../../include/nvtable.h
-cleanup_out.o: ../../include/htable.h
-cleanup_out.o: ../../include/mymalloc.h
-cleanup_out.o: ../../include/maps.h
-cleanup_out.o: ../../include/dict.h
-cleanup_out.o: ../../include/tok822.h
-cleanup_out.o: ../../include/resolve_clnt.h
 cleanup_out.o: ../../include/been_here.h
-cleanup_out.o: ../../include/mail_stream.h
-cleanup_out.o: ../../include/mail_conf.h
-cleanup_out.o: ../../include/mime_state.h
+cleanup_out.o: ../../include/cleanup_user.h
+cleanup_out.o: ../../include/dict.h
 cleanup_out.o: ../../include/header_opts.h
-cleanup_out.o: ../../include/string_list.h
+cleanup_out.o: ../../include/htable.h
+cleanup_out.o: ../../include/mail_conf.h
+cleanup_out.o: ../../include/mail_params.h
+cleanup_out.o: ../../include/mail_stream.h
+cleanup_out.o: ../../include/maps.h
 cleanup_out.o: ../../include/match_list.h
 cleanup_out.o: ../../include/match_ops.h
-cleanup_out_recipient.o: cleanup_out_recipient.c
-cleanup_out_recipient.o: ../../include/sys_defs.h
+cleanup_out.o: ../../include/mime_state.h
+cleanup_out.o: ../../include/msg.h
+cleanup_out.o: ../../include/mymalloc.h
+cleanup_out.o: ../../include/nvtable.h
+cleanup_out.o: ../../include/rec_type.h
+cleanup_out.o: ../../include/record.h
+cleanup_out.o: ../../include/resolve_clnt.h
+cleanup_out.o: ../../include/string_list.h
+cleanup_out.o: ../../include/sys_defs.h
+cleanup_out.o: ../../include/tok822.h
+cleanup_out.o: ../../include/vbuf.h
+cleanup_out.o: ../../include/vstream.h
+cleanup_out.o: ../../include/vstring.h
+cleanup_out.o: cleanup.h
+cleanup_out.o: cleanup_out.c
 cleanup_out_recipient.o: ../../include/argv.h
 cleanup_out_recipient.o: ../../include/been_here.h
-cleanup_out_recipient.o: ../../include/mail_params.h
-cleanup_out_recipient.o: ../../include/rec_type.h
-cleanup_out_recipient.o: ../../include/ext_prop.h
 cleanup_out_recipient.o: ../../include/cleanup_user.h
-cleanup_out_recipient.o: cleanup.h
-cleanup_out_recipient.o: ../../include/vstring.h
-cleanup_out_recipient.o: ../../include/vbuf.h
-cleanup_out_recipient.o: ../../include/vstream.h
-cleanup_out_recipient.o: ../../include/nvtable.h
-cleanup_out_recipient.o: ../../include/htable.h
-cleanup_out_recipient.o: ../../include/mymalloc.h
-cleanup_out_recipient.o: ../../include/maps.h
 cleanup_out_recipient.o: ../../include/dict.h
-cleanup_out_recipient.o: ../../include/tok822.h
-cleanup_out_recipient.o: ../../include/resolve_clnt.h
-cleanup_out_recipient.o: ../../include/mail_stream.h
-cleanup_out_recipient.o: ../../include/mail_conf.h
-cleanup_out_recipient.o: ../../include/mime_state.h
+cleanup_out_recipient.o: ../../include/ext_prop.h
 cleanup_out_recipient.o: ../../include/header_opts.h
-cleanup_out_recipient.o: ../../include/string_list.h
+cleanup_out_recipient.o: ../../include/htable.h
+cleanup_out_recipient.o: ../../include/mail_conf.h
+cleanup_out_recipient.o: ../../include/mail_params.h
+cleanup_out_recipient.o: ../../include/mail_stream.h
+cleanup_out_recipient.o: ../../include/maps.h
 cleanup_out_recipient.o: ../../include/match_list.h
 cleanup_out_recipient.o: ../../include/match_ops.h
-cleanup_rewrite.o: cleanup_rewrite.c
-cleanup_rewrite.o: ../../include/sys_defs.h
-cleanup_rewrite.o: ../../include/msg.h
-cleanup_rewrite.o: ../../include/vstring.h
-cleanup_rewrite.o: ../../include/vbuf.h
-cleanup_rewrite.o: ../../include/tok822.h
-cleanup_rewrite.o: ../../include/resolve_clnt.h
-cleanup_rewrite.o: ../../include/rewrite_clnt.h
-cleanup_rewrite.o: ../../include/mail_proto.h
-cleanup_rewrite.o: ../../include/vstream.h
-cleanup_rewrite.o: ../../include/iostuff.h
-cleanup_rewrite.o: ../../include/attr.h
-cleanup_rewrite.o: ../../include/quote_822_local.h
-cleanup_rewrite.o: ../../include/quote_flags.h
-cleanup_rewrite.o: cleanup.h
+cleanup_out_recipient.o: ../../include/mime_state.h
+cleanup_out_recipient.o: ../../include/mymalloc.h
+cleanup_out_recipient.o: ../../include/nvtable.h
+cleanup_out_recipient.o: ../../include/rec_type.h
+cleanup_out_recipient.o: ../../include/resolve_clnt.h
+cleanup_out_recipient.o: ../../include/string_list.h
+cleanup_out_recipient.o: ../../include/sys_defs.h
+cleanup_out_recipient.o: ../../include/tok822.h
+cleanup_out_recipient.o: ../../include/vbuf.h
+cleanup_out_recipient.o: ../../include/vstream.h
+cleanup_out_recipient.o: ../../include/vstring.h
+cleanup_out_recipient.o: cleanup.h
+cleanup_out_recipient.o: cleanup_out_recipient.c
 cleanup_rewrite.o: ../../include/argv.h
-cleanup_rewrite.o: ../../include/nvtable.h
-cleanup_rewrite.o: ../../include/htable.h
-cleanup_rewrite.o: ../../include/mymalloc.h
-cleanup_rewrite.o: ../../include/maps.h
-cleanup_rewrite.o: ../../include/dict.h
+cleanup_rewrite.o: ../../include/attr.h
 cleanup_rewrite.o: ../../include/been_here.h
-cleanup_rewrite.o: ../../include/mail_stream.h
-cleanup_rewrite.o: ../../include/mail_conf.h
-cleanup_rewrite.o: ../../include/mime_state.h
+cleanup_rewrite.o: ../../include/dict.h
 cleanup_rewrite.o: ../../include/header_opts.h
-cleanup_rewrite.o: ../../include/string_list.h
+cleanup_rewrite.o: ../../include/htable.h
+cleanup_rewrite.o: ../../include/iostuff.h
+cleanup_rewrite.o: ../../include/mail_conf.h
+cleanup_rewrite.o: ../../include/mail_proto.h
+cleanup_rewrite.o: ../../include/mail_stream.h
+cleanup_rewrite.o: ../../include/maps.h
 cleanup_rewrite.o: ../../include/match_list.h
 cleanup_rewrite.o: ../../include/match_ops.h
-cleanup_state.o: cleanup_state.c
-cleanup_state.o: ../../include/sys_defs.h
-cleanup_state.o: ../../include/mymalloc.h
-cleanup_state.o: ../../include/vstring.h
-cleanup_state.o: ../../include/vbuf.h
-cleanup_state.o: ../../include/htable.h
+cleanup_rewrite.o: ../../include/mime_state.h
+cleanup_rewrite.o: ../../include/msg.h
+cleanup_rewrite.o: ../../include/mymalloc.h
+cleanup_rewrite.o: ../../include/nvtable.h
+cleanup_rewrite.o: ../../include/quote_822_local.h
+cleanup_rewrite.o: ../../include/quote_flags.h
+cleanup_rewrite.o: ../../include/resolve_clnt.h
+cleanup_rewrite.o: ../../include/rewrite_clnt.h
+cleanup_rewrite.o: ../../include/string_list.h
+cleanup_rewrite.o: ../../include/sys_defs.h
+cleanup_rewrite.o: ../../include/tok822.h
+cleanup_rewrite.o: ../../include/vbuf.h
+cleanup_rewrite.o: ../../include/vstream.h
+cleanup_rewrite.o: ../../include/vstring.h
+cleanup_rewrite.o: cleanup.h
+cleanup_rewrite.o: cleanup_rewrite.c
+cleanup_state.o: ../../include/argv.h
+cleanup_state.o: ../../include/attr.h
 cleanup_state.o: ../../include/been_here.h
-cleanup_state.o: ../../include/mail_params.h
-cleanup_state.o: ../../include/mime_state.h
+cleanup_state.o: ../../include/dict.h
 cleanup_state.o: ../../include/header_opts.h
-cleanup_state.o: ../../include/mail_proto.h
-cleanup_state.o: ../../include/vstream.h
+cleanup_state.o: ../../include/htable.h
 cleanup_state.o: ../../include/iostuff.h
-cleanup_state.o: ../../include/attr.h
-cleanup_state.o: cleanup.h
-cleanup_state.o: ../../include/argv.h
-cleanup_state.o: ../../include/nvtable.h
-cleanup_state.o: ../../include/maps.h
-cleanup_state.o: ../../include/dict.h
-cleanup_state.o: ../../include/tok822.h
-cleanup_state.o: ../../include/resolve_clnt.h
-cleanup_state.o: ../../include/mail_stream.h
 cleanup_state.o: ../../include/mail_conf.h
-cleanup_state.o: ../../include/string_list.h
+cleanup_state.o: ../../include/mail_params.h
+cleanup_state.o: ../../include/mail_proto.h
+cleanup_state.o: ../../include/mail_stream.h
+cleanup_state.o: ../../include/maps.h
 cleanup_state.o: ../../include/match_list.h
 cleanup_state.o: ../../include/match_ops.h
+cleanup_state.o: ../../include/mime_state.h
+cleanup_state.o: ../../include/mymalloc.h
+cleanup_state.o: ../../include/nvtable.h
+cleanup_state.o: ../../include/resolve_clnt.h
+cleanup_state.o: ../../include/string_list.h
+cleanup_state.o: ../../include/sys_defs.h
+cleanup_state.o: ../../include/tok822.h
+cleanup_state.o: ../../include/vbuf.h
+cleanup_state.o: ../../include/vstream.h
+cleanup_state.o: ../../include/vstring.h
+cleanup_state.o: cleanup.h
+cleanup_state.o: cleanup_state.c
index 97ea3d7a05e7add2b6b6886790df5d332fcce089..fdceb52b33b6879cba6c0f7ba81eaefa9bb68831 100644 (file)
 #include <mail_params.h>
 #include <mail_stream.h>
 #include <hold_message.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -191,6 +192,8 @@ int     cleanup_flush(CLEANUP_STATE *state)
     char   *junk;
     int     status;
     char   *encoding;
+    CLEANUP_STAT_DETAIL *detail = 0;
+DSN_SPLIT dp;
 
     /*
      * Raise these errors only if we examined all queue file records.
@@ -256,12 +259,17 @@ int     cleanup_flush(CLEANUP_STATE *state)
 
     if (state->errs != 0) {
        if (CAN_BOUNCE()) {
+           if (state->reason) 
+               dsn_split(&dp, "5.0.0", state->reason);
+           else
+               detail = cleanup_stat_detail(state->errs);
            if (bounce_append(BOUNCE_FLAG_CLEAN, state->queue_id,
                              state->recip ? state->recip : "unknown",
                              state->recip ? state->recip : "unknown",
-                             (long) 0, "none", state->time,
-                             "%s", state->reason ? state->reason :
-                             cleanup_strerror(state->errs)) == 0
+                             (long) 0, "none",
+                             detail ? detail->dsn : dp.dsn, 
+                             state->time, "%s", 
+                             detail ? detail->text : dp.text) == 0
                && bounce_flush(BOUNCE_FLAG_CLEAN, state->queue_name,
                                state->queue_id,
                (encoding = nvtable_find(state->attr, MAIL_ATTR_ENCODING)) ?
index 0a77d4f3d7587195e29b668cb3d0a024a65c4cc8..3819363cd13aa293515cb5df276c0727c6821f32 100644 (file)
@@ -80,6 +80,7 @@
 #include <mail_proto.h>
 #include <mime_state.h>
 #include <lex_822.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -301,6 +302,7 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
     const char *optional_text = value + strcspn(value, " \t");
     int     command_len = optional_text - value;
     VSTRING *bp;
+    CLEANUP_STAT_DETAIL *detail;
 
     while (*optional_text && ISSPACE(*optional_text))
        optional_text++;
@@ -310,9 +312,14 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
 #define CLEANUP_ACT_DROP 0
 
     if (STREQUAL(value, "REJECT", command_len)) {
-       if (state->reason == 0)
-           state->reason = mystrdup(*optional_text ? optional_text :
-                                    cleanup_strerror(CLEANUP_STAT_CONT));
+       if (state->reason == 0) {
+           if (*optional_text) {
+               state->reason = dsn_prepend("5.7.1", optional_text);
+           } else {
+               detail = cleanup_stat_detail(CLEANUP_STAT_CONT);
+               state->reason = dsn_prepend(detail->dsn, detail->text);
+           }
+       }
        state->errs |= CLEANUP_STAT_CONT;
        state->flags &= ~CLEANUP_FLAG_FILTER;
        cleanup_act_log(state, "reject", context, buf, state->reason);
@@ -371,7 +378,7 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
                         "need \"headername: headervalue\"",
                         optional_text, map_class);
                return (CLEANUP_ACT_KEEP);
-           } 
+           }
            /* XXX Impedance mismatch. */
            bp = vstring_strcpy(vstring_alloc(100), optional_text);
            cleanup_out_header(state, bp);
index 9f87480a1144bfa4e9268fd454985be4635f4a23..224cd90a7658af8d2f494cd7c5d230814649a093 100644 (file)
@@ -47,21 +47,24 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-discard.o: discard.c
-discard.o: ../../include/sys_defs.h
-discard.o: ../../include/msg.h
-discard.o: ../../include/vstream.h
-discard.o: ../../include/vbuf.h
-discard.o: ../../include/deliver_request.h
-discard.o: ../../include/vstring.h
-discard.o: ../../include/recipient_list.h
-discard.o: ../../include/mail_queue.h
 discard.o: ../../include/bounce.h
 discard.o: ../../include/deliver_completed.h
+discard.o: ../../include/deliver_request.h
+discard.o: ../../include/dsn_util.h
 discard.o: ../../include/flush_clnt.h
+discard.o: ../../include/mail_queue.h
 discard.o: ../../include/mail_server.h
+discard.o: ../../include/msg.h
+discard.o: ../../include/recipient_list.h
+discard.o: ../../include/sent.h
+discard.o: ../../include/sys_defs.h
+discard.o: ../../include/vbuf.h
+discard.o: ../../include/vstream.h
+discard.o: ../../include/vstring.h
+discard.o: discard.c
index 235367f06e72882f1ab5f2e366382c4a33e467c9..d4f166d61c166272449ad912e8962c3986e818c6 100644 (file)
@@ -11,6 +11,7 @@
 /*     the queue manager. Each request specifies a queue file, a sender
 /*     address, a domain or host name that is treated as the reason for
 /*     discarding the mail, and recipient information.
+/*     The reason may be prefixed with an RFC 1893-compatible detail code.
 /*     This program expects to be run from the \fBmaster\fR(8) process
 /*     manager.
 /*
 #include <deliver_completed.h>
 #include <flush_clnt.h>
 #include <sent.h>
+#include <dsn_util.h>
 
 /* Single server skeleton. */
 
@@ -131,6 +133,7 @@ static int deliver_message(DELIVER_REQUEST *request)
     int     status;
     RECIPIENT *rcpt;
     int     nrcpt;
+    DSN_SPLIT dp;
 
     if (msg_verbose)
        msg_info("deliver_message: from %s", request->sender);
@@ -162,12 +165,14 @@ static int deliver_message(DELIVER_REQUEST *request)
      */
 #define BOUNCE_FLAGS(request) DEL_REQ_TRACE_FLAGS(request->flags)
 
+    dsn_split(&dp, "2.0.0", request->nexthop);
     for (nrcpt = 0; nrcpt < request->rcpt_list.len; nrcpt++) {
        rcpt = request->rcpt_list.info + nrcpt;
        if (rcpt->offset >= 0) {
            status = sent(BOUNCE_FLAGS(request), request->queue_id,
-                      rcpt->orig_addr, rcpt->address, rcpt->offset, "none",
-                         request->arrival_time, "%s", request->nexthop);
+                         rcpt->orig_addr, rcpt->address, rcpt->offset,
+                         "none", dp.dsn, request->arrival_time,
+                         "%s", dp.text);
            if (status == 0 && (request->flags & DEL_REQ_FLAG_SUCCESS))
                deliver_completed(src, rcpt->offset);
            result |= status;
index d18adf4507a140b6d25e6388e5bd39482e8cc651..9b4573abc5f4f475b3d76f0421eec16831596d48 100644 (file)
@@ -105,87 +105,88 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-dns_lookup.o: dns_lookup.c
-dns_lookup.o: ../../include/sys_defs.h
-dns_lookup.o: ../../include/mymalloc.h
-dns_lookup.o: ../../include/vstring.h
-dns_lookup.o: ../../include/vbuf.h
 dns_lookup.o: ../../include/msg.h
-dns_lookup.o: ../../include/valid_hostname.h
+dns_lookup.o: ../../include/myaddrinfo.h
+dns_lookup.o: ../../include/mymalloc.h
+dns_lookup.o: ../../include/sock_addr.h
 dns_lookup.o: ../../include/stringops.h
+dns_lookup.o: ../../include/sys_defs.h
+dns_lookup.o: ../../include/valid_hostname.h
+dns_lookup.o: ../../include/vbuf.h
+dns_lookup.o: ../../include/vstring.h
 dns_lookup.o: dns.h
-dns_lookup.o: ../../include/sock_addr.h
-dns_lookup.o: ../../include/myaddrinfo.h
-dns_rr.o: dns_rr.c
-dns_rr.o: ../../include/sys_defs.h
+dns_lookup.o: dns_lookup.c
 dns_rr.o: ../../include/msg.h
+dns_rr.o: ../../include/myaddrinfo.h
 dns_rr.o: ../../include/mymalloc.h
 dns_rr.o: ../../include/myrand.h
-dns_rr.o: dns.h
-dns_rr.o: ../../include/vstring.h
-dns_rr.o: ../../include/vbuf.h
 dns_rr.o: ../../include/sock_addr.h
-dns_rr.o: ../../include/myaddrinfo.h
-dns_rr_eq_sa.o: dns_rr_eq_sa.c
-dns_rr_eq_sa.o: ../../include/sys_defs.h
+dns_rr.o: ../../include/sys_defs.h
+dns_rr.o: ../../include/vbuf.h
+dns_rr.o: ../../include/vstring.h
+dns_rr.o: dns.h
+dns_rr.o: dns_rr.c
 dns_rr_eq_sa.o: ../../include/msg.h
+dns_rr_eq_sa.o: ../../include/myaddrinfo.h
 dns_rr_eq_sa.o: ../../include/sock_addr.h
-dns_rr_eq_sa.o: dns.h
-dns_rr_eq_sa.o: ../../include/vstring.h
+dns_rr_eq_sa.o: ../../include/sys_defs.h
 dns_rr_eq_sa.o: ../../include/vbuf.h
-dns_rr_eq_sa.o: ../../include/myaddrinfo.h
-dns_rr_to_pa.o: dns_rr_to_pa.c
-dns_rr_to_pa.o: ../../include/sys_defs.h
+dns_rr_eq_sa.o: ../../include/vstring.h
+dns_rr_eq_sa.o: dns.h
+dns_rr_eq_sa.o: dns_rr_eq_sa.c
 dns_rr_to_pa.o: ../../include/msg.h
-dns_rr_to_pa.o: dns.h
-dns_rr_to_pa.o: ../../include/vstring.h
-dns_rr_to_pa.o: ../../include/vbuf.h
-dns_rr_to_pa.o: ../../include/sock_addr.h
 dns_rr_to_pa.o: ../../include/myaddrinfo.h
-dns_rr_to_sa.o: dns_rr_to_sa.c
-dns_rr_to_sa.o: ../../include/sys_defs.h
+dns_rr_to_pa.o: ../../include/sock_addr.h
+dns_rr_to_pa.o: ../../include/sys_defs.h
+dns_rr_to_pa.o: ../../include/vbuf.h
+dns_rr_to_pa.o: ../../include/vstring.h
+dns_rr_to_pa.o: dns.h
+dns_rr_to_pa.o: dns_rr_to_pa.c
 dns_rr_to_sa.o: ../../include/msg.h
-dns_rr_to_sa.o: dns.h
-dns_rr_to_sa.o: ../../include/vstring.h
-dns_rr_to_sa.o: ../../include/vbuf.h
-dns_rr_to_sa.o: ../../include/sock_addr.h
 dns_rr_to_sa.o: ../../include/myaddrinfo.h
-dns_sa_to_rr.o: dns_sa_to_rr.c
-dns_sa_to_rr.o: ../../include/sys_defs.h
+dns_rr_to_sa.o: ../../include/sock_addr.h
+dns_rr_to_sa.o: ../../include/sys_defs.h
+dns_rr_to_sa.o: ../../include/vbuf.h
+dns_rr_to_sa.o: ../../include/vstring.h
+dns_rr_to_sa.o: dns.h
+dns_rr_to_sa.o: dns_rr_to_sa.c
 dns_sa_to_rr.o: ../../include/msg.h
-dns_sa_to_rr.o: dns.h
-dns_sa_to_rr.o: ../../include/vstring.h
-dns_sa_to_rr.o: ../../include/vbuf.h
-dns_sa_to_rr.o: ../../include/sock_addr.h
 dns_sa_to_rr.o: ../../include/myaddrinfo.h
-dns_strerror.o: dns_strerror.c
+dns_sa_to_rr.o: ../../include/sock_addr.h
+dns_sa_to_rr.o: ../../include/sys_defs.h
+dns_sa_to_rr.o: ../../include/vbuf.h
+dns_sa_to_rr.o: ../../include/vstring.h
+dns_sa_to_rr.o: dns.h
+dns_sa_to_rr.o: dns_sa_to_rr.c
+dns_strerror.o: ../../include/myaddrinfo.h
+dns_strerror.o: ../../include/sock_addr.h
 dns_strerror.o: ../../include/sys_defs.h
-dns_strerror.o: ../../include/vstring.h
 dns_strerror.o: ../../include/vbuf.h
+dns_strerror.o: ../../include/vstring.h
 dns_strerror.o: dns.h
-dns_strerror.o: ../../include/sock_addr.h
-dns_strerror.o: ../../include/myaddrinfo.h
-dns_strtype.o: dns_strtype.c
+dns_strerror.o: dns_strerror.c
+dns_strtype.o: ../../include/myaddrinfo.h
+dns_strtype.o: ../../include/sock_addr.h
 dns_strtype.o: ../../include/sys_defs.h
-dns_strtype.o: ../../include/vstring.h
 dns_strtype.o: ../../include/vbuf.h
+dns_strtype.o: ../../include/vstring.h
 dns_strtype.o: dns.h
-dns_strtype.o: ../../include/sock_addr.h
-dns_strtype.o: ../../include/myaddrinfo.h
-test_dns_lookup.o: test_dns_lookup.c
-test_dns_lookup.o: ../../include/sys_defs.h
-test_dns_lookup.o: ../../include/vstring.h
-test_dns_lookup.o: ../../include/vbuf.h
+dns_strtype.o: dns_strtype.c
+test_dns_lookup.o: ../../include/argv.h
 test_dns_lookup.o: ../../include/msg.h
 test_dns_lookup.o: ../../include/msg_vstream.h
-test_dns_lookup.o: ../../include/vstream.h
+test_dns_lookup.o: ../../include/myaddrinfo.h
 test_dns_lookup.o: ../../include/mymalloc.h
-test_dns_lookup.o: ../../include/argv.h
-test_dns_lookup.o: dns.h
 test_dns_lookup.o: ../../include/sock_addr.h
-test_dns_lookup.o: ../../include/myaddrinfo.h
+test_dns_lookup.o: ../../include/sys_defs.h
+test_dns_lookup.o: ../../include/vbuf.h
+test_dns_lookup.o: ../../include/vstream.h
+test_dns_lookup.o: ../../include/vstring.h
+test_dns_lookup.o: dns.h
+test_dns_lookup.o: test_dns_lookup.c
index 8bacb92b9d47c51f0ba43e67efa14f20ce45a12d..a9ccd8e1eacd868addd352681d97c31dd6307100 100644 (file)
@@ -47,21 +47,23 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-error.o: error.c
-error.o: ../../include/sys_defs.h
-error.o: ../../include/msg.h
-error.o: ../../include/vstream.h
-error.o: ../../include/vbuf.h
-error.o: ../../include/deliver_request.h
-error.o: ../../include/vstring.h
-error.o: ../../include/recipient_list.h
-error.o: ../../include/mail_queue.h
 error.o: ../../include/bounce.h
 error.o: ../../include/deliver_completed.h
+error.o: ../../include/deliver_request.h
+error.o: ../../include/dsn_util.h
 error.o: ../../include/flush_clnt.h
+error.o: ../../include/mail_queue.h
 error.o: ../../include/mail_server.h
+error.o: ../../include/msg.h
+error.o: ../../include/recipient_list.h
+error.o: ../../include/sys_defs.h
+error.o: ../../include/vbuf.h
+error.o: ../../include/vstream.h
+error.o: ../../include/vstring.h
+error.o: error.c
index 5166bf17721a580f2c30638462c99b3bca113d97..6fedb17484edd13891c783f024452b02f23505ed 100644 (file)
@@ -11,6 +11,7 @@
 /*     the queue manager. Each request specifies a queue file, a sender
 /*     address, a domain or host name that is treated as the reason for
 /*     non-delivery, and recipient information.
+/*     The reason may be prefixed with an RFC 1893-compatible detail code.
 /*     This program expects to be run from the \fBmaster\fR(8) process
 /*     manager.
 /*
 #include <bounce.h>
 #include <deliver_completed.h>
 #include <flush_clnt.h>
+#include <dsn_util.h>
 
 /* Single server skeleton. */
 
@@ -133,6 +135,7 @@ static int deliver_message(DELIVER_REQUEST *request)
     int     status;
     RECIPIENT *rcpt;
     int     nrcpt;
+    DSN_SPLIT dp;
 
     if (msg_verbose)
        msg_info("deliver_message: from %s", request->sender);
@@ -164,13 +167,15 @@ static int deliver_message(DELIVER_REQUEST *request)
      */
 #define BOUNCE_FLAGS(request) DEL_REQ_TRACE_FLAGS(request->flags)
 
+    dsn_split(&dp, "5.0.0", request->nexthop);
     for (nrcpt = 0; nrcpt < request->rcpt_list.len; nrcpt++) {
        rcpt = request->rcpt_list.info + nrcpt;
        if (rcpt->offset >= 0) {
            status = bounce_append(BOUNCE_FLAGS(request), request->queue_id,
                                   rcpt->orig_addr, rcpt->address,
-                               rcpt->offset, "none", request->arrival_time,
-                                  "%s", request->nexthop);
+                                  rcpt->offset, "none", dp.dsn,
+                                  request->arrival_time,
+                                  "%s", dp.text);
            if (status == 0)
                deliver_completed(src, rcpt->offset);
            result |= status;
index 21603b9e885e0e1d8f1342d65620b6da19f06395..a211280499a01258654082aa940e002b5232673a 100644 (file)
@@ -47,37 +47,38 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-flush.o: flush.c
-flush.o: ../../include/sys_defs.h
-flush.o: ../../include/msg.h
-flush.o: ../../include/events.h
-flush.o: ../../include/vstream.h
-flush.o: ../../include/vbuf.h
-flush.o: ../../include/vstring.h
-flush.o: ../../include/vstring_vstream.h
-flush.o: ../../include/myflock.h
-flush.o: ../../include/htable.h
-flush.o: ../../include/dict.h
 flush.o: ../../include/argv.h
-flush.o: ../../include/scan_dir.h
-flush.o: ../../include/stringops.h
-flush.o: ../../include/mail_params.h
-flush.o: ../../include/mail_queue.h
-flush.o: ../../include/mail_proto.h
-flush.o: ../../include/iostuff.h
 flush.o: ../../include/attr.h
-flush.o: ../../include/mail_flush.h
+flush.o: ../../include/dict.h
+flush.o: ../../include/domain_list.h
+flush.o: ../../include/events.h
 flush.o: ../../include/flush_clnt.h
+flush.o: ../../include/htable.h
+flush.o: ../../include/iostuff.h
 flush.o: ../../include/mail_conf.h
+flush.o: ../../include/mail_flush.h
+flush.o: ../../include/mail_params.h
+flush.o: ../../include/mail_proto.h
+flush.o: ../../include/mail_queue.h
 flush.o: ../../include/mail_scan_dir.h
+flush.o: ../../include/mail_server.h
 flush.o: ../../include/maps.h
-flush.o: ../../include/domain_list.h
 flush.o: ../../include/match_list.h
 flush.o: ../../include/match_ops.h
 flush.o: ../../include/match_parent_style.h
-flush.o: ../../include/mail_server.h
+flush.o: ../../include/msg.h
+flush.o: ../../include/myflock.h
+flush.o: ../../include/scan_dir.h
+flush.o: ../../include/stringops.h
+flush.o: ../../include/sys_defs.h
+flush.o: ../../include/vbuf.h
+flush.o: ../../include/vstream.h
+flush.o: ../../include/vstring.h
+flush.o: ../../include/vstring_vstream.h
+flush.o: flush.c
index a04617a03a98759bc1a00ec288e4948e5233a8ee..39d22cc35709a36fb6be528e91111c8f34a72202 100644 (file)
@@ -46,14 +46,9 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-fsstone.o: fsstone.c
-fsstone.o: ../../include/sys_defs.h
-fsstone.o: ../../include/msg.h
-fsstone.o: ../../include/msg_vstream.h
-fsstone.o: ../../include/vstream.h
-fsstone.o: ../../include/vbuf.h
index e15cbca8be3b09d25604676bc0ec0b6aa32e9f1d..e91b98f113361172ecfd784210f1c07c56826994 100644 (file)
@@ -25,7 +25,7 @@ SRCS  = abounce.c anvil_clnt.c been_here.c bounce.c bounce_log.c \
        verify_clnt.c verp_sender.c virtual8_maps.c xtext.c scache_single.c \
        scache_clnt.c scache_multi.c user_acl.c mkmap_cdb.c mkmap_sdbm.c \
        ehlo_mask.c \
-       wildcard_inet_addr.c valid_mailhost_addr.c
+       wildcard_inet_addr.c valid_mailhost_addr.c dsn_util.c
 OBJS   = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
        canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
        clnt_stream.o debug_peer.o debug_process.o defer.o db_common.o \
@@ -52,7 +52,7 @@ OBJS  = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
        verify_clnt.o verp_sender.o virtual8_maps.o xtext.o scache_single.o \
        scache_clnt.o scache_multi.o user_acl.o mkmap_cdb.o mkmap_sdbm.o \
        ehlo_mask.o \
-       wildcard_inet_addr.o valid_mailhost_addr.o
+       wildcard_inet_addr.o valid_mailhost_addr.o dsn_util.o
 HDRS   = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
        canon_addr.h cfg_parser.h cleanup_user.h clnt_stream.h config.h \
        debug_peer.h debug_process.h defer.h deliver_completed.h \
@@ -74,7 +74,7 @@ HDRS  = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
        string_list.h strip_addr.h sys_exits.h timed_ipc.h tok822.h \
        trace.h verify.h verify_clnt.h verp_sender.h virtual8_maps.h \
        xtext.h scache.h user_acl.h ehlo_mask.h db_common.h \
-       wildcard_inet_addr.h valid_mailhost_addr.h
+       wildcard_inet_addr.h valid_mailhost_addr.h dsn_util.h
 TESTSRC        = rec2stream.c stream2rec.c recdump.c
 DEFS   = -I. -I$(INC_DIR) -D$(SYSTYPE)
 CFLAGS = $(DEBUG) $(OPT) $(DEFS)
@@ -399,1221 +399,1191 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-abounce.o: abounce.c
-abounce.o: ../../include/sys_defs.h
+abounce.o: ../../include/attr.h
+abounce.o: ../../include/events.h
+abounce.o: ../../include/iostuff.h
 abounce.o: ../../include/msg.h
 abounce.o: ../../include/mymalloc.h
-abounce.o: ../../include/events.h
-abounce.o: ../../include/vstream.h
+abounce.o: ../../include/sys_defs.h
 abounce.o: ../../include/vbuf.h
-abounce.o: mail_params.h
-abounce.o: mail_proto.h
-abounce.o: ../../include/iostuff.h
-abounce.o: ../../include/attr.h
+abounce.o: ../../include/vstream.h
+abounce.o: ../../include/vstring.h
+abounce.o: abounce.c
 abounce.o: abounce.h
 abounce.o: bounce.h
 abounce.o: deliver_request.h
-abounce.o: ../../include/vstring.h
+abounce.o: mail_params.h
+abounce.o: mail_proto.h
 abounce.o: recipient_list.h
-anvil_clnt.o: anvil_clnt.c
-anvil_clnt.o: ../../include/sys_defs.h
-anvil_clnt.o: ../../include/mymalloc.h
-anvil_clnt.o: ../../include/msg.h
-anvil_clnt.o: ../../include/attr_clnt.h
 anvil_clnt.o: ../../include/attr.h
-anvil_clnt.o: ../../include/vstream.h
-anvil_clnt.o: ../../include/vbuf.h
+anvil_clnt.o: ../../include/attr_clnt.h
+anvil_clnt.o: ../../include/iostuff.h
+anvil_clnt.o: ../../include/msg.h
+anvil_clnt.o: ../../include/mymalloc.h
 anvil_clnt.o: ../../include/stringops.h
+anvil_clnt.o: ../../include/sys_defs.h
+anvil_clnt.o: ../../include/vbuf.h
+anvil_clnt.o: ../../include/vstream.h
 anvil_clnt.o: ../../include/vstring.h
-anvil_clnt.o: mail_proto.h
-anvil_clnt.o: ../../include/iostuff.h
-anvil_clnt.o: mail_params.h
+anvil_clnt.o: anvil_clnt.c
 anvil_clnt.o: anvil_clnt.h
-been_here.o: been_here.c
-been_here.o: ../../include/sys_defs.h
+anvil_clnt.o: mail_params.h
+anvil_clnt.o: mail_proto.h
+been_here.o: ../../include/htable.h
 been_here.o: ../../include/msg.h
 been_here.o: ../../include/mymalloc.h
-been_here.o: ../../include/htable.h
-been_here.o: ../../include/vstring.h
-been_here.o: ../../include/vbuf.h
 been_here.o: ../../include/stringops.h
+been_here.o: ../../include/sys_defs.h
+been_here.o: ../../include/vbuf.h
+been_here.o: ../../include/vstring.h
+been_here.o: been_here.c
 been_here.o: been_here.h
-bounce.o: bounce.c
-bounce.o: ../../include/sys_defs.h
+bounce.o: ../../include/attr.h
+bounce.o: ../../include/iostuff.h
 bounce.o: ../../include/msg.h
-bounce.o: ../../include/vstring.h
+bounce.o: ../../include/mymalloc.h
+bounce.o: ../../include/sys_defs.h
 bounce.o: ../../include/vbuf.h
-bounce.o: mail_params.h
-bounce.o: mail_proto.h
 bounce.o: ../../include/vstream.h
-bounce.o: ../../include/iostuff.h
-bounce.o: ../../include/attr.h
-bounce.o: log_adhoc.h
-bounce.o: verify.h
+bounce.o: ../../include/vstring.h
+bounce.o: bounce.c
+bounce.o: bounce.h
+bounce.o: defer.h
 bounce.o: deliver_request.h
+bounce.o: dsn_util.h
+bounce.o: log_adhoc.h
+bounce.o: mail_params.h
+bounce.o: mail_proto.h
 bounce.o: recipient_list.h
-bounce.o: defer.h
-bounce.o: bounce.h
 bounce.o: trace.h
-bounce_log.o: bounce_log.c
-bounce_log.o: ../../include/sys_defs.h
+bounce.o: verify.h
+bounce_log.o: ../../include/attr.h
+bounce_log.o: ../../include/iostuff.h
 bounce_log.o: ../../include/msg.h
 bounce_log.o: ../../include/mymalloc.h
-bounce_log.o: ../../include/vstream.h
+bounce_log.o: ../../include/stringops.h
+bounce_log.o: ../../include/sys_defs.h
 bounce_log.o: ../../include/vbuf.h
+bounce_log.o: ../../include/vstream.h
 bounce_log.o: ../../include/vstring.h
 bounce_log.o: ../../include/vstring_vstream.h
-bounce_log.o: ../../include/stringops.h
+bounce_log.o: bounce_log.c
+bounce_log.o: bounce_log.h
 bounce_log.o: mail_params.h
 bounce_log.o: mail_proto.h
-bounce_log.o: ../../include/iostuff.h
-bounce_log.o: ../../include/attr.h
 bounce_log.o: mail_queue.h
-bounce_log.o: bounce_log.h
-canon_addr.o: canon_addr.c
+canon_addr.o: ../../include/attr.h
+canon_addr.o: ../../include/iostuff.h
+canon_addr.o: ../../include/mymalloc.h
 canon_addr.o: ../../include/sys_defs.h
-canon_addr.o: ../../include/vstring.h
 canon_addr.o: ../../include/vbuf.h
-canon_addr.o: ../../include/mymalloc.h
-canon_addr.o: rewrite_clnt.h
-canon_addr.o: mail_proto.h
 canon_addr.o: ../../include/vstream.h
-canon_addr.o: ../../include/iostuff.h
-canon_addr.o: ../../include/attr.h
+canon_addr.o: ../../include/vstring.h
+canon_addr.o: canon_addr.c
 canon_addr.o: canon_addr.h
-cfg_parser.o: cfg_parser.c
-cfg_parser.o: ../../include/sys_defs.h
+canon_addr.o: mail_proto.h
+canon_addr.o: rewrite_clnt.h
+cfg_parser.o: ../../include/argv.h
+cfg_parser.o: ../../include/dict.h
 cfg_parser.o: ../../include/msg.h
 cfg_parser.o: ../../include/mymalloc.h
-cfg_parser.o: ../../include/vstring.h
+cfg_parser.o: ../../include/sys_defs.h
 cfg_parser.o: ../../include/vbuf.h
-cfg_parser.o: ../../include/dict.h
 cfg_parser.o: ../../include/vstream.h
-cfg_parser.o: ../../include/argv.h
-cfg_parser.o: mail_conf.h
+cfg_parser.o: ../../include/vstring.h
+cfg_parser.o: cfg_parser.c
 cfg_parser.o: cfg_parser.h
-cleanup_strerror.o: cleanup_strerror.c
+cfg_parser.o: mail_conf.h
+cleanup_strerror.o: ../../include/msg.h
 cleanup_strerror.o: ../../include/sys_defs.h
-cleanup_strerror.o: ../../include/vstring.h
 cleanup_strerror.o: ../../include/vbuf.h
+cleanup_strerror.o: ../../include/vstring.h
+cleanup_strerror.o: cleanup_strerror.c
 cleanup_strerror.o: cleanup_user.h
-cleanup_strflags.o: cleanup_strflags.c
-cleanup_strflags.o: ../../include/sys_defs.h
 cleanup_strflags.o: ../../include/msg.h
-cleanup_strflags.o: ../../include/vstring.h
+cleanup_strflags.o: ../../include/sys_defs.h
 cleanup_strflags.o: ../../include/vbuf.h
+cleanup_strflags.o: ../../include/vstring.h
+cleanup_strflags.o: cleanup_strflags.c
 cleanup_strflags.o: cleanup_user.h
-clnt_stream.o: clnt_stream.c
-clnt_stream.o: ../../include/sys_defs.h
+clnt_stream.o: ../../include/attr.h
+clnt_stream.o: ../../include/events.h
+clnt_stream.o: ../../include/iostuff.h
 clnt_stream.o: ../../include/msg.h
 clnt_stream.o: ../../include/mymalloc.h
-clnt_stream.o: ../../include/vstream.h
+clnt_stream.o: ../../include/sys_defs.h
 clnt_stream.o: ../../include/vbuf.h
-clnt_stream.o: ../../include/events.h
-clnt_stream.o: ../../include/iostuff.h
-clnt_stream.o: mail_proto.h
-clnt_stream.o: ../../include/attr.h
-clnt_stream.o: mail_params.h
+clnt_stream.o: ../../include/vstream.h
+clnt_stream.o: clnt_stream.c
 clnt_stream.o: clnt_stream.h
-db_common.o: db_common.c
-db_common.o: ../../include/sys_defs.h
-db_common.o: cfg_parser.h
+clnt_stream.o: mail_params.h
+clnt_stream.o: mail_proto.h
+db_common.o: ../../include/argv.h
+db_common.o: ../../include/dict.h
+db_common.o: ../../include/match_list.h
+db_common.o: ../../include/match_ops.h
+db_common.o: ../../include/msg.h
 db_common.o: ../../include/mymalloc.h
-db_common.o: ../../include/vstring.h
+db_common.o: ../../include/sys_defs.h
 db_common.o: ../../include/vbuf.h
-db_common.o: ../../include/msg.h
-db_common.o: ../../include/dict.h
 db_common.o: ../../include/vstream.h
-db_common.o: ../../include/argv.h
+db_common.o: ../../include/vstring.h
+db_common.o: cfg_parser.h
+db_common.o: db_common.c
 db_common.o: db_common.h
 db_common.o: string_list.h
-db_common.o: ../../include/match_list.h
-db_common.o: ../../include/match_ops.h
-debug_peer.o: debug_peer.c
-debug_peer.o: ../../include/sys_defs.h
-debug_peer.o: ../../include/msg.h
-debug_peer.o: mail_params.h
-debug_peer.o: namadr_list.h
 debug_peer.o: ../../include/match_list.h
 debug_peer.o: ../../include/match_ops.h
+debug_peer.o: ../../include/msg.h
+debug_peer.o: ../../include/sys_defs.h
+debug_peer.o: debug_peer.c
 debug_peer.o: debug_peer.h
+debug_peer.o: mail_params.h
 debug_peer.o: match_parent_style.h
-debug_process.o: debug_process.c
-debug_process.o: ../../include/sys_defs.h
+debug_peer.o: namadr_list.h
 debug_process.o: ../../include/msg.h
-debug_process.o: mail_params.h
-debug_process.o: mail_conf.h
+debug_process.o: ../../include/sys_defs.h
+debug_process.o: debug_process.c
 debug_process.o: debug_process.h
-defer.o: defer.c
-defer.o: ../../include/sys_defs.h
+debug_process.o: mail_conf.h
+debug_process.o: mail_params.h
+defer.o: ../../include/attr.h
+defer.o: ../../include/iostuff.h
 defer.o: ../../include/msg.h
-defer.o: ../../include/vstring.h
+defer.o: ../../include/sys_defs.h
 defer.o: ../../include/vbuf.h
-defer.o: mail_params.h
-defer.o: mail_queue.h
 defer.o: ../../include/vstream.h
-defer.o: mail_proto.h
-defer.o: ../../include/iostuff.h
-defer.o: ../../include/attr.h
-defer.o: flush_clnt.h
-defer.o: verify.h
+defer.o: ../../include/vstring.h
+defer.o: bounce.h
+defer.o: defer.c
+defer.o: defer.h
 defer.o: deliver_request.h
-defer.o: recipient_list.h
+defer.o: dsn_util.h
+defer.o: flush_clnt.h
 defer.o: log_adhoc.h
+defer.o: mail_params.h
+defer.o: mail_proto.h
+defer.o: mail_queue.h
+defer.o: recipient_list.h
 defer.o: trace.h
-defer.o: bounce.h
-defer.o: defer.h
-deliver_completed.o: deliver_completed.c
-deliver_completed.o: ../../include/sys_defs.h
+defer.o: verify.h
 deliver_completed.o: ../../include/msg.h
-deliver_completed.o: ../../include/vstream.h
+deliver_completed.o: ../../include/sys_defs.h
 deliver_completed.o: ../../include/vbuf.h
-deliver_completed.o: record.h
+deliver_completed.o: ../../include/vstream.h
 deliver_completed.o: ../../include/vstring.h
-deliver_completed.o: rec_type.h
+deliver_completed.o: deliver_completed.c
 deliver_completed.o: deliver_completed.h
-deliver_flock.o: deliver_flock.c
+deliver_completed.o: rec_type.h
+deliver_completed.o: record.h
+deliver_flock.o: ../../include/iostuff.h
+deliver_flock.o: ../../include/myflock.h
 deliver_flock.o: ../../include/sys_defs.h
-deliver_flock.o: ../../include/vstring.h
 deliver_flock.o: ../../include/vbuf.h
-deliver_flock.o: ../../include/myflock.h
-deliver_flock.o: ../../include/iostuff.h
-deliver_flock.o: mail_params.h
+deliver_flock.o: ../../include/vstring.h
+deliver_flock.o: deliver_flock.c
 deliver_flock.o: deliver_flock.h
-deliver_pass.o: deliver_pass.c
-deliver_pass.o: ../../include/sys_defs.h
+deliver_flock.o: mail_params.h
+deliver_pass.o: ../../include/attr.h
+deliver_pass.o: ../../include/iostuff.h
 deliver_pass.o: ../../include/msg.h
-deliver_pass.o: ../../include/vstring.h
+deliver_pass.o: ../../include/mymalloc.h
+deliver_pass.o: ../../include/split_at.h
+deliver_pass.o: ../../include/sys_defs.h
 deliver_pass.o: ../../include/vbuf.h
 deliver_pass.o: ../../include/vstream.h
-deliver_pass.o: ../../include/split_at.h
-deliver_pass.o: ../../include/mymalloc.h
-deliver_pass.o: mail_params.h
+deliver_pass.o: ../../include/vstring.h
+deliver_pass.o: deliver_pass.c
 deliver_pass.o: deliver_pass.h
 deliver_pass.o: deliver_request.h
-deliver_pass.o: recipient_list.h
+deliver_pass.o: mail_params.h
 deliver_pass.o: mail_proto.h
-deliver_pass.o: ../../include/iostuff.h
-deliver_pass.o: ../../include/attr.h
-deliver_request.o: deliver_request.c
-deliver_request.o: ../../include/sys_defs.h
+deliver_pass.o: recipient_list.h
+deliver_request.o: ../../include/attr.h
+deliver_request.o: ../../include/iostuff.h
 deliver_request.o: ../../include/msg.h
-deliver_request.o: ../../include/vstream.h
+deliver_request.o: ../../include/myflock.h
+deliver_request.o: ../../include/mymalloc.h
+deliver_request.o: ../../include/sys_defs.h
 deliver_request.o: ../../include/vbuf.h
+deliver_request.o: ../../include/vstream.h
 deliver_request.o: ../../include/vstring.h
-deliver_request.o: ../../include/mymalloc.h
-deliver_request.o: ../../include/iostuff.h
-deliver_request.o: ../../include/myflock.h
-deliver_request.o: mail_queue.h
-deliver_request.o: mail_proto.h
-deliver_request.o: ../../include/attr.h
+deliver_request.o: deliver_request.c
+deliver_request.o: deliver_request.h
 deliver_request.o: mail_open_ok.h
+deliver_request.o: mail_proto.h
+deliver_request.o: mail_queue.h
 deliver_request.o: recipient_list.h
-deliver_request.o: deliver_request.h
-dict_ldap.o: dict_ldap.c
 dict_ldap.o: ../../include/sys_defs.h
-dict_ldap.o: ../../include/msg.h
-dict_ldap.o: ../../include/mymalloc.h
-dict_ldap.o: ../../include/vstring.h
-dict_ldap.o: ../../include/vbuf.h
-dict_ldap.o: ../../include/dict.h
-dict_ldap.o: ../../include/vstream.h
-dict_ldap.o: ../../include/argv.h
-dict_ldap.o: ../../include/stringops.h
-dict_ldap.o: ../../include/binhash.h
-dict_ldap.o: cfg_parser.h
-dict_ldap.o: db_common.h
-dict_ldap.o: string_list.h
-dict_ldap.o: ../../include/match_list.h
-dict_ldap.o: ../../include/match_ops.h
-dict_ldap.o: dict_ldap.h
-dict_mysql.o: dict_mysql.c
+dict_ldap.o: dict_ldap.c
 dict_mysql.o: ../../include/sys_defs.h
-dict_mysql.o: ../../include/dict.h
-dict_mysql.o: ../../include/vstream.h
-dict_mysql.o: ../../include/vbuf.h
-dict_mysql.o: ../../include/argv.h
-dict_mysql.o: ../../include/msg.h
-dict_mysql.o: ../../include/mymalloc.h
-dict_mysql.o: ../../include/vstring.h
-dict_mysql.o: ../../include/split_at.h
-dict_mysql.o: ../../include/find_inet.h
-dict_mysql.o: ../../include/myrand.h
-dict_mysql.o: ../../include/events.h
-dict_mysql.o: cfg_parser.h
-dict_mysql.o: db_common.h
-dict_mysql.o: string_list.h
-dict_mysql.o: ../../include/match_list.h
-dict_mysql.o: ../../include/match_ops.h
-dict_mysql.o: dict_mysql.h
-dict_pgsql.o: dict_pgsql.c
+dict_mysql.o: dict_mysql.c
 dict_pgsql.o: ../../include/sys_defs.h
-dict_pgsql.o: ../../include/dict.h
-dict_pgsql.o: ../../include/vstream.h
-dict_pgsql.o: ../../include/vbuf.h
-dict_pgsql.o: ../../include/argv.h
-dict_pgsql.o: ../../include/msg.h
-dict_pgsql.o: ../../include/mymalloc.h
-dict_pgsql.o: ../../include/vstring.h
-dict_pgsql.o: ../../include/split_at.h
-dict_pgsql.o: ../../include/find_inet.h
-dict_pgsql.o: ../../include/myrand.h
-dict_pgsql.o: ../../include/events.h
-dict_pgsql.o: cfg_parser.h
-dict_pgsql.o: db_common.h
-dict_pgsql.o: string_list.h
-dict_pgsql.o: ../../include/match_list.h
-dict_pgsql.o: ../../include/match_ops.h
-dict_pgsql.o: dict_pgsql.h
-dict_proxy.o: dict_proxy.c
-dict_proxy.o: ../../include/sys_defs.h
+dict_pgsql.o: dict_pgsql.c
+dict_proxy.o: ../../include/argv.h
+dict_proxy.o: ../../include/attr.h
+dict_proxy.o: ../../include/dict.h
+dict_proxy.o: ../../include/iostuff.h
 dict_proxy.o: ../../include/msg.h
 dict_proxy.o: ../../include/mymalloc.h
 dict_proxy.o: ../../include/stringops.h
-dict_proxy.o: ../../include/vstring.h
+dict_proxy.o: ../../include/sys_defs.h
 dict_proxy.o: ../../include/vbuf.h
 dict_proxy.o: ../../include/vstream.h
-dict_proxy.o: ../../include/attr.h
-dict_proxy.o: ../../include/dict.h
-dict_proxy.o: ../../include/argv.h
-dict_proxy.o: mail_proto.h
-dict_proxy.o: ../../include/iostuff.h
-dict_proxy.o: mail_params.h
+dict_proxy.o: ../../include/vstring.h
 dict_proxy.o: clnt_stream.h
+dict_proxy.o: dict_proxy.c
 dict_proxy.o: dict_proxy.h
-domain_list.o: domain_list.c
-domain_list.o: ../../include/sys_defs.h
+dict_proxy.o: mail_params.h
+dict_proxy.o: mail_proto.h
 domain_list.o: ../../include/match_list.h
-domain_list.o: domain_list.h
 domain_list.o: ../../include/match_ops.h
-dot_lockfile.o: dot_lockfile.c
+domain_list.o: ../../include/sys_defs.h
+domain_list.o: domain_list.c
+domain_list.o: domain_list.h
+dot_lockfile.o: ../../include/iostuff.h
+dot_lockfile.o: ../../include/mymalloc.h
+dot_lockfile.o: ../../include/stringops.h
 dot_lockfile.o: ../../include/sys_defs.h
-dot_lockfile.o: ../../include/vstring.h
 dot_lockfile.o: ../../include/vbuf.h
-dot_lockfile.o: ../../include/stringops.h
-dot_lockfile.o: ../../include/mymalloc.h
-dot_lockfile.o: ../../include/iostuff.h
-dot_lockfile.o: mail_params.h
+dot_lockfile.o: ../../include/vstring.h
+dot_lockfile.o: dot_lockfile.c
 dot_lockfile.o: dot_lockfile.h
-dot_lockfile_as.o: dot_lockfile_as.c
-dot_lockfile_as.o: ../../include/sys_defs.h
+dot_lockfile.o: mail_params.h
 dot_lockfile_as.o: ../../include/msg.h
 dot_lockfile_as.o: ../../include/set_eugid.h
-dot_lockfile_as.o: dot_lockfile.h
-dot_lockfile_as.o: ../../include/vstring.h
+dot_lockfile_as.o: ../../include/sys_defs.h
 dot_lockfile_as.o: ../../include/vbuf.h
+dot_lockfile_as.o: ../../include/vstring.h
+dot_lockfile_as.o: dot_lockfile.h
+dot_lockfile_as.o: dot_lockfile_as.c
 dot_lockfile_as.o: dot_lockfile_as.h
-ehlo_mask.o: ehlo_mask.c
-ehlo_mask.o: ../../include/sys_defs.h
+dsn_util.o: ../../include/msg.h
+dsn_util.o: ../../include/mymalloc.h
+dsn_util.o: ../../include/stringops.h
+dsn_util.o: ../../include/sys_defs.h
+dsn_util.o: ../../include/vbuf.h
+dsn_util.o: ../../include/vstring.h
+dsn_util.o: dsn_util.c
+dsn_util.o: dsn_util.h
 ehlo_mask.o: ../../include/name_mask.h
+ehlo_mask.o: ../../include/sys_defs.h
+ehlo_mask.o: ehlo_mask.c
 ehlo_mask.o: ehlo_mask.h
-ext_prop.o: ext_prop.c
-ext_prop.o: ../../include/sys_defs.h
 ext_prop.o: ../../include/name_mask.h
-ext_prop.o: mail_params.h
+ext_prop.o: ../../include/sys_defs.h
+ext_prop.o: ext_prop.c
 ext_prop.o: ext_prop.h
-file_id.o: file_id.c
-file_id.o: ../../include/sys_defs.h
+ext_prop.o: mail_params.h
 file_id.o: ../../include/msg.h
-file_id.o: ../../include/vstring.h
+file_id.o: ../../include/sys_defs.h
 file_id.o: ../../include/vbuf.h
+file_id.o: ../../include/vstring.h
+file_id.o: file_id.c
 file_id.o: file_id.h
-flush_clnt.o: flush_clnt.c
-flush_clnt.o: ../../include/sys_defs.h
+flush_clnt.o: ../../include/attr.h
+flush_clnt.o: ../../include/iostuff.h
+flush_clnt.o: ../../include/match_list.h
+flush_clnt.o: ../../include/match_ops.h
 flush_clnt.o: ../../include/msg.h
-flush_clnt.o: ../../include/vstream.h
+flush_clnt.o: ../../include/sys_defs.h
 flush_clnt.o: ../../include/vbuf.h
-flush_clnt.o: mail_proto.h
-flush_clnt.o: ../../include/iostuff.h
-flush_clnt.o: ../../include/attr.h
+flush_clnt.o: ../../include/vstream.h
+flush_clnt.o: domain_list.h
+flush_clnt.o: flush_clnt.c
+flush_clnt.o: flush_clnt.h
 flush_clnt.o: mail_flush.h
 flush_clnt.o: mail_params.h
-flush_clnt.o: domain_list.h
-flush_clnt.o: ../../include/match_list.h
-flush_clnt.o: ../../include/match_ops.h
+flush_clnt.o: mail_proto.h
 flush_clnt.o: match_parent_style.h
-flush_clnt.o: flush_clnt.h
-header_opts.o: header_opts.c
-header_opts.o: ../../include/sys_defs.h
-header_opts.o: ../../include/msg.h
 header_opts.o: ../../include/htable.h
-header_opts.o: ../../include/vstring.h
-header_opts.o: ../../include/vbuf.h
+header_opts.o: ../../include/msg.h
 header_opts.o: ../../include/stringops.h
+header_opts.o: ../../include/sys_defs.h
+header_opts.o: ../../include/vbuf.h
+header_opts.o: ../../include/vstring.h
+header_opts.o: header_opts.c
 header_opts.o: header_opts.h
-header_token.o: header_token.c
-header_token.o: ../../include/sys_defs.h
 header_token.o: ../../include/msg.h
-header_token.o: ../../include/vstring.h
+header_token.o: ../../include/sys_defs.h
 header_token.o: ../../include/vbuf.h
-header_token.o: lex_822.h
+header_token.o: ../../include/vstring.h
+header_token.o: header_token.c
 header_token.o: header_token.h
-hold_message.o: hold_message.c
-hold_message.o: ../../include/sys_defs.h
+header_token.o: lex_822.h
 hold_message.o: ../../include/msg.h
-hold_message.o: ../../include/set_eugid.h
 hold_message.o: ../../include/sane_fsops.h
-hold_message.o: mail_queue.h
-hold_message.o: ../../include/vstring.h
+hold_message.o: ../../include/set_eugid.h
+hold_message.o: ../../include/sys_defs.h
 hold_message.o: ../../include/vbuf.h
 hold_message.o: ../../include/vstream.h
-hold_message.o: mail_params.h
+hold_message.o: ../../include/vstring.h
+hold_message.o: hold_message.c
 hold_message.o: hold_message.h
-input_transp.o: input_transp.c
-input_transp.o: ../../include/sys_defs.h
-input_transp.o: ../../include/name_mask.h
+hold_message.o: mail_params.h
+hold_message.o: mail_queue.h
 input_transp.o: ../../include/msg.h
-input_transp.o: mail_params.h
+input_transp.o: ../../include/name_mask.h
+input_transp.o: ../../include/sys_defs.h
 input_transp.o: cleanup_user.h
+input_transp.o: input_transp.c
 input_transp.o: input_transp.h
-is_header.o: is_header.c
+input_transp.o: mail_params.h
 is_header.o: ../../include/sys_defs.h
+is_header.o: is_header.c
 is_header.o: is_header.h
-log_adhoc.o: log_adhoc.c
-log_adhoc.o: ../../include/sys_defs.h
 log_adhoc.o: ../../include/msg.h
-log_adhoc.o: ../../include/vstring.h
+log_adhoc.o: ../../include/sys_defs.h
 log_adhoc.o: ../../include/vbuf.h
+log_adhoc.o: ../../include/vstring.h
+log_adhoc.o: log_adhoc.c
 log_adhoc.o: log_adhoc.h
-mail_addr.o: mail_addr.c
-mail_addr.o: ../../include/sys_defs.h
 mail_addr.o: ../../include/stringops.h
-mail_addr.o: ../../include/vstring.h
+mail_addr.o: ../../include/sys_defs.h
 mail_addr.o: ../../include/vbuf.h
-mail_addr.o: mail_params.h
+mail_addr.o: ../../include/vstring.h
+mail_addr.o: mail_addr.c
 mail_addr.o: mail_addr.h
-mail_addr_crunch.o: mail_addr_crunch.c
-mail_addr_crunch.o: ../../include/sys_defs.h
-mail_addr_crunch.o: ../../include/mymalloc.h
+mail_addr.o: mail_params.h
 mail_addr_crunch.o: ../../include/argv.h
-mail_addr_crunch.o: ../../include/vstring.h
+mail_addr_crunch.o: ../../include/mymalloc.h
+mail_addr_crunch.o: ../../include/sys_defs.h
 mail_addr_crunch.o: ../../include/vbuf.h
-mail_addr_crunch.o: tok822.h
-mail_addr_crunch.o: resolve_clnt.h
+mail_addr_crunch.o: ../../include/vstring.h
 mail_addr_crunch.o: canon_addr.h
+mail_addr_crunch.o: mail_addr_crunch.c
 mail_addr_crunch.o: mail_addr_crunch.h
-mail_addr_find.o: mail_addr_find.c
-mail_addr_find.o: ../../include/sys_defs.h
-mail_addr_find.o: ../../include/msg.h
-mail_addr_find.o: ../../include/dict.h
-mail_addr_find.o: ../../include/vstream.h
-mail_addr_find.o: ../../include/vbuf.h
+mail_addr_crunch.o: resolve_clnt.h
+mail_addr_crunch.o: tok822.h
 mail_addr_find.o: ../../include/argv.h
+mail_addr_find.o: ../../include/dict.h
+mail_addr_find.o: ../../include/msg.h
+mail_addr_find.o: ../../include/mymalloc.h
 mail_addr_find.o: ../../include/stringops.h
+mail_addr_find.o: ../../include/sys_defs.h
+mail_addr_find.o: ../../include/vbuf.h
+mail_addr_find.o: ../../include/vstream.h
 mail_addr_find.o: ../../include/vstring.h
-mail_addr_find.o: ../../include/mymalloc.h
-mail_addr_find.o: mail_params.h
-mail_addr_find.o: strip_addr.h
+mail_addr_find.o: mail_addr_find.c
 mail_addr_find.o: mail_addr_find.h
+mail_addr_find.o: mail_params.h
 mail_addr_find.o: maps.h
 mail_addr_find.o: resolve_local.h
-mail_addr_map.o: mail_addr_map.c
-mail_addr_map.o: ../../include/sys_defs.h
+mail_addr_find.o: strip_addr.h
+mail_addr_map.o: ../../include/argv.h
+mail_addr_map.o: ../../include/dict.h
 mail_addr_map.o: ../../include/msg.h
-mail_addr_map.o: ../../include/vstring.h
+mail_addr_map.o: ../../include/mymalloc.h
+mail_addr_map.o: ../../include/sys_defs.h
 mail_addr_map.o: ../../include/vbuf.h
-mail_addr_map.o: ../../include/dict.h
 mail_addr_map.o: ../../include/vstream.h
-mail_addr_map.o: ../../include/argv.h
-mail_addr_map.o: ../../include/mymalloc.h
-mail_addr_map.o: mail_addr_find.h
-mail_addr_map.o: maps.h
+mail_addr_map.o: ../../include/vstring.h
 mail_addr_map.o: mail_addr_crunch.h
+mail_addr_map.o: mail_addr_find.h
+mail_addr_map.o: mail_addr_map.c
 mail_addr_map.o: mail_addr_map.h
-mail_command_client.o: mail_command_client.c
+mail_addr_map.o: maps.h
+mail_command_client.o: ../../include/attr.h
+mail_command_client.o: ../../include/iostuff.h
 mail_command_client.o: ../../include/sys_defs.h
-mail_command_client.o: ../../include/vstream.h
 mail_command_client.o: ../../include/vbuf.h
+mail_command_client.o: ../../include/vstream.h
+mail_command_client.o: mail_command_client.c
 mail_command_client.o: mail_proto.h
-mail_command_client.o: ../../include/iostuff.h
-mail_command_client.o: ../../include/attr.h
-mail_command_server.o: mail_command_server.c
+mail_command_server.o: ../../include/attr.h
+mail_command_server.o: ../../include/iostuff.h
 mail_command_server.o: ../../include/sys_defs.h
-mail_command_server.o: ../../include/vstream.h
 mail_command_server.o: ../../include/vbuf.h
+mail_command_server.o: ../../include/vstream.h
+mail_command_server.o: mail_command_server.c
 mail_command_server.o: mail_proto.h
-mail_command_server.o: ../../include/iostuff.h
-mail_command_server.o: ../../include/attr.h
-mail_conf.o: mail_conf.c
-mail_conf.o: ../../include/sys_defs.h
+mail_conf.o: ../../include/argv.h
+mail_conf.o: ../../include/dict.h
 mail_conf.o: ../../include/msg.h
 mail_conf.o: ../../include/mymalloc.h
-mail_conf.o: ../../include/vstream.h
-mail_conf.o: ../../include/vbuf.h
-mail_conf.o: ../../include/vstring.h
-mail_conf.o: ../../include/dict.h
-mail_conf.o: ../../include/argv.h
+mail_conf.o: ../../include/readlline.h
 mail_conf.o: ../../include/safe.h
 mail_conf.o: ../../include/stringops.h
-mail_conf.o: ../../include/readlline.h
-mail_conf.o: mail_params.h
+mail_conf.o: ../../include/sys_defs.h
+mail_conf.o: ../../include/vbuf.h
+mail_conf.o: ../../include/vstream.h
+mail_conf.o: ../../include/vstring.h
+mail_conf.o: mail_conf.c
 mail_conf.o: mail_conf.h
-mail_conf_bool.o: mail_conf_bool.c
-mail_conf_bool.o: ../../include/sys_defs.h
-mail_conf_bool.o: ../../include/msg.h
+mail_conf.o: mail_params.h
+mail_conf_bool.o: ../../include/argv.h
 mail_conf_bool.o: ../../include/dict.h
-mail_conf_bool.o: ../../include/vstream.h
+mail_conf_bool.o: ../../include/msg.h
+mail_conf_bool.o: ../../include/sys_defs.h
 mail_conf_bool.o: ../../include/vbuf.h
-mail_conf_bool.o: ../../include/argv.h
+mail_conf_bool.o: ../../include/vstream.h
 mail_conf_bool.o: mail_conf.h
-mail_conf_int.o: mail_conf_int.c
-mail_conf_int.o: ../../include/sys_defs.h
+mail_conf_bool.o: mail_conf_bool.c
+mail_conf_int.o: ../../include/argv.h
+mail_conf_int.o: ../../include/dict.h
 mail_conf_int.o: ../../include/msg.h
 mail_conf_int.o: ../../include/mymalloc.h
-mail_conf_int.o: ../../include/dict.h
-mail_conf_int.o: ../../include/vstream.h
-mail_conf_int.o: ../../include/vbuf.h
-mail_conf_int.o: ../../include/argv.h
 mail_conf_int.o: ../../include/stringops.h
+mail_conf_int.o: ../../include/sys_defs.h
+mail_conf_int.o: ../../include/vbuf.h
+mail_conf_int.o: ../../include/vstream.h
 mail_conf_int.o: ../../include/vstring.h
 mail_conf_int.o: mail_conf.h
-mail_conf_raw.o: mail_conf_raw.c
-mail_conf_raw.o: ../../include/sys_defs.h
+mail_conf_int.o: mail_conf_int.c
 mail_conf_raw.o: ../../include/msg.h
 mail_conf_raw.o: ../../include/mymalloc.h
+mail_conf_raw.o: ../../include/sys_defs.h
 mail_conf_raw.o: mail_conf.h
-mail_conf_str.o: mail_conf_str.c
-mail_conf_str.o: ../../include/sys_defs.h
+mail_conf_raw.o: mail_conf_raw.c
 mail_conf_str.o: ../../include/msg.h
 mail_conf_str.o: ../../include/mymalloc.h
+mail_conf_str.o: ../../include/sys_defs.h
 mail_conf_str.o: mail_conf.h
-mail_conf_time.o: mail_conf_time.c
-mail_conf_time.o: ../../include/sys_defs.h
+mail_conf_str.o: mail_conf_str.c
+mail_conf_time.o: ../../include/argv.h
+mail_conf_time.o: ../../include/dict.h
 mail_conf_time.o: ../../include/msg.h
 mail_conf_time.o: ../../include/mymalloc.h
-mail_conf_time.o: ../../include/dict.h
-mail_conf_time.o: ../../include/vstream.h
-mail_conf_time.o: ../../include/vbuf.h
-mail_conf_time.o: ../../include/argv.h
 mail_conf_time.o: ../../include/stringops.h
+mail_conf_time.o: ../../include/sys_defs.h
+mail_conf_time.o: ../../include/vbuf.h
+mail_conf_time.o: ../../include/vstream.h
 mail_conf_time.o: ../../include/vstring.h
 mail_conf_time.o: mail_conf.h
-mail_connect.o: mail_connect.c
-mail_connect.o: ../../include/sys_defs.h
-mail_connect.o: ../../include/msg.h
-mail_connect.o: ../../include/vstream.h
-mail_connect.o: ../../include/vbuf.h
+mail_conf_time.o: mail_conf_time.c
+mail_connect.o: ../../include/attr.h
 mail_connect.o: ../../include/connect.h
 mail_connect.o: ../../include/iostuff.h
+mail_connect.o: ../../include/msg.h
 mail_connect.o: ../../include/mymalloc.h
 mail_connect.o: ../../include/stringops.h
+mail_connect.o: ../../include/sys_defs.h
+mail_connect.o: ../../include/vbuf.h
+mail_connect.o: ../../include/vstream.h
 mail_connect.o: ../../include/vstring.h
-mail_connect.o: timed_ipc.h
+mail_connect.o: mail_connect.c
 mail_connect.o: mail_proto.h
-mail_connect.o: ../../include/attr.h
-mail_copy.o: mail_copy.c
-mail_copy.o: ../../include/sys_defs.h
-mail_copy.o: ../../include/msg.h
+mail_connect.o: timed_ipc.h
 mail_copy.o: ../../include/htable.h
-mail_copy.o: ../../include/vstream.h
+mail_copy.o: ../../include/msg.h
+mail_copy.o: ../../include/safe_open.h
+mail_copy.o: ../../include/stringops.h
+mail_copy.o: ../../include/sys_defs.h
 mail_copy.o: ../../include/vbuf.h
+mail_copy.o: ../../include/vstream.h
 mail_copy.o: ../../include/vstring.h
 mail_copy.o: ../../include/vstring_vstream.h
-mail_copy.o: ../../include/stringops.h
+mail_copy.o: dsn_util.h
+mail_copy.o: mail_addr.h
+mail_copy.o: mail_copy.c
+mail_copy.o: mail_copy.h
+mail_copy.o: mail_params.h
+mail_copy.o: mail_queue.h
+mail_copy.o: mark_corrupt.h
+mail_copy.o: mbox_open.h
 mail_copy.o: quote_822_local.h
 mail_copy.o: quote_flags.h
-mail_copy.o: record.h
 mail_copy.o: rec_type.h
-mail_copy.o: mail_queue.h
-mail_copy.o: mail_addr.h
-mail_copy.o: mark_corrupt.h
-mail_copy.o: mail_params.h
-mail_copy.o: mail_copy.h
-mail_date.o: mail_date.c
-mail_date.o: ../../include/sys_defs.h
+mail_copy.o: record.h
 mail_date.o: ../../include/msg.h
-mail_date.o: ../../include/vstring.h
+mail_date.o: ../../include/sys_defs.h
 mail_date.o: ../../include/vbuf.h
+mail_date.o: ../../include/vstring.h
+mail_date.o: mail_date.c
 mail_date.o: mail_date.h
-mail_dict.o: mail_dict.c
-mail_dict.o: ../../include/sys_defs.h
-mail_dict.o: ../../include/dict.h
-mail_dict.o: ../../include/vstream.h
-mail_dict.o: ../../include/vbuf.h
 mail_dict.o: ../../include/argv.h
+mail_dict.o: ../../include/dict.h
 mail_dict.o: ../../include/msg.h
-mail_dict.o: dict_proxy.h
+mail_dict.o: ../../include/sys_defs.h
+mail_dict.o: ../../include/vbuf.h
+mail_dict.o: ../../include/vstream.h
 mail_dict.o: dict_ldap.h
 mail_dict.o: dict_mysql.h
 mail_dict.o: dict_pgsql.h
+mail_dict.o: dict_proxy.h
+mail_dict.o: mail_dict.c
 mail_dict.o: mail_dict.h
-mail_error.o: mail_error.c
+mail_error.o: ../../include/name_mask.h
 mail_error.o: ../../include/sys_defs.h
+mail_error.o: mail_error.c
 mail_error.o: mail_error.h
-mail_error.o: ../../include/name_mask.h
-mail_flush.o: mail_flush.c
+mail_flush.o: ../../include/attr.h
+mail_flush.o: ../../include/iostuff.h
 mail_flush.o: ../../include/sys_defs.h
-mail_flush.o: mail_params.h
-mail_flush.o: mail_proto.h
-mail_flush.o: ../../include/vstream.h
 mail_flush.o: ../../include/vbuf.h
-mail_flush.o: ../../include/iostuff.h
-mail_flush.o: ../../include/attr.h
+mail_flush.o: ../../include/vstream.h
+mail_flush.o: mail_flush.c
 mail_flush.o: mail_flush.h
-mail_open_ok.o: mail_open_ok.c
-mail_open_ok.o: ../../include/sys_defs.h
+mail_flush.o: mail_params.h
+mail_flush.o: mail_proto.h
 mail_open_ok.o: ../../include/msg.h
-mail_open_ok.o: mail_queue.h
-mail_open_ok.o: ../../include/vstring.h
+mail_open_ok.o: ../../include/sys_defs.h
 mail_open_ok.o: ../../include/vbuf.h
 mail_open_ok.o: ../../include/vstream.h
+mail_open_ok.o: ../../include/vstring.h
+mail_open_ok.o: mail_open_ok.c
 mail_open_ok.o: mail_open_ok.h
-mail_params.o: mail_params.c
-mail_params.o: ../../include/sys_defs.h
+mail_open_ok.o: mail_queue.h
+mail_params.o: ../../include/argv.h
+mail_params.o: ../../include/attr.h
+mail_params.o: ../../include/dict.h
+mail_params.o: ../../include/dict_db.h
+mail_params.o: ../../include/get_hostname.h
+mail_params.o: ../../include/inet_addr_list.h
+mail_params.o: ../../include/inet_proto.h
+mail_params.o: ../../include/iostuff.h
 mail_params.o: ../../include/msg.h
 mail_params.o: ../../include/msg_syslog.h
-mail_params.o: ../../include/get_hostname.h
-mail_params.o: ../../include/valid_hostname.h
+mail_params.o: ../../include/myaddrinfo.h
+mail_params.o: ../../include/safe.h
 mail_params.o: ../../include/stringops.h
-mail_params.o: ../../include/vstring.h
+mail_params.o: ../../include/sys_defs.h
+mail_params.o: ../../include/valid_hostname.h
 mail_params.o: ../../include/vbuf.h
-mail_params.o: ../../include/safe.h
-mail_params.o: ../../include/dict_db.h
-mail_params.o: ../../include/dict.h
 mail_params.o: ../../include/vstream.h
-mail_params.o: ../../include/argv.h
-mail_params.o: ../../include/inet_proto.h
-mail_params.o: mynetworks.h
+mail_params.o: ../../include/vstring.h
 mail_params.o: mail_conf.h
-mail_params.o: mail_version.h
+mail_params.o: mail_params.c
+mail_params.o: mail_params.h
 mail_params.o: mail_proto.h
-mail_params.o: ../../include/iostuff.h
-mail_params.o: ../../include/attr.h
-mail_params.o: verp_sender.h
+mail_params.o: mail_version.h
+mail_params.o: mynetworks.h
 mail_params.o: own_inet_addr.h
-mail_params.o: ../../include/inet_addr_list.h
-mail_params.o: ../../include/myaddrinfo.h
-mail_params.o: mail_params.h
-mail_pathname.o: mail_pathname.c
-mail_pathname.o: ../../include/sys_defs.h
+mail_params.o: verp_sender.h
+mail_pathname.o: ../../include/attr.h
+mail_pathname.o: ../../include/iostuff.h
 mail_pathname.o: ../../include/stringops.h
-mail_pathname.o: ../../include/vstring.h
+mail_pathname.o: ../../include/sys_defs.h
 mail_pathname.o: ../../include/vbuf.h
-mail_pathname.o: mail_proto.h
 mail_pathname.o: ../../include/vstream.h
-mail_pathname.o: ../../include/iostuff.h
-mail_pathname.o: ../../include/attr.h
-mail_queue.o: mail_queue.c
-mail_queue.o: ../../include/sys_defs.h
-mail_queue.o: ../../include/msg.h
-mail_queue.o: ../../include/vstring.h
-mail_queue.o: ../../include/vbuf.h
-mail_queue.o: ../../include/vstream.h
-mail_queue.o: ../../include/mymalloc.h
+mail_pathname.o: ../../include/vstring.h
+mail_pathname.o: mail_pathname.c
+mail_pathname.o: mail_proto.h
 mail_queue.o: ../../include/argv.h
 mail_queue.o: ../../include/dir_forest.h
 mail_queue.o: ../../include/make_dirs.h
-mail_queue.o: ../../include/split_at.h
+mail_queue.o: ../../include/msg.h
+mail_queue.o: ../../include/mymalloc.h
 mail_queue.o: ../../include/sane_fsops.h
+mail_queue.o: ../../include/split_at.h
+mail_queue.o: ../../include/sys_defs.h
 mail_queue.o: ../../include/valid_hostname.h
+mail_queue.o: ../../include/vbuf.h
+mail_queue.o: ../../include/vstream.h
+mail_queue.o: ../../include/vstring.h
 mail_queue.o: file_id.h
 mail_queue.o: mail_params.h
+mail_queue.o: mail_queue.c
 mail_queue.o: mail_queue.h
-mail_run.o: mail_run.c
-mail_run.o: ../../include/sys_defs.h
 mail_run.o: ../../include/msg.h
+mail_run.o: ../../include/mymalloc.h
 mail_run.o: ../../include/stringops.h
-mail_run.o: ../../include/vstring.h
+mail_run.o: ../../include/sys_defs.h
 mail_run.o: ../../include/vbuf.h
-mail_run.o: ../../include/mymalloc.h
+mail_run.o: ../../include/vstring.h
 mail_run.o: mail_params.h
+mail_run.o: mail_run.c
 mail_run.o: mail_run.h
-mail_scan_dir.o: mail_scan_dir.c
-mail_scan_dir.o: ../../include/sys_defs.h
 mail_scan_dir.o: ../../include/scan_dir.h
+mail_scan_dir.o: ../../include/sys_defs.h
+mail_scan_dir.o: mail_scan_dir.c
 mail_scan_dir.o: mail_scan_dir.h
-mail_stream.o: mail_stream.c
-mail_stream.o: ../../include/sys_defs.h
+mail_stream.o: ../../include/argv.h
+mail_stream.o: ../../include/attr.h
+mail_stream.o: ../../include/iostuff.h
 mail_stream.o: ../../include/msg.h
 mail_stream.o: ../../include/mymalloc.h
-mail_stream.o: ../../include/vstring.h
+mail_stream.o: ../../include/stringops.h
+mail_stream.o: ../../include/sys_defs.h
 mail_stream.o: ../../include/vbuf.h
 mail_stream.o: ../../include/vstream.h
-mail_stream.o: ../../include/stringops.h
-mail_stream.o: ../../include/argv.h
+mail_stream.o: ../../include/vstring.h
 mail_stream.o: cleanup_user.h
+mail_stream.o: mail_params.h
 mail_stream.o: mail_proto.h
-mail_stream.o: ../../include/iostuff.h
-mail_stream.o: ../../include/attr.h
 mail_stream.o: mail_queue.h
-mail_stream.o: opened.h
-mail_stream.o: mail_params.h
+mail_stream.o: mail_stream.c
 mail_stream.o: mail_stream.h
-mail_task.o: mail_task.c
+mail_stream.o: opened.h
+mail_task.o: ../../include/safe.h
 mail_task.o: ../../include/sys_defs.h
-mail_task.o: ../../include/vstring.h
 mail_task.o: ../../include/vbuf.h
-mail_task.o: ../../include/safe.h
-mail_task.o: mail_params.h
+mail_task.o: ../../include/vstring.h
 mail_task.o: mail_conf.h
+mail_task.o: mail_params.h
+mail_task.o: mail_task.c
 mail_task.o: mail_task.h
-mail_trigger.o: mail_trigger.c
-mail_trigger.o: ../../include/sys_defs.h
+mail_trigger.o: ../../include/attr.h
+mail_trigger.o: ../../include/iostuff.h
 mail_trigger.o: ../../include/msg.h
 mail_trigger.o: ../../include/mymalloc.h
-mail_trigger.o: ../../include/iostuff.h
+mail_trigger.o: ../../include/sys_defs.h
 mail_trigger.o: ../../include/trigger.h
+mail_trigger.o: ../../include/vbuf.h
+mail_trigger.o: ../../include/vstream.h
 mail_trigger.o: mail_params.h
 mail_trigger.o: mail_proto.h
-mail_trigger.o: ../../include/vstream.h
-mail_trigger.o: ../../include/vbuf.h
-mail_trigger.o: ../../include/attr.h
+mail_trigger.o: mail_trigger.c
 mail_version.o: mail_version.c
-maps.o: maps.c
-maps.o: ../../include/sys_defs.h
 maps.o: ../../include/argv.h
-maps.o: ../../include/mymalloc.h
-maps.o: ../../include/msg.h
 maps.o: ../../include/dict.h
-maps.o: ../../include/vstream.h
-maps.o: ../../include/vbuf.h
+maps.o: ../../include/msg.h
+maps.o: ../../include/mymalloc.h
+maps.o: ../../include/split_at.h
 maps.o: ../../include/stringops.h
+maps.o: ../../include/sys_defs.h
+maps.o: ../../include/vbuf.h
+maps.o: ../../include/vstream.h
 maps.o: ../../include/vstring.h
-maps.o: ../../include/split_at.h
 maps.o: mail_conf.h
+maps.o: maps.c
 maps.o: maps.h
-mark_corrupt.o: mark_corrupt.c
-mark_corrupt.o: ../../include/sys_defs.h
 mark_corrupt.o: ../../include/msg.h
-mark_corrupt.o: ../../include/vstream.h
-mark_corrupt.o: ../../include/vbuf.h
 mark_corrupt.o: ../../include/set_eugid.h
-mark_corrupt.o: mail_queue.h
+mark_corrupt.o: ../../include/sys_defs.h
+mark_corrupt.o: ../../include/vbuf.h
+mark_corrupt.o: ../../include/vstream.h
 mark_corrupt.o: ../../include/vstring.h
-mark_corrupt.o: mail_params.h
 mark_corrupt.o: deliver_request.h
-mark_corrupt.o: recipient_list.h
+mark_corrupt.o: mail_params.h
+mark_corrupt.o: mail_queue.h
+mark_corrupt.o: mark_corrupt.c
 mark_corrupt.o: mark_corrupt.h
-match_parent_style.o: match_parent_style.c
-match_parent_style.o: ../../include/sys_defs.h
-match_parent_style.o: string_list.h
+mark_corrupt.o: recipient_list.h
 match_parent_style.o: ../../include/match_list.h
 match_parent_style.o: ../../include/match_ops.h
+match_parent_style.o: ../../include/sys_defs.h
 match_parent_style.o: mail_params.h
+match_parent_style.o: match_parent_style.c
 match_parent_style.o: match_parent_style.h
-mbox_conf.o: mbox_conf.c
-mbox_conf.o: ../../include/sys_defs.h
-mbox_conf.o: ../../include/name_mask.h
+match_parent_style.o: string_list.h
 mbox_conf.o: ../../include/argv.h
+mbox_conf.o: ../../include/name_mask.h
+mbox_conf.o: ../../include/sys_defs.h
 mbox_conf.o: mail_params.h
+mbox_conf.o: mbox_conf.c
 mbox_conf.o: mbox_conf.h
-mbox_open.o: mbox_open.c
-mbox_open.o: ../../include/sys_defs.h
+mbox_open.o: ../../include/argv.h
+mbox_open.o: ../../include/iostuff.h
 mbox_open.o: ../../include/msg.h
-mbox_open.o: ../../include/vstream.h
+mbox_open.o: ../../include/myflock.h
+mbox_open.o: ../../include/mymalloc.h
+mbox_open.o: ../../include/safe_open.h
+mbox_open.o: ../../include/sys_defs.h
 mbox_open.o: ../../include/vbuf.h
+mbox_open.o: ../../include/vstream.h
 mbox_open.o: ../../include/vstring.h
-mbox_open.o: ../../include/safe_open.h
-mbox_open.o: ../../include/iostuff.h
-mbox_open.o: ../../include/mymalloc.h
-mbox_open.o: dot_lockfile.h
 mbox_open.o: deliver_flock.h
-mbox_open.o: ../../include/myflock.h
+mbox_open.o: dot_lockfile.h
+mbox_open.o: dsn_util.h
 mbox_open.o: mbox_conf.h
-mbox_open.o: ../../include/argv.h
+mbox_open.o: mbox_open.c
 mbox_open.o: mbox_open.h
-mime_state.o: mime_state.c
-mime_state.o: ../../include/sys_defs.h
-mime_state.o: ../../include/mymalloc.h
 mime_state.o: ../../include/msg.h
-mime_state.o: ../../include/vstring.h
+mime_state.o: ../../include/mymalloc.h
+mime_state.o: ../../include/sys_defs.h
 mime_state.o: ../../include/vbuf.h
-mime_state.o: rec_type.h
-mime_state.o: is_header.h
+mime_state.o: ../../include/vstring.h
 mime_state.o: header_opts.h
-mime_state.o: mail_params.h
 mime_state.o: header_token.h
+mime_state.o: is_header.h
 mime_state.o: lex_822.h
+mime_state.o: mail_params.h
+mime_state.o: mime_state.c
 mime_state.o: mime_state.h
-mkmap_cdb.o: mkmap_cdb.c
+mime_state.o: rec_type.h
 mkmap_cdb.o: ../../include/sys_defs.h
-mkmap_db.o: mkmap_db.c
-mkmap_db.o: ../../include/sys_defs.h
+mkmap_cdb.o: mkmap_cdb.c
+mkmap_db.o: ../../include/argv.h
+mkmap_db.o: ../../include/dict.h
+mkmap_db.o: ../../include/dict_db.h
 mkmap_db.o: ../../include/msg.h
+mkmap_db.o: ../../include/myflock.h
 mkmap_db.o: ../../include/mymalloc.h
 mkmap_db.o: ../../include/stringops.h
-mkmap_db.o: ../../include/vstring.h
+mkmap_db.o: ../../include/sys_defs.h
 mkmap_db.o: ../../include/vbuf.h
-mkmap_db.o: ../../include/dict.h
 mkmap_db.o: ../../include/vstream.h
-mkmap_db.o: ../../include/argv.h
-mkmap_db.o: ../../include/dict_db.h
-mkmap_db.o: ../../include/myflock.h
+mkmap_db.o: ../../include/vstring.h
 mkmap_db.o: mail_params.h
-mkmap_db.o: mkmap.h
-mkmap_dbm.o: mkmap_dbm.c
-mkmap_dbm.o: ../../include/sys_defs.h
+mkmap_db.o: mkmap.h
+mkmap_db.o: mkmap_db.c
+mkmap_dbm.o: ../../include/argv.h
+mkmap_dbm.o: ../../include/dict.h
+mkmap_dbm.o: ../../include/dict_dbm.h
 mkmap_dbm.o: ../../include/msg.h
+mkmap_dbm.o: ../../include/myflock.h
 mkmap_dbm.o: ../../include/mymalloc.h
 mkmap_dbm.o: ../../include/stringops.h
-mkmap_dbm.o: ../../include/vstring.h
+mkmap_dbm.o: ../../include/sys_defs.h
 mkmap_dbm.o: ../../include/vbuf.h
-mkmap_dbm.o: ../../include/dict.h
 mkmap_dbm.o: ../../include/vstream.h
-mkmap_dbm.o: ../../include/argv.h
-mkmap_dbm.o: ../../include/dict_dbm.h
-mkmap_dbm.o: ../../include/myflock.h
+mkmap_dbm.o: ../../include/vstring.h
 mkmap_dbm.o: mkmap.h
-mkmap_open.o: mkmap_open.c
-mkmap_open.o: ../../include/sys_defs.h
-mkmap_open.o: ../../include/msg.h
-mkmap_open.o: ../../include/dict.h
-mkmap_open.o: ../../include/vstream.h
-mkmap_open.o: ../../include/vbuf.h
+mkmap_dbm.o: mkmap_dbm.c
 mkmap_open.o: ../../include/argv.h
-mkmap_open.o: ../../include/dict_db.h
+mkmap_open.o: ../../include/dict.h
 mkmap_open.o: ../../include/dict_cdb.h
+mkmap_open.o: ../../include/dict_db.h
 mkmap_open.o: ../../include/dict_dbm.h
 mkmap_open.o: ../../include/dict_sdbm.h
-mkmap_open.o: ../../include/sigdelay.h
+mkmap_open.o: ../../include/msg.h
 mkmap_open.o: ../../include/mymalloc.h
+mkmap_open.o: ../../include/sigdelay.h
+mkmap_open.o: ../../include/sys_defs.h
+mkmap_open.o: ../../include/vbuf.h
+mkmap_open.o: ../../include/vstream.h
 mkmap_open.o: mkmap.h
-mkmap_sdbm.o: mkmap_sdbm.c
-mkmap_sdbm.o: ../../include/sys_defs.h
+mkmap_open.o: mkmap_open.c
+mkmap_sdbm.o: ../../include/argv.h
+mkmap_sdbm.o: ../../include/dict.h
+mkmap_sdbm.o: ../../include/dict_sdbm.h
 mkmap_sdbm.o: ../../include/msg.h
+mkmap_sdbm.o: ../../include/myflock.h
 mkmap_sdbm.o: ../../include/mymalloc.h
 mkmap_sdbm.o: ../../include/stringops.h
-mkmap_sdbm.o: ../../include/vstring.h
+mkmap_sdbm.o: ../../include/sys_defs.h
 mkmap_sdbm.o: ../../include/vbuf.h
-mkmap_sdbm.o: ../../include/dict.h
 mkmap_sdbm.o: ../../include/vstream.h
-mkmap_sdbm.o: ../../include/argv.h
-mkmap_sdbm.o: ../../include/dict_sdbm.h
-mkmap_sdbm.o: ../../include/myflock.h
+mkmap_sdbm.o: ../../include/vstring.h
 mkmap_sdbm.o: mkmap.h
-mynetworks.o: mynetworks.c
-mynetworks.o: ../../include/sys_defs.h
-mynetworks.o: ../../include/msg.h
-mynetworks.o: ../../include/vstring.h
-mynetworks.o: ../../include/vbuf.h
+mkmap_sdbm.o: mkmap_sdbm.c
+mynetworks.o: ../../include/argv.h
 mynetworks.o: ../../include/inet_addr_list.h
+mynetworks.o: ../../include/mask_addr.h
+mynetworks.o: ../../include/msg.h
 mynetworks.o: ../../include/myaddrinfo.h
 mynetworks.o: ../../include/name_mask.h
-mynetworks.o: ../../include/mask_addr.h
-mynetworks.o: ../../include/argv.h
-mynetworks.o: own_inet_addr.h
-mynetworks.o: mail_params.h
-mynetworks.o: mynetworks.h
 mynetworks.o: ../../include/sock_addr.h
+mynetworks.o: ../../include/sys_defs.h
+mynetworks.o: ../../include/vbuf.h
+mynetworks.o: ../../include/vstring.h
 mynetworks.o: been_here.h
-mypwd.o: mypwd.c
-mypwd.o: ../../include/sys_defs.h
-mypwd.o: ../../include/mymalloc.h
-mypwd.o: ../../include/htable.h
+mynetworks.o: mail_params.h
+mynetworks.o: mynetworks.c
+mynetworks.o: mynetworks.h
+mynetworks.o: own_inet_addr.h
 mypwd.o: ../../include/binhash.h
+mypwd.o: ../../include/htable.h
 mypwd.o: ../../include/msg.h
+mypwd.o: ../../include/mymalloc.h
+mypwd.o: ../../include/sys_defs.h
+mypwd.o: mypwd.c
 mypwd.o: mypwd.h
-namadr_list.o: namadr_list.c
-namadr_list.o: ../../include/sys_defs.h
 namadr_list.o: ../../include/match_list.h
-namadr_list.o: namadr_list.h
 namadr_list.o: ../../include/match_ops.h
-off_cvt.o: off_cvt.c
-off_cvt.o: ../../include/sys_defs.h
+namadr_list.o: ../../include/sys_defs.h
+namadr_list.o: namadr_list.c
+namadr_list.o: namadr_list.h
 off_cvt.o: ../../include/msg.h
-off_cvt.o: ../../include/vstring.h
+off_cvt.o: ../../include/sys_defs.h
 off_cvt.o: ../../include/vbuf.h
+off_cvt.o: ../../include/vstring.h
+off_cvt.o: off_cvt.c
 off_cvt.o: off_cvt.h
-opened.o: opened.c
-opened.o: ../../include/sys_defs.h
 opened.o: ../../include/msg.h
-opened.o: ../../include/vstring.h
+opened.o: ../../include/sys_defs.h
 opened.o: ../../include/vbuf.h
+opened.o: ../../include/vstring.h
+opened.o: opened.c
 opened.o: opened.h
-own_inet_addr.o: own_inet_addr.c
-own_inet_addr.o: ../../include/sys_defs.h
-own_inet_addr.o: ../../include/msg.h
-own_inet_addr.o: ../../include/mymalloc.h
+own_inet_addr.o: ../../include/inet_addr_host.h
 own_inet_addr.o: ../../include/inet_addr_list.h
-own_inet_addr.o: ../../include/myaddrinfo.h
 own_inet_addr.o: ../../include/inet_addr_local.h
-own_inet_addr.o: ../../include/inet_addr_host.h
+own_inet_addr.o: ../../include/inet_proto.h
+own_inet_addr.o: ../../include/msg.h
+own_inet_addr.o: ../../include/myaddrinfo.h
+own_inet_addr.o: ../../include/mymalloc.h
+own_inet_addr.o: ../../include/sock_addr.h
 own_inet_addr.o: ../../include/stringops.h
-own_inet_addr.o: ../../include/vstring.h
+own_inet_addr.o: ../../include/sys_defs.h
 own_inet_addr.o: ../../include/vbuf.h
-own_inet_addr.o: ../../include/sock_addr.h
-own_inet_addr.o: ../../include/inet_proto.h
+own_inet_addr.o: ../../include/vstring.h
 own_inet_addr.o: mail_params.h
+own_inet_addr.o: own_inet_addr.c
 own_inet_addr.o: own_inet_addr.h
-pipe_command.o: pipe_command.c
-pipe_command.o: ../../include/sys_defs.h
+pipe_command.o: ../../include/argv.h
+pipe_command.o: ../../include/clean_env.h
+pipe_command.o: ../../include/exec_command.h
+pipe_command.o: ../../include/iostuff.h
 pipe_command.o: ../../include/msg.h
-pipe_command.o: ../../include/vstream.h
-pipe_command.o: ../../include/vbuf.h
-pipe_command.o: ../../include/vstring.h
+pipe_command.o: ../../include/set_eugid.h
+pipe_command.o: ../../include/set_ugid.h
 pipe_command.o: ../../include/stringops.h
-pipe_command.o: ../../include/iostuff.h
+pipe_command.o: ../../include/sys_defs.h
 pipe_command.o: ../../include/timed_wait.h
-pipe_command.o: ../../include/set_ugid.h
-pipe_command.o: ../../include/set_eugid.h
-pipe_command.o: ../../include/argv.h
-pipe_command.o: mail_params.h
+pipe_command.o: ../../include/vbuf.h
+pipe_command.o: ../../include/vstream.h
+pipe_command.o: ../../include/vstring.h
+pipe_command.o: dsn_util.h
 pipe_command.o: mail_copy.h
-pipe_command.o: ../../include/clean_env.h
+pipe_command.o: mail_params.h
+pipe_command.o: pipe_command.c
 pipe_command.o: pipe_command.h
-pipe_command.o: ../../include/exec_command.h
 pipe_command.o: sys_exits.h
-post_mail.o: post_mail.c
-post_mail.o: ../../include/sys_defs.h
+post_mail.o: ../../include/attr.h
+post_mail.o: ../../include/events.h
+post_mail.o: ../../include/iostuff.h
 post_mail.o: ../../include/msg.h
-post_mail.o: ../../include/vstream.h
+post_mail.o: ../../include/mymalloc.h
+post_mail.o: ../../include/sys_defs.h
 post_mail.o: ../../include/vbuf.h
+post_mail.o: ../../include/vstream.h
 post_mail.o: ../../include/vstring.h
-post_mail.o: ../../include/mymalloc.h
-post_mail.o: ../../include/events.h
+post_mail.o: cleanup_user.h
+post_mail.o: mail_date.h
 post_mail.o: mail_params.h
-post_mail.o: record.h
-post_mail.o: rec_type.h
 post_mail.o: mail_proto.h
-post_mail.o: ../../include/iostuff.h
-post_mail.o: ../../include/attr.h
-post_mail.o: cleanup_user.h
+post_mail.o: post_mail.c
 post_mail.o: post_mail.h
-post_mail.o: mail_date.h
-quote_821_local.o: quote_821_local.c
+post_mail.o: rec_type.h
+post_mail.o: record.h
 quote_821_local.o: ../../include/sys_defs.h
-quote_821_local.o: ../../include/vstring.h
 quote_821_local.o: ../../include/vbuf.h
+quote_821_local.o: ../../include/vstring.h
+quote_821_local.o: quote_821_local.c
 quote_821_local.o: quote_821_local.h
 quote_821_local.o: quote_flags.h
-quote_822_local.o: quote_822_local.c
 quote_822_local.o: ../../include/sys_defs.h
-quote_822_local.o: ../../include/vstring.h
 quote_822_local.o: ../../include/vbuf.h
+quote_822_local.o: ../../include/vstring.h
+quote_822_local.o: quote_822_local.c
 quote_822_local.o: quote_822_local.h
 quote_822_local.o: quote_flags.h
-rec2stream.o: rec2stream.c
 rec2stream.o: ../../include/sys_defs.h
-rec2stream.o: ../../include/vstring.h
 rec2stream.o: ../../include/vbuf.h
 rec2stream.o: ../../include/vstream.h
-rec2stream.o: record.h
+rec2stream.o: ../../include/vstring.h
+rec2stream.o: rec2stream.c
 rec2stream.o: rec_streamlf.h
 rec2stream.o: rec_type.h
-rec_streamlf.o: rec_streamlf.c
+rec2stream.o: record.h
 rec_streamlf.o: ../../include/sys_defs.h
-rec_streamlf.o: ../../include/vstring.h
 rec_streamlf.o: ../../include/vbuf.h
 rec_streamlf.o: ../../include/vstream.h
-rec_streamlf.o: record.h
-rec_streamlf.o: rec_type.h
+rec_streamlf.o: ../../include/vstring.h
+rec_streamlf.o: rec_streamlf.c
 rec_streamlf.o: rec_streamlf.h
+rec_streamlf.o: rec_type.h
+rec_streamlf.o: record.h
 rec_type.o: rec_type.c
 rec_type.o: rec_type.h
-recdump.o: recdump.c
-recdump.o: ../../include/sys_defs.h
 recdump.o: ../../include/msg_vstream.h
-recdump.o: ../../include/vstream.h
+recdump.o: ../../include/sys_defs.h
 recdump.o: ../../include/vbuf.h
-recdump.o: record.h
+recdump.o: ../../include/vstream.h
 recdump.o: ../../include/vstring.h
 recdump.o: rec_streamlf.h
 recdump.o: rec_type.h
-recipient_list.o: recipient_list.c
-recipient_list.o: ../../include/sys_defs.h
+recdump.o: recdump.c
+recdump.o: record.h
 recipient_list.o: ../../include/mymalloc.h
+recipient_list.o: ../../include/sys_defs.h
+recipient_list.o: recipient_list.c
 recipient_list.o: recipient_list.h
-record.o: record.c
-record.o: ../../include/sys_defs.h
 record.o: ../../include/msg.h
 record.o: ../../include/mymalloc.h
-record.o: ../../include/vstream.h
+record.o: ../../include/sys_defs.h
 record.o: ../../include/vbuf.h
+record.o: ../../include/vstream.h
 record.o: ../../include/vstring.h
+record.o: record.c
 record.o: record.h
-remove.o: remove.c
 remove.o: ../../include/sys_defs.h
-remove.o: ../../include/vstring.h
 remove.o: ../../include/vbuf.h
+remove.o: ../../include/vstring.h
 remove.o: mail_params.h
-resolve_clnt.o: resolve_clnt.c
-resolve_clnt.o: ../../include/sys_defs.h
+remove.o: remove.c
+resolve_clnt.o: ../../include/attr.h
+resolve_clnt.o: ../../include/events.h
+resolve_clnt.o: ../../include/iostuff.h
 resolve_clnt.o: ../../include/msg.h
-resolve_clnt.o: ../../include/vstream.h
+resolve_clnt.o: ../../include/sys_defs.h
 resolve_clnt.o: ../../include/vbuf.h
+resolve_clnt.o: ../../include/vstream.h
 resolve_clnt.o: ../../include/vstring.h
 resolve_clnt.o: ../../include/vstring_vstream.h
-resolve_clnt.o: ../../include/events.h
-resolve_clnt.o: ../../include/iostuff.h
-resolve_clnt.o: mail_proto.h
-resolve_clnt.o: ../../include/attr.h
-resolve_clnt.o: mail_params.h
 resolve_clnt.o: clnt_stream.h
+resolve_clnt.o: mail_params.h
+resolve_clnt.o: mail_proto.h
+resolve_clnt.o: resolve_clnt.c
 resolve_clnt.o: resolve_clnt.h
-resolve_local.o: resolve_local.c
-resolve_local.o: ../../include/sys_defs.h
-resolve_local.o: ../../include/msg.h
-resolve_local.o: ../../include/mymalloc.h
-resolve_local.o: string_list.h
+resolve_local.o: ../../include/inet_addr_list.h
 resolve_local.o: ../../include/match_list.h
 resolve_local.o: ../../include/match_ops.h
+resolve_local.o: ../../include/msg.h
 resolve_local.o: ../../include/myaddrinfo.h
-resolve_local.o: valid_mailhost_addr.h
+resolve_local.o: ../../include/mymalloc.h
+resolve_local.o: ../../include/sys_defs.h
 resolve_local.o: ../../include/valid_hostname.h
 resolve_local.o: mail_params.h
 resolve_local.o: own_inet_addr.h
-resolve_local.o: ../../include/inet_addr_list.h
+resolve_local.o: resolve_local.c
 resolve_local.o: resolve_local.h
-rewrite_clnt.o: rewrite_clnt.c
-rewrite_clnt.o: ../../include/sys_defs.h
+resolve_local.o: string_list.h
+resolve_local.o: valid_mailhost_addr.h
+rewrite_clnt.o: ../../include/attr.h
+rewrite_clnt.o: ../../include/events.h
+rewrite_clnt.o: ../../include/iostuff.h
 rewrite_clnt.o: ../../include/msg.h
-rewrite_clnt.o: ../../include/vstring.h
+rewrite_clnt.o: ../../include/sys_defs.h
 rewrite_clnt.o: ../../include/vbuf.h
 rewrite_clnt.o: ../../include/vstream.h
+rewrite_clnt.o: ../../include/vstring.h
 rewrite_clnt.o: ../../include/vstring_vstream.h
-rewrite_clnt.o: ../../include/events.h
-rewrite_clnt.o: ../../include/iostuff.h
+rewrite_clnt.o: clnt_stream.h
+rewrite_clnt.o: mail_params.h
+rewrite_clnt.o: mail_proto.h
 rewrite_clnt.o: quote_822_local.h
 rewrite_clnt.o: quote_flags.h
-rewrite_clnt.o: mail_proto.h
-rewrite_clnt.o: ../../include/attr.h
-rewrite_clnt.o: mail_params.h
-rewrite_clnt.o: clnt_stream.h
+rewrite_clnt.o: rewrite_clnt.c
 rewrite_clnt.o: rewrite_clnt.h
-scache.o: scache.c
-scache.o: ../../include/sys_defs.h
+scache.o: ../../include/argv.h
+scache.o: ../../include/events.h
 scache.o: ../../include/msg.h
-scache.o: ../../include/vstream.h
+scache.o: ../../include/sys_defs.h
 scache.o: ../../include/vbuf.h
+scache.o: ../../include/vstream.h
 scache.o: ../../include/vstring.h
-scache.o: ../../include/vstring_vstream.h
-scache.o: ../../include/argv.h
-scache.o: ../../include/events.h
+scache.o: ../../include/vstring_vstream.h
+scache.o: scache.c
 scache.o: scache.h
-scache_clnt.o: scache_clnt.c
-scache_clnt.o: ../../include/sys_defs.h
+scache_clnt.o: ../../include/attr.h
+scache_clnt.o: ../../include/iostuff.h
 scache_clnt.o: ../../include/msg.h
 scache_clnt.o: ../../include/mymalloc.h
-scache_clnt.o: mail_proto.h
-scache_clnt.o: ../../include/vstream.h
+scache_clnt.o: ../../include/sys_defs.h
 scache_clnt.o: ../../include/vbuf.h
-scache_clnt.o: ../../include/iostuff.h
-scache_clnt.o: ../../include/attr.h
-scache_clnt.o: mail_params.h
+scache_clnt.o: ../../include/vstream.h
+scache_clnt.o: ../../include/vstring.h
 scache_clnt.o: clnt_stream.h
+scache_clnt.o: mail_params.h
+scache_clnt.o: mail_proto.h
 scache_clnt.o: scache.h
-scache_clnt.o: ../../include/vstring.h
-scache_multi.o: scache_multi.c
-scache_multi.o: ../../include/sys_defs.h
+scache_clnt.o: scache_clnt.c
+scache_multi.o: ../../include/events.h
+scache_multi.o: ../../include/htable.h
 scache_multi.o: ../../include/msg.h
+scache_multi.o: ../../include/mymalloc.h
 scache_multi.o: ../../include/ring.h
-scache_multi.o: ../../include/htable.h
-scache_multi.o: ../../include/vstring.h
+scache_multi.o: ../../include/sys_defs.h
 scache_multi.o: ../../include/vbuf.h
-scache_multi.o: ../../include/mymalloc.h
-scache_multi.o: ../../include/events.h
+scache_multi.o: ../../include/vstring.h
 scache_multi.o: scache.h
-scache_single.o: scache_single.c
-scache_single.o: ../../include/sys_defs.h
+scache_multi.o: scache_multi.c
+scache_single.o: ../../include/events.h
 scache_single.o: ../../include/msg.h
-scache_single.o: ../../include/vstring.h
-scache_single.o: ../../include/vbuf.h
 scache_single.o: ../../include/mymalloc.h
-scache_single.o: ../../include/events.h
+scache_single.o: ../../include/sys_defs.h
+scache_single.o: ../../include/vbuf.h
+scache_single.o: ../../include/vstring.h
 scache_single.o: scache.h
-sent.o: sent.c
-sent.o: ../../include/sys_defs.h
+scache_single.o: scache_single.c
 sent.o: ../../include/msg.h
-sent.o: ../../include/vstring.h
+sent.o: ../../include/sys_defs.h
 sent.o: ../../include/vbuf.h
-sent.o: mail_params.h
-sent.o: verify.h
-sent.o: deliver_request.h
 sent.o: ../../include/vstream.h
-sent.o: recipient_list.h
-sent.o: log_adhoc.h
-sent.o: trace.h
-sent.o: defer.h
+sent.o: ../../include/vstring.h
 sent.o: bounce.h
+sent.o: defer.h
+sent.o: deliver_request.h
+sent.o: dsn_util.h
+sent.o: log_adhoc.h
+sent.o: mail_params.h
+sent.o: recipient_list.h
+sent.o: sent.c
 sent.o: sent.h
-smtp_stream.o: smtp_stream.c
+sent.o: trace.h
+sent.o: verify.h
+smtp_stream.o: ../../include/iostuff.h
+smtp_stream.o: ../../include/msg.h
 smtp_stream.o: ../../include/sys_defs.h
-smtp_stream.o: ../../include/vstring.h
 smtp_stream.o: ../../include/vbuf.h
 smtp_stream.o: ../../include/vstream.h
+smtp_stream.o: ../../include/vstring.h
 smtp_stream.o: ../../include/vstring_vstream.h
-smtp_stream.o: ../../include/msg.h
-smtp_stream.o: ../../include/iostuff.h
+smtp_stream.o: smtp_stream.c
 smtp_stream.o: smtp_stream.h
-split_addr.o: split_addr.c
-split_addr.o: ../../include/sys_defs.h
 split_addr.o: ../../include/split_at.h
-split_addr.o: mail_params.h
+split_addr.o: ../../include/sys_defs.h
 split_addr.o: mail_addr.h
+split_addr.o: mail_params.h
+split_addr.o: split_addr.c
 split_addr.o: split_addr.h
-stream2rec.o: stream2rec.c
 stream2rec.o: ../../include/sys_defs.h
-stream2rec.o: ../../include/vstream.h
 stream2rec.o: ../../include/vbuf.h
+stream2rec.o: ../../include/vstream.h
 stream2rec.o: ../../include/vstring.h
-stream2rec.o: record.h
 stream2rec.o: rec_streamlf.h
 stream2rec.o: rec_type.h
-string_list.o: string_list.c
-string_list.o: ../../include/sys_defs.h
+stream2rec.o: record.h
+stream2rec.o: stream2rec.c
 string_list.o: ../../include/match_list.h
-string_list.o: string_list.h
 string_list.o: ../../include/match_ops.h
-strip_addr.o: strip_addr.c
-strip_addr.o: ../../include/sys_defs.h
+string_list.o: ../../include/sys_defs.h
+string_list.o: string_list.c
+string_list.o: string_list.h
 strip_addr.o: ../../include/mymalloc.h
+strip_addr.o: ../../include/sys_defs.h
 strip_addr.o: split_addr.h
+strip_addr.o: strip_addr.c
 strip_addr.o: strip_addr.h
-sys_exits.o: sys_exits.c
-sys_exits.o: ../../include/sys_defs.h
 sys_exits.o: ../../include/msg.h
+sys_exits.o: ../../include/sys_defs.h
+sys_exits.o: sys_exits.c
 sys_exits.o: sys_exits.h
-timed_ipc.o: timed_ipc.c
-timed_ipc.o: ../../include/sys_defs.h
 timed_ipc.o: ../../include/msg.h
-timed_ipc.o: ../../include/vstream.h
+timed_ipc.o: ../../include/sys_defs.h
 timed_ipc.o: ../../include/vbuf.h
+timed_ipc.o: ../../include/vstream.h
 timed_ipc.o: mail_params.h
+timed_ipc.o: timed_ipc.c
 timed_ipc.o: timed_ipc.h
-tok822_find.o: tok822_find.c
 tok822_find.o: ../../include/sys_defs.h
-tok822_find.o: ../../include/vstring.h
 tok822_find.o: ../../include/vbuf.h
-tok822_find.o: tok822.h
+tok822_find.o: ../../include/vstring.h
 tok822_find.o: resolve_clnt.h
-tok822_node.o: tok822_node.c
-tok822_node.o: ../../include/sys_defs.h
+tok822_find.o: tok822.h
+tok822_find.o: tok822_find.c
 tok822_node.o: ../../include/mymalloc.h
-tok822_node.o: ../../include/vstring.h
+tok822_node.o: ../../include/sys_defs.h
 tok822_node.o: ../../include/vbuf.h
-tok822_node.o: tok822.h
+tok822_node.o: ../../include/vstring.h
 tok822_node.o: resolve_clnt.h
-tok822_parse.o: tok822_parse.c
-tok822_parse.o: ../../include/sys_defs.h
-tok822_parse.o: ../../include/vstring.h
-tok822_parse.o: ../../include/vbuf.h
+tok822_node.o: tok822.h
+tok822_node.o: tok822_node.c
 tok822_parse.o: ../../include/msg.h
 tok822_parse.o: ../../include/stringops.h
+tok822_parse.o: ../../include/sys_defs.h
+tok822_parse.o: ../../include/vbuf.h
+tok822_parse.o: ../../include/vstring.h
 tok822_parse.o: lex_822.h
 tok822_parse.o: quote_822_local.h
 tok822_parse.o: quote_flags.h
-tok822_parse.o: tok822.h
 tok822_parse.o: resolve_clnt.h
-tok822_resolve.o: tok822_resolve.c
+tok822_parse.o: tok822.h
+tok822_parse.o: tok822_parse.c
+tok822_resolve.o: ../../include/msg.h
 tok822_resolve.o: ../../include/sys_defs.h
-tok822_resolve.o: ../../include/vstring.h
 tok822_resolve.o: ../../include/vbuf.h
-tok822_resolve.o: ../../include/msg.h
+tok822_resolve.o: ../../include/vstring.h
 tok822_resolve.o: resolve_clnt.h
 tok822_resolve.o: tok822.h
-tok822_rewrite.o: tok822_rewrite.c
+tok822_resolve.o: tok822_resolve.c
+tok822_rewrite.o: ../../include/attr.h
+tok822_rewrite.o: ../../include/iostuff.h
+tok822_rewrite.o: ../../include/msg.h
 tok822_rewrite.o: ../../include/sys_defs.h
-tok822_rewrite.o: ../../include/vstring.h
 tok822_rewrite.o: ../../include/vbuf.h
-tok822_rewrite.o: ../../include/msg.h
-tok822_rewrite.o: rewrite_clnt.h
-tok822_rewrite.o: mail_proto.h
 tok822_rewrite.o: ../../include/vstream.h
-tok822_rewrite.o: ../../include/iostuff.h
-tok822_rewrite.o: ../../include/attr.h
-tok822_rewrite.o: tok822.h
+tok822_rewrite.o: ../../include/vstring.h
+tok822_rewrite.o: mail_proto.h
 tok822_rewrite.o: resolve_clnt.h
-tok822_tree.o: tok822_tree.c
-tok822_tree.o: ../../include/sys_defs.h
+tok822_rewrite.o: rewrite_clnt.h
+tok822_rewrite.o: tok822.h
+tok822_rewrite.o: tok822_rewrite.c
 tok822_tree.o: ../../include/mymalloc.h
-tok822_tree.o: ../../include/vstring.h
+tok822_tree.o: ../../include/sys_defs.h
 tok822_tree.o: ../../include/vbuf.h
-tok822_tree.o: tok822.h
+tok822_tree.o: ../../include/vstring.h
 tok822_tree.o: resolve_clnt.h
-trace.o: trace.c
-trace.o: ../../include/sys_defs.h
+tok822_tree.o: tok822.h
+tok822_tree.o: tok822_tree.c
+trace.o: ../../include/attr.h
+trace.o: ../../include/iostuff.h
 trace.o: ../../include/msg.h
-trace.o: ../../include/vstring.h
+trace.o: ../../include/sys_defs.h
 trace.o: ../../include/vbuf.h
-trace.o: mail_params.h
-trace.o: mail_proto.h
 trace.o: ../../include/vstream.h
-trace.o: ../../include/iostuff.h
-trace.o: ../../include/attr.h
-trace.o: verify_clnt.h
+trace.o: ../../include/vstring.h
+trace.o: bounce.h
 trace.o: deliver_request.h
-trace.o: recipient_list.h
 trace.o: log_adhoc.h
-trace.o: bounce.h
+trace.o: mail_params.h
+trace.o: mail_proto.h
+trace.o: recipient_list.h
+trace.o: trace.c
 trace.o: trace.h
-user_acl.o: user_acl.c
-user_acl.o: ../../include/sys_defs.h
-user_acl.o: ../../include/vstring.h
-user_acl.o: ../../include/vbuf.h
-user_acl.o: string_list.h
+trace.o: verify_clnt.h
 user_acl.o: ../../include/match_list.h
 user_acl.o: ../../include/match_ops.h
-user_acl.o: mypwd.h
+user_acl.o: ../../include/sys_defs.h
+user_acl.o: ../../include/vbuf.h
+user_acl.o: ../../include/vstring.h
 user_acl.o: mail_params.h
+user_acl.o: mypwd.h
+user_acl.o: string_list.h
+user_acl.o: user_acl.c
 user_acl.o: user_acl.h
-valid_mailhost_addr.o: valid_mailhost_addr.c
-valid_mailhost_addr.o: ../../include/sys_defs.h
 valid_mailhost_addr.o: ../../include/msg.h
 valid_mailhost_addr.o: ../../include/myaddrinfo.h
-valid_mailhost_addr.o: valid_mailhost_addr.h
+valid_mailhost_addr.o: ../../include/sys_defs.h
 valid_mailhost_addr.o: ../../include/valid_hostname.h
-verify.o: verify.c
-verify.o: ../../include/sys_defs.h
+valid_mailhost_addr.o: valid_mailhost_addr.c
+valid_mailhost_addr.o: valid_mailhost_addr.h
+verify.o: ../../include/attr.h
+verify.o: ../../include/iostuff.h
 verify.o: ../../include/msg.h
-verify.o: ../../include/vstring.h
+verify.o: ../../include/sys_defs.h
 verify.o: ../../include/vbuf.h
-verify.o: mail_params.h
-verify.o: mail_proto.h
 verify.o: ../../include/vstream.h
-verify.o: ../../include/iostuff.h
-verify.o: ../../include/attr.h
-verify.o: verify_clnt.h
+verify.o: ../../include/vstring.h
 verify.o: deliver_request.h
-verify.o: recipient_list.h
 verify.o: log_adhoc.h
+verify.o: mail_params.h
+verify.o: mail_proto.h
+verify.o: recipient_list.h
+verify.o: verify.c
 verify.o: verify.h
-verify_clnt.o: verify_clnt.c
-verify_clnt.o: ../../include/sys_defs.h
+verify.o: verify_clnt.h
+verify_clnt.o: ../../include/attr.h
+verify_clnt.o: ../../include/iostuff.h
 verify_clnt.o: ../../include/msg.h
-verify_clnt.o: ../../include/vstream.h
+verify_clnt.o: ../../include/sys_defs.h
 verify_clnt.o: ../../include/vbuf.h
+verify_clnt.o: ../../include/vstream.h
 verify_clnt.o: ../../include/vstring.h
-verify_clnt.o: ../../include/attr.h
-verify_clnt.o: mail_params.h
-verify_clnt.o: mail_proto.h
-verify_clnt.o: ../../include/iostuff.h
 verify_clnt.o: clnt_stream.h
-verify_clnt.o: verify_clnt.h
 verify_clnt.o: deliver_request.h
+verify_clnt.o: mail_params.h
+verify_clnt.o: mail_proto.h
 verify_clnt.o: recipient_list.h
-verp_sender.o: verp_sender.c
+verify_clnt.o: verify_clnt.c
+verify_clnt.o: verify_clnt.h
 verp_sender.o: ../../include/sys_defs.h
-verp_sender.o: ../../include/vstring.h
 verp_sender.o: ../../include/vbuf.h
+verp_sender.o: ../../include/vstring.h
 verp_sender.o: mail_params.h
+verp_sender.o: verp_sender.c
 verp_sender.o: verp_sender.h
-virtual8_maps.o: virtual8_maps.c
-virtual8_maps.o: ../../include/sys_defs.h
+virtual8_maps.o: ../../include/argv.h
+virtual8_maps.o: ../../include/dict.h
 virtual8_maps.o: ../../include/msg.h
 virtual8_maps.o: ../../include/mymalloc.h
-virtual8_maps.o: maps.h
-virtual8_maps.o: ../../include/dict.h
-virtual8_maps.o: ../../include/vstream.h
+virtual8_maps.o: ../../include/sys_defs.h
 virtual8_maps.o: ../../include/vbuf.h
-virtual8_maps.o: ../../include/argv.h
+virtual8_maps.o: ../../include/vstream.h
 virtual8_maps.o: mail_params.h
+virtual8_maps.o: maps.h
 virtual8_maps.o: strip_addr.h
+virtual8_maps.o: virtual8_maps.c
 virtual8_maps.o: virtual8_maps.h
-wildcard_inet_addr.o: wildcard_inet_addr.c
-wildcard_inet_addr.o: ../../include/sys_defs.h
-wildcard_inet_addr.o: ../../include/msg.h
+wildcard_inet_addr.o: ../../include/inet_addr_host.h
 wildcard_inet_addr.o: ../../include/inet_addr_list.h
+wildcard_inet_addr.o: ../../include/msg.h
 wildcard_inet_addr.o: ../../include/myaddrinfo.h
-wildcard_inet_addr.o: ../../include/inet_addr_host.h
+wildcard_inet_addr.o: ../../include/sys_defs.h
+wildcard_inet_addr.o: wildcard_inet_addr.c
 wildcard_inet_addr.o: wildcard_inet_addr.h
-xtext.o: xtext.c
-xtext.o: ../../include/sys_defs.h
 xtext.o: ../../include/msg.h
-xtext.o: ../../include/vstring.h
+xtext.o: ../../include/sys_defs.h
 xtext.o: ../../include/vbuf.h
+xtext.o: ../../include/vstring.h
+xtext.o: xtext.c
 xtext.o: xtext.h
index 6b121cedb493856d4cfcc9484ea1e66ca1d243d1..e1a1c541186517fb12fe1f9b1deaf4152697accd 100644 (file)
@@ -7,24 +7,26 @@
 /*     #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;
@@ -37,7 +39,8 @@
 /*     const char *sender;
 /*
 /*     int     bounce_one(flags, queue, id, encoding, sender, orig_rcpt,
-/*                             recipient, offset, relay, entry, format, ...)
+/*                             recipient, offset, relay, dsn, entry,
+/*                             format, ...)
 /*     int     flags;
 /*     const char *queue;
 /*     const char *id;
 /*     const char *recipient;
 /*     long    offset;
 /*     const char *relay;
+/*     const char *dsn;
 /*     time_t  entry;
 /*     const char *format;
 /*
 /*     int     vbounce_one(flags, queue, id, encoding, sender, orig_rcpt,
-/*                             recipient, offset, relay, entry, format, ap)
+/*                             recipient, offset, relay, dsn, entry,
+/*                             format, ap)
 /*     int     flags;
 /*     const char *queue;
 /*     const char *id;
@@ -61,6 +66,7 @@
 /*     const char *recipient;
 /*     long    offset;
 /*     const char *relay;
+/*     const char *dsn;
 /*     time_t  entry;
 /*     const char *format;
 /*     va_list ap;
 /* .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);
 }
@@ -199,16 +210,25 @@ int     bounce_append(int flags, const char *id, const char *orig_rcpt,
 
 int     vbounce_append(int flags, const char *id, const char *orig_rcpt,
                      const char *recipient, long offset, const char *relay,
-                              time_t entry, const char *fmt, va_list ap)
+                              const char *dsn, time_t entry,
+                              const char *fmt, va_list ap)
 {
     int     status;
 
+    /*
+     * Sanity check.
+     */
+    if (*dsn != '5' || !dsn_valid(dsn)) {
+       msg_warn("bounce_append: ignoring dsn code \"%s\"", dsn);
+       dsn = "5.0.0";
+    }
+
     /*
      * MTA-requested address verification information is stored in the verify
      * service database.
      */
     if (flags & DEL_REQ_FLAG_VERIFY) {
-       status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+       status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
                            "undeliverable", DEL_RCPT_STAT_BOUNCE, fmt, ap);
        return (status);
     }
@@ -219,7 +239,7 @@ int     vbounce_append(int flags, const char *id, const char *orig_rcpt,
      */
     if (flags & DEL_REQ_FLAG_EXPAND) {
        status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
-                              entry, "5.0.0", "undeliverable", fmt, ap);
+                              dsn, entry, "undeliverable", fmt, ap);
        return (status);
     }
 
@@ -237,13 +257,15 @@ int     vbounce_append(int flags, const char *id, const char *orig_rcpt,
      */
     else {
        VSTRING *why = vstring_alloc(100);
-       char   *dsn_code = var_soft_bounce ? "4.0.0" : "5.0.0";
-       char   *dsn_action = var_soft_bounce ? "delayed" : "failed";
+       char   *my_dsn = mystrdup(dsn);
+       char   *action = var_soft_bounce ? "delayed" : "failed";
        char   *log_status = var_soft_bounce ? "SOFTBOUNCE" : "bounced";
 
        vstring_vsprintf(why, fmt, ap);
        if (orig_rcpt == 0)
            orig_rcpt = "";
+       if (var_soft_bounce)
+           my_dsn[0] = '4';
        if (mail_command_client(MAIL_CLASS_PRIVATE, var_soft_bounce ?
                                var_defer_service : var_bounce_service,
                           ATTR_TYPE_NUM, MAIL_ATTR_NREQ, BOUNCE_CMD_APPEND,
@@ -252,24 +274,27 @@ int     vbounce_append(int flags, const char *id, const char *orig_rcpt,
                                ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
                                ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
                                ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, offset,
-                               ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn_code,
-                               ATTR_TYPE_STR, MAIL_ATTR_ACTION, dsn_action,
+                               ATTR_TYPE_STR, MAIL_ATTR_STATUS, my_dsn,
+                               ATTR_TYPE_STR, MAIL_ATTR_ACTION, action,
                             ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
                                ATTR_TYPE_END) == 0
            && ((flags & DEL_REQ_FLAG_RECORD) == 0
                || trace_append(flags, id, orig_rcpt, recipient, relay,
-                               entry, dsn_code, dsn_action,
+                               my_dsn, entry, action,
                                "%s", vstring_str(why)) == 0)) {
-           log_adhoc(id, orig_rcpt, recipient, relay,
+           log_adhoc(id, orig_rcpt, recipient, relay, my_dsn,
                      entry, log_status, "%s", vstring_str(why));
            status = (var_soft_bounce ? -1 : 0);
        } else if ((flags & BOUNCE_FLAG_CLEAN) == 0) {
+           my_dsn[0] = '4';
            status = defer_append(flags, id, orig_rcpt, recipient, offset,
-                                 relay, entry, "%s or %s service failure",
+                                 relay, my_dsn, entry,
+                                 "%s or %s service failure",
                                  var_bounce_service, var_trace_service);
        } else {
            status = -1;
        }
+       myfree(my_dsn);
        vstring_free(why);
        return (status);
     }
@@ -309,15 +334,15 @@ int     bounce_flush(int flags, const char *queue, const char *id,
 int     bounce_one(int flags, const char *queue, const char *id,
                           const char *encoding, const char *sender,
                           const char *orig_rcpt, const char *recipient,
-                          long offset, const char *relay, time_t entry,
-                          const char *fmt,...)
+                          long offset, const char *relay, const char *dsn,
+                          time_t entry, const char *fmt,...)
 {
     va_list ap;
     int     status;
 
     va_start(ap, fmt);
     status = vbounce_one(flags, queue, id, encoding, sender, orig_rcpt,
-                        recipient, offset, relay, entry, fmt, ap);
+                        recipient, offset, relay, dsn, entry, fmt, ap);
     va_end(ap);
     return (status);
 }
@@ -327,17 +352,25 @@ int     bounce_one(int flags, const char *queue, const char *id,
 int     vbounce_one(int flags, const char *queue, const char *id,
                            const char *encoding, const char *sender,
                            const char *orig_rcpt, const char *recipient,
-                           long offset, const char *relay, time_t entry,
-                           const char *fmt, va_list ap)
+                           long offset, const char *relay, const char *dsn,
+                           time_t entry, const char *fmt, va_list ap)
 {
     int     status;
 
+    /*
+     * Sanity check.
+     */
+    if (*dsn != '5' || !dsn_valid(dsn)) {
+       msg_warn("bounce_one: ignoring dsn code \"%s\"", dsn);
+       dsn = "5.0.0";
+    }
+
     /*
      * MTA-requested address verification information is stored in the verify
      * service database.
      */
     if (flags & DEL_REQ_FLAG_VERIFY) {
-       status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+       status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
                            "undeliverable", DEL_RCPT_STAT_BOUNCE, fmt, ap);
        return (status);
     }
@@ -348,7 +381,7 @@ int     vbounce_one(int flags, const char *queue, const char *id,
      */
     if (flags & DEL_REQ_FLAG_EXPAND) {
        status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
-                              entry, "5.0.0", "undeliverable", fmt, ap);
+                              dsn, entry, "undeliverable", fmt, ap);
        return (status);
     }
 
@@ -358,7 +391,7 @@ int     vbounce_one(int flags, const char *queue, const char *id,
      */
     else if (var_soft_bounce) {
        return (vbounce_append(flags, id, orig_rcpt, recipient,
-                              offset, relay, entry, fmt, ap));
+                              offset, relay, dsn, entry, fmt, ap));
     }
 
     /*
@@ -366,10 +399,13 @@ int     vbounce_one(int flags, const char *queue, const char *id,
      */
     else {
        VSTRING *why = vstring_alloc(100);
+       char   *my_dsn = mystrdup(dsn);
 
        vstring_vsprintf(why, fmt, ap);
        if (orig_rcpt == 0)
            orig_rcpt = "";
+       if (var_soft_bounce)
+           my_dsn[0] = '4';
        if (mail_command_client(MAIL_CLASS_PRIVATE, var_bounce_service,
                              ATTR_TYPE_NUM, MAIL_ATTR_NREQ, BOUNCE_CMD_ONE,
                                ATTR_TYPE_NUM, MAIL_ATTR_FLAGS, flags,
@@ -380,24 +416,27 @@ int     vbounce_one(int flags, const char *queue, const char *id,
                                ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
                                ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
                                ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, offset,
-                               ATTR_TYPE_STR, MAIL_ATTR_STATUS, "5.0.0",
+                               ATTR_TYPE_STR, MAIL_ATTR_STATUS, my_dsn,
                                ATTR_TYPE_STR, MAIL_ATTR_ACTION, "failed",
                             ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
                                ATTR_TYPE_END) == 0
            && ((flags & DEL_REQ_FLAG_RECORD) == 0
                || trace_append(flags, id, orig_rcpt, recipient, relay,
-                               entry, "5.0.0", "failed",
+                               my_dsn, entry, "failed",
                                "%s", vstring_str(why)) == 0)) {
-           log_adhoc(id, orig_rcpt, recipient, relay,
+           log_adhoc(id, orig_rcpt, recipient, relay, my_dsn,
                      entry, "bounced", "%s", vstring_str(why));
            status = 0;
        } else if ((flags & BOUNCE_FLAG_CLEAN) == 0) {
+           my_dsn[0] = '4';
            status = defer_append(flags, id, orig_rcpt, recipient, offset,
-                                 relay, entry, "%s or %s service failure",
+                                 relay, my_dsn, entry,
+                                 "%s or %s service failure",
                                  var_bounce_service, var_trace_service);
        } else {
            status = -1;
        }
+       myfree(my_dsn);
        vstring_free(why);
        return (status);
     }
index 6f1a6a552136d20a6ea93a52492187084b05b94f..38cb9a5a4804a7d43b3a928647c878f71b3a1c35 100644 (file)
  /*
   * 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.
index 489093ed94e2e9cb367d099e611be3d980c5703e..0910102b046b84a4a5cfa717842a75c6c86dc889 100644 (file)
@@ -6,13 +6,29 @@
 /* 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);
 }
index 8a398c7a85ece0e5ff86a8f2c8d49005e5bc1c9e..d45efcc09626c6bd8d9bda89244db13a9e518de6 100644 (file)
 #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
index f710d20b24c02e460f59853d35c4ce38c911cb33..d4f42cb7333d23ca271ad2f18b2a5bb25562e69e 100644 (file)
@@ -7,24 +7,26 @@
 /*     #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);
 }
@@ -177,17 +183,26 @@ int     defer_append(int flags, const char *id, const char *orig_rcpt,
 
 int     vdefer_append(int flags, const char *id, const char *orig_rcpt,
                      const char *recipient, long offset, const char *relay,
-                             time_t entry, const char *fmt, va_list ap)
+                             const char *dsn, time_t entry,
+                             const char *fmt, va_list ap)
 {
     const char *rcpt_domain;
     int     status;
 
+    /*
+     * Sanity check.
+     */
+    if (*dsn != '4' || !dsn_valid(dsn)) {
+       msg_warn("defer_append: ignoring dsn code \"%s\"", dsn);
+       dsn = "4.0.0";
+    }
+
     /*
      * MTA-requested address verification information is stored in the verify
      * service database.
      */
     if (flags & DEL_REQ_FLAG_VERIFY) {
-       status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+       status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
                             "undeliverable", DEL_RCPT_STAT_DEFER, fmt, ap);
        return (status);
     }
@@ -198,7 +213,7 @@ int     vdefer_append(int flags, const char *id, const char *orig_rcpt,
      */
     if (flags & DEL_REQ_FLAG_EXPAND) {
        status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
-                              entry, "4.0.0", "undeliverable", fmt, ap);
+                              dsn, entry, "undeliverable", fmt, ap);
        return (status);
     }
 
@@ -219,12 +234,12 @@ int     vdefer_append(int flags, const char *id, const char *orig_rcpt,
                                ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
                                ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
                                ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, offset,
-                               ATTR_TYPE_STR, MAIL_ATTR_STATUS, "4.0.0",
+                               ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn,
                                ATTR_TYPE_STR, MAIL_ATTR_ACTION, "delayed",
                             ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
                                ATTR_TYPE_END) != 0)
            msg_warn("%s: %s service failure", id, var_defer_service);
-       log_adhoc(id, orig_rcpt, recipient, relay, entry, "deferred",
+       log_adhoc(id, orig_rcpt, recipient, relay, dsn, entry, "deferred",
                  "%s", vstring_str(why));
 
        /*
@@ -232,7 +247,7 @@ int     vdefer_append(int flags, const char *id, const char *orig_rcpt,
         */
        if (flags & DEL_REQ_FLAG_RECORD)
            if (trace_append(flags, id, orig_rcpt, recipient, relay,
-                            entry, "4.0.0", "deferred",
+                            dsn, entry, "deferred",
                             "%s", vstring_str(why)) != 0)
                msg_warn("%s: %s service failure", id, var_trace_service);
 
index 9e39ce2f4e0ea684b275ca8cf6eb017989cd1d0b..6680f3217c96e80d9c7df9cceb296eebe40b3862 100644 (file)
  /*
   * 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 *);
index f8a1fc7f8c3e6ba3cec5c3a7802db6a4a4678bb5..26c18ecf2529eef530a53d984b0dadb0a369b48b 100644 (file)
@@ -64,7 +64,8 @@
 /*     The \fIhop_status\fR structure member must be updated
 /*     by the caller when all delivery to the destination in
 /*     \fInexthop\fR should be deferred. The value of the
-/*     \fIhop_status\fR member is the reason; it is passed
+/*     \fIhop_status\fR member is the reason, with optional
+/*     RFC 1893-style detail at the beginning; it is passed
 /*     to myfree().
 /*
 /*     deliver_request_done() reports the delivery status back to the
diff --git a/postfix/src/global/dsn_util.c b/postfix/src/global/dsn_util.c
new file mode 100644 (file)
index 0000000..35bec1d
--- /dev/null
@@ -0,0 +1,240 @@
+/*++
+/* 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);
+}
diff --git a/postfix/src/global/dsn_util.h b/postfix/src/global/dsn_util.h
new file mode 100644 (file)
index 0000000..a932353
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef _DSN_SPLIT_H_INCLUDED_
+#define _DSN_SPLIT_H_INCLUDED_
+
+/*++
+/* NAME
+/*     dsn_util 3
+/* SUMMARY
+/*     Extract DSN detail from text
+/* SYNOPSIS
+/*     #include "dsn_split.h"
+/* DESCRIPTION
+/* .nf
+
+ /*
+  * Utility library.
+  */
+#include <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
index 03a3539f096dffd9b13bdb978b9ba0a2f300a7ba..3f05d474e002b1fbfa6d06cf50e4cc8e5426cb2a 100644 (file)
@@ -7,21 +7,23 @@
 /*     #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;
@@ -50,6 +52,8 @@
 /*     Host we could (not) talk to.
 /* .IP status
 /*     bounced, deferred, sent, and so on.
+/* .IP detail
+/*     X.YY.ZZ Error detail as specified in RFC 1893.
 /* .IP entry
 /*     Message arrival time.
 /* .IP format
 
 void    log_adhoc(const char *id, const char *orig_rcpt,
                          const char *recipient, const char *relay,
-                         time_t entry, const char *status,
-                         const char *fmt,...)
+                         const char *detail, time_t entry,
+                         const char *status, const char *fmt,...)
 {
     va_list ap;
 
     va_start(ap, fmt);
-    vlog_adhoc(id, orig_rcpt, recipient, relay, entry, status, fmt, ap);
+    vlog_adhoc(id, orig_rcpt, recipient, relay, detail, entry, status, fmt, ap);
     va_end(ap);
 }
 
@@ -108,7 +112,7 @@ void    log_adhoc(const char *id, const char *orig_rcpt,
 
 void    vlog_adhoc(const char *id, const char *orig_rcpt,
                           const char *recipient, const char *relay,
-                          time_t entry, const char *status,
+                          const char *detail, time_t entry, const char *status,
                           const char *fmt, va_list ap)
 {
     VSTRING *why = vstring_alloc(100);
@@ -116,10 +120,10 @@ void    vlog_adhoc(const char *id, const char *orig_rcpt,
 
     vstring_vsprintf(why, fmt, ap);
     if (orig_rcpt && *orig_rcpt && strcasecmp(recipient, orig_rcpt) != 0)
-       msg_info("%s: to=<%s>, orig_to=<%s>, relay=%s, delay=%d, status=%s (%s)",
-         id, recipient, orig_rcpt, relay, delay, status, vstring_str(why));
+       msg_info("%s: to=<%s>, orig_to=<%s>, relay=%s, delay=%d, dsn=%s status=%s (%s)",
+         id, recipient, orig_rcpt, relay, delay, detail, status, vstring_str(why));
     else
-       msg_info("%s: to=<%s>, relay=%s, delay=%d, status=%s (%s)",
-                id, recipient, relay, delay, status, vstring_str(why));
+       msg_info("%s: to=<%s>, relay=%s, delay=%d, dsn=%s status=%s (%s)",
+                id, recipient, relay, delay, detail, status, vstring_str(why));
     vstring_free(why);
 }
index 7e3108cfb6693507cf934f9c40eaf2ffd9dfcf03..561edd03575b633da5aa9f0a5ff2a83cf624dd01 100644 (file)
  /*
   * 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
index 07932828ce3f7787080a7f175c51836c0332e95c..90423eca394e993124ce069e524f9b2a117d3194 100644 (file)
@@ -14,7 +14,7 @@
 /*     VSTREAM *dst;
 /*     int     flags;
 /*     const char *eol;
-/*     VSTRING *why;
+/*     DSN_VSTRING *why;
 /* DESCRIPTION
 /*     mail_copy() copies a mail message from record stream to stream-lf
 /*     stream, and attempts to detect all possible I/O errors.
@@ -62,7 +62,8 @@
 /* .IP eol
 /*     Record delimiter, for example, LF or CF LF.
 /* .IP why
-/*     A null pointer, or storage for the reason of failure.
+/*     A null pointer, or storage for the reason of failure in
+/*     the form of a DSN detail code plus free text.
 /* DIAGNOSTICS
 /*     A non-zero result means the operation failed. Warnings: corrupt
 /*     message file. A corrupt message is marked as corrupt.
 #include "mark_corrupt.h"
 #include "mail_params.h"
 #include "mail_copy.h"
+#include "mbox_open.h"
+#include "dsn_util.h"
 
 /* mail_copy - copy message with extreme prejudice */
 
@@ -121,7 +124,7 @@ int     mail_copy(const char *sender,
                          const char *orig_rcpt,
                          const char *delivered,
                          VSTREAM *src, VSTREAM *dst,
-                         int flags, const char *eol, VSTRING *why)
+                         int flags, const char *eol, DSN_VSTRING *why)
 {
     char   *myname = "mail_copy";
     VSTRING *buf;
@@ -255,10 +258,23 @@ int     mail_copy(const char *sender,
            ftruncate(vstream_fileno(dst), orig_length);
 #endif
     write_error |= vstream_fclose(dst);
+
+    /*
+     * Return the optional verbose error description.
+     */
+#define TRY_AGAIN_ERROR(errno) \
+       (errno == EAGAIN || errno == ESTALE)
+
     if (why && read_error)
-       vstring_sprintf(why, "error reading message: %m");
+       dsn_vstring_update(why, TRY_AGAIN_ERROR(errno) ? "4.3.0" : "5.3.0",
+                          "error reading message: %m");
     if (why && write_error)
-       vstring_sprintf(why, "error writing message: %m");
+       dsn_vstring_update(why, mbox_dsn(errno), "error writing message: %m");
+
+    /*
+     * Use flag+errno description when the optional verbose description is
+     * not desired.
+     */
     return ((corrupt_error ? MAIL_COPY_STAT_CORRUPT : 0)
            | (read_error ? MAIL_COPY_STAT_READ : 0)
            | (write_error ? MAIL_COPY_STAT_WRITE : 0));
index bd7f1d58f2c35f3fed37dd4a0665ebf7d3411d25..8aa7e3c623e3cd83feb8152401c7d66216a31825 100644 (file)
 #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() */
index ebce57eaa3986b87fc82ff2dc1cd984741a748ce..6a5255cdb8c43f341f01e33e3b80c9dac48fd952 100644 (file)
@@ -1689,7 +1689,7 @@ extern int var_access_map_code;
 extern char *var_rbl_reply_maps;
 
 #define VAR_DEF_RBL_REPLY      "default_rbl_reply"
-#define DEF_DEF_RBL_REPLY      "$rbl_code Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}"
+#define DEF_DEF_RBL_REPLY      "$rbl_code 5.7.1 Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}"
 extern char *var_def_rbl_reply;
 
 #define REJECT_MAPS_RBL                "reject_maps_rbl"       /* backwards compat */
index bb01bc1cde0ebaf65ae863f67080a6e807cdcc18..f7fd1ccf206c42d742042b3e99d687917d75c111 100644 (file)
@@ -20,7 +20,7 @@
   * Patches change the patchlevel and the release date. Snapshots change the
   * release date only.
   */
-#define MAIL_RELEASE_DATE      "20050315"
+#define MAIL_RELEASE_DATE      "20050327"
 #define MAIL_VERSION_NUMBER    "2.3"
 
 #define VAR_MAIL_VERSION       "mail_version"
index d533dd86f3de70c13268b760d19728d5f2647045..991f49ce9ac39cd0b4a2b92b90cf6ef1fa52f194 100644 (file)
@@ -8,8 +8,8 @@
 /*
 /*     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.
 /*
@@ -39,6 +42,9 @@
 /*
 /*     mbox_release() releases the named mailbox. It is up to the
 /*     application to close the stream.
+/*
+/*     mbox_dsn() translates an errno value to a mailbox related
+/*     DSN detail code.
 /* DIAGNOSTICS
 /*     mbox_open() returns a null pointer in case of problems, and
 /*     sets errno to EAGAIN if someone else has exclusive access.
 #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
@@ -103,7 +112,8 @@ MBOX   *mbox_open(const char *path, int flags, int mode, struct stat * st,
     if (st == 0)
        st = &local_statbuf;
     if ((fp = safe_open(path, flags | O_NONBLOCK, mode, st,
-                       chown_uid, chown_gid, why)) == 0) {
+                       chown_uid, chown_gid, why->vstring)) == 0) {
+       dsn_vstring_update(why, mbox_dsn(errno), "");
        return (0);
     }
     close_on_exec(vstream_fileno(fp), CLOSE_ON_EXEC);
@@ -124,15 +134,16 @@ MBOX   *mbox_open(const char *path, int flags, int mode, struct stat * st,
      * an unprivileged user is not supposed to be able to do.
      */
     if (S_ISREG(st->st_mode) && (lock_style & MBOX_DOT_LOCK)) {
-       if (dot_lockfile(path, why) == 0) {
+       if (dot_lockfile(path, why->vstring) == 0) {
            locked |= MBOX_DOT_LOCK;
        } else if (errno == EEXIST) {
-           errno = EAGAIN;
+           dsn_vstring_update(why, mbox_dsn(EAGAIN), "");
            vstream_fclose(fp);
            return (0);
        } else if (lock_style & MBOX_DOT_LOCK_MAY_FAIL) {
-           msg_warn("%s", vstring_str(why));
+           msg_warn("%s", vstring_str(why->vstring));
        } else {
+           dsn_vstring_update(why, mbox_dsn(errno), "");
            vstream_fclose(fp);
            return (0);
        }
@@ -145,18 +156,17 @@ MBOX   *mbox_open(const char *path, int flags, int mode, struct stat * st,
      * problems.
      */
 #define HUNKY_DORY(lock_mask, myflock_style) ((lock_style & (lock_mask)) == 0 \
-         || deliver_flock(vstream_fileno(fp), (myflock_style), why) == 0)
+         || deliver_flock(vstream_fileno(fp), (myflock_style), why->vstring) == 0)
 
     if (S_ISREG(st->st_mode)) {
        if (HUNKY_DORY(MBOX_FLOCK_LOCK, MYFLOCK_STYLE_FLOCK)
            && HUNKY_DORY(MBOX_FCNTL_LOCK, MYFLOCK_STYLE_FCNTL)) {
            locked |= lock_style;
        } else {
-           saved_errno = errno;
+           dsn_vstring_update(why, mbox_dsn(errno), "");
            if (locked & MBOX_DOT_LOCK)
                dot_unlockfile(path);
            vstream_fclose(fp);
-           errno = saved_errno;
            return (0);
        }
     }
@@ -185,3 +195,20 @@ void    mbox_release(MBOX *mp)
     myfree(mp->path);
     myfree((char *) mp);
 }
+
+/* mbox_dsn - map errno value to mailbox-related DSN detail */
+
+const char *mbox_dsn(int err)
+{
+#define TRY_AGAIN_ERROR(e) \
+       (e == EACCES || e == EAGAIN || e == ESTALE)
+#define SYSTEM_FULL_ERROR(e) \
+       (e == ENOSPC)
+#define MBOX_FULL_ERROR(e) \
+       (e == EDQUOT || e == EFBIG)
+
+    return (TRY_AGAIN_ERROR(err) ? "4.2.0" :
+           SYSTEM_FULL_ERROR(err) ? "4.3.0" :
+           MBOX_FULL_ERROR(err) ? "5.2.2" :
+           "5.2.0");
+}
index 940f04b52233b7c4f1955720b2033135ec7cfd46..e904cd8c60842b975e674b3903c42f9469847131 100644 (file)
 #include <vstring.h>
 #include <safe_open.h>
 
+ /*
+  * Global library.
+  */
+#include <dsn_util.h>
+
  /*
   * External interface.
   */
@@ -26,8 +31,9 @@ typedef struct {
     VSTREAM *fp;                       /* open stream or null */
     int     locked;                    /* what locks were set */
 } MBOX;
-extern MBOX *mbox_open(const char *, int, int, struct stat *, uid_t, gid_t, int, VSTRING *);
+extern MBOX *mbox_open(const char *, int, int, struct stat *, uid_t, gid_t, int, DSN_VSTRING *);
 extern void mbox_release(MBOX *);
+extern const char *mbox_dsn(int);
 
 /* LICENSE
 /* .ad
index e091b6e77af552de1fce802c9680acb95b201785..1e2ee88c0f91ee55cd3208ae2789d5410975de40 100644 (file)
@@ -8,19 +8,26 @@
 /*
 /*     int     pipe_command(src, why, key, value, ...)
 /*     VSTREAM *src;
-/*     VSTRING *why;
+/*     DSN_VSTRING *why;
 /*     int     key;
 /* DESCRIPTION
 /*     pipe_command() runs a command with a message as standard
 /*     input.  A limited amount of standard output and standard error
 /*     output is captured for diagnostics purposes.
 /*
+/*     If the command invokes exit() with a non-zero status,
+/*     the delivery status is taken from an RFC 1893-style code
+/*     at the beginning of command output. If that information is
+/*     unavailable, the delivery status is taken from the command
+/*     exit status as per <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. */
 
@@ -343,7 +351,7 @@ static int pipe_command_wait_or_kill(pid_t pid, WAIT_STATUS_T *statusp, int sig,
 
 /* pipe_command - execute command with extreme prejudice */
 
-int     pipe_command(VSTREAM *src, VSTRING *why,...)
+int     pipe_command(VSTREAM *src, DSN_VSTRING *why,...)
 {
     char   *myname = "pipe_comand";
     va_list ap;
@@ -360,6 +368,8 @@ int     pipe_command(VSTREAM *src, VSTRING *why,...)
     struct pipe_args args;
     char  **cpp;
     ARGV   *argv;
+    DSN_SPLIT dp;
+    SYS_EXITS_DETAIL *sp;
 
     /*
      * Process the variadic argument list. This also does sanity checks on
@@ -413,7 +423,7 @@ int     pipe_command(VSTREAM *src, VSTRING *why,...)
         */
     case -1:
        msg_warn("fork: %m");
-       vstring_sprintf(why, "Delivery failed: %m");
+       dsn_vstring_update(why, "4.3.0", "Delivery failed: %m");
        return (PIPE_STAT_DEFER);
 
        /*
@@ -506,7 +516,7 @@ int     pipe_command(VSTREAM *src, VSTRING *why,...)
         * stop reading input early, and that should not be considered an
         * error condition.
         */
-#define DONT_CARE_WHY  ((VSTRING *) 0)
+#define DONT_CARE_WHY  ((DSN_VSTRING *) 0)
 
        write_status = mail_copy(args.sender, args.orig_rcpt,
                                 args.delivered, src,
@@ -541,9 +551,10 @@ int     pipe_command(VSTREAM *src, VSTRING *why,...)
                                      args.uid, args.gid) < 0)
            msg_fatal("wait: %m");
        if (pipe_command_timeout) {
-           vstring_sprintf(why, "Command time limit exceeded: \"%s\"%s%s",
-                           args.command,
-                           log_len ? ". Command output: " : "", log_buf);
+           dsn_vstring_update(why, "5.3.0",
+                              "Command time limit exceeded: \"%s\"%s%s",
+                              args.command,
+                              log_len ? ". Command output: " : "", log_buf);
            return (PIPE_STAT_BOUNCE);
        }
 
@@ -553,33 +564,50 @@ int     pipe_command(VSTREAM *src, VSTRING *why,...)
         */
        if (!NORMAL_EXIT_STATUS(wait_status)) {
            if (WIFSIGNALED(wait_status)) {
-               vstring_sprintf(why, "Command died with signal %d: \"%s\"%s%s",
-                               WTERMSIG(wait_status),
-                               args.command,
+               dsn_vstring_update(why, "5.3.0",
+                                  "Command died with signal %d: \"%s\"%s%s",
+                                  WTERMSIG(wait_status),
+                                  args.command,
                              log_len ? ". Command output: " : "", log_buf);
-               return (PIPE_STAT_DEFER);
-           } else if (SYS_EXITS_CODE(WEXITSTATUS(wait_status))) {
-               vstring_sprintf(why, "%s%s%s",
-                               sys_exits_strerror(WEXITSTATUS(wait_status)),
+               return (PIPE_STAT_BOUNCE);
+           }
+           /* Use "D.S.N text" command output. */
+           else if (dsn_valid(log_buf) > 0) {
+               /* XXX Assumes dsn_split() does not require 5.x.x in log_buf */
+               dsn_split(&dp, "5.3.0", log_buf);
+               dsn_vstring_update(why, dp.dsn, "%s", dp.text);
+               return (dp.dsn[0] == '4' ?
+                       PIPE_STAT_DEFER : PIPE_STAT_BOUNCE);
+           }
+           /* Use <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);
        }
index a500e8440da5f88ddb5d29f75804b091dd585344..eade930d9b59246091d8a639f0ac29ec13fe5906 100644 (file)
@@ -21,6 +21,7 @@
   * Global library.
   */
 #include <mail_copy.h>
+#include <dsn_util.h>
 
  /*
   * Request arguments.
@@ -49,7 +50,7 @@
 #define PIPE_STAT_BOUNCE       2       /* failed */
 #define PIPE_STAT_CORRUPT      3       /* corrupted file */
 
-extern int pipe_command(VSTREAM *, VSTRING *,...);
+extern int pipe_command(VSTREAM *, DSN_VSTRING *,...);
 
 /* LICENSE
 /* .ad
index 4f845ed78b97c0ee5ea08208e75d88f4e16a2c9a..e3410dda9aad918b57a12296c90005fece1f9302 100644 (file)
@@ -7,24 +7,26 @@
 /*     #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;
@@ -63,6 +65,8 @@
 /*     Queue file offset of the recipient record.
 /* .IP relay
 /*     Name of the host we're talking to.
+/* .IP dsn
+/*     X.YY.ZZ Error detail as specified in RFC 1893.
 /* .IP entry
 /*     Message arrival time.
 /* .IP format
 #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);
 }
@@ -133,16 +138,25 @@ int     sent(int flags, const char *id, const char *orig_rcpt,
 
 int     vsent(int flags, const char *id, const char *orig_rcpt,
                      const char *recipient, long offset, const char *relay,
-                     time_t entry, const char *fmt, va_list ap)
+                     const char *dsn, time_t entry,
+                     const char *fmt, va_list ap)
 {
     int     status;
 
+    /*
+     * Sanity check.
+     */
+    if (*dsn != '2' || !dsn_valid(dsn)) {
+       msg_warn("sent: ignoring dsn code \"%s\"", dsn);
+       dsn = "2.0.0";
+    }
+
     /*
      * MTA-requested address verification information is stored in the verify
      * service database.
      */
     if (flags & DEL_REQ_FLAG_VERIFY) {
-       status = vverify_append(id, orig_rcpt, recipient, relay, entry,
+       status = vverify_append(id, orig_rcpt, recipient, relay, dsn, entry,
                                "deliverable", DEL_RCPT_STAT_OK, fmt, ap);
        return (status);
     }
@@ -153,7 +167,7 @@ int     vsent(int flags, const char *id, const char *orig_rcpt,
      */
     if (flags & DEL_REQ_FLAG_EXPAND) {
        status = vtrace_append(flags, id, orig_rcpt, recipient, relay,
-                              entry, "2.0.0", "deliverable", fmt, ap);
+                              dsn, entry, "deliverable", fmt, ap);
        return (status);
     }
 
@@ -166,14 +180,15 @@ int     vsent(int flags, const char *id, const char *orig_rcpt,
        vstring_vsprintf(text, fmt, ap);
        if ((flags & DEL_REQ_FLAG_RECORD) == 0
            || trace_append(flags, id, orig_rcpt, recipient, relay,
-                           entry, "2.0.0", "delivered",
+                           dsn, entry, "delivered",
                            "%s", vstring_str(text)) == 0) {
-           log_adhoc(id, orig_rcpt, recipient, relay,
+           log_adhoc(id, orig_rcpt, recipient, relay, dsn,
                      entry, "sent", "%s", vstring_str(text));
            status = 0;
        } else {
            status = defer_append(flags, id, orig_rcpt, recipient, offset,
-                                 relay, entry, "%s: %s service failed",
+                                 relay, dsn, entry,
+                                 "%s: %s service failed",
                                  id, var_trace_service);
        }
        vstring_free(text);
index d303449e69644c8e1f2947e77d4d0d90d50f2747..67a3b5280191f969f020bf9b76562cef46a7abee 100644 (file)
   */
 #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
index ef7eb2ef5cf6c988d2fd78a5e930dd7bf7315c81..cbb989ea78dbf9afd93d3fa997a765654b18c3e0 100644 (file)
@@ -6,17 +6,28 @@
 /* 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 */
@@ -89,6 +98,18 @@ const char *sys_exits_strerror(int code)
     return (sys_exits_table[code - EX__BASE].text);
 }
 
+/* sys_exits_detail - map exit status info table entry */
+
+SYS_EXITS_DETAIL *sys_exits_detail(int code)
+{
+    char   *myname = "sys_exits_detail";
+
+    if (!SYS_EXITS_CODE(code))
+       msg_panic("%s: bad code: %d", myname, code);
+
+    return (sys_exits_table + code - EX__BASE);
+}
+
 /* sys_exits_softerror  - determine if error is transient */
 
 int     sys_exits_softerror(int code)
@@ -98,5 +119,5 @@ int     sys_exits_softerror(int code)
     if (!SYS_EXITS_CODE(code))
        msg_panic("%s: bad code: %d", myname, code);
 
-    return (sys_exits_table[code - EX__BASE].flags);
+    return (sys_exits_table[code - EX__BASE].dsn[0] == '4');
 }
index 4b09cb3bb32bb74f2b76725472a448014dc8b050..ee3b8ba32d8e6fe75643a4be32160a35f67ffc5a 100644 (file)
  /*
   * 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)
index cd9710c6531263f21f92954cc2d7c64f5389a96f..9f2e0df18911748b0ac691deba1c3aad8cc2edf1 100644 (file)
@@ -7,27 +7,27 @@
 /*     #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;
 /*
@@ -69,9 +69,9 @@
 /*     The host we sent the mail to.
 /* .IP entry
 /*     Message arrival time.
-/* .IP dsn_code
-/*     three-digit dot-separated code.
-/* .IP dsn_action
+/* .IP dsn
+/*     X.YY.ZZ Error detail as specified in RFC 1893.
+/* .IP action
 /*     "deliverable", "undeliverable", and so on.
 /* .IP format
 /*     Optional additional information.
 
 int     trace_append(int flags, const char *queue_id,
                             const char *orig_rcpt, const char *recipient,
-                            const char *relay, time_t entry,
-                            const char *dsn_code, const char *dsn_action,
+                            const char *relay, const char *dsn,
+                            time_t entry, const char *action,
                             const char *fmt,...)
 {
     va_list ap;
@@ -132,7 +132,7 @@ int     trace_append(int flags, const char *queue_id,
 
     va_start(ap, fmt);
     req_stat = vtrace_append(flags, queue_id, orig_rcpt, recipient,
-                            relay, entry, dsn_code, dsn_action, fmt, ap);
+                            relay, dsn, entry, action, fmt, ap);
     va_end(ap);
     return (req_stat);
 }
@@ -141,13 +141,18 @@ int     trace_append(int flags, const char *queue_id,
 
 int     vtrace_append(int flags, const char *queue_id,
                              const char *orig_rcpt, const char *recipient,
-                             const char *relay, time_t entry,
-                             const char *dsn_code, const char *dsn_action,
+                             const char *relay, const char *dsn,
+                             time_t entry, const char *action,
                              const char *fmt, va_list ap)
 {
     VSTRING *why = vstring_alloc(100);
     int     req_stat;
 
+    /*
+     * XXX No DSN check. This routine is called from bounce/defer/sent, which
+     * already know what the DSN initial digit should look like.
+     */
+
     /*
      * User-requested address verification or verbose delivery. Mail the
      * report to the requesting user.
@@ -164,16 +169,16 @@ int     vtrace_append(int flags, const char *queue_id,
                            ATTR_TYPE_STR, MAIL_ATTR_ORCPT, orig_rcpt,
                            ATTR_TYPE_STR, MAIL_ATTR_RECIP, recipient,
                            ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, (long) 0,
-                           ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn_code,
-                           ATTR_TYPE_STR, MAIL_ATTR_ACTION, dsn_action,
+                           ATTR_TYPE_STR, MAIL_ATTR_STATUS, dsn,
+                           ATTR_TYPE_STR, MAIL_ATTR_ACTION, action,
                            ATTR_TYPE_STR, MAIL_ATTR_WHY, vstring_str(why),
                            ATTR_TYPE_END) != 0) {
        msg_warn("%s: %s service failure", queue_id, var_trace_service);
        req_stat = -1;
     } else {
        if (flags & DEL_REQ_FLAG_EXPAND)
-           log_adhoc(queue_id, orig_rcpt, recipient, relay,
-                     entry, dsn_action, "%s", vstring_str(why));
+           log_adhoc(queue_id, orig_rcpt, recipient, relay, dsn,
+                     entry, action, "%s", vstring_str(why));
        req_stat = 0;
     }
     vstring_free(why);
index b024c3209281fadbb71fee74df788ff171a48b8b..1afab0993739e725f1f16e74c164fa1c5675f5cf 100644 (file)
   */
 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 *);
 
index 623013be5346a689d62faaf6a65180fe9a41d34b..a6ceed1bfb021bd0956387fc77febc01d11c41a0 100644 (file)
@@ -7,25 +7,27 @@
 /*     #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;
@@ -51,6 +53,8 @@
 /*     The recipient address.
 /* .IP relay
 /*     Name of the host we're talking to.
+/* .IP dsn
+/*     X.YY.ZZ Error detail as specified in RFC 1893.
 /* .IP entry
 /*     Message arrival time.
 /* .IP status
 /* verify_append - update address verification database */
 
 int     verify_append(const char *queue_id, const char *orig_rcpt,
-                            const char *recipient, const char *relay,
-                            time_t entry, const char *status,
-                            int rcpt_stat, const char *fmt,...)
+                             const char *recipient, const char *relay,
+                             const char *dsn, time_t entry,
+                             const char *status, int rcpt_stat,
+                             const char *fmt,...)
 {
     va_list ap;
     int     req_stat;
 
     va_start(ap, fmt);
     req_stat = vverify_append(queue_id, orig_rcpt, recipient, relay,
-                            entry, status, rcpt_stat, fmt, ap);
+                             dsn, entry, status, rcpt_stat, fmt, ap);
     va_end(ap);
     return (req_stat);
 }
@@ -130,17 +135,26 @@ int     verify_append(const char *queue_id, const char *orig_rcpt,
 /* vverify_append - update address verification database */
 
 int     vverify_append(const char *queue_id, const char *orig_rcpt,
-                             const char *recipient, const char *relay,
-                             time_t entry, const char *status,
-                             int rcpt_stat, const char *fmt, va_list ap)
+                              const char *recipient, const char *relay,
+                              const char *dsn, time_t entry,
+                              const char *status, int rcpt_stat,
+                              const char *fmt, va_list ap)
 {
     VSTRING *text = vstring_alloc(10);
     int     req_stat;
 
     /*
      * Impedance adaptor between bounce/defer/sent and verify_clnt.
+     * 
+     * XXX No DSN check; this routine is called from bounce/defer/sent, which
+     * know what the DSN initial digit should look like.
+     * 
+     * XXX rcpt_stat is competely redundant because of dsn.
      */
-    vstring_vsprintf(text, fmt, ap);
+#if 0
+    vstring_sprintf(text, "%s ", dsn);
+#endif
+    vstring_vsprintf_append(text, fmt, ap);
     if (var_verify_neg_cache || rcpt_stat == DEL_RCPT_STAT_OK) {
        req_stat = verify_clnt_update(orig_rcpt, rcpt_stat,
                                      "%s", vstring_str(text));
@@ -152,7 +166,7 @@ int     vverify_append(const char *queue_id, const char *orig_rcpt,
        req_stat = VRFY_STAT_OK;
     }
     if (req_stat == VRFY_STAT_OK) {
-       log_adhoc(queue_id, orig_rcpt, recipient, relay,
+       log_adhoc(queue_id, orig_rcpt, recipient, relay, dsn,
                  entry, status, "%s", vstring_str(text));
        req_stat = 0;
     } else {
index 1ecd4daa4c788edeebec7f324d22b46a052bd359..59d69dbbd214fcf2189bc3ef62e9dfc542bba1c0 100644 (file)
  /*
   * 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
index 24aad7250e128f0b1a533f72650a0ff7455ca9a2..4208feb0d1bb8d15c30fa59ad5c164e96e19c515 100644 (file)
@@ -52,203 +52,214 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-lmtp.o: lmtp.c
-lmtp.o: ../../include/sys_defs.h
-lmtp.o: ../../include/dict.h
-lmtp.o: ../../include/vstream.h
-lmtp.o: ../../include/vbuf.h
 lmtp.o: ../../include/argv.h
+lmtp.o: ../../include/debug_peer.h
+lmtp.o: ../../include/deliver_request.h
+lmtp.o: ../../include/dict.h
+lmtp.o: ../../include/dsn_util.h
+lmtp.o: ../../include/flush_clnt.h
+lmtp.o: ../../include/mail_conf.h
+lmtp.o: ../../include/mail_error.h
+lmtp.o: ../../include/mail_params.h
+lmtp.o: ../../include/mail_queue.h
+lmtp.o: ../../include/mail_server.h
 lmtp.o: ../../include/msg.h
 lmtp.o: ../../include/mymalloc.h
 lmtp.o: ../../include/name_mask.h
+lmtp.o: ../../include/recipient_list.h
 lmtp.o: ../../include/split_at.h
-lmtp.o: ../../include/deliver_request.h
+lmtp.o: ../../include/sys_defs.h
+lmtp.o: ../../include/vbuf.h
+lmtp.o: ../../include/vstream.h
 lmtp.o: ../../include/vstring.h
-lmtp.o: ../../include/recipient_list.h
-lmtp.o: ../../include/mail_queue.h
-lmtp.o: ../../include/mail_params.h
-lmtp.o: ../../include/mail_conf.h
-lmtp.o: ../../include/debug_peer.h
-lmtp.o: ../../include/mail_error.h
-lmtp.o: ../../include/flush_clnt.h
-lmtp.o: ../../include/mail_server.h
+lmtp.o: lmtp.c
 lmtp.o: lmtp.h
 lmtp.o: lmtp_sasl.h
-lmtp_addr.o: lmtp_addr.c
-lmtp_addr.o: ../../include/sys_defs.h
-lmtp_addr.o: ../../include/msg.h
-lmtp_addr.o: ../../include/vstring.h
-lmtp_addr.o: ../../include/vbuf.h
-lmtp_addr.o: ../../include/mymalloc.h
+lmtp_addr.o: ../../include/argv.h
+lmtp_addr.o: ../../include/deliver_request.h
+lmtp_addr.o: ../../include/dns.h
+lmtp_addr.o: ../../include/dsn_util.h
 lmtp_addr.o: ../../include/inet_addr_list.h
-lmtp_addr.o: ../../include/myaddrinfo.h
-lmtp_addr.o: ../../include/stringops.h
-lmtp_addr.o: ../../include/sock_addr.h
 lmtp_addr.o: ../../include/inet_proto.h
 lmtp_addr.o: ../../include/mail_params.h
+lmtp_addr.o: ../../include/msg.h
+lmtp_addr.o: ../../include/myaddrinfo.h
+lmtp_addr.o: ../../include/mymalloc.h
 lmtp_addr.o: ../../include/own_inet_addr.h
-lmtp_addr.o: ../../include/dns.h
-lmtp_addr.o: lmtp.h
-lmtp_addr.o: ../../include/vstream.h
-lmtp_addr.o: ../../include/argv.h
-lmtp_addr.o: ../../include/deliver_request.h
 lmtp_addr.o: ../../include/recipient_list.h
+lmtp_addr.o: ../../include/sock_addr.h
+lmtp_addr.o: ../../include/stringops.h
+lmtp_addr.o: ../../include/sys_defs.h
+lmtp_addr.o: ../../include/vbuf.h
+lmtp_addr.o: ../../include/vstream.h
+lmtp_addr.o: ../../include/vstring.h
+lmtp_addr.o: lmtp.h
+lmtp_addr.o: lmtp_addr.c
 lmtp_addr.o: lmtp_addr.h
-lmtp_chat.o: lmtp_chat.c
-lmtp_chat.o: ../../include/sys_defs.h
-lmtp_chat.o: ../../include/msg.h
-lmtp_chat.o: ../../include/vstring.h
-lmtp_chat.o: ../../include/vbuf.h
-lmtp_chat.o: ../../include/vstream.h
 lmtp_chat.o: ../../include/argv.h
-lmtp_chat.o: ../../include/stringops.h
-lmtp_chat.o: ../../include/line_wrap.h
-lmtp_chat.o: ../../include/mymalloc.h
-lmtp_chat.o: ../../include/recipient_list.h
+lmtp_chat.o: ../../include/cleanup_user.h
 lmtp_chat.o: ../../include/deliver_request.h
-lmtp_chat.o: ../../include/smtp_stream.h
-lmtp_chat.o: ../../include/mail_params.h
+lmtp_chat.o: ../../include/dsn_util.h
+lmtp_chat.o: ../../include/line_wrap.h
 lmtp_chat.o: ../../include/mail_addr.h
-lmtp_chat.o: ../../include/post_mail.h
-lmtp_chat.o: ../../include/cleanup_user.h
 lmtp_chat.o: ../../include/mail_error.h
+lmtp_chat.o: ../../include/mail_params.h
+lmtp_chat.o: ../../include/msg.h
+lmtp_chat.o: ../../include/mymalloc.h
 lmtp_chat.o: ../../include/name_mask.h
+lmtp_chat.o: ../../include/post_mail.h
+lmtp_chat.o: ../../include/recipient_list.h
+lmtp_chat.o: ../../include/smtp_stream.h
+lmtp_chat.o: ../../include/stringops.h
+lmtp_chat.o: ../../include/sys_defs.h
+lmtp_chat.o: ../../include/vbuf.h
+lmtp_chat.o: ../../include/vstream.h
+lmtp_chat.o: ../../include/vstring.h
 lmtp_chat.o: lmtp.h
-lmtp_connect.o: lmtp_connect.c
-lmtp_connect.o: ../../include/sys_defs.h
-lmtp_connect.o: ../../include/msg.h
-lmtp_connect.o: ../../include/vstream.h
-lmtp_connect.o: ../../include/vbuf.h
-lmtp_connect.o: ../../include/vstring.h
-lmtp_connect.o: ../../include/split_at.h
-lmtp_connect.o: ../../include/mymalloc.h
-lmtp_connect.o: ../../include/iostuff.h
-lmtp_connect.o: ../../include/timed_connect.h
-lmtp_connect.o: ../../include/stringops.h
+lmtp_chat.o: lmtp_chat.c
+lmtp_connect.o: ../../include/argv.h
+lmtp_connect.o: ../../include/attr.h
+lmtp_connect.o: ../../include/deliver_request.h
+lmtp_connect.o: ../../include/dns.h
+lmtp_connect.o: ../../include/dsn_util.h
 lmtp_connect.o: ../../include/host_port.h
-lmtp_connect.o: ../../include/sane_connect.h
 lmtp_connect.o: ../../include/inet_addr_list.h
-lmtp_connect.o: ../../include/myaddrinfo.h
-lmtp_connect.o: ../../include/sock_addr.h
+lmtp_connect.o: ../../include/iostuff.h
 lmtp_connect.o: ../../include/mail_params.h
 lmtp_connect.o: ../../include/mail_proto.h
-lmtp_connect.o: ../../include/attr.h
+lmtp_connect.o: ../../include/msg.h
+lmtp_connect.o: ../../include/myaddrinfo.h
+lmtp_connect.o: ../../include/mymalloc.h
 lmtp_connect.o: ../../include/own_inet_addr.h
-lmtp_connect.o: ../../include/dns.h
-lmtp_connect.o: lmtp.h
-lmtp_connect.o: ../../include/argv.h
-lmtp_connect.o: ../../include/deliver_request.h
 lmtp_connect.o: ../../include/recipient_list.h
+lmtp_connect.o: ../../include/sane_connect.h
+lmtp_connect.o: ../../include/sock_addr.h
+lmtp_connect.o: ../../include/split_at.h
+lmtp_connect.o: ../../include/stringops.h
+lmtp_connect.o: ../../include/sys_defs.h
+lmtp_connect.o: ../../include/timed_connect.h
+lmtp_connect.o: ../../include/vbuf.h
+lmtp_connect.o: ../../include/vstream.h
+lmtp_connect.o: ../../include/vstring.h
+lmtp_connect.o: lmtp.h
 lmtp_connect.o: lmtp_addr.h
-lmtp_proto.o: lmtp_proto.c
-lmtp_proto.o: ../../include/sys_defs.h
+lmtp_connect.o: lmtp_connect.c
+lmtp_proto.o: ../../include/argv.h
+lmtp_proto.o: ../../include/attr.h
+lmtp_proto.o: ../../include/bounce.h
+lmtp_proto.o: ../../include/defer.h
+lmtp_proto.o: ../../include/deliver_completed.h
+lmtp_proto.o: ../../include/deliver_request.h
+lmtp_proto.o: ../../include/dsn_util.h
+lmtp_proto.o: ../../include/iostuff.h
+lmtp_proto.o: ../../include/mail_params.h
+lmtp_proto.o: ../../include/mail_proto.h
+lmtp_proto.o: ../../include/mail_queue.h
+lmtp_proto.o: ../../include/mark_corrupt.h
 lmtp_proto.o: ../../include/msg.h
-lmtp_proto.o: ../../include/vstring.h
-lmtp_proto.o: ../../include/vbuf.h
-lmtp_proto.o: ../../include/vstream.h
-lmtp_proto.o: ../../include/vstring_vstream.h
-lmtp_proto.o: ../../include/stringops.h
 lmtp_proto.o: ../../include/mymalloc.h
 lmtp_proto.o: ../../include/name_code.h
-lmtp_proto.o: ../../include/mail_params.h
-lmtp_proto.o: ../../include/smtp_stream.h
-lmtp_proto.o: ../../include/mail_queue.h
-lmtp_proto.o: ../../include/recipient_list.h
-lmtp_proto.o: ../../include/deliver_request.h
-lmtp_proto.o: ../../include/deliver_completed.h
-lmtp_proto.o: ../../include/defer.h
-lmtp_proto.o: ../../include/bounce.h
-lmtp_proto.o: ../../include/sent.h
-lmtp_proto.o: ../../include/record.h
-lmtp_proto.o: ../../include/rec_type.h
 lmtp_proto.o: ../../include/off_cvt.h
-lmtp_proto.o: ../../include/mark_corrupt.h
 lmtp_proto.o: ../../include/quote_821_local.h
 lmtp_proto.o: ../../include/quote_flags.h
-lmtp_proto.o: ../../include/mail_proto.h
-lmtp_proto.o: ../../include/iostuff.h
-lmtp_proto.o: ../../include/attr.h
+lmtp_proto.o: ../../include/rec_type.h
+lmtp_proto.o: ../../include/recipient_list.h
+lmtp_proto.o: ../../include/record.h
+lmtp_proto.o: ../../include/sent.h
+lmtp_proto.o: ../../include/smtp_stream.h
+lmtp_proto.o: ../../include/stringops.h
+lmtp_proto.o: ../../include/sys_defs.h
+lmtp_proto.o: ../../include/vbuf.h
+lmtp_proto.o: ../../include/vstream.h
+lmtp_proto.o: ../../include/vstring.h
+lmtp_proto.o: ../../include/vstring_vstream.h
 lmtp_proto.o: lmtp.h
-lmtp_proto.o: ../../include/argv.h
+lmtp_proto.o: lmtp_proto.c
 lmtp_proto.o: lmtp_sasl.h
-lmtp_sasl_glue.o: lmtp_sasl_glue.c
-lmtp_sasl_glue.o: ../../include/sys_defs.h
+lmtp_sasl_glue.o: ../../include/argv.h
+lmtp_sasl_glue.o: ../../include/deliver_request.h
+lmtp_sasl_glue.o: ../../include/dict.h
+lmtp_sasl_glue.o: ../../include/dsn_util.h
+lmtp_sasl_glue.o: ../../include/mail_params.h
+lmtp_sasl_glue.o: ../../include/maps.h
+lmtp_sasl_glue.o: ../../include/match_list.h
+lmtp_sasl_glue.o: ../../include/match_ops.h
 lmtp_sasl_glue.o: ../../include/msg.h
 lmtp_sasl_glue.o: ../../include/mymalloc.h
-lmtp_sasl_glue.o: ../../include/stringops.h
-lmtp_sasl_glue.o: ../../include/vstring.h
-lmtp_sasl_glue.o: ../../include/vbuf.h
-lmtp_sasl_glue.o: ../../include/split_at.h
 lmtp_sasl_glue.o: ../../include/name_mask.h
-lmtp_sasl_glue.o: ../../include/mail_params.h
+lmtp_sasl_glue.o: ../../include/recipient_list.h
+lmtp_sasl_glue.o: ../../include/split_at.h
 lmtp_sasl_glue.o: ../../include/string_list.h
-lmtp_sasl_glue.o: ../../include/match_list.h
-lmtp_sasl_glue.o: ../../include/match_ops.h
-lmtp_sasl_glue.o: ../../include/maps.h
-lmtp_sasl_glue.o: ../../include/dict.h
+lmtp_sasl_glue.o: ../../include/stringops.h
+lmtp_sasl_glue.o: ../../include/sys_defs.h
+lmtp_sasl_glue.o: ../../include/vbuf.h
 lmtp_sasl_glue.o: ../../include/vstream.h
-lmtp_sasl_glue.o: ../../include/argv.h
+lmtp_sasl_glue.o: ../../include/vstring.h
 lmtp_sasl_glue.o: lmtp.h
-lmtp_sasl_glue.o: ../../include/deliver_request.h
-lmtp_sasl_glue.o: ../../include/recipient_list.h
 lmtp_sasl_glue.o: lmtp_sasl.h
-lmtp_sasl_proto.o: lmtp_sasl_proto.c
-lmtp_sasl_proto.o: ../../include/sys_defs.h
+lmtp_sasl_glue.o: lmtp_sasl_glue.c
+lmtp_sasl_proto.o: ../../include/argv.h
+lmtp_sasl_proto.o: ../../include/deliver_request.h
+lmtp_sasl_proto.o: ../../include/dsn_util.h
+lmtp_sasl_proto.o: ../../include/mail_params.h
 lmtp_sasl_proto.o: ../../include/msg.h
 lmtp_sasl_proto.o: ../../include/mymalloc.h
-lmtp_sasl_proto.o: ../../include/mail_params.h
-lmtp_sasl_proto.o: lmtp.h
-lmtp_sasl_proto.o: ../../include/vstream.h
+lmtp_sasl_proto.o: ../../include/recipient_list.h
+lmtp_sasl_proto.o: ../../include/sys_defs.h
 lmtp_sasl_proto.o: ../../include/vbuf.h
+lmtp_sasl_proto.o: ../../include/vstream.h
 lmtp_sasl_proto.o: ../../include/vstring.h
-lmtp_sasl_proto.o: ../../include/argv.h
-lmtp_sasl_proto.o: ../../include/deliver_request.h
-lmtp_sasl_proto.o: ../../include/recipient_list.h
+lmtp_sasl_proto.o: lmtp.h
 lmtp_sasl_proto.o: lmtp_sasl.h
-lmtp_session.o: lmtp_session.c
-lmtp_session.o: ../../include/sys_defs.h
+lmtp_sasl_proto.o: lmtp_sasl_proto.c
+lmtp_session.o: ../../include/argv.h
+lmtp_session.o: ../../include/debug_peer.h
+lmtp_session.o: ../../include/deliver_request.h
+lmtp_session.o: ../../include/dsn_util.h
 lmtp_session.o: ../../include/mymalloc.h
-lmtp_session.o: ../../include/vstream.h
-lmtp_session.o: ../../include/vbuf.h
+lmtp_session.o: ../../include/recipient_list.h
 lmtp_session.o: ../../include/stringops.h
+lmtp_session.o: ../../include/sys_defs.h
+lmtp_session.o: ../../include/vbuf.h
+lmtp_session.o: ../../include/vstream.h
 lmtp_session.o: ../../include/vstring.h
-lmtp_session.o: ../../include/debug_peer.h
 lmtp_session.o: lmtp.h
-lmtp_session.o: ../../include/argv.h
-lmtp_session.o: ../../include/deliver_request.h
-lmtp_session.o: ../../include/recipient_list.h
-lmtp_state.o: lmtp_state.c
-lmtp_state.o: ../../include/sys_defs.h
+lmtp_session.o: lmtp_session.c
+lmtp_state.o: ../../include/argv.h
+lmtp_state.o: ../../include/deliver_request.h
+lmtp_state.o: ../../include/dsn_util.h
+lmtp_state.o: ../../include/mail_conf.h
 lmtp_state.o: ../../include/mymalloc.h
-lmtp_state.o: ../../include/vstring.h
+lmtp_state.o: ../../include/recipient_list.h
+lmtp_state.o: ../../include/sys_defs.h
 lmtp_state.o: ../../include/vbuf.h
 lmtp_state.o: ../../include/vstream.h
-lmtp_state.o: ../../include/mail_conf.h
+lmtp_state.o: ../../include/vstring.h
 lmtp_state.o: lmtp.h
-lmtp_state.o: ../../include/argv.h
-lmtp_state.o: ../../include/deliver_request.h
-lmtp_state.o: ../../include/recipient_list.h
 lmtp_state.o: lmtp_sasl.h
-lmtp_trouble.o: lmtp_trouble.c
-lmtp_trouble.o: ../../include/sys_defs.h
-lmtp_trouble.o: ../../include/msg.h
-lmtp_trouble.o: ../../include/vstring.h
-lmtp_trouble.o: ../../include/vbuf.h
-lmtp_trouble.o: ../../include/stringops.h
-lmtp_trouble.o: ../../include/mymalloc.h
-lmtp_trouble.o: ../../include/smtp_stream.h
-lmtp_trouble.o: ../../include/vstream.h
-lmtp_trouble.o: ../../include/deliver_request.h
-lmtp_trouble.o: ../../include/recipient_list.h
-lmtp_trouble.o: ../../include/deliver_completed.h
+lmtp_state.o: lmtp_state.c
+lmtp_trouble.o: ../../include/argv.h
 lmtp_trouble.o: ../../include/bounce.h
 lmtp_trouble.o: ../../include/defer.h
+lmtp_trouble.o: ../../include/deliver_completed.h
+lmtp_trouble.o: ../../include/deliver_request.h
+lmtp_trouble.o: ../../include/dsn_util.h
 lmtp_trouble.o: ../../include/mail_error.h
+lmtp_trouble.o: ../../include/msg.h
+lmtp_trouble.o: ../../include/mymalloc.h
 lmtp_trouble.o: ../../include/name_mask.h
+lmtp_trouble.o: ../../include/recipient_list.h
+lmtp_trouble.o: ../../include/smtp_stream.h
+lmtp_trouble.o: ../../include/stringops.h
+lmtp_trouble.o: ../../include/sys_defs.h
+lmtp_trouble.o: ../../include/vbuf.h
+lmtp_trouble.o: ../../include/vstream.h
+lmtp_trouble.o: ../../include/vstring.h
 lmtp_trouble.o: lmtp.h
-lmtp_trouble.o: ../../include/argv.h
+lmtp_trouble.o: lmtp_trouble.c
index e9078e551e605eadd0fdea0af2e1eebe4784f37c..6b9206de687fe3ff4c1a71f7f2b840d7d66c644b 100644 (file)
@@ -50,6 +50,7 @@
 /*     RFC 1652 (8bit-MIME transport)
 /*     RFC 1870 (Message Size Declaration)
 /*     RFC 2033 (LMTP protocol)
+/*     RFC 2034 (Enhanced Error Codes)
 /*     RFC 2554 (AUTH command)
 /*     RFC 2821 (SMTP protocol)
 /*     RFC 2920 (SMTP Pipelining)
 #include <debug_peer.h>
 #include <mail_error.h>
 #include <flush_clnt.h>
+#include <dsn_util.h>
 
 /* Single server skeleton. */
 
@@ -311,7 +313,7 @@ static LMTP_STATE *state = 0;
 static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
 {
     char   *myname = "deliver_message";
-    VSTRING *why;
+    DSN_VSTRING *why;
     int     result;
 
     if (msg_verbose)
@@ -334,7 +336,7 @@ static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
      * performed in the MAIL_SERVER_POST_INIT function (post_init).
      * 
      */
-    why = vstring_alloc(100);
+    why = dsn_vstring_alloc(100);
     state->request = request;
     state->src = request->fp;
 
@@ -397,8 +399,15 @@ static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
         * Bounce or defer the recipients if no connection can be made.
         */
        if ((state->session = lmtp_connect(request->nexthop, why)) == 0) {
-           lmtp_site_fail(state, lmtp_errno == LMTP_RETRY ? 450 : 550,
-                          "%s", vstring_str(why));
+           if (lmtp_errno == LMTP_RETRY) {
+               why->dsn[0] = '4';
+               lmtp_site_fail(state, why->dsn, 450,
+                              "%s", vstring_str(why->vstring));
+           } else {
+               why->dsn[0] = '5';
+               lmtp_site_fail(state, why->dsn, 550,
+                              "%s", vstring_str(why->vstring));
+           }
        }
 
        /*
@@ -448,7 +457,7 @@ static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
     /*
      * Clean up.
      */
-    vstring_free(why);
+    dsn_vstring_free(why);
     result = state->status;
     lmtp_chat_reset(state);
 
index 2c30226c489d2907c111194fdaaa12085ae06400..560a712c7b29d509473686bb126cbae827746989 100644 (file)
@@ -27,6 +27,7 @@
   * Global library.
   */
 #include <deliver_request.h>
+#include <dsn_util.h>
 
  /*
   * State information associated with each LMTP delivery. We're bundling the
@@ -89,7 +90,7 @@ extern LMTP_SESSION *lmtp_session_free(LMTP_SESSION *);
  /*
   * lmtp_connect.c
   */
-extern LMTP_SESSION *lmtp_connect(const char *, VSTRING *);
+extern LMTP_SESSION *lmtp_connect(const char *, DSN_VSTRING *);
 
  /*
   * lmtp_proto.c
@@ -104,6 +105,7 @@ extern int lmtp_rset(LMTP_STATE *);
   */
 typedef struct LMTP_RESP {             /* server response */
     int     code;                      /* status */
+    char    dsn[DSN_BUFSIZE];          /* DSN detail */
     char   *str;                       /* text */
     VSTRING *buf;                      /* origin of text */
 } LMTP_RESP;
@@ -116,11 +118,13 @@ extern void lmtp_chat_notify(LMTP_STATE *);
  /*
   * lmtp_trouble.c
   */
-extern int PRINTFLIKE(3, 4) lmtp_conn_fail(LMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) lmtp_site_fail(LMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) lmtp_mesg_fail(LMTP_STATE *, int, char *,...);
-extern void PRINTFLIKE(4, 5) lmtp_rcpt_fail(LMTP_STATE *, int, RECIPIENT *, char *,...);
-extern int lmtp_stream_except(LMTP_STATE *, int, char *);
+extern int PRINTFLIKE(4, 5) lmtp_site_fail(LMTP_STATE *, const char *, int,
+                                                  const char *,...);
+extern int PRINTFLIKE(4, 5) lmtp_mesg_fail(LMTP_STATE *, const char *, int,
+                                                  const char *,...);
+extern void PRINTFLIKE(5, 6) lmtp_rcpt_fail(LMTP_STATE *, const char *, int,
+                                            RECIPIENT *, const char *,...);
+extern int lmtp_stream_except(LMTP_STATE *, int, const char *);
 
  /*
   * lmtp_state.c
index 1710f787db0121bea076c9657e5f5881e8c50380..af44ebb8f3e982a9f19efe76962172b7a4d59a40 100644 (file)
@@ -8,7 +8,7 @@
 /*
 /*     DNS_RR *lmtp_host_addr(name, why)
 /*     char    *name;
-/*     VSTRING *why;
+/*     DSN_VSTRING *why;
 /* DESCRIPTION
 /*     This module implements Internet address lookups. By default,
 /*     lookups are done via the Internet domain name service (DNS).
@@ -31,7 +31,7 @@
 /* .IP LMTP_FAIL
 /*     The request attempt failed due to a hard error.
 /* .PP
-/*     In addition, a textual description of the problem is made available
+/*     In addition, a description of the problem is made available
 /*     via the \fIwhy\fR argument.
 /* LICENSE
 /* .ad
@@ -82,6 +82,7 @@
 
 #include <mail_params.h>
 #include <own_inet_addr.h>
+#include <dsn_util.h>
 
 /* DNS library. */
 
@@ -114,7 +115,8 @@ static void lmtp_print_addr(char *what, DNS_RR *addr_list)
 
 /* lmtp_addr_one - address lookup for one host name */
 
-static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRING *why)
+static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref,
+                                    DSN_VSTRING *why)
 {
     char   *myname = "lmtp_addr_one";
     DNS_RR *addr = 0;
@@ -132,7 +134,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
      * Interpret a numerical name as an address.
      */
     if (hostaddr_to_sockaddr(host, (char *) 0, 0, &res0) == 0
-       && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
+     && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
        if ((addr = dns_sa_to_rr(host, pref, res0->ai_addr)) == 0)
            msg_fatal("host %s: conversion error for address family %d: %m",
                    host, ((struct sockaddr *) (res0->ai_addr))->sa_family);
@@ -146,10 +148,19 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
      */
 #define RETRY_AI_ERROR(e) \
        ((e) == EAI_AGAIN || (e) == EAI_MEMORY || (e) == EAI_SYSTEM)
+#ifdef EAI_NODATA
+#define DSN_NOHOST(e) \
+       ((e) == EAI_AGAIN || (e) == EAI_NODATA || (e) == EAI_NONAME)
+#else
+#define DSN_NOHOST(e) \
+       ((e) == EAI_AGAIN || (e) == EAI_NONAME)
+#endif
 
     if (var_disable_dns) {
        if ((aierr = hostname_to_sockaddr(host, (char *) 0, 0, &res0)) != 0) {
-           vstring_sprintf(why, "%s: %s", host, MAI_STRERROR(aierr));
+           dsn_vstring_update(why, DSN_NOHOST(aierr) ? "4.4.4" : "4.3.0",
+                              "unable to look up host %s: %s",
+                              host, MAI_STRERROR(aierr));
            lmtp_errno = (RETRY_AI_ERROR(aierr) ? LMTP_RETRY : LMTP_FAIL);
        } else {
            for (found = 0, res = res0; res != 0; res = res->ai_next) {
@@ -166,7 +177,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
            }
            freeaddrinfo(res0);
            if (found == 0) {
-               vstring_sprintf(why, "%s: host not found", host);
+               dsn_vstring_update(why, "5.4.4", "%s: host not found", host);
                lmtp_errno = LMTP_FAIL;
            }
            return (addr_list);
@@ -176,7 +187,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
     /*
      * Append the addresses for this host to the address list.
      */
-    switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0, why,
+    switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0, why->vstring,
                         DNS_REQ_FLAG_ALL, proto_info->dns_atype_list)) {
     case DNS_OK:
        for (rr = addr; rr; rr = rr->next)
@@ -184,10 +195,15 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
        addr_list = dns_rr_append(addr_list, addr);
        break;
     default:
+       dsn_vstring_update(why, "4.4.3", "");
        lmtp_errno = LMTP_RETRY;
        break;
-    case DNS_NOTFOUND:
     case DNS_FAIL:
+       dsn_vstring_update(why, "4.4.3", "");
+       lmtp_errno = LMTP_FAIL;
+       break;
+    case DNS_NOTFOUND:
+       dsn_vstring_update(why, "4.4.4", "");
        lmtp_errno = LMTP_FAIL;
        break;
     }
@@ -196,7 +212,7 @@ static DNS_RR *lmtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
 
 /* lmtp_host_addr - direct host lookup */
 
-DNS_RR *lmtp_host_addr(char *host, VSTRING *why)
+DNS_RR *lmtp_host_addr(char *host, DSN_VSTRING *why)
 {
     DNS_RR *addr_list;
 
index 579b7f034a75488d01649a77f6a7effed43195d6..92d1c2ee63a9e3d959e2b6b9923292a8794388ad 100644 (file)
@@ -8,6 +8,11 @@
 /* DESCRIPTION
 /* .nf
 
+ /*
+  * Global library.
+  */
+#include <dsn_util.h>
+
  /*
   * DNS library.
   */
@@ -16,7 +21,7 @@
  /*
   * Internal interfaces.
   */
-extern DNS_RR *lmtp_host_addr(char *, VSTRING *);
+extern DNS_RR *lmtp_host_addr(char *, DSN_VSTRING *);
 
 /* LICENSE
 /* .ad
index 43379a75397262a8f4f05dc175496f765c09dac0..a5c1f5d8c28667d5f61e8f1ff278f5d0ff38f552 100644 (file)
@@ -9,6 +9,7 @@
 /*     typedef struct {
 /* .in +4
 /*             int code;
+/*             char dsn[...];
 /*             char *str;
 /*             VSTRING *buf;
 /* .in -4
@@ -85,6 +86,7 @@
 #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. */
 
@@ -175,6 +178,8 @@ LMTP_RESP *lmtp_chat_resp(LMTP_STATE *state)
     static LMTP_RESP rdata;
     char   *cp;
     int     last_char;
+    int     three_digs = 0;
+    size_t  len;
 
     /*
      * Initialize the response data buffer.
@@ -215,7 +220,7 @@ LMTP_RESP *lmtp_chat_resp(LMTP_STATE *state)
         */
        for (cp = STR(state->buffer); *cp && ISDIGIT(*cp); cp++)
             /* void */ ;
-       if (cp - STR(state->buffer) == 3) {
+       if ((three_digs = (cp - STR(state->buffer) == 3)) != 0) {
            if (*cp == '-')
                continue;
            if (*cp == ' ' || *cp == 0)
@@ -223,7 +228,25 @@ LMTP_RESP *lmtp_chat_resp(LMTP_STATE *state)
        }
        state->error_mask |= MAIL_ERROR_PROTOCOL;
     }
-    rdata.code = atoi(STR(state->buffer));
+
+    /*
+     * Extract RFC 821 reply code and RFC 2034 detail code. Use a default
+     * detail code if none was given.
+     */
+    rdata.dsn[0] = 0;
+    if (three_digs != 0) {
+       rdata.code = atoi(STR(state->buffer));
+       for (cp = STR(state->buffer) + 4; *cp == ' '; cp++)
+            /* void */ ;
+       if ((len = dsn_valid(cp)) > 0 && len < sizeof(rdata.dsn)) {
+           DSN_BUF_UPDATE(rdata.dsn, cp, len);
+       } else if (strchr("245", STR(state->buffer)[0]) != 0) {
+           DSN_BUF_UPDATE(rdata.dsn, "0.0.0", sizeof("0.0.0") - 1);
+           rdata.dsn[0] = STR(state->buffer)[0];
+       }
+    } else {
+       rdata.code = 0;
+    }
     VSTRING_TERMINATE(rdata.buf);
     rdata.str = STR(rdata.buf);
     return (&rdata);
index e00a151149b79651c211f4d06566f79f77c0e646..b06ff2b1fdc32e8710bb7e8ceb9150133cc11c9e 100644 (file)
@@ -8,7 +8,7 @@
 /*
 /*     LMTP_SESSION *lmtp_connect(destination, why)
 /*     char    *destination;
-/*     VSTRING *why;
+/*     DSN_VSTRING *why;
 /* DESCRIPTION
 /*     This module implements LMTP connection management.
 /*
@@ -37,7 +37,7 @@
 /* .IP LMTP_FAIL
 /*     The connection attempt failed.
 /* .PP
-/*     In addition, a textual description of the error is made available
+/*     In addition, a description of the error is made available
 /*     via the \fIwhy\fR argument.
 /* SEE ALSO
 /*     lmtp_proto(3) LMTP client protocol
 /* 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";
@@ -136,6 +136,7 @@ static LMTP_SESSION *lmtp_connect_unix(const char *addr,
      */
     if (len >= (int) sizeof(sun.sun_path)) {
        msg_warn("unix-domain name too long: %s", addr);
+       dsn_vstring_update(why, "4.3.5", "Server configuration error");
        lmtp_errno = LMTP_RETRY;
        return (0);
     }
@@ -169,7 +170,7 @@ static LMTP_SESSION *lmtp_connect_unix(const char *addr,
 /* lmtp_connect_addr - connect to explicit address */
 
 static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
-                                     const char *destination, VSTRING *why)
+                                 const char *destination, DSN_VSTRING *why)
 {
     char   *myname = "lmtp_connect_addr";
     struct sockaddr_storage ss;
@@ -184,6 +185,7 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
     if (dns_rr_to_sa(addr, port, sa, &salen) != 0) {
        msg_warn("%s: skip address type %s: %m",
                 myname, dns_strtype(addr->type));
+       dsn_vstring_update(why, "4.3.0", "network address conversion failed");
        lmtp_errno = LMTP_RETRY;
        return (0);
     }
@@ -210,7 +212,8 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
 
 static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
                                         const char *name, const char *addr,
-                                     const char *destination, VSTRING *why)
+                                              const char *destination,
+                                              DSN_VSTRING *why)
 {
     int     conn_stat;
     int     saved_errno;
@@ -227,8 +230,8 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
        conn_stat = sane_connect(sock, sa, len);
     }
     if (conn_stat < 0) {
-       vstring_sprintf(why, "connect to %s[%s]: %m",
-                       name, addr);
+       dsn_vstring_update(why, "4.4.1", "connect to %s[%s]: %m",
+                          name, addr);
        lmtp_errno = LMTP_RETRY;
        close(sock);
        return (0);
@@ -238,8 +241,8 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
      * Skip this host if it takes no action within some time limit.
      */
     if (read_wait(sock, var_lmtp_lhlo_tmout) < 0) {
-       vstring_sprintf(why, "connect to %s[%s]: read timeout",
-                       name, addr);
+       dsn_vstring_update(why, "4.4.2", "connect to %s[%s]: read timeout",
+                          name, addr);
        lmtp_errno = LMTP_RETRY;
        close(sock);
        return (0);
@@ -250,8 +253,9 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
      */
     stream = vstream_fdopen(sock, O_RDWR);
     if ((ch = VSTREAM_GETC(stream)) == VSTREAM_EOF) {
-       vstring_sprintf(why, "connect to %s[%s]: server dropped connection without sending the initial greeting",
-                       name, addr);
+       dsn_vstring_update(why, "4.4.0",
+                          "connect to %s[%s]: server dropped connection without sending the initial greeting",
+                          name, addr);
        lmtp_errno = LMTP_RETRY;
        vstream_fclose(stream);
        return (0);
@@ -262,8 +266,9 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
      * Skip this host if it sends a 4xx or 5xx greeting.
      */
     if (ch == '4' || ch == '5') {
-       vstring_sprintf(why, "connect to %s[%s]: server refused mail service",
-                       name, addr);
+       dsn_vstring_update(why, "4.3.0",
+                          "connect to %s[%s]: server refused mail service",
+                          name, addr);
        lmtp_errno = LMTP_RETRY;
        vstream_fclose(stream);
        return (0);
@@ -274,7 +279,7 @@ static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
 /* lmtp_connect_host - direct connection to host */
 
 static LMTP_SESSION *lmtp_connect_host(char *host, unsigned port,
-                                     const char *destination, VSTRING *why)
+                                 const char *destination, DSN_VSTRING *why)
 {
     LMTP_SESSION *session = 0;
     DNS_RR *addr_list;
@@ -336,7 +341,7 @@ static char *lmtp_parse_destination(const char *destination, char *def_service,
 
 /* lmtp_connect - establish LMTP connection */
 
-LMTP_SESSION *lmtp_connect(const char *destination, VSTRING *why)
+LMTP_SESSION *lmtp_connect(const char *destination, DSN_VSTRING *why)
 {
     char   *myname = "lmtp_connect";
     LMTP_SESSION *session;
index ebfa6323d7ac50e4163009036f8b76772527b494..f446f1f74ebf5ea675e751ede24c5919fc6361cd 100644 (file)
@@ -224,7 +224,7 @@ int     lmtp_lhlo(LMTP_STATE *state)
      * Read and parse the server's LMTP greeting banner.
      */
     if (((resp = lmtp_chat_resp(state))->code / 100) != 2)
-       return (lmtp_site_fail(state, resp->code,
+       return (lmtp_site_fail(state, resp->dsn, resp->code,
                               "host %s refused to talk to me: %s",
                         session->namaddr, translit(resp->str, "\n", " ")));
 
@@ -233,7 +233,7 @@ int     lmtp_lhlo(LMTP_STATE *state)
      */
     lmtp_chat_cmd(state, "LHLO %s", var_myhostname);
     if ((resp = lmtp_chat_resp(state))->code / 100 != 2)
-       return (lmtp_site_fail(state, resp->code,
+       return (lmtp_site_fail(state, resp->dsn, resp->code,
                               "host %s refused to talk to me: %s",
                               session->namaddr,
                               translit(resp->str, "\n", " ")));
@@ -594,7 +594,7 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
                     */
                case LMTP_STATE_MAIL:
                    if (resp->code / 100 != 2) {
-                       lmtp_mesg_fail(state, resp->code,
+                       lmtp_mesg_fail(state, resp->dsn, resp->code,
                                       "host %s said: %s (in reply to %s)",
                                       session->namaddr,
                                       translit(resp->str, "\n", " "),
@@ -634,15 +634,16 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
                                && sent(DEL_REQ_TRACE_FLAGS(request->flags),
                                        request->queue_id, rcpt->orig_addr,
                                        rcpt->address, rcpt->offset,
-                                   session->namaddr, request->arrival_time,
-                                       "%s",
+                                       session->namaddr, resp->dsn,
+                                       request->arrival_time, "%s",
                                     translit(resp->str, "\n", " ")) == 0) {
                                if (request->flags & DEL_REQ_FLAG_SUCCESS)
                                    deliver_completed(state->src, rcpt->offset);
                                rcpt->offset = 0;       /* in case deferred */
                            }
                        } else {
-                           lmtp_rcpt_fail(state, resp->code, rcpt,
+                           lmtp_rcpt_fail(state, resp->dsn,
+                                          resp->code, rcpt,
                                        "host %s said: %s (in reply to %s)",
                                           session->namaddr,
                                           translit(resp->str, "\n", " "),
@@ -664,7 +665,7 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
                case LMTP_STATE_DATA:
                    if (resp->code / 100 != 3) {
                        if (nrcpt > 0)
-                           lmtp_mesg_fail(state, resp->code,
+                           lmtp_mesg_fail(state, resp->dsn, resp->code,
                                        "host %s said: %s (in reply to %s)",
                                           session->namaddr,
                                           translit(resp->str, "\n", " "),
@@ -691,7 +692,7 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
                                if (sent(DEL_REQ_TRACE_FLAGS(request->flags),
                                         request->queue_id, rcpt->orig_addr,
                                         rcpt->address, rcpt->offset,
-                                        session->namaddr,
+                                        session->namaddr, resp->dsn,
                                         request->arrival_time,
                                         "%s", resp->str) == 0) {
                                    if (request->flags & DEL_REQ_FLAG_SUCCESS)
@@ -700,7 +701,8 @@ static int lmtp_loop(LMTP_STATE *state, NOCLOBBER int send_state,
                                }
                            }
                        } else {
-                           lmtp_rcpt_fail(state, resp->code, rcpt,
+                           lmtp_rcpt_fail(state, resp->dsn,
+                                          resp->code, rcpt,
                                        "host %s said: %s (in reply to %s)",
                                           session->namaddr,
                                           translit(resp->str, "\n", " "),
index e9fc09a2cdb6b77f3e464150d4ccc58961200d7b..6d15e26597e905c6c47171d5cd58d3d9c6ec0572 100644 (file)
@@ -116,7 +116,8 @@ int     lmtp_sasl_helo_login(LMTP_STATE *state)
     if (lmtp_sasl_passwd_lookup(state) != 0) {
        lmtp_sasl_start(state, VAR_LMTP_SASL_OPTS, var_lmtp_sasl_opts);
        if (lmtp_sasl_authenticate(state, why) <= 0)
-           ret = lmtp_site_fail(state, 450, "Authentication failed: %s",
+           ret = lmtp_site_fail(state, "4.7.0", 450,
+                                "Authentication failed: %s",
                                 vstring_str(why));
     }
     vstring_free(why);
index 84ce001e1700bdeb0b9e6c0a1ccfeef667300f62..2dc71b81d5e5a263352b9e85e7ff77a90141b44b 100644 (file)
@@ -6,26 +6,29 @@
 /* SYNOPSIS
 /*     #include "lmtp.h"
 /*
-/*     int     lmtp_site_fail(state, code, format, ...)
+/*     int     lmtp_site_fail(state, dsn, code, format, ...)
 /*     LMTP_STATE *state;
+/*     const char *dsn;
 /*     int     code;
-/*     char    *format;
+/*     const char *format;
 /*
-/*     int     lmtp_mesg_fail(state, code, format, ...)
+/*     int     lmtp_mesg_fail(state, dsn, code, format, ...)
 /*     LMTP_STATE *state;
+/*     const char *dsn;
 /*     int     code;
-/*     char    *format;
+/*     const char *format;
 /*
-/*     void    lmtp_rcpt_fail(state, code, recipient, format, ...)
+/*     void    lmtp_rcpt_fail(state, dsn, code, recipient, format, ...)
 /*     LMTP_STATE *state;
+/*     const char *dsn;
 /*     int     code;
 /*     RECIPIENT *recipient;
-/*     char    *format;
+/*     const char *format;
 /*
 /*     int     lmtp_stream_except(state, exception, description)
 /*     LMTP_STATE *state;
 /*     int     exception;
-/*     char    *description;
+/*     const char *description;
 /* DESCRIPTION
 /*     This module handles all non-fatal errors that can happen while
 /*     attempting to deliver mail via LMTP, and implements the policy
 #include <bounce.h>
 #include <defer.h>
 #include <mail_error.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -150,7 +154,8 @@ static void lmtp_check_code(LMTP_STATE *state, int code)
 
 /* lmtp_site_fail - defer site or bounce recipients */
 
-int     lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
+int     lmtp_site_fail(LMTP_STATE *state, const char *dsn,
+                              int code, const char *format,...)
 {
     DELIVER_REQUEST *request = state->request;
     LMTP_SESSION *session = state->session;
@@ -165,7 +170,11 @@ int     lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
      * Initialize.
      */
     va_start(ap, format);
-    vstring_vsprintf(why, format, ap);
+    if (code < 400 || code > 599) {
+       vstring_sprintf(why, "Protocol error: ");
+       dsn = "5.5.0";
+    }
+    vstring_vsprintf_append(why, format, ap);
     va_end(ap);
 
     /*
@@ -180,7 +189,7 @@ int     lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
            (DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
             rcpt->orig_addr, rcpt->address, rcpt->offset,
             session ? session->namaddr : "none",
-            request->arrival_time, "%s", vstring_str(why));
+            dsn, request->arrival_time, "%s", vstring_str(why));
        if (status == 0) {
            deliver_completed(state->src, rcpt->offset);
            rcpt->offset = 0;
@@ -188,7 +197,7 @@ int     lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
        state->status |= status;
     }
     if (soft_error && request->hop_status == 0)
-       request->hop_status = mystrdup(vstring_str(why));
+       request->hop_status = dsn_prepend(dsn, vstring_str(why));
 
     /*
      * Cleanup.
@@ -199,7 +208,8 @@ int     lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
 
 /* lmtp_mesg_fail - defer message or bounce all recipients */
 
-int     lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
+int     lmtp_mesg_fail(LMTP_STATE *state, const char *dsn,
+                              int code, const char *format,...)
 {
     DELIVER_REQUEST *request = state->request;
     LMTP_SESSION *session = state->session;
@@ -213,7 +223,11 @@ int     lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
      * Initialize.
      */
     va_start(ap, format);
-    vstring_vsprintf(why, format, ap);
+    if (code < 400 || code > 599) {
+       vstring_sprintf(why, "Protocol error: ");
+       dsn = "5.5.0";
+    }
+    vstring_vsprintf_append(why, format, ap);
     va_end(ap);
 
     /*
@@ -227,7 +241,7 @@ int     lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
        status = (LMTP_SOFT(code) ? defer_append : bounce_append)
            (DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
             rcpt->orig_addr, rcpt->address, rcpt->offset,
-            session->namaddr, request->arrival_time,
+            session->namaddr, dsn, request->arrival_time,
             "%s", vstring_str(why));
        if (status == 0) {
            deliver_completed(state->src, rcpt->offset);
@@ -246,41 +260,58 @@ int     lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
 
 /* lmtp_rcpt_fail - defer or bounce recipient */
 
-void    lmtp_rcpt_fail(LMTP_STATE *state, int code, RECIPIENT *rcpt,
-                              char *format,...)
+void    lmtp_rcpt_fail(LMTP_STATE *state, const char *dsn, int code,
+                              RECIPIENT *rcpt, const char *format,...)
 {
     DELIVER_REQUEST *request = state->request;
     LMTP_SESSION *session = state->session;
     int     status;
     va_list ap;
+    VSTRING *why = vstring_alloc(100);
+
+    /*
+     * Initialize.
+     */
+    va_start(ap, format);
+    if (code < 400 || code > 599) {
+       vstring_sprintf(why, "Protocol error: ");
+       dsn = "5.5.0";
+    }
+    vstring_vsprintf_append(why, format, ap);
+    va_end(ap);
 
     /*
      * If this is a soft error, postpone delivery to this recipient.
      * Otherwise, generate a bounce record for this recipient.
      */
-    va_start(ap, format);
-    status = (LMTP_SOFT(code) ? vdefer_append : vbounce_append)
+    status = (LMTP_SOFT(code) ? defer_append : bounce_append)
        (DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
         rcpt->orig_addr, rcpt->address, rcpt->offset,
-        session->namaddr, request->arrival_time, format, ap);
-    va_end(ap);
+        session->namaddr, dsn, request->arrival_time,
+        "%s", vstring_str(why));
     if (status == 0) {
        deliver_completed(state->src, rcpt->offset);
        rcpt->offset = 0;
     }
     lmtp_check_code(state, code);
     state->status |= status;
+
+    /*
+     * Cleanup.
+     */
+    vstring_free(why);
 }
 
 /* lmtp_stream_except - defer domain after I/O problem */
 
-int     lmtp_stream_except(LMTP_STATE *state, int code, char *description)
+int     lmtp_stream_except(LMTP_STATE *state, int code, const char *description)
 {
     DELIVER_REQUEST *request = state->request;
     LMTP_SESSION *session = state->session;
     RECIPIENT *rcpt;
     int     nrcpt;
     VSTRING *why = vstring_alloc(100);
+    const char *dsn;
 
     /*
      * Initialize.
@@ -291,10 +322,12 @@ int     lmtp_stream_except(LMTP_STATE *state, int code, char *description)
     case SMTP_ERR_EOF:
        vstring_sprintf(why, "lost connection with %s while %s",
                        session->namaddr, description);
+       dsn = "4.4.2";
        break;
     case SMTP_ERR_TIME:
        vstring_sprintf(why, "conversation with %s timed out while %s",
                        session->namaddr, description);
+       dsn = "4.4.2";
        break;
     }
 
@@ -310,9 +343,11 @@ int     lmtp_stream_except(LMTP_STATE *state, int code, char *description)
                                      request->queue_id,
                                      rcpt->orig_addr, rcpt->address,
                                      rcpt->offset, session->namaddr,
-                                     request->arrival_time,
+                                     dsn, request->arrival_time,
                                      "%s", vstring_str(why));
     }
+    if (request->hop_status == 0)
+       request->hop_status = dsn_prepend(dsn, vstring_str(why));
 
     /*
      * Cleanup.
index fb439cde6a6720fbdd4fd9893e662b3fd19e48d3..b5a0c702aab099d7167d5007c2a17c960cccbea4 100644 (file)
@@ -54,449 +54,454 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-alias.o: alias.c
-alias.o: ../../include/sys_defs.h
-alias.o: ../../include/msg.h
-alias.o: ../../include/htable.h
-alias.o: ../../include/dict.h
-alias.o: ../../include/vstream.h
-alias.o: ../../include/vbuf.h
 alias.o: ../../include/argv.h
-alias.o: ../../include/stringops.h
-alias.o: ../../include/vstring.h
-alias.o: ../../include/mymalloc.h
-alias.o: ../../include/mail_params.h
-alias.o: ../../include/defer.h
+alias.o: ../../include/been_here.h
 alias.o: ../../include/bounce.h
+alias.o: ../../include/canon_addr.h
+alias.o: ../../include/defer.h
 alias.o: ../../include/deliver_request.h
-alias.o: ../../include/recipient_list.h
+alias.o: ../../include/dict.h
+alias.o: ../../include/htable.h
+alias.o: ../../include/mail_params.h
 alias.o: ../../include/maps.h
+alias.o: ../../include/mbox_conf.h
+alias.o: ../../include/msg.h
+alias.o: ../../include/mymalloc.h
 alias.o: ../../include/mypwd.h
-alias.o: ../../include/canon_addr.h
+alias.o: ../../include/recipient_list.h
+alias.o: ../../include/resolve_clnt.h
 alias.o: ../../include/sent.h
-alias.o: local.h
-alias.o: ../../include/been_here.h
+alias.o: ../../include/stringops.h
+alias.o: ../../include/sys_defs.h
 alias.o: ../../include/tok822.h
-alias.o: ../../include/resolve_clnt.h
-alias.o: ../../include/mbox_conf.h
-biff_notify.o: biff_notify.c
-biff_notify.o: ../../include/sys_defs.h
+alias.o: ../../include/vbuf.h
+alias.o: ../../include/vstream.h
+alias.o: ../../include/vstring.h
+alias.o: alias.c
+alias.o: local.h
 biff_notify.o: ../../include/msg.h
+biff_notify.o: ../../include/sys_defs.h
+biff_notify.o: biff_notify.c
 biff_notify.o: biff_notify.h
-command.o: command.c
-command.o: ../../include/sys_defs.h
-command.o: ../../include/msg.h
-command.o: ../../include/htable.h
-command.o: ../../include/vstring.h
-command.o: ../../include/vbuf.h
-command.o: ../../include/vstream.h
 command.o: ../../include/argv.h
-command.o: ../../include/mac_parse.h
-command.o: ../../include/defer.h
+command.o: ../../include/been_here.h
 command.o: ../../include/bounce.h
+command.o: ../../include/defer.h
 command.o: ../../include/deliver_request.h
-command.o: ../../include/recipient_list.h
-command.o: ../../include/sent.h
-command.o: ../../include/been_here.h
+command.o: ../../include/dict.h
+command.o: ../../include/dsn_util.h
+command.o: ../../include/htable.h
+command.o: ../../include/mac_parse.h
+command.o: ../../include/mail_copy.h
 command.o: ../../include/mail_params.h
+command.o: ../../include/maps.h
+command.o: ../../include/mbox_conf.h
+command.o: ../../include/msg.h
 command.o: ../../include/pipe_command.h
-command.o: ../../include/mail_copy.h
-command.o: local.h
-command.o: ../../include/tok822.h
+command.o: ../../include/recipient_list.h
 command.o: ../../include/resolve_clnt.h
-command.o: ../../include/mbox_conf.h
-command.o: ../../include/maps.h
-command.o: ../../include/dict.h
-deliver_attr.o: deliver_attr.c
-deliver_attr.o: ../../include/sys_defs.h
-deliver_attr.o: ../../include/msg.h
-deliver_attr.o: ../../include/vstream.h
-deliver_attr.o: ../../include/vbuf.h
-deliver_attr.o: local.h
-deliver_attr.o: ../../include/htable.h
-deliver_attr.o: ../../include/vstring.h
+command.o: ../../include/sent.h
+command.o: ../../include/sys_defs.h
+command.o: ../../include/tok822.h
+command.o: ../../include/vbuf.h
+command.o: ../../include/vstream.h
+command.o: ../../include/vstring.h
+command.o: command.c
+command.o: local.h
+deliver_attr.o: ../../include/argv.h
 deliver_attr.o: ../../include/been_here.h
-deliver_attr.o: ../../include/tok822.h
-deliver_attr.o: ../../include/resolve_clnt.h
 deliver_attr.o: ../../include/deliver_request.h
-deliver_attr.o: ../../include/recipient_list.h
-deliver_attr.o: ../../include/mbox_conf.h
-deliver_attr.o: ../../include/argv.h
-deliver_attr.o: ../../include/maps.h
 deliver_attr.o: ../../include/dict.h
-delivered.o: delivered.c
-delivered.o: ../../include/sys_defs.h
-delivered.o: ../../include/msg.h
+deliver_attr.o: ../../include/htable.h
+deliver_attr.o: ../../include/maps.h
+deliver_attr.o: ../../include/mbox_conf.h
+deliver_attr.o: ../../include/msg.h
+deliver_attr.o: ../../include/recipient_list.h
+deliver_attr.o: ../../include/resolve_clnt.h
+deliver_attr.o: ../../include/sys_defs.h
+deliver_attr.o: ../../include/tok822.h
+deliver_attr.o: ../../include/vbuf.h
+deliver_attr.o: ../../include/vstream.h
+deliver_attr.o: ../../include/vstring.h
+deliver_attr.o: deliver_attr.c
+deliver_attr.o: local.h
+delivered.o: ../../include/argv.h
+delivered.o: ../../include/been_here.h
+delivered.o: ../../include/deliver_request.h
+delivered.o: ../../include/dict.h
+delivered.o: ../../include/header_opts.h
 delivered.o: ../../include/htable.h
-delivered.o: ../../include/vstring.h
-delivered.o: ../../include/vbuf.h
-delivered.o: ../../include/vstream.h
-delivered.o: ../../include/vstring_vstream.h
-delivered.o: ../../include/stringops.h
-delivered.o: ../../include/record.h
-delivered.o: ../../include/rec_type.h
 delivered.o: ../../include/is_header.h
+delivered.o: ../../include/maps.h
+delivered.o: ../../include/mbox_conf.h
+delivered.o: ../../include/msg.h
 delivered.o: ../../include/quote_822_local.h
 delivered.o: ../../include/quote_flags.h
-delivered.o: ../../include/header_opts.h
-delivered.o: local.h
-delivered.o: ../../include/been_here.h
-delivered.o: ../../include/tok822.h
-delivered.o: ../../include/resolve_clnt.h
-delivered.o: ../../include/deliver_request.h
+delivered.o: ../../include/rec_type.h
 delivered.o: ../../include/recipient_list.h
-delivered.o: ../../include/mbox_conf.h
-delivered.o: ../../include/argv.h
-delivered.o: ../../include/maps.h
-delivered.o: ../../include/dict.h
-dotforward.o: dotforward.c
-dotforward.o: ../../include/sys_defs.h
-dotforward.o: ../../include/msg.h
-dotforward.o: ../../include/vstring.h
-dotforward.o: ../../include/vbuf.h
-dotforward.o: ../../include/vstream.h
+delivered.o: ../../include/record.h
+delivered.o: ../../include/resolve_clnt.h
+delivered.o: ../../include/stringops.h
+delivered.o: ../../include/sys_defs.h
+delivered.o: ../../include/tok822.h
+delivered.o: ../../include/vbuf.h
+delivered.o: ../../include/vstream.h
+delivered.o: ../../include/vstring.h
+delivered.o: ../../include/vstring_vstream.h
+delivered.o: delivered.c
+delivered.o: local.h
+dotforward.o: ../../include/argv.h
+dotforward.o: ../../include/been_here.h
+dotforward.o: ../../include/bounce.h
+dotforward.o: ../../include/deliver_request.h
+dotforward.o: ../../include/dict.h
+dotforward.o: ../../include/ext_prop.h
 dotforward.o: ../../include/htable.h
-dotforward.o: ../../include/open_as.h
-dotforward.o: ../../include/lstat_as.h
 dotforward.o: ../../include/iostuff.h
-dotforward.o: ../../include/stringops.h
-dotforward.o: ../../include/mymalloc.h
+dotforward.o: ../../include/lstat_as.h
 dotforward.o: ../../include/mac_expand.h
 dotforward.o: ../../include/mac_parse.h
+dotforward.o: ../../include/mail_conf.h
+dotforward.o: ../../include/mail_params.h
+dotforward.o: ../../include/maps.h
+dotforward.o: ../../include/mbox_conf.h
+dotforward.o: ../../include/msg.h
+dotforward.o: ../../include/mymalloc.h
 dotforward.o: ../../include/mypwd.h
-dotforward.o: ../../include/bounce.h
-dotforward.o: ../../include/deliver_request.h
+dotforward.o: ../../include/open_as.h
 dotforward.o: ../../include/recipient_list.h
-dotforward.o: ../../include/been_here.h
-dotforward.o: ../../include/mail_params.h
-dotforward.o: ../../include/mail_conf.h
-dotforward.o: ../../include/ext_prop.h
+dotforward.o: ../../include/resolve_clnt.h
 dotforward.o: ../../include/sent.h
-dotforward.o: local.h
+dotforward.o: ../../include/stringops.h
+dotforward.o: ../../include/sys_defs.h
 dotforward.o: ../../include/tok822.h
-dotforward.o: ../../include/resolve_clnt.h
-dotforward.o: ../../include/mbox_conf.h
-dotforward.o: ../../include/argv.h
-dotforward.o: ../../include/maps.h
-dotforward.o: ../../include/dict.h
-file.o: file.c
-file.o: ../../include/sys_defs.h
-file.o: ../../include/msg.h
-file.o: ../../include/htable.h
-file.o: ../../include/vstring.h
-file.o: ../../include/vbuf.h
-file.o: ../../include/vstream.h
-file.o: ../../include/deliver_flock.h
-file.o: ../../include/myflock.h
-file.o: ../../include/set_eugid.h
-file.o: ../../include/mail_copy.h
+dotforward.o: ../../include/vbuf.h
+dotforward.o: ../../include/vstream.h
+dotforward.o: ../../include/vstring.h
+dotforward.o: dotforward.c
+dotforward.o: local.h
+file.o: ../../include/argv.h
+file.o: ../../include/been_here.h
 file.o: ../../include/bounce.h
-file.o: ../../include/deliver_request.h
-file.o: ../../include/recipient_list.h
 file.o: ../../include/defer.h
-file.o: ../../include/sent.h
-file.o: ../../include/been_here.h
+file.o: ../../include/deliver_flock.h
+file.o: ../../include/deliver_request.h
+file.o: ../../include/dict.h
+file.o: ../../include/dsn_util.h
+file.o: ../../include/htable.h
+file.o: ../../include/mail_copy.h
 file.o: ../../include/mail_params.h
+file.o: ../../include/maps.h
 file.o: ../../include/mbox_conf.h
-file.o: ../../include/argv.h
 file.o: ../../include/mbox_open.h
+file.o: ../../include/msg.h
+file.o: ../../include/myflock.h
+file.o: ../../include/recipient_list.h
+file.o: ../../include/resolve_clnt.h
 file.o: ../../include/safe_open.h
-file.o: local.h
+file.o: ../../include/sent.h
+file.o: ../../include/set_eugid.h
+file.o: ../../include/sys_defs.h
 file.o: ../../include/tok822.h
-file.o: ../../include/resolve_clnt.h
-file.o: ../../include/maps.h
-file.o: ../../include/dict.h
-forward.o: forward.c
-forward.o: ../../include/sys_defs.h
-forward.o: ../../include/msg.h
-forward.o: ../../include/mymalloc.h
-forward.o: ../../include/htable.h
+file.o: ../../include/vbuf.h
+file.o: ../../include/vstream.h
+file.o: ../../include/vstring.h
+file.o: file.c
+file.o: local.h
 forward.o: ../../include/argv.h
-forward.o: ../../include/vstring.h
-forward.o: ../../include/vbuf.h
-forward.o: ../../include/vstream.h
-forward.o: ../../include/vstring_vstream.h
-forward.o: ../../include/iostuff.h
-forward.o: ../../include/stringops.h
-forward.o: ../../include/mail_proto.h
 forward.o: ../../include/attr.h
+forward.o: ../../include/been_here.h
 forward.o: ../../include/cleanup_user.h
-forward.o: ../../include/sent.h
 forward.o: ../../include/deliver_request.h
-forward.o: ../../include/recipient_list.h
-forward.o: ../../include/record.h
-forward.o: ../../include/rec_type.h
-forward.o: ../../include/mark_corrupt.h
+forward.o: ../../include/dict.h
+forward.o: ../../include/htable.h
+forward.o: ../../include/iostuff.h
 forward.o: ../../include/mail_date.h
 forward.o: ../../include/mail_params.h
-forward.o: local.h
-forward.o: ../../include/been_here.h
-forward.o: ../../include/tok822.h
-forward.o: ../../include/resolve_clnt.h
-forward.o: ../../include/mbox_conf.h
+forward.o: ../../include/mail_proto.h
 forward.o: ../../include/maps.h
-forward.o: ../../include/dict.h
-include.o: include.c
-include.o: ../../include/sys_defs.h
-include.o: ../../include/msg.h
+forward.o: ../../include/mark_corrupt.h
+forward.o: ../../include/mbox_conf.h
+forward.o: ../../include/msg.h
+forward.o: ../../include/mymalloc.h
+forward.o: ../../include/rec_type.h
+forward.o: ../../include/recipient_list.h
+forward.o: ../../include/record.h
+forward.o: ../../include/resolve_clnt.h
+forward.o: ../../include/sent.h
+forward.o: ../../include/stringops.h
+forward.o: ../../include/sys_defs.h
+forward.o: ../../include/tok822.h
+forward.o: ../../include/vbuf.h
+forward.o: ../../include/vstream.h
+forward.o: ../../include/vstring.h
+forward.o: ../../include/vstring_vstream.h
+forward.o: forward.c
+forward.o: local.h
+include.o: ../../include/argv.h
+include.o: ../../include/been_here.h
+include.o: ../../include/bounce.h
+include.o: ../../include/defer.h
+include.o: ../../include/deliver_request.h
+include.o: ../../include/dict.h
+include.o: ../../include/ext_prop.h
 include.o: ../../include/htable.h
-include.o: ../../include/mymalloc.h
-include.o: ../../include/vstream.h
-include.o: ../../include/vbuf.h
-include.o: ../../include/open_as.h
-include.o: ../../include/stat_as.h
 include.o: ../../include/iostuff.h
+include.o: ../../include/mail_params.h
+include.o: ../../include/maps.h
+include.o: ../../include/mbox_conf.h
+include.o: ../../include/msg.h
+include.o: ../../include/mymalloc.h
 include.o: ../../include/mypwd.h
-include.o: ../../include/bounce.h
-include.o: ../../include/deliver_request.h
-include.o: ../../include/vstring.h
+include.o: ../../include/open_as.h
 include.o: ../../include/recipient_list.h
-include.o: ../../include/defer.h
-include.o: ../../include/been_here.h
-include.o: ../../include/mail_params.h
-include.o: ../../include/ext_prop.h
+include.o: ../../include/resolve_clnt.h
 include.o: ../../include/sent.h
-include.o: local.h
+include.o: ../../include/stat_as.h
+include.o: ../../include/sys_defs.h
 include.o: ../../include/tok822.h
-include.o: ../../include/resolve_clnt.h
-include.o: ../../include/mbox_conf.h
-include.o: ../../include/argv.h
-include.o: ../../include/maps.h
-include.o: ../../include/dict.h
-indirect.o: indirect.c
-indirect.o: ../../include/sys_defs.h
-indirect.o: ../../include/msg.h
-indirect.o: ../../include/htable.h
-indirect.o: ../../include/mail_params.h
+include.o: ../../include/vbuf.h
+include.o: ../../include/vstream.h
+include.o: ../../include/vstring.h
+include.o: include.c
+include.o: local.h
+indirect.o: ../../include/argv.h
+indirect.o: ../../include/been_here.h
 indirect.o: ../../include/bounce.h
+indirect.o: ../../include/defer.h
 indirect.o: ../../include/deliver_request.h
-indirect.o: ../../include/vstring.h
-indirect.o: ../../include/vbuf.h
-indirect.o: ../../include/vstream.h
+indirect.o: ../../include/dict.h
+indirect.o: ../../include/htable.h
+indirect.o: ../../include/mail_params.h
+indirect.o: ../../include/maps.h
+indirect.o: ../../include/mbox_conf.h
+indirect.o: ../../include/msg.h
 indirect.o: ../../include/recipient_list.h
-indirect.o: ../../include/defer.h
-indirect.o: ../../include/been_here.h
+indirect.o: ../../include/resolve_clnt.h
 indirect.o: ../../include/sent.h
-indirect.o: local.h
+indirect.o: ../../include/sys_defs.h
 indirect.o: ../../include/tok822.h
-indirect.o: ../../include/resolve_clnt.h
-indirect.o: ../../include/mbox_conf.h
-indirect.o: ../../include/argv.h
-indirect.o: ../../include/maps.h
-indirect.o: ../../include/dict.h
-local.o: local.c
-local.o: ../../include/sys_defs.h
-local.o: ../../include/msg.h
-local.o: ../../include/mymalloc.h
-local.o: ../../include/htable.h
-local.o: ../../include/vstring.h
-local.o: ../../include/vbuf.h
-local.o: ../../include/vstream.h
-local.o: ../../include/iostuff.h
-local.o: ../../include/name_mask.h
-local.o: ../../include/set_eugid.h
-local.o: ../../include/dict.h
+indirect.o: ../../include/vbuf.h
+indirect.o: ../../include/vstream.h
+indirect.o: ../../include/vstring.h
+indirect.o: indirect.c
+indirect.o: local.h
 local.o: ../../include/argv.h
-local.o: ../../include/recipient_list.h
-local.o: ../../include/deliver_request.h
-local.o: ../../include/deliver_completed.h
-local.o: ../../include/mail_params.h
-local.o: ../../include/mail_addr.h
-local.o: ../../include/mail_conf.h
 local.o: ../../include/been_here.h
+local.o: ../../include/deliver_completed.h
+local.o: ../../include/deliver_request.h
+local.o: ../../include/dict.h
 local.o: ../../include/ext_prop.h
-local.o: ../../include/maps.h
 local.o: ../../include/flush_clnt.h
+local.o: ../../include/htable.h
+local.o: ../../include/iostuff.h
+local.o: ../../include/mail_addr.h
+local.o: ../../include/mail_conf.h
+local.o: ../../include/mail_params.h
 local.o: ../../include/mail_server.h
-local.o: local.h
-local.o: ../../include/tok822.h
-local.o: ../../include/resolve_clnt.h
+local.o: ../../include/maps.h
 local.o: ../../include/mbox_conf.h
-local_expand.o: local_expand.c
-local_expand.o: ../../include/sys_defs.h
-local_expand.o: ../../include/vstring.h
-local_expand.o: ../../include/vbuf.h
+local.o: ../../include/msg.h
+local.o: ../../include/mymalloc.h
+local.o: ../../include/name_mask.h
+local.o: ../../include/recipient_list.h
+local.o: ../../include/resolve_clnt.h
+local.o: ../../include/set_eugid.h
+local.o: ../../include/sys_defs.h
+local.o: ../../include/tok822.h
+local.o: ../../include/vbuf.h
+local.o: ../../include/vstream.h
+local.o: ../../include/vstring.h
+local.o: local.c
+local.o: local.h
+local_expand.o: ../../include/argv.h
+local_expand.o: ../../include/been_here.h
+local_expand.o: ../../include/deliver_request.h
+local_expand.o: ../../include/dict.h
+local_expand.o: ../../include/htable.h
 local_expand.o: ../../include/mac_expand.h
 local_expand.o: ../../include/mac_parse.h
 local_expand.o: ../../include/mail_params.h
-local_expand.o: local.h
-local_expand.o: ../../include/htable.h
-local_expand.o: ../../include/vstream.h
-local_expand.o: ../../include/been_here.h
-local_expand.o: ../../include/tok822.h
-local_expand.o: ../../include/resolve_clnt.h
-local_expand.o: ../../include/deliver_request.h
-local_expand.o: ../../include/recipient_list.h
-local_expand.o: ../../include/mbox_conf.h
-local_expand.o: ../../include/argv.h
 local_expand.o: ../../include/maps.h
-local_expand.o: ../../include/dict.h
-mailbox.o: mailbox.c
-mailbox.o: ../../include/sys_defs.h
-mailbox.o: ../../include/msg.h
-mailbox.o: ../../include/htable.h
-mailbox.o: ../../include/vstring.h
-mailbox.o: ../../include/vbuf.h
-mailbox.o: ../../include/vstream.h
-mailbox.o: ../../include/mymalloc.h
-mailbox.o: ../../include/stringops.h
-mailbox.o: ../../include/set_eugid.h
-mailbox.o: ../../include/mail_copy.h
-mailbox.o: ../../include/defer.h
+local_expand.o: ../../include/mbox_conf.h
+local_expand.o: ../../include/recipient_list.h
+local_expand.o: ../../include/resolve_clnt.h
+local_expand.o: ../../include/sys_defs.h
+local_expand.o: ../../include/tok822.h
+local_expand.o: ../../include/vbuf.h
+local_expand.o: ../../include/vstream.h
+local_expand.o: ../../include/vstring.h
+local_expand.o: local.h
+local_expand.o: local_expand.c
+mailbox.o: ../../include/argv.h
+mailbox.o: ../../include/attr.h
+mailbox.o: ../../include/been_here.h
 mailbox.o: ../../include/bounce.h
+mailbox.o: ../../include/defer.h
+mailbox.o: ../../include/deliver_pass.h
 mailbox.o: ../../include/deliver_request.h
-mailbox.o: ../../include/recipient_list.h
-mailbox.o: ../../include/sent.h
-mailbox.o: ../../include/mypwd.h
-mailbox.o: ../../include/been_here.h
+mailbox.o: ../../include/dict.h
+mailbox.o: ../../include/dsn_util.h
+mailbox.o: ../../include/htable.h
+mailbox.o: ../../include/iostuff.h
+mailbox.o: ../../include/mail_copy.h
 mailbox.o: ../../include/mail_params.h
-mailbox.o: ../../include/deliver_pass.h
 mailbox.o: ../../include/mail_proto.h
-mailbox.o: ../../include/iostuff.h
-mailbox.o: ../../include/attr.h
+mailbox.o: ../../include/maps.h
+mailbox.o: ../../include/mbox_conf.h
 mailbox.o: ../../include/mbox_open.h
+mailbox.o: ../../include/msg.h
+mailbox.o: ../../include/mymalloc.h
+mailbox.o: ../../include/mypwd.h
+mailbox.o: ../../include/recipient_list.h
+mailbox.o: ../../include/resolve_clnt.h
 mailbox.o: ../../include/safe_open.h
-mailbox.o: ../../include/maps.h
-mailbox.o: ../../include/dict.h
-mailbox.o: ../../include/argv.h
-mailbox.o: local.h
+mailbox.o: ../../include/sent.h
+mailbox.o: ../../include/set_eugid.h
+mailbox.o: ../../include/stringops.h
+mailbox.o: ../../include/sys_defs.h
 mailbox.o: ../../include/tok822.h
-mailbox.o: ../../include/resolve_clnt.h
-mailbox.o: ../../include/mbox_conf.h
+mailbox.o: ../../include/vbuf.h
+mailbox.o: ../../include/vstream.h
+mailbox.o: ../../include/vstring.h
 mailbox.o: biff_notify.h
-maildir.o: maildir.c
-maildir.o: ../../include/sys_defs.h
+mailbox.o: local.h
+mailbox.o: mailbox.c
+maildir.o: ../../include/argv.h
+maildir.o: ../../include/been_here.h
+maildir.o: ../../include/bounce.h
+maildir.o: ../../include/defer.h
+maildir.o: ../../include/deliver_request.h
+maildir.o: ../../include/dict.h
+maildir.o: ../../include/dsn_util.h
+maildir.o: ../../include/get_hostname.h
+maildir.o: ../../include/htable.h
+maildir.o: ../../include/mail_copy.h
+maildir.o: ../../include/mail_params.h
+maildir.o: ../../include/make_dirs.h
+maildir.o: ../../include/maps.h
+maildir.o: ../../include/mbox_conf.h
 maildir.o: ../../include/msg.h
 maildir.o: ../../include/mymalloc.h
+maildir.o: ../../include/recipient_list.h
+maildir.o: ../../include/resolve_clnt.h
+maildir.o: ../../include/sane_fsops.h
+maildir.o: ../../include/sent.h
+maildir.o: ../../include/set_eugid.h
 maildir.o: ../../include/stringops.h
-maildir.o: ../../include/vstring.h
+maildir.o: ../../include/sys_defs.h
+maildir.o: ../../include/tok822.h
 maildir.o: ../../include/vbuf.h
 maildir.o: ../../include/vstream.h
-maildir.o: ../../include/make_dirs.h
-maildir.o: ../../include/set_eugid.h
-maildir.o: ../../include/get_hostname.h
-maildir.o: ../../include/sane_fsops.h
-maildir.o: ../../include/mail_copy.h
-maildir.o: ../../include/bounce.h
-maildir.o: ../../include/deliver_request.h
-maildir.o: ../../include/recipient_list.h
-maildir.o: ../../include/defer.h
-maildir.o: ../../include/sent.h
-maildir.o: ../../include/mail_params.h
+maildir.o: ../../include/vstring.h
 maildir.o: local.h
-maildir.o: ../../include/htable.h
-maildir.o: ../../include/been_here.h
-maildir.o: ../../include/tok822.h
-maildir.o: ../../include/resolve_clnt.h
-maildir.o: ../../include/mbox_conf.h
-maildir.o: ../../include/argv.h
-maildir.o: ../../include/maps.h
-maildir.o: ../../include/dict.h
-recipient.o: recipient.c
-recipient.o: ../../include/sys_defs.h
-recipient.o: ../../include/msg.h
-recipient.o: ../../include/mymalloc.h
-recipient.o: ../../include/htable.h
-recipient.o: ../../include/split_at.h
-recipient.o: ../../include/stringops.h
-recipient.o: ../../include/vstring.h
-recipient.o: ../../include/vbuf.h
-recipient.o: ../../include/dict.h
-recipient.o: ../../include/vstream.h
+maildir.o: maildir.c
 recipient.o: ../../include/argv.h
-recipient.o: ../../include/stat_as.h
+recipient.o: ../../include/been_here.h
 recipient.o: ../../include/bounce.h
-recipient.o: ../../include/deliver_request.h
-recipient.o: ../../include/recipient_list.h
+recipient.o: ../../include/canon_addr.h
 recipient.o: ../../include/defer.h
+recipient.o: ../../include/deliver_request.h
+recipient.o: ../../include/dict.h
+recipient.o: ../../include/ext_prop.h
+recipient.o: ../../include/htable.h
 recipient.o: ../../include/mail_params.h
+recipient.o: ../../include/maps.h
+recipient.o: ../../include/mbox_conf.h
+recipient.o: ../../include/msg.h
+recipient.o: ../../include/mymalloc.h
+recipient.o: ../../include/mypwd.h
+recipient.o: ../../include/recipient_list.h
+recipient.o: ../../include/resolve_clnt.h
 recipient.o: ../../include/split_addr.h
+recipient.o: ../../include/split_at.h
+recipient.o: ../../include/stat_as.h
+recipient.o: ../../include/stringops.h
 recipient.o: ../../include/strip_addr.h
-recipient.o: ../../include/ext_prop.h
-recipient.o: ../../include/mypwd.h
-recipient.o: ../../include/canon_addr.h
-recipient.o: local.h
-recipient.o: ../../include/been_here.h
+recipient.o: ../../include/sys_defs.h
 recipient.o: ../../include/tok822.h
-recipient.o: ../../include/resolve_clnt.h
-recipient.o: ../../include/mbox_conf.h
-recipient.o: ../../include/maps.h
-resolve.o: resolve.c
-resolve.o: ../../include/sys_defs.h
-resolve.o: ../../include/msg.h
-resolve.o: ../../include/vstring.h
-resolve.o: ../../include/vbuf.h
+recipient.o: ../../include/vbuf.h
+recipient.o: ../../include/vstream.h
+recipient.o: ../../include/vstring.h
+recipient.o: local.h
+recipient.o: recipient.c
+resolve.o: ../../include/argv.h
+resolve.o: ../../include/attr.h
+resolve.o: ../../include/been_here.h
+resolve.o: ../../include/bounce.h
+resolve.o: ../../include/defer.h
+resolve.o: ../../include/deliver_request.h
+resolve.o: ../../include/dict.h
 resolve.o: ../../include/htable.h
-resolve.o: ../../include/mail_proto.h
-resolve.o: ../../include/vstream.h
 resolve.o: ../../include/iostuff.h
-resolve.o: ../../include/attr.h
+resolve.o: ../../include/mail_params.h
+resolve.o: ../../include/mail_proto.h
+resolve.o: ../../include/maps.h
+resolve.o: ../../include/mbox_conf.h
+resolve.o: ../../include/msg.h
+resolve.o: ../../include/recipient_list.h
 resolve.o: ../../include/resolve_clnt.h
 resolve.o: ../../include/rewrite_clnt.h
+resolve.o: ../../include/sys_defs.h
 resolve.o: ../../include/tok822.h
-resolve.o: ../../include/mail_params.h
-resolve.o: ../../include/defer.h
-resolve.o: ../../include/bounce.h
-resolve.o: ../../include/deliver_request.h
-resolve.o: ../../include/recipient_list.h
+resolve.o: ../../include/vbuf.h
+resolve.o: ../../include/vstream.h
+resolve.o: ../../include/vstring.h
 resolve.o: local.h
-resolve.o: ../../include/been_here.h
-resolve.o: ../../include/mbox_conf.h
-resolve.o: ../../include/argv.h
-resolve.o: ../../include/maps.h
-resolve.o: ../../include/dict.h
-token.o: token.c
-token.o: ../../include/sys_defs.h
-token.o: ../../include/msg.h
-token.o: ../../include/vstring.h
-token.o: ../../include/vbuf.h
-token.o: ../../include/vstream.h
+resolve.o: resolve.c
+token.o: ../../include/argv.h
+token.o: ../../include/been_here.h
+token.o: ../../include/bounce.h
+token.o: ../../include/defer.h
+token.o: ../../include/deliver_request.h
+token.o: ../../include/dict.h
 token.o: ../../include/htable.h
-token.o: ../../include/readlline.h
+token.o: ../../include/mail_params.h
+token.o: ../../include/maps.h
+token.o: ../../include/mbox_conf.h
+token.o: ../../include/msg.h
 token.o: ../../include/mymalloc.h
-token.o: ../../include/vstring_vstream.h
+token.o: ../../include/readlline.h
+token.o: ../../include/recipient_list.h
+token.o: ../../include/resolve_clnt.h
 token.o: ../../include/stringops.h
+token.o: ../../include/sys_defs.h
 token.o: ../../include/tok822.h
-token.o: ../../include/resolve_clnt.h
-token.o: ../../include/mail_params.h
-token.o: ../../include/bounce.h
-token.o: ../../include/deliver_request.h
-token.o: ../../include/recipient_list.h
-token.o: ../../include/defer.h
+token.o: ../../include/vbuf.h
+token.o: ../../include/vstream.h
+token.o: ../../include/vstring.h
+token.o: ../../include/vstring_vstream.h
 token.o: local.h
-token.o: ../../include/been_here.h
-token.o: ../../include/mbox_conf.h
-token.o: ../../include/argv.h
-token.o: ../../include/maps.h
-token.o: ../../include/dict.h
-unknown.o: unknown.c
-unknown.o: ../../include/sys_defs.h
-unknown.o: ../../include/msg.h
-unknown.o: ../../include/stringops.h
-unknown.o: ../../include/vstring.h
-unknown.o: ../../include/vbuf.h
-unknown.o: ../../include/mymalloc.h
-unknown.o: ../../include/been_here.h
-unknown.o: ../../include/mail_params.h
-unknown.o: ../../include/mail_proto.h
-unknown.o: ../../include/vstream.h
-unknown.o: ../../include/iostuff.h
+token.o: token.c
+unknown.o: ../../include/argv.h
 unknown.o: ../../include/attr.h
+unknown.o: ../../include/been_here.h
 unknown.o: ../../include/bounce.h
 unknown.o: ../../include/deliver_request.h
-unknown.o: ../../include/recipient_list.h
+unknown.o: ../../include/dict.h
+unknown.o: ../../include/htable.h
+unknown.o: ../../include/iostuff.h
 unknown.o: ../../include/mail_addr.h
+unknown.o: ../../include/mail_params.h
+unknown.o: ../../include/mail_proto.h
+unknown.o: ../../include/maps.h
+unknown.o: ../../include/mbox_conf.h
+unknown.o: ../../include/msg.h
+unknown.o: ../../include/mymalloc.h
+unknown.o: ../../include/recipient_list.h
+unknown.o: ../../include/resolve_clnt.h
 unknown.o: ../../include/sent.h
-unknown.o: local.h
-unknown.o: ../../include/htable.h
+unknown.o: ../../include/stringops.h
+unknown.o: ../../include/sys_defs.h
 unknown.o: ../../include/tok822.h
-unknown.o: ../../include/resolve_clnt.h
-unknown.o: ../../include/mbox_conf.h
-unknown.o: ../../include/argv.h
-unknown.o: ../../include/maps.h
-unknown.o: ../../include/dict.h
+unknown.o: ../../include/vbuf.h
+unknown.o: ../../include/vstream.h
+unknown.o: ../../include/vstring.h
+unknown.o: local.h
+unknown.o: unknown.c
index ad8ebee7a1141eeb6af2b0f5abf715d4ce4f6da2..d87571fbd9fa83dd3afd7506ddeb1e8dbc030f31 100644 (file)
@@ -164,7 +164,7 @@ int     deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
     if (state.level > 100) {
        msg_warn("possible alias database loop for %s", name);
        *statusp = bounce_append(BOUNCE_FLAGS(state.request),
-                                BOUNCE_ATTR(state.msg_attr),
+                                BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                               "possible alias database loop for %s", name);
        return (YES);
     }
@@ -198,7 +198,7 @@ int     deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
             */
            if (state.request->flags & DEL_REQ_FLAG_VERIFY) {
                *statusp = sent(BOUNCE_FLAGS(state.request),
-                               SENT_ATTR(state.msg_attr),
+                               SENT_ATTR(state.msg_attr, "2.0.0"),
                                "aliased to %s", alias_result);
                return (YES);
            }
@@ -226,7 +226,7 @@ int     deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
                if ((alias_pwd = mypwuid(alias_uid)) == 0) {
                    msg_warn("cannot find alias database owner for %s", *cpp);
                    *statusp = defer_append(BOUNCE_FLAGS(state.request),
-                                           BOUNCE_ATTR(state.msg_attr),
+                                           BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                                        "cannot find alias database owner");
                    return (YES);
                }
@@ -273,7 +273,7 @@ int     deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
            *statusp =
                (dict_errno ?
                 defer_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                              "alias database unavailable") :
            deliver_token_string(state, usr_attr, expansion, &alias_count));
 #if 0
@@ -286,7 +286,7 @@ int     deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
            if (alias_count < 1) {
                msg_warn("no recipient in alias lookup result for %s", name);
                *statusp = defer_append(BOUNCE_FLAGS(state.request),
-                                       BOUNCE_ATTR(state.msg_attr),
+                                       BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                                        "alias database unavailable");
            }
            myfree(expansion);
@@ -305,7 +305,7 @@ int     deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
         */
        if (dict_errno != 0) {
            *statusp = defer_append(BOUNCE_FLAGS(state.request),
-                                   BOUNCE_ATTR(state.msg_attr),
+                                   BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                                    "alias database unavailable");
            return (YES);
        } else {
index 7d7ea4e50bf795f00d146417634b8f9cf346f7d7..a06cf0208a02d16fa0eeed1b85baa48edb626066 100644 (file)
@@ -73,6 +73,7 @@
 #include <mail_params.h>
 #include <pipe_command.h>
 #include <mail_copy.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -83,7 +84,7 @@
 int     deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *command)
 {
     char   *myname = "deliver_command";
-    VSTRING *why;
+    DSN_VSTRING *why;
     int     cmd_status;
     int     deliver_status;
     ARGV   *env;
@@ -114,7 +115,8 @@ int     deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
      * Don't deliver a trace-only request.
      */
     if (DEL_REQ_TRACE_ONLY(state.request->flags))
-       return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+       return (sent(BOUNCE_FLAGS(state.request),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "delivers to command: %s", command));
 
     /*
@@ -136,7 +138,7 @@ int     deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
     if (local_deliver_hdr_mask & DELIVER_HDR_CMD)
        copy_flags |= MAIL_COPY_DELIVERED;
 
-    why = vstring_alloc(1);
+    why = dsn_vstring_alloc(1);
     if (vstream_fseek(state.msg_attr.fp, state.msg_attr.offset, SEEK_SET) < 0)
        msg_fatal("%s: seek queue file %s: %m",
                  myname, VSTREAM_PATH(state.msg_attr.fp));
@@ -195,7 +197,7 @@ int     deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
 
     if (expand_status & MAC_PARSE_ERROR) {
        cmd_status = PIPE_STAT_DEFER;
-       vstring_strcpy(why, "Server configuration error");
+       dsn_vstring_update(why, "4.3.5", "Server configuration error");
        msg_warn("bad parameter value syntax for %s: %s",
                 VAR_EXEC_DIRECTORY, var_exec_directory);
     } else {
@@ -225,18 +227,15 @@ int     deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
     switch (cmd_status) {
     case PIPE_STAT_OK:
        deliver_status = sent(BOUNCE_FLAGS(state.request),
-                             SENT_ATTR(state.msg_attr),
+                             SENT_ATTR(state.msg_attr, "2.0.0"),
                              "delivered to command: %s", command);
        break;
     case PIPE_STAT_BOUNCE:
-       deliver_status = bounce_append(BOUNCE_FLAGS(state.request),
-                                      BOUNCE_ATTR(state.msg_attr),
-                                      "%s", vstring_str(why));
-       break;
     case PIPE_STAT_DEFER:
-       deliver_status = defer_append(BOUNCE_FLAGS(state.request),
-                                     BOUNCE_ATTR(state.msg_attr),
-                                     "%s", vstring_str(why));
+       deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+           (BOUNCE_FLAGS(state.request),
+            BOUNCE_ATTR(state.msg_attr, why->dsn),
+            "%s", vstring_str(why->vstring));
        break;
     case PIPE_STAT_CORRUPT:
        deliver_status = DEL_STAT_DEFER;
@@ -249,7 +248,7 @@ int     deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
     /*
      * Cleanup.
      */
-    vstring_free(why);
+    dsn_vstring_free(why);
 
     return (deliver_status);
 }
index 307082169ffa5aac776a64e11f60e043902eeb46..6d5df5b88d39fcd73f622b0f50ab07c83e81689d 100644 (file)
@@ -221,7 +221,7 @@ int     deliver_dotforward(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp)
         */
        if (state.request->flags & DEL_REQ_FLAG_VERIFY) {
            *statusp = sent(BOUNCE_FLAGS(state.request), 
-                               SENT_ATTR(state.msg_attr),
+                               SENT_ATTR(state.msg_attr, "2.0.0"),
                            "forward via file: %s", STR(path));
            forward_found = YES;
        } else if (been_here(state.dup_filter, "forward %s", STR(path)) == 0) {
index 7e5b73f663f6738e5255b832b347234016dab35e..09c675aba85e4dcd430807ec474bb16353ea2b5a 100644 (file)
@@ -71,6 +71,7 @@
 #include <mail_params.h>
 #include <mbox_conf.h>
 #include <mbox_open.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -85,7 +86,7 @@ int     deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
     char   *myname = "deliver_file";
     struct stat st;
     MBOX   *mp;
-    VSTRING *why;
+    DSN_VSTRING *why;
     int     mail_copy_status = MAIL_COPY_STAT_WRITE;
     int     deliver_status;
     int     copy_flags;
@@ -112,14 +113,15 @@ int     deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
      */
     if ((local_file_deliver_mask & state.msg_attr.exp_type) == 0)
        return (bounce_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "5.7.1"),
                              "mail to file is restricted"));
 
     /*
      * Don't deliver trace-only requests.
      */
     if (DEL_REQ_TRACE_ONLY(state.request->flags))
-       return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+       return (sent(BOUNCE_FLAGS(state.request),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "delivers to file: %s", path));
 
     /*
@@ -146,7 +148,7 @@ int     deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
                 (long) usr_attr.uid, (long) usr_attr.gid, path);
     if (vstream_fseek(state.msg_attr.fp, state.msg_attr.offset, SEEK_SET) < 0)
        msg_fatal("seek queue file %s: %m", state.msg_attr.queue_id);
-    why = vstring_alloc(100);
+    why = dsn_vstring_alloc(100);
 
     /*
      * As the specified user, open or create the file, lock it, and append
@@ -163,8 +165,7 @@ int     deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
     if (mp != 0) {
        if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
            vstream_fclose(mp->fp);
-           vstring_sprintf(why, "destination file is executable");
-           errno = 0;
+           dsn_vstring_update(why, "5.7.1", "destination file is executable");
        } else {
            mail_copy_status = mail_copy(COPY_ATTR(state.msg_attr), mp->fp,
                                         S_ISREG(st.st_mode) ? copy_flags :
@@ -181,20 +182,20 @@ int     deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
     if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
        deliver_status = DEL_STAT_DEFER;
     } else if (mail_copy_status != 0) {
-       deliver_status = (errno == EAGAIN || errno == ENOSPC || errno == ESTALE ?
-                         defer_append : bounce_append)
-           (BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr),
+       deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+           (BOUNCE_FLAGS(state.request),
+            BOUNCE_ATTR(state.msg_attr, why->dsn),
             "cannot append message to destination file %s: %s",
-            path, STR(why));
+            path, vstring_str(why->vstring));
     } else {
        deliver_status = sent(BOUNCE_FLAGS(state.request),
-                             SENT_ATTR(state.msg_attr),
+                             SENT_ATTR(state.msg_attr, "2.0.0"),
                              "delivered to file: %s", path);
     }
 
     /*
      * Clean up.
      */
-    vstring_free(why);
+    dsn_vstring_free(why);
     return (deliver_status);
 }
index 2e987d9bad4043f8cbd4a87166b1c5fd535f5890..2ce28d4a3b1c442df47d317e0e7ce7d36162cc98 100644 (file)
@@ -280,7 +280,8 @@ static int forward_send(FORWARD_INFO *info, DELIVER_REQUEST *request,
      * Log successful forwarding.
      */
     if (status == 0)
-       status = sent(BOUNCE_FLAGS(request), SENT_ATTR(attr),
+       status = sent(BOUNCE_FLAGS(request),
+                     SENT_ATTR(attr, "2.0.0"),
                      "forwarded as %s", info->queue_id);
 
     /*
index 53d31a44739a9c257485e02a362713137962d514..4608bc8978182b73b71c6f9c347daf32d0fdf459 100644 (file)
@@ -108,19 +108,19 @@ int     deliver_include(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
      */
     if (*path != '/')
        return (bounce_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                              ":include:%s uses a relative path", path));
     if (stat_as(path, &st, usr_attr.uid, usr_attr.gid) < 0)
        return (bounce_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                              "unable to lookup include file %s: %m", path));
     if (S_ISREG(st.st_mode) == 0)
        return (bounce_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                              "not a regular include file: %s", path));
     if (st.st_mode & S_IWOTH)
        return (bounce_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                              "world writable include file: %s", path));
 
     /*
@@ -147,7 +147,7 @@ int     deliver_include(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
        if ((file_pwd = mypwuid(st.st_uid)) == 0) {
            msg_warn("cannot find username for uid %ld", (long) st.st_uid);
            return (defer_append(BOUNCE_FLAGS(state.request),
-                                BOUNCE_ATTR(state.msg_attr),
+                                BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                             "%s: cannot find :include: file owner", path));
        }
        if (file_pwd->pw_uid != 0)
@@ -184,7 +184,7 @@ int     deliver_include(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
 
     if ((fp = FOPEN_AS(path, usr_attr.uid, usr_attr.gid)) == 0) {
        status = bounce_append(BOUNCE_FLAGS(state.request),
-                              BOUNCE_ATTR(state.msg_attr),
+                              BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                               "cannot open include file %s: %m", path);
     } else {
        if ((local_ext_prop_mask & EXT_PROP_INCLUDE) == 0)
index 4b81777f02345f6b500b5b1697b42a6260fcc7db..824d89320a80bdf1ff1143682d094bde8902d86e 100644 (file)
@@ -76,7 +76,7 @@ int     deliver_indirect(LOCAL_STATE state)
      */
     if (DEL_REQ_TRACE_ONLY(state.request->flags))
        return (sent(BOUNCE_FLAGS(state.request),
-                    SENT_ATTR(state.msg_attr),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "forwards to %s", state.msg_attr.recipient));
 
     /*
@@ -85,7 +85,7 @@ int     deliver_indirect(LOCAL_STATE state)
      */
     if (forward_append(state.msg_attr))
        return (defer_append(BOUNCE_FLAGS(state.request),
-                            BOUNCE_ATTR(state.msg_attr),
+                            BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                             "unable to forward message"));
     return (0);
 }
index e2945e723712dc75343cd6c2e50aedc2949c8622..6f39095b8c7ef21c9c91c06b91805861ed764f5a 100644 (file)
@@ -125,19 +125,20 @@ typedef struct LOCAL_STATE {
   */
 #define BOUNCE_FLAGS(request)  DEL_REQ_TRACE_FLAGS((request)->flags)
 
-#define BOUNCE_ATTR(attr)      attr.queue_id, attr.orig_rcpt, attr.recipient, \
-                                       attr.rcpt_offset, attr.relay, \
-                                       attr.arrival_time
-#define BOUNCE_ONE_ATTR(attr)  attr.queue_name, attr.queue_id, attr.encoding, \
-                                       attr.sender, attr.orig_rcpt, \
-                                       attr.recipient, attr.rcpt_offset, \
-                                       attr.relay, attr.arrival_time
-#define SENT_ATTR(attr)                attr.queue_id, attr.orig_rcpt, attr.recipient, \
-                                       attr.rcpt_offset, attr.relay, \
-                                       attr.arrival_time
-#define OPENED_ATTR(attr)      attr.queue_id, attr.sender
-#define COPY_ATTR(attr)                attr.sender, attr.orig_rcpt, attr.delivered, \
-                                       attr.fp
+#define BOUNCE_ATTR(attr, detail) \
+       attr.queue_id, attr.orig_rcpt, attr.recipient, \
+       attr.rcpt_offset, attr.relay, detail, attr.arrival_time
+#define BOUNCE_ONE_ATTR(attr, detail) \
+       attr.queue_name, attr.queue_id, attr.encoding, \
+       attr.sender, attr.orig_rcpt, attr.recipient, attr.rcpt_offset, \
+       attr.relay, detail, attr.arrival_time
+#define SENT_ATTR(attr, detail) \
+       attr.queue_id, attr.orig_rcpt, attr.recipient, \
+       attr.rcpt_offset, attr.relay, detail, attr.arrival_time
+#define OPENED_ATTR(attr) \
+       attr.queue_id, attr.sender
+#define COPY_ATTR(attr) \
+       attr.sender, attr.orig_rcpt, attr.delivered, attr.fp
 
 #define MSG_LOG_STATE(m, p) \
        msg_info("%s[%d]: local %s recip %s exten %s deliver %s exp_from %s", \
index 7cbd8d7f05f6d775d10914d93cedaaf1797122d6..98fc13c4390c6b14cc7ae0776beadb5781fe6e17 100644 (file)
 #include <deliver_pass.h>
 #include <mbox_open.h>
 #include <maps.h>
-
-#ifndef EDQUOT
-#define EDQUOT EFBIG
-#endif
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -93,7 +90,7 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
     char   *myname = "deliver_mailbox_file";
     char   *spool_dir;
     char   *mailbox;
-    VSTRING *why;
+    DSN_VSTRING *why;
     MBOX   *mp;
     int     mail_copy_status;
     int     deliver_status;
@@ -117,7 +114,8 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
      * Don't deliver trace-only requests.
      */
     if (DEL_REQ_TRACE_ONLY(state.request->flags))
-       return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+       return (sent(BOUNCE_FLAGS(state.request),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "delivers to mailbox"));
 
     /*
@@ -128,7 +126,7 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
        msg_fatal("seek message file %s: %m", VSTREAM_PATH(state.msg_attr.fp));
     state.msg_attr.delivered = state.msg_attr.recipient;
     mail_copy_status = MAIL_COPY_STAT_WRITE;
-    why = vstring_alloc(100);
+    why = dsn_vstring_alloc(100);
     if (*var_home_mailbox) {
        spool_dir = 0;
        mailbox = concatenate(usr_attr.home, "/", var_home_mailbox, (char *) 0);
@@ -194,8 +192,9 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
            set_eugid(usr_attr.uid, usr_attr.gid);
        if (S_ISREG(st.st_mode) == 0) {
            vstream_fclose(mp->fp);
-           vstring_sprintf(why, "destination is not a regular file");
-           errno = 0;
+           dsn_vstring_update(why, "5.2.0",
+                              "destination %s is not a regular file",
+                              mailbox);
        } else {
            end = vstream_fseek(mp->fp, (off_t) 0, SEEK_END);
            mail_copy_status = mail_copy(COPY_ATTR(state.msg_attr), mp->fp,
@@ -213,14 +212,14 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
     if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
        deliver_status = DEL_STAT_DEFER;
     } else if (mail_copy_status != 0) {
-       deliver_status = (errno == EAGAIN || errno == ENOSPC || errno == ESTALE ?
-                         defer_append : bounce_append)
-           (BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr),
-            "cannot access mailbox %s for user %s. %s",
-            mailbox, state.msg_attr.user, vstring_str(why));
+       deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+           (BOUNCE_FLAGS(state.request),
+            BOUNCE_ATTR(state.msg_attr, why->dsn),
+            "cannot update mailbox %s for user %s. %s",
+            mailbox, state.msg_attr.user, vstring_str(why->vstring));
     } else {
        deliver_status = sent(BOUNCE_FLAGS(state.request),
-                             SENT_ATTR(state.msg_attr),
+                             SENT_ATTR(state.msg_attr, "2.0.0"),
                              "delivered to mailbox");
        if (var_biff) {
            biff = vstring_alloc(100);
@@ -234,7 +233,7 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
      * Clean up.
      */
     myfree(mailbox);
-    vstring_free(why);
+    dsn_vstring_free(why);
     return (deliver_status);
 }
 
index 5d0ab04af84d3baba03b19689ad199727d74e0cb..9540a2c06556ba1bd35c99f68208b125adc30642 100644 (file)
@@ -65,6 +65,7 @@
 #include <defer.h>
 #include <sent.h>
 #include <mail_params.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -80,7 +81,7 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
     char   *curdir;
     char   *tmpfile;
     char   *newfile;
-    VSTRING *why;
+    DSN_VSTRING *why;
     VSTRING *buf;
     VSTREAM *dst;
     int     mail_copy_status;
@@ -102,7 +103,8 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
      * Don't deliver trace-only requests.
      */
     if (DEL_REQ_TRACE_ONLY(state.request->flags))
-       return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+       return (sent(BOUNCE_FLAGS(state.request),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "delivers to maildir"));
 
     /*
@@ -114,7 +116,7 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
     state.msg_attr.delivered = state.msg_attr.recipient;
     mail_copy_status = MAIL_COPY_STAT_WRITE;
     buf = vstring_alloc(100);
-    why = vstring_alloc(100);
+    why = dsn_vstring_alloc(100);
 
     copy_flags = MAIL_COPY_TOFILE | MAIL_COPY_RETURN_PATH | MAIL_COPY_ORIG_RCPT;
     if (local_deliver_hdr_mask & DELIVER_HDR_FILE)
@@ -187,9 +189,9 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
        && (errno != ENOENT
            || make_dirs(tmpdir, 0700) < 0
            || (dst = vstream_fopen(tmpfile, O_WRONLY | O_CREAT | O_EXCL, 0600)) == 0)) {
-       vstring_sprintf(why, "create %s: %m", tmpfile);
+       dsn_vstring_update(why, "5.2.0", "create maildir file %s: %m", tmpfile);
     } else if (fstat(vstream_fileno(dst), &st) < 0) {
-       vstring_sprintf(why, "create %s: %m", tmpfile);
+       dsn_vstring_update(why, "5.2.0", "create maildir file %s: %m", tmpfile);
     } else {
        vstring_sprintf(buf, "%lu.V%lxI%lxM%lu.%s",
                        (unsigned long) starttime.tv_sec,
@@ -204,7 +206,8 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
                && (errno != ENOENT
                    || (make_dirs(curdir, 0700), make_dirs(newdir, 0700)) < 0
                    || sane_link(tmpfile, newfile) < 0)) {
-               vstring_sprintf(why, "link to %s: %m", newfile);
+               dsn_vstring_update(why, "5.2.0",
+                                  "create maildir file %s: %m", newfile);
                mail_copy_status = MAIL_COPY_STAT_WRITE;
            }
        }
@@ -219,22 +222,23 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
     if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
        deliver_status = DEL_STAT_DEFER;
     } else if (mail_copy_status != 0) {
-       deliver_status = (errno == ENOSPC || errno == ESTALE ?
-                         defer_append : bounce_append)
-           (BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr),
-            "maildir delivery failed: %s", vstring_str(why));
+       deliver_status = (why->dsn[0] == '4' ? defer_append : bounce_append)
+           (BOUNCE_FLAGS(state.request),
+            BOUNCE_ATTR(state.msg_attr, why->dsn),
+            "maildir delivery failed: %s", vstring_str(why->vstring));
        if (errno == EACCES) {
            msg_warn("maildir access problem for UID/GID=%lu/%lu: %s",
-               (long) usr_attr.uid, (long) usr_attr.gid, vstring_str(why));
+                    (long) usr_attr.uid, (long) usr_attr.gid,
+                    vstring_str(why->vstring));
            msg_warn("perhaps you need to create the maildirs in advance");
        }
     } else {
        deliver_status = sent(BOUNCE_FLAGS(state.request),
-                             SENT_ATTR(state.msg_attr),
+                             SENT_ATTR(state.msg_attr, "2.0.0"),
                              "delivered to maildir");
     }
     vstring_free(buf);
-    vstring_free(why);
+    dsn_vstring_free(why);
     myfree(newdir);
     myfree(tmpdir);
     myfree(curdir);
index 761d58420f03c097e0d4159d2640daf6944b3f23..de8fdeef5c3cc60649326c007c72b5611bae5eff 100644 (file)
@@ -185,7 +185,7 @@ static int deliver_switch(LOCAL_STATE state, USER_ATTR usr_attr)
        && (mypwd = mypwnam(state.msg_attr.user)) != 0
        && stat_as(mypwd->pw_dir, &st, mypwd->pw_uid, mypwd->pw_gid) < 0)
        return (defer_append(BOUNCE_FLAGS(state.request),
-                            BOUNCE_ATTR(state.msg_attr),
+                            BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                             "cannot access home directory %s: %m",
                             mypwd->pw_dir));
     if (deliver_dotforward(state, usr_attr, &status) == 0
@@ -263,13 +263,13 @@ int     deliver_recipient(LOCAL_STATE state, USER_ATTR usr_attr)
        }
        if (canon_owner) {
            rcpt_stat = bounce_one(BOUNCE_FLAGS(state.request),
-                                  BOUNCE_ONE_ATTR(state.msg_attr),
+                                  BOUNCE_ONE_ATTR(state.msg_attr, "5.4.6"),
                                   "mail forwarding loop for %s",
                                   state.msg_attr.recipient);
            vstring_free(canon_owner);
        } else {
            rcpt_stat = bounce_append(BOUNCE_FLAGS(state.request),
-                                     BOUNCE_ATTR(state.msg_attr),
+                                     BOUNCE_ATTR(state.msg_attr, "5.4.6"),
                                      "mail forwarding loop for %s",
                                      state.msg_attr.recipient);
        }
@@ -309,7 +309,7 @@ int     deliver_recipient(LOCAL_STATE state, USER_ATTR usr_attr)
      */
     if (state.msg_attr.user[0] == 0)
        return (bounce_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "5.1.3"),
                          "null username in %s", state.msg_attr.recipient));
 
     /*
index f495b6d81865f43532ee87bd453f0c3bf37be485..f89ffcff2211b4d92e2ee41c502c3ae9c10ddfed 100644 (file)
@@ -119,11 +119,11 @@ int     deliver_resolve_tree(LOCAL_STATE state, USER_ATTR usr_attr, TOK822 *addr
      */
     if (reply.flags & RESOLVE_FLAG_FAIL) {
        status = defer_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
+                             BOUNCE_ATTR(state.msg_attr, "4.3.0"),
                              "address resolver failure");
     } else if (reply.flags & RESOLVE_FLAG_ERROR) {
        status = bounce_append(BOUNCE_FLAGS(state.request),
-                              BOUNCE_ATTR(state.msg_attr),
+                              BOUNCE_ATTR(state.msg_attr, "5.1.3"),
                               "bad recipient address syntax: %s",
                               STR(reply.recipient));
     } else {
index 7954c39ac3d8542d6a1785bc99760f053f1334bd..35dad714935af953d2adf50348ec32eb6a85cee0 100644 (file)
@@ -113,11 +113,11 @@ static int deliver_token_home(LOCAL_STATE state, USER_ATTR usr_attr, char *addr)
 
     if (addr[1] != '/') {                      /* disallow ~user */
        status = bounce_append(BOUNCE_FLAGS(state.request),
-                              BOUNCE_ATTR(state.msg_attr),
+                              BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                               "bad home directory syntax for: %s", addr);
     } else if (usr_attr.home == 0) {           /* require user context */
        status = bounce_append(BOUNCE_FLAGS(state.request),
-                              BOUNCE_ATTR(state.msg_attr),
+                              BOUNCE_ATTR(state.msg_attr, "5.3.5"),
                               "unknown home directory for: %s", addr);
     } else if (usr_attr.home[0] == '/' && usr_attr.home[1] == 0) {
        status = deliver_file(state, usr_attr, addr + 1);
@@ -151,7 +151,7 @@ int     deliver_token(LOCAL_STATE state, USER_ATTR usr_attr, TOK822 *addr)
     } else if (*STR(addr_buf) == '|') {
        if ((local_cmd_deliver_mask & state.msg_attr.exp_type) == 0)
            status = bounce_append(BOUNCE_FLAGS(state.request),
-                                  BOUNCE_ATTR(state.msg_attr),
+                                  BOUNCE_ATTR(state.msg_attr, "5.7.1"),
                                   "mail to command is restricted");
        else
            status = deliver_command(state, usr_attr, STR(addr_buf) + 1);
@@ -210,8 +210,8 @@ int     deliver_token_stream(LOCAL_STATE state, USER_ATTR usr_attr,
     }
     if (vstream_ferror(fp))
        status = defer_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr),
-                             "error reading .forward file: %m");
+                             BOUNCE_ATTR(state.msg_attr, "4.3.0"),
+                             "error reading forwarding file: %m");
     vstring_free(buf);
     return (status);
 }
index 062a32888aa7bf1452df5a393ff86e232795204c..702cee47c14620aab98996f97a0867a8d05b3240 100644 (file)
@@ -133,7 +133,7 @@ int     deliver_unknown(LOCAL_STATE state, USER_ATTR usr_attr)
        || STREQ(state.msg_attr.local, MAIL_ADDR_POSTMASTER)) {
        msg_warn("required alias not found: %s", state.msg_attr.local);
        return (sent(BOUNCE_FLAGS(state.request),
-                    SENT_ATTR(state.msg_attr),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "discarded"));
     }
 
@@ -141,6 +141,6 @@ int     deliver_unknown(LOCAL_STATE state, USER_ATTR usr_attr)
      * Bounce the message when no luser relay is specified.
      */
     return (bounce_append(BOUNCE_FLAGS(state.request),
-                         BOUNCE_ATTR(state.msg_attr),
+                         BOUNCE_ATTR(state.msg_attr, "5.1.1"),
                          "unknown user: \"%s\"", state.msg_attr.local));
 }
index d21f674c8a034d93c921ea79f91137914e1d079f..a6ae05998bff4a48ac403bdc3e10684f3a5b6507 100644 (file)
@@ -73,239 +73,240 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-mail_flow.o: mail_flow.c
-mail_flow.o: ../../include/sys_defs.h
-mail_flow.o: ../../include/msg.h
 mail_flow.o: ../../include/iostuff.h
+mail_flow.o: ../../include/msg.h
+mail_flow.o: ../../include/sys_defs.h
+mail_flow.o: mail_flow.c
 mail_flow.o: mail_flow.h
 mail_flow.o: master_proto.h
-master.o: master.c
-master.o: ../../include/sys_defs.h
+master.o: ../../include/argv.h
+master.o: ../../include/clean_env.h
+master.o: ../../include/debug_process.h
 master.o: ../../include/events.h
+master.o: ../../include/inet_proto.h
+master.o: ../../include/iostuff.h
+master.o: ../../include/mail_conf.h
+master.o: ../../include/mail_params.h
+master.o: ../../include/mail_task.h
+master.o: ../../include/mail_version.h
 master.o: ../../include/msg.h
 master.o: ../../include/msg_syslog.h
-master.o: ../../include/vstring.h
-master.o: ../../include/vbuf.h
+master.o: ../../include/myflock.h
 master.o: ../../include/mymalloc.h
-master.o: ../../include/iostuff.h
-master.o: ../../include/vstream.h
+master.o: ../../include/open_lock.h
+master.o: ../../include/safe.h
 master.o: ../../include/stringops.h
-master.o: ../../include/myflock.h
+master.o: ../../include/sys_defs.h
+master.o: ../../include/vbuf.h
+master.o: ../../include/vstream.h
+master.o: ../../include/vstring.h
 master.o: ../../include/watchdog.h
-master.o: ../../include/clean_env.h
-master.o: ../../include/argv.h
-master.o: ../../include/safe.h
-master.o: ../../include/mail_params.h
-master.o: ../../include/mail_version.h
-master.o: ../../include/debug_process.h
-master.o: ../../include/mail_task.h
-master.o: ../../include/mail_conf.h
-master.o: ../../include/open_lock.h
-master.o: ../../include/inet_proto.h
+master.o: master.c
 master.o: master.h
-master_avail.o: master_avail.c
-master_avail.o: ../../include/sys_defs.h
 master_avail.o: ../../include/events.h
 master_avail.o: ../../include/msg.h
-master_avail.o: master_proto.h
+master_avail.o: ../../include/sys_defs.h
 master_avail.o: master.h
-master_conf.o: master_conf.c
-master_conf.o: ../../include/sys_defs.h
-master_conf.o: ../../include/msg.h
+master_avail.o: master_avail.c
+master_avail.o: master_proto.h
 master_conf.o: ../../include/argv.h
+master_conf.o: ../../include/msg.h
+master_conf.o: ../../include/sys_defs.h
 master_conf.o: master.h
-master_ent.o: master_ent.c
-master_ent.o: ../../include/sys_defs.h
-master_ent.o: ../../include/msg.h
-master_ent.o: ../../include/mymalloc.h
-master_ent.o: ../../include/vstring.h
-master_ent.o: ../../include/vbuf.h
-master_ent.o: ../../include/vstream.h
+master_conf.o: master_conf.c
 master_ent.o: ../../include/argv.h
-master_ent.o: ../../include/stringops.h
-master_ent.o: ../../include/readlline.h
-master_ent.o: ../../include/inet_addr_list.h
-master_ent.o: ../../include/myaddrinfo.h
+master_ent.o: ../../include/attr.h
 master_ent.o: ../../include/host_port.h
 master_ent.o: ../../include/inet_addr_host.h
-master_ent.o: ../../include/mail_proto.h
+master_ent.o: ../../include/inet_addr_list.h
 master_ent.o: ../../include/iostuff.h
-master_ent.o: ../../include/attr.h
 master_ent.o: ../../include/mail_params.h
+master_ent.o: ../../include/mail_proto.h
+master_ent.o: ../../include/msg.h
+master_ent.o: ../../include/myaddrinfo.h
+master_ent.o: ../../include/mymalloc.h
 master_ent.o: ../../include/own_inet_addr.h
+master_ent.o: ../../include/readlline.h
+master_ent.o: ../../include/stringops.h
+master_ent.o: ../../include/sys_defs.h
+master_ent.o: ../../include/vbuf.h
+master_ent.o: ../../include/vstream.h
+master_ent.o: ../../include/vstring.h
 master_ent.o: ../../include/wildcard_inet_addr.h
-master_ent.o: master_proto.h
 master_ent.o: master.h
-master_flow.o: master_flow.c
-master_flow.o: ../../include/sys_defs.h
-master_flow.o: ../../include/msg.h
+master_ent.o: master_ent.c
+master_ent.o: master_proto.h
 master_flow.o: ../../include/iostuff.h
+master_flow.o: ../../include/msg.h
+master_flow.o: ../../include/sys_defs.h
 master_flow.o: master.h
+master_flow.o: master_flow.c
 master_flow.o: master_proto.h
-master_listen.o: master_listen.c
-master_listen.o: ../../include/sys_defs.h
-master_listen.o: ../../include/msg.h
-master_listen.o: ../../include/listen.h
-master_listen.o: ../../include/iostuff.h
-master_listen.o: ../../include/mymalloc.h
-master_listen.o: ../../include/stringops.h
-master_listen.o: ../../include/vstring.h
-master_listen.o: ../../include/vbuf.h
 master_listen.o: ../../include/inet_addr_list.h
+master_listen.o: ../../include/iostuff.h
+master_listen.o: ../../include/listen.h
+master_listen.o: ../../include/mail_params.h
+master_listen.o: ../../include/msg.h
 master_listen.o: ../../include/myaddrinfo.h
+master_listen.o: ../../include/mymalloc.h
 master_listen.o: ../../include/set_eugid.h
 master_listen.o: ../../include/set_ugid.h
 master_listen.o: ../../include/sock_addr.h
-master_listen.o: ../../include/mail_params.h
+master_listen.o: ../../include/stringops.h
+master_listen.o: ../../include/sys_defs.h
+master_listen.o: ../../include/vbuf.h
+master_listen.o: ../../include/vstring.h
 master_listen.o: master.h
-master_proto.o: master_proto.c
-master_proto.o: ../../include/sys_defs.h
+master_listen.o: master_listen.c
 master_proto.o: ../../include/msg.h
+master_proto.o: ../../include/sys_defs.h
+master_proto.o: master_proto.c
 master_proto.o: master_proto.h
-master_service.o: master_service.c
-master_service.o: ../../include/sys_defs.h
 master_service.o: ../../include/msg.h
 master_service.o: ../../include/mymalloc.h
+master_service.o: ../../include/sys_defs.h
 master_service.o: master.h
-master_sig.o: master_sig.c
-master_sig.o: ../../include/sys_defs.h
+master_service.o: master_service.c
+master_sig.o: ../../include/events.h
+master_sig.o: ../../include/iostuff.h
 master_sig.o: ../../include/msg.h
 master_sig.o: ../../include/posix_signals.h
+master_sig.o: ../../include/sys_defs.h
 master_sig.o: master.h
-master_sig.o: ../../include/iostuff.h
-master_sig.o: ../../include/events.h
-master_spawn.o: master_spawn.c
-master_spawn.o: ../../include/sys_defs.h
-master_spawn.o: ../../include/msg.h
+master_sig.o: master_sig.c
+master_spawn.o: ../../include/argv.h
 master_spawn.o: ../../include/binhash.h
-master_spawn.o: ../../include/mymalloc.h
 master_spawn.o: ../../include/events.h
-master_spawn.o: ../../include/vstring.h
+master_spawn.o: ../../include/msg.h
+master_spawn.o: ../../include/mymalloc.h
+master_spawn.o: ../../include/sys_defs.h
 master_spawn.o: ../../include/vbuf.h
-master_spawn.o: ../../include/argv.h
-master_spawn.o: master_proto.h
+master_spawn.o: ../../include/vstring.h
 master_spawn.o: master.h
-master_status.o: master_status.c
-master_status.o: ../../include/sys_defs.h
-master_status.o: ../../include/msg.h
-master_status.o: ../../include/events.h
+master_spawn.o: master_proto.h
+master_spawn.o: master_spawn.c
 master_status.o: ../../include/binhash.h
+master_status.o: ../../include/events.h
 master_status.o: ../../include/iostuff.h
-master_status.o: master_proto.h
+master_status.o: ../../include/msg.h
+master_status.o: ../../include/sys_defs.h
 master_status.o: master.h
-master_vars.o: master_vars.c
-master_vars.o: ../../include/sys_defs.h
+master_status.o: master_proto.h
+master_status.o: master_status.c
+master_vars.o: ../../include/mail_conf.h
+master_vars.o: ../../include/mail_params.h
 master_vars.o: ../../include/msg.h
+master_vars.o: ../../include/mymalloc.h
 master_vars.o: ../../include/stringops.h
-master_vars.o: ../../include/vstring.h
+master_vars.o: ../../include/sys_defs.h
 master_vars.o: ../../include/vbuf.h
-master_vars.o: ../../include/mymalloc.h
-master_vars.o: ../../include/mail_conf.h
-master_vars.o: ../../include/mail_params.h
+master_vars.o: ../../include/vstring.h
 master_vars.o: master.h
-master_wakeup.o: master_wakeup.c
-master_wakeup.o: ../../include/sys_defs.h
-master_wakeup.o: ../../include/msg.h
-master_wakeup.o: ../../include/trigger.h
+master_vars.o: master_vars.c
+master_wakeup.o: ../../include/attr.h
 master_wakeup.o: ../../include/events.h
+master_wakeup.o: ../../include/iostuff.h
+master_wakeup.o: ../../include/mail_params.h
+master_wakeup.o: ../../include/mail_proto.h
+master_wakeup.o: ../../include/msg.h
 master_wakeup.o: ../../include/set_eugid.h
 master_wakeup.o: ../../include/set_ugid.h
-master_wakeup.o: ../../include/mail_proto.h
-master_wakeup.o: ../../include/vstream.h
+master_wakeup.o: ../../include/sys_defs.h
+master_wakeup.o: ../../include/trigger.h
 master_wakeup.o: ../../include/vbuf.h
-master_wakeup.o: ../../include/iostuff.h
-master_wakeup.o: ../../include/attr.h
-master_wakeup.o: ../../include/mail_params.h
+master_wakeup.o: ../../include/vstream.h
 master_wakeup.o: mail_server.h
 master_wakeup.o: master.h
-multi_server.o: multi_server.c
-multi_server.o: ../../include/sys_defs.h
-multi_server.o: ../../include/msg.h
-multi_server.o: ../../include/msg_syslog.h
+master_wakeup.o: master_wakeup.c
 multi_server.o: ../../include/chroot_uid.h
-multi_server.o: ../../include/listen.h
-multi_server.o: ../../include/iostuff.h
+multi_server.o: ../../include/debug_process.h
 multi_server.o: ../../include/events.h
-multi_server.o: ../../include/vstring.h
-multi_server.o: ../../include/vbuf.h
-multi_server.o: ../../include/vstream.h
+multi_server.o: ../../include/iostuff.h
+multi_server.o: ../../include/listen.h
+multi_server.o: ../../include/mail_conf.h
+multi_server.o: ../../include/mail_dict.h
+multi_server.o: ../../include/mail_params.h
+multi_server.o: ../../include/mail_task.h
+multi_server.o: ../../include/msg.h
+multi_server.o: ../../include/msg_syslog.h
 multi_server.o: ../../include/msg_vstream.h
-multi_server.o: ../../include/mymalloc.h
-multi_server.o: ../../include/stringops.h
-multi_server.o: ../../include/sane_accept.h
 multi_server.o: ../../include/myflock.h
+multi_server.o: ../../include/mymalloc.h
+multi_server.o: ../../include/resolve_local.h
 multi_server.o: ../../include/safe_open.h
-multi_server.o: ../../include/watchdog.h
+multi_server.o: ../../include/sane_accept.h
 multi_server.o: ../../include/split_at.h
-multi_server.o: ../../include/mail_task.h
-multi_server.o: ../../include/debug_process.h
-multi_server.o: ../../include/mail_params.h
-multi_server.o: ../../include/mail_conf.h
-multi_server.o: ../../include/mail_dict.h
+multi_server.o: ../../include/stringops.h
+multi_server.o: ../../include/sys_defs.h
 multi_server.o: ../../include/timed_ipc.h
-multi_server.o: ../../include/resolve_local.h
+multi_server.o: ../../include/vbuf.h
+multi_server.o: ../../include/vstream.h
+multi_server.o: ../../include/vstring.h
+multi_server.o: ../../include/watchdog.h
 multi_server.o: mail_flow.h
-multi_server.o: master_proto.h
 multi_server.o: mail_server.h
-single_server.o: single_server.c
-single_server.o: ../../include/sys_defs.h
-single_server.o: ../../include/msg.h
-single_server.o: ../../include/msg_syslog.h
+multi_server.o: master_proto.h
+multi_server.o: multi_server.c
 single_server.o: ../../include/chroot_uid.h
-single_server.o: ../../include/vstring.h
-single_server.o: ../../include/vbuf.h
-single_server.o: ../../include/vstream.h
-single_server.o: ../../include/msg_vstream.h
-single_server.o: ../../include/mymalloc.h
+single_server.o: ../../include/debug_process.h
 single_server.o: ../../include/events.h
 single_server.o: ../../include/iostuff.h
-single_server.o: ../../include/stringops.h
-single_server.o: ../../include/sane_accept.h
-single_server.o: ../../include/myflock.h
-single_server.o: ../../include/safe_open.h
 single_server.o: ../../include/listen.h
-single_server.o: ../../include/watchdog.h
-single_server.o: ../../include/split_at.h
-single_server.o: ../../include/mail_params.h
-single_server.o: ../../include/mail_task.h
-single_server.o: ../../include/debug_process.h
 single_server.o: ../../include/mail_conf.h
 single_server.o: ../../include/mail_dict.h
-single_server.o: ../../include/timed_ipc.h
+single_server.o: ../../include/mail_params.h
+single_server.o: ../../include/mail_task.h
+single_server.o: ../../include/msg.h
+single_server.o: ../../include/msg_syslog.h
+single_server.o: ../../include/msg_vstream.h
+single_server.o: ../../include/myflock.h
+single_server.o: ../../include/mymalloc.h
 single_server.o: ../../include/resolve_local.h
+single_server.o: ../../include/safe_open.h
+single_server.o: ../../include/sane_accept.h
+single_server.o: ../../include/split_at.h
+single_server.o: ../../include/stringops.h
+single_server.o: ../../include/sys_defs.h
+single_server.o: ../../include/timed_ipc.h
+single_server.o: ../../include/vbuf.h
+single_server.o: ../../include/vstream.h
+single_server.o: ../../include/vstring.h
+single_server.o: ../../include/watchdog.h
 single_server.o: mail_flow.h
-single_server.o: master_proto.h
 single_server.o: mail_server.h
-trigger_server.o: trigger_server.c
-trigger_server.o: ../../include/sys_defs.h
-trigger_server.o: ../../include/msg.h
-trigger_server.o: ../../include/msg_syslog.h
+single_server.o: master_proto.h
+single_server.o: single_server.c
 trigger_server.o: ../../include/chroot_uid.h
-trigger_server.o: ../../include/vstring.h
-trigger_server.o: ../../include/vbuf.h
-trigger_server.o: ../../include/vstream.h
-trigger_server.o: ../../include/msg_vstream.h
-trigger_server.o: ../../include/mymalloc.h
+trigger_server.o: ../../include/debug_process.h
 trigger_server.o: ../../include/events.h
 trigger_server.o: ../../include/iostuff.h
-trigger_server.o: ../../include/stringops.h
-trigger_server.o: ../../include/sane_accept.h
-trigger_server.o: ../../include/myflock.h
-trigger_server.o: ../../include/safe_open.h
 trigger_server.o: ../../include/listen.h
-trigger_server.o: ../../include/watchdog.h
-trigger_server.o: ../../include/split_at.h
-trigger_server.o: ../../include/mail_params.h
-trigger_server.o: ../../include/mail_task.h
-trigger_server.o: ../../include/debug_process.h
 trigger_server.o: ../../include/mail_conf.h
 trigger_server.o: ../../include/mail_dict.h
+trigger_server.o: ../../include/mail_params.h
+trigger_server.o: ../../include/mail_task.h
+trigger_server.o: ../../include/msg.h
+trigger_server.o: ../../include/msg_syslog.h
+trigger_server.o: ../../include/msg_vstream.h
+trigger_server.o: ../../include/myflock.h
+trigger_server.o: ../../include/mymalloc.h
 trigger_server.o: ../../include/resolve_local.h
+trigger_server.o: ../../include/safe_open.h
+trigger_server.o: ../../include/sane_accept.h
+trigger_server.o: ../../include/split_at.h
+trigger_server.o: ../../include/stringops.h
+trigger_server.o: ../../include/sys_defs.h
+trigger_server.o: ../../include/vbuf.h
+trigger_server.o: ../../include/vstream.h
+trigger_server.o: ../../include/vstring.h
+trigger_server.o: ../../include/watchdog.h
 trigger_server.o: mail_flow.h
-trigger_server.o: master_proto.h
 trigger_server.o: mail_server.h
+trigger_server.o: master_proto.h
+trigger_server.o: trigger_server.c
index 509875b755b3974bbb38e37dc6f909eeaf57e372..26ed78b795f798234d0d7dca34e1ee146d3851d5 100644 (file)
@@ -52,199 +52,202 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-qmgr.o: qmgr.c
-qmgr.o: ../../include/sys_defs.h
-qmgr.o: ../../include/msg.h
-qmgr.o: ../../include/events.h
-qmgr.o: ../../include/vstream.h
-qmgr.o: ../../include/vbuf.h
-qmgr.o: ../../include/dict.h
 qmgr.o: ../../include/argv.h
-qmgr.o: ../../include/mail_queue.h
-qmgr.o: ../../include/vstring.h
-qmgr.o: ../../include/recipient_list.h
+qmgr.o: ../../include/attr.h
+qmgr.o: ../../include/dict.h
+qmgr.o: ../../include/events.h
+qmgr.o: ../../include/flush_clnt.h
+qmgr.o: ../../include/iostuff.h
 qmgr.o: ../../include/mail_conf.h
+qmgr.o: ../../include/mail_flow.h
 qmgr.o: ../../include/mail_params.h
 qmgr.o: ../../include/mail_proto.h
-qmgr.o: ../../include/iostuff.h
-qmgr.o: ../../include/attr.h
-qmgr.o: ../../include/mail_flow.h
-qmgr.o: ../../include/flush_clnt.h
-qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/mail_queue.h
 qmgr.o: ../../include/mail_server.h
-qmgr.o: qmgr.h
+qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/msg.h
+qmgr.o: ../../include/recipient_list.h
 qmgr.o: ../../include/scan_dir.h
-qmgr_active.o: qmgr_active.c
-qmgr_active.o: ../../include/sys_defs.h
-qmgr_active.o: ../../include/msg.h
+qmgr.o: ../../include/sys_defs.h
+qmgr.o: ../../include/vbuf.h
+qmgr.o: ../../include/vstream.h
+qmgr.o: ../../include/vstring.h
+qmgr.o: qmgr.c
+qmgr.o: qmgr.h
+qmgr_active.o: ../../include/abounce.h
+qmgr_active.o: ../../include/bounce.h
+qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/deliver_request.h
 qmgr_active.o: ../../include/events.h
-qmgr_active.o: ../../include/mymalloc.h
-qmgr_active.o: ../../include/vstream.h
-qmgr_active.o: ../../include/vbuf.h
-qmgr_active.o: ../../include/mail_params.h
 qmgr_active.o: ../../include/mail_open_ok.h
+qmgr_active.o: ../../include/mail_params.h
 qmgr_active.o: ../../include/mail_queue.h
-qmgr_active.o: ../../include/vstring.h
+qmgr_active.o: ../../include/msg.h
+qmgr_active.o: ../../include/mymalloc.h
+qmgr_active.o: ../../include/rec_type.h
 qmgr_active.o: ../../include/recipient_list.h
-qmgr_active.o: ../../include/bounce.h
-qmgr_active.o: ../../include/deliver_request.h
-qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/scan_dir.h
+qmgr_active.o: ../../include/sys_defs.h
 qmgr_active.o: ../../include/trace.h
-qmgr_active.o: ../../include/abounce.h
-qmgr_active.o: ../../include/rec_type.h
+qmgr_active.o: ../../include/vbuf.h
+qmgr_active.o: ../../include/vstream.h
+qmgr_active.o: ../../include/vstring.h
 qmgr_active.o: qmgr.h
-qmgr_active.o: ../../include/scan_dir.h
-qmgr_bounce.o: qmgr_bounce.c
-qmgr_bounce.o: ../../include/sys_defs.h
+qmgr_active.o: qmgr_active.c
 qmgr_bounce.o: ../../include/bounce.h
+qmgr_bounce.o: ../../include/deliver_completed.h
 qmgr_bounce.o: ../../include/deliver_request.h
-qmgr_bounce.o: ../../include/vstring.h
+qmgr_bounce.o: ../../include/recipient_list.h
+qmgr_bounce.o: ../../include/scan_dir.h
+qmgr_bounce.o: ../../include/sys_defs.h
 qmgr_bounce.o: ../../include/vbuf.h
 qmgr_bounce.o: ../../include/vstream.h
-qmgr_bounce.o: ../../include/recipient_list.h
-qmgr_bounce.o: ../../include/deliver_completed.h
+qmgr_bounce.o: ../../include/vstring.h
 qmgr_bounce.o: qmgr.h
-qmgr_bounce.o: ../../include/scan_dir.h
-qmgr_defer.o: qmgr_defer.c
-qmgr_defer.o: ../../include/sys_defs.h
-qmgr_defer.o: ../../include/msg.h
-qmgr_defer.o: ../../include/vstream.h
-qmgr_defer.o: ../../include/vbuf.h
-qmgr_defer.o: ../../include/defer.h
+qmgr_bounce.o: qmgr_bounce.c
 qmgr_defer.o: ../../include/bounce.h
+qmgr_defer.o: ../../include/defer.h
 qmgr_defer.o: ../../include/deliver_request.h
-qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: ../../include/msg.h
 qmgr_defer.o: ../../include/recipient_list.h
-qmgr_defer.o: qmgr.h
 qmgr_defer.o: ../../include/scan_dir.h
-qmgr_deliver.o: qmgr_deliver.c
-qmgr_deliver.o: ../../include/sys_defs.h
-qmgr_deliver.o: ../../include/msg.h
-qmgr_deliver.o: ../../include/vstring.h
-qmgr_deliver.o: ../../include/vbuf.h
-qmgr_deliver.o: ../../include/vstream.h
-qmgr_deliver.o: ../../include/vstring_vstream.h
+qmgr_defer.o: ../../include/sys_defs.h
+qmgr_defer.o: ../../include/vbuf.h
+qmgr_defer.o: ../../include/vstream.h
+qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: qmgr.h
+qmgr_defer.o: qmgr_defer.c
+qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/dsn_util.h
 qmgr_deliver.o: ../../include/events.h
 qmgr_deliver.o: ../../include/iostuff.h
-qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/mail_params.h
 qmgr_deliver.o: ../../include/mail_proto.h
-qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/msg.h
 qmgr_deliver.o: ../../include/recipient_list.h
-qmgr_deliver.o: ../../include/mail_params.h
-qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/scan_dir.h
+qmgr_deliver.o: ../../include/stringops.h
+qmgr_deliver.o: ../../include/sys_defs.h
+qmgr_deliver.o: ../../include/vbuf.h
 qmgr_deliver.o: ../../include/verp_sender.h
+qmgr_deliver.o: ../../include/vstream.h
+qmgr_deliver.o: ../../include/vstring.h
+qmgr_deliver.o: ../../include/vstring_vstream.h
 qmgr_deliver.o: qmgr.h
-qmgr_deliver.o: ../../include/scan_dir.h
-qmgr_enable.o: qmgr_enable.c
-qmgr_enable.o: ../../include/sys_defs.h
+qmgr_deliver.o: qmgr_deliver.c
 qmgr_enable.o: ../../include/msg.h
-qmgr_enable.o: ../../include/vstream.h
+qmgr_enable.o: ../../include/scan_dir.h
+qmgr_enable.o: ../../include/sys_defs.h
 qmgr_enable.o: ../../include/vbuf.h
+qmgr_enable.o: ../../include/vstream.h
 qmgr_enable.o: qmgr.h
-qmgr_enable.o: ../../include/scan_dir.h
-qmgr_entry.o: qmgr_entry.c
-qmgr_entry.o: ../../include/sys_defs.h
+qmgr_enable.o: qmgr_enable.c
+qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/events.h
+qmgr_entry.o: ../../include/mail_params.h
 qmgr_entry.o: ../../include/msg.h
 qmgr_entry.o: ../../include/mymalloc.h
-qmgr_entry.o: ../../include/events.h
-qmgr_entry.o: ../../include/vstream.h
+qmgr_entry.o: ../../include/recipient_list.h
+qmgr_entry.o: ../../include/scan_dir.h
+qmgr_entry.o: ../../include/sys_defs.h
 qmgr_entry.o: ../../include/vbuf.h
-qmgr_entry.o: ../../include/mail_params.h
-qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/vstream.h
 qmgr_entry.o: ../../include/vstring.h
-qmgr_entry.o: ../../include/recipient_list.h
 qmgr_entry.o: qmgr.h
-qmgr_entry.o: ../../include/scan_dir.h
-qmgr_message.o: qmgr_message.c
-qmgr_message.o: ../../include/sys_defs.h
-qmgr_message.o: ../../include/msg.h
-qmgr_message.o: ../../include/mymalloc.h
-qmgr_message.o: ../../include/vstring.h
-qmgr_message.o: ../../include/vbuf.h
-qmgr_message.o: ../../include/vstream.h
-qmgr_message.o: ../../include/split_at.h
-qmgr_message.o: ../../include/valid_hostname.h
+qmgr_entry.o: qmgr_entry.c
 qmgr_message.o: ../../include/argv.h
-qmgr_message.o: ../../include/stringops.h
-qmgr_message.o: ../../include/myflock.h
-qmgr_message.o: ../../include/dict.h
-qmgr_message.o: ../../include/mail_queue.h
-qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/attr.h
 qmgr_message.o: ../../include/canon_addr.h
-qmgr_message.o: ../../include/record.h
-qmgr_message.o: ../../include/rec_type.h
-qmgr_message.o: ../../include/sent.h
-qmgr_message.o: ../../include/deliver_request.h
-qmgr_message.o: ../../include/recipient_list.h
 qmgr_message.o: ../../include/deliver_completed.h
-qmgr_message.o: ../../include/opened.h
-qmgr_message.o: ../../include/verp_sender.h
-qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/deliver_request.h
+qmgr_message.o: ../../include/dict.h
 qmgr_message.o: ../../include/iostuff.h
-qmgr_message.o: ../../include/attr.h
+qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/mail_queue.h
+qmgr_message.o: ../../include/msg.h
+qmgr_message.o: ../../include/myflock.h
+qmgr_message.o: ../../include/mymalloc.h
+qmgr_message.o: ../../include/opened.h
 qmgr_message.o: ../../include/qmgr_user.h
-qmgr_message.o: ../../include/split_addr.h
-qmgr_message.o: ../../include/rewrite_clnt.h
+qmgr_message.o: ../../include/rec_type.h
+qmgr_message.o: ../../include/recipient_list.h
+qmgr_message.o: ../../include/record.h
 qmgr_message.o: ../../include/resolve_clnt.h
-qmgr_message.o: qmgr.h
+qmgr_message.o: ../../include/rewrite_clnt.h
 qmgr_message.o: ../../include/scan_dir.h
-qmgr_move.o: qmgr_move.c
-qmgr_move.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/sent.h
+qmgr_message.o: ../../include/split_addr.h
+qmgr_message.o: ../../include/split_at.h
+qmgr_message.o: ../../include/stringops.h
+qmgr_message.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/valid_hostname.h
+qmgr_message.o: ../../include/vbuf.h
+qmgr_message.o: ../../include/verp_sender.h
+qmgr_message.o: ../../include/vstream.h
+qmgr_message.o: ../../include/vstring.h
+qmgr_message.o: qmgr.h
+qmgr_message.o: qmgr_message.c
+qmgr_move.o: ../../include/mail_queue.h
+qmgr_move.o: ../../include/mail_scan_dir.h
 qmgr_move.o: ../../include/msg.h
-qmgr_move.o: ../../include/scan_dir.h
 qmgr_move.o: ../../include/recipient_list.h
-qmgr_move.o: ../../include/mail_queue.h
-qmgr_move.o: ../../include/vstring.h
+qmgr_move.o: ../../include/scan_dir.h
+qmgr_move.o: ../../include/sys_defs.h
 qmgr_move.o: ../../include/vbuf.h
 qmgr_move.o: ../../include/vstream.h
-qmgr_move.o: ../../include/mail_scan_dir.h
+qmgr_move.o: ../../include/vstring.h
 qmgr_move.o: qmgr.h
-qmgr_queue.o: qmgr_queue.c
-qmgr_queue.o: ../../include/sys_defs.h
-qmgr_queue.o: ../../include/msg.h
-qmgr_queue.o: ../../include/mymalloc.h
+qmgr_move.o: qmgr_move.c
 qmgr_queue.o: ../../include/events.h
 qmgr_queue.o: ../../include/htable.h
 qmgr_queue.o: ../../include/mail_params.h
+qmgr_queue.o: ../../include/msg.h
+qmgr_queue.o: ../../include/mymalloc.h
 qmgr_queue.o: ../../include/recipient_list.h
-qmgr_queue.o: qmgr.h
-qmgr_queue.o: ../../include/vstream.h
-qmgr_queue.o: ../../include/vbuf.h
 qmgr_queue.o: ../../include/scan_dir.h
-qmgr_rcpt_list.o: qmgr_rcpt_list.c
-qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/vbuf.h
+qmgr_queue.o: ../../include/vstream.h
+qmgr_queue.o: qmgr.h
+qmgr_queue.o: qmgr_queue.c
 qmgr_rcpt_list.o: ../../include/mymalloc.h
-qmgr_rcpt_list.o: qmgr.h
-qmgr_rcpt_list.o: ../../include/vstream.h
-qmgr_rcpt_list.o: ../../include/vbuf.h
 qmgr_rcpt_list.o: ../../include/scan_dir.h
-qmgr_scan.o: qmgr_scan.c
-qmgr_scan.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/vbuf.h
+qmgr_rcpt_list.o: ../../include/vstream.h
+qmgr_rcpt_list.o: qmgr.h
+qmgr_rcpt_list.o: qmgr_rcpt_list.c
+qmgr_scan.o: ../../include/mail_scan_dir.h
 qmgr_scan.o: ../../include/msg.h
 qmgr_scan.o: ../../include/mymalloc.h
 qmgr_scan.o: ../../include/scan_dir.h
-qmgr_scan.o: ../../include/mail_scan_dir.h
-qmgr_scan.o: qmgr.h
-qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: ../../include/sys_defs.h
 qmgr_scan.o: ../../include/vbuf.h
-qmgr_transport.o: qmgr_transport.c
-qmgr_transport.o: ../../include/sys_defs.h
-qmgr_transport.o: ../../include/msg.h
-qmgr_transport.o: ../../include/htable.h
+qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: qmgr.h
+qmgr_scan.o: qmgr_scan.c
+qmgr_transport.o: ../../include/attr.h
 qmgr_transport.o: ../../include/events.h
-qmgr_transport.o: ../../include/mymalloc.h
-qmgr_transport.o: ../../include/vstream.h
-qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/htable.h
 qmgr_transport.o: ../../include/iostuff.h
-qmgr_transport.o: ../../include/mail_proto.h
-qmgr_transport.o: ../../include/attr.h
-qmgr_transport.o: ../../include/recipient_list.h
 qmgr_transport.o: ../../include/mail_conf.h
 qmgr_transport.o: ../../include/mail_params.h
-qmgr_transport.o: qmgr.h
+qmgr_transport.o: ../../include/mail_proto.h
+qmgr_transport.o: ../../include/msg.h
+qmgr_transport.o: ../../include/mymalloc.h
+qmgr_transport.o: ../../include/recipient_list.h
 qmgr_transport.o: ../../include/scan_dir.h
+qmgr_transport.o: ../../include/sys_defs.h
+qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/vstream.h
+qmgr_transport.o: qmgr.h
+qmgr_transport.o: qmgr_transport.c
index 0cac1664d6155ed2409738a2c9cb9e9f2a163460..40e5699acca08a078b54fd518aa037b35973523b 100644 (file)
@@ -111,6 +111,7 @@ struct QMGR_TRANSPORT {
     struct HTABLE *queue_byname;       /* queues indexed by domain */
     QMGR_QUEUE_LIST queue_list;                /* queues, round robin order */
     QMGR_TRANSPORT_LIST peers;         /* linkage */
+    char   *dsn;                       /* why unavailable */
     char   *reason;                    /* why unavailable */
 };
 
@@ -120,7 +121,7 @@ struct QMGR_TRANSPORT {
 typedef void (*QMGR_TRANSPORT_ALLOC_NOTIFY) (QMGR_TRANSPORT *, VSTREAM *);
 extern QMGR_TRANSPORT *qmgr_transport_select(void);
 extern void qmgr_transport_alloc(QMGR_TRANSPORT *, QMGR_TRANSPORT_ALLOC_NOTIFY);
-extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *);
+extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *, const char *);
 extern void qmgr_transport_unthrottle(QMGR_TRANSPORT *);
 extern QMGR_TRANSPORT *qmgr_transport_create(const char *);
 extern QMGR_TRANSPORT *qmgr_transport_find(const char *);
@@ -151,6 +152,7 @@ struct QMGR_QUEUE {
     QMGR_ENTRY_LIST todo;              /* todo queue entries */
     QMGR_ENTRY_LIST busy;              /* messages on the wire */
     QMGR_QUEUE_LIST peers;             /* neighbor queues */
+    char   *dsn;                       /* why unavailable */
     char   *reason;                    /* why unavailable */
     time_t  clog_time_to_warn;         /* time of next warning */
 };
@@ -163,7 +165,7 @@ extern int qmgr_queue_count;
 extern QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *, const char *, const char *);
 extern QMGR_QUEUE *qmgr_queue_select(QMGR_TRANSPORT *);
 extern void qmgr_queue_done(QMGR_QUEUE *);
-extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *);
+extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *, const char *);
 extern void qmgr_queue_unthrottle(QMGR_QUEUE *);
 extern QMGR_QUEUE *qmgr_queue_find(QMGR_TRANSPORT *, const char *);
 
@@ -269,14 +271,15 @@ extern QMGR_MESSAGE *qmgr_message_realloc(QMGR_MESSAGE *);
  /*
   * qmgr_defer.c
   */
-extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *);
-extern void qmgr_defer_todo(QMGR_QUEUE *, const char *);
-extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *);
+extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *, const char *);
+extern void qmgr_defer_todo(QMGR_QUEUE *, const char *, const char *);
+extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *, const char *);
 
  /*
   * qmgr_bounce.c
   */
-extern void PRINTFLIKE(3, 4) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *,...);
+extern void PRINTFLIKE(4, 5) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *,
+                                           const char *, const char *,...);
 
  /*
   * qmgr_deliver.c
index 284342d6d8c4bb06555d58ffe8baac835bbda312..ef870c610660bdafa97cce6befe09d9a0dae55a2 100644 (file)
@@ -6,9 +6,11 @@
 /* SYNOPSIS
 /*     #include "qmgr.h"
 /*
-/*     QMGR_QUEUE *qmgr_bounce_recipient(message, recipient, format, ...)
+/*     QMGR_QUEUE *qmgr_bounce_recipient(message, recipient,
+/*                                     dsn, format, ...)
 /*     QMGR_MESSAGE *message;
 /*     QMGR_RCPT *recipient;
+/*     const char *dsn;
 /*     const char *format;
 /* DESCRIPTION
 /*     qmgr_bounce_recipient() produces a bounce log record.
@@ -22,6 +24,8 @@
 /*     Open queue file with the message being bounced.
 /* .IP recipient
 /*     The recipient that will not be delivered.
+/* .IP dsn
+/*     RFC 1893 detail code.
 /* .IP format
 /*     Free-format text that describes why delivery will not happen.
 /* DIAGNOSTICS
@@ -56,7 +60,7 @@
 /* qmgr_bounce_recipient - bounce one message recipient */
 
 void    qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
-                                     const char *format,...)
+                                   const char *dsn, const char *format,...)
 {
     va_list ap;
     int     status;
@@ -64,8 +68,8 @@ void    qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
     va_start(ap, format);
     status = vbounce_append(message->tflags, message->queue_id,
                            recipient->orig_rcpt, recipient->address,
-                           recipient->offset, "none", message->arrival_time,
-                           format, ap);
+                           recipient->offset, "none", dsn,
+                           message->arrival_time, format, ap);
     va_end(ap);
 
     if (status == 0)
index 2f3d89787f21e5936a272c4066489887fb3cda18..8e1675b7e6c32ab51c5f611eb95185111a4390f3 100644 (file)
@@ -6,17 +6,20 @@
 /* SYNOPSIS
 /*     #include "qmgr.h"
 /*
-/*     void    qmgr_defer_recipient(message, recipient, reason)
+/*     void    qmgr_defer_recipient(message, recipient, dsn, reason)
 /*     QMGR_MESSAGE *message;
 /*     QMGR_RCPT *recipient;
+/*     const char *dsn;
 /*     const char *reason;
 /*
-/*     void    qmgr_defer_todo(queue, reason)
+/*     void    qmgr_defer_todo(queue, dsn, reason)
 /*     QMGR_QUEUE *queue;
+/*     const char *dsn;
 /*     const char *reason;
 /*
-/*     QMGR_QUEUE *qmgr_defer_transport(transport, reason)
+/*     QMGR_QUEUE *qmgr_defer_transport(transport, dsn, reason)
 /*     QMGR_TRANSPORT *transport;
+/*     const char *dsn;
 /*     const char *reason;
 /* DESCRIPTION
 /*     qmgr_defer_recipient() defers delivery of the named message to
@@ -43,6 +46,8 @@
 /*     host (or local user).
 /* .IP transport
 /*     Specifies a message delivery transport.
+/* .IP dsn
+/*     X.YY.ZZ Error detail as specified in RFC 1893.
 /* .IP reason
 /*     Free-format text that describes why delivery is deferred; this
 /*     used for logging purposes, and for updating the message-specific
@@ -81,7 +86,8 @@
 
 /* qmgr_defer_transport - defer todo entries for named transport */
 
-void    qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
+void    qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *dsn,
+                                    const char *reason)
 {
     char   *myname = "qmgr_defer_transport";
     QMGR_QUEUE *queue;
@@ -90,23 +96,25 @@ void    qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
     /*
      * Sanity checks.
      */
-    if (reason == 0)
+    if (dsn == 0 || *dsn == 0)
+       msg_panic("%s: null dsn", myname);
+    if (reason == 0 || *reason == 0)
        msg_panic("%s: null reason", myname);
     if (msg_verbose)
-       msg_info("defer transport %s: %s", transport->name, reason);
+       msg_info("defer transport %s: %s %s", transport->name, dsn, reason);
 
     /*
      * Proceed carefully. Queues may disappear as a side effect.
      */
     for (queue = transport->queue_list.next; queue; queue = next) {
        next = queue->peers.next;
-       qmgr_defer_todo(queue, reason);
+       qmgr_defer_todo(queue, dsn, reason);
     }
 }
 
 /* qmgr_defer_todo - defer all todo queue entries for specific site */
 
-void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
+void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *dsn, const char *reason)
 {
     char   *myname = "qmgr_defer_todo";
     QMGR_ENTRY *entry;
@@ -118,10 +126,12 @@ void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
     /*
      * Sanity checks.
      */
-    if (reason == 0)
+    if (dsn == 0 || *dsn == 0)
+       msg_panic("%s: null dsn", myname);
+    if (reason == 0 || *reason == 0)
        msg_panic("%s: null reason", myname);
     if (msg_verbose)
-       msg_info("defer site %s: %s", queue->name, reason);
+       msg_info("defer site %s: %s %s", queue->name, dsn, reason);
 
     /*
      * Proceed carefully. Queue entries will disappear as a side effect.
@@ -131,7 +141,7 @@ void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
        message = entry->message;
        for (nrcpt = 0; nrcpt < entry->rcpt_list.len; nrcpt++) {
            recipient = entry->rcpt_list.info + nrcpt;
-           qmgr_defer_recipient(message, recipient, reason);
+           qmgr_defer_recipient(message, recipient, dsn, reason);
        }
        qmgr_entry_done(entry, QMGR_QUEUE_TODO);
     }
@@ -140,14 +150,16 @@ void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
 /* qmgr_defer_recipient - defer delivery of specific recipient */
 
 void    qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
-                                    const char *reason)
+                                    const char *dsn, const char *reason)
 {
     char   *myname = "qmgr_defer_recipient";
 
     /*
      * Sanity checks.
      */
-    if (reason == 0)
+    if (dsn == 0 || *dsn == 0)
+       msg_panic("%s: null dsn", myname);
+    if (reason == 0 || *reason == 0)
        msg_panic("%s: reason 0", myname);
 
     /*
@@ -155,7 +167,7 @@ void    qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
      */
     message->flags |= defer_append(message->tflags, message->queue_id,
                                   recipient->orig_rcpt, recipient->address,
-                                  recipient->offset, "none",
+                                  recipient->offset, "none", dsn,
                                   message->arrival_time,
-       "delivery temporarily suspended: %s", reason);
+                             "delivery temporarily suspended: %s", reason);
 }
index 058aa8a5599e105eeb45731047675545355c86ae..67be2d78ec1674bf4aa6902e83aa51faec10ce20 100644 (file)
@@ -55,6 +55,7 @@
 #include <vstring_vstream.h>
 #include <events.h>
 #include <iostuff.h>
+#include <stringops.h>
 
 /* Global library. */
 
@@ -64,6 +65,7 @@
 #include <mail_params.h>
 #include <deliver_request.h>
 #include <verp_sender.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -162,9 +164,9 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
               ATTR_TYPE_STR, MAIL_ATTR_PROTO_NAME, message->client_proto,
               ATTR_TYPE_STR, MAIL_ATTR_HELO_NAME, message->client_helo,
               ATTR_TYPE_STR, MAIL_ATTR_SASL_METHOD, message->sasl_method,
-              ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
+            ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
               ATTR_TYPE_STR, MAIL_ATTR_SASL_SENDER, message->sasl_sender,
-              ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
+            ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
               ATTR_TYPE_END);
     if (sender_buf != 0)
        vstring_free(sender_buf);
@@ -210,6 +212,7 @@ static void qmgr_deliver_update(int unused_event, char *context)
     QMGR_MESSAGE *message = entry->message;
     VSTRING *reason = vstring_alloc(1);
     int     status;
+    DSN_SPLIT dp;
 
     /*
      * The message transport has responded. Stop the watchdog timer.
@@ -236,10 +239,11 @@ static void qmgr_deliver_update(int unused_event, char *context)
      */
     if (status == DELIVER_STAT_CRASH) {
        message->flags |= DELIVER_STAT_DEFER;
-       qmgr_transport_throttle(transport, "unknown mail transport error");
+       qmgr_transport_throttle(transport, "4.3.0",
+                               "unknown mail transport error");
        msg_warn("transport %s failure -- see a previous warning/fatal/panic logfile record for the problem description",
                 transport->name);
-       qmgr_defer_transport(transport, transport->reason);
+       qmgr_defer_transport(transport, transport->dsn, transport->reason);
     }
 
     /*
@@ -254,9 +258,12 @@ static void qmgr_deliver_update(int unused_event, char *context)
     if (status == DELIVER_STAT_DEFER) {
        message->flags |= DELIVER_STAT_DEFER;
        if (VSTRING_LEN(reason)) {
-           qmgr_queue_throttle(queue, vstring_str(reason));
+           /* Sanitize the DSN status from delivery agent. */
+           dsn_split(&dp, "4.0.0", printable(vstring_str(reason), '?'));
+           qmgr_queue_throttle(queue, dp.dsn, *dp.text ?
+                               dp.text : "unknown problem");
            if (queue->window == 0)
-               qmgr_defer_todo(queue, queue->reason);
+               qmgr_defer_todo(queue, queue->dsn, queue->reason);
        }
     }
 
@@ -298,8 +305,9 @@ void    qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
      * while some other queue manipulation is happening.
      */
     if (qmgr_deliver_initial_reply(stream) != 0) {
-       qmgr_transport_throttle(transport, "mail transport unavailable");
-       qmgr_defer_transport(transport, transport->reason);
+       qmgr_transport_throttle(transport, "4.3.0",
+                               "mail transport unavailable");
+       qmgr_defer_transport(transport, transport->dsn, transport->reason);
        (void) vstream_fclose(stream);
        return;
     }
@@ -325,8 +333,9 @@ void    qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
      */
     if (qmgr_deliver_send_request(entry, stream) < 0) {
        qmgr_entry_unselect(queue, entry);
-       qmgr_transport_throttle(transport, "mail transport unavailable");
-       qmgr_defer_transport(transport, transport->reason);
+       qmgr_transport_throttle(transport, "4.3.0",
+                               "mail transport unavailable");
+       qmgr_defer_transport(transport, transport->dsn, transport->reason);
        /* warning: entry and queue may be dangling pointers here */
        (void) vstream_fclose(stream);
        return;
index 7b09bb233a56beac4b1a03ca1431e3952e0b8960..4c8838d657c711b460ae7089863b799567d21c95 100644 (file)
@@ -782,10 +782,11 @@ static int qmgr_resolve_one(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
     else
        resolve_clnt_verify(addr, reply);
     if (reply->flags & RESOLVE_FLAG_FAIL) {
-       qmgr_defer_recipient(message, recipient, "address resolver failure");
+       qmgr_defer_recipient(message, recipient,
+                            "4.3.0", "address resolver failure");
        return (-1);
     } else if (reply->flags & RESOLVE_FLAG_ERROR) {
-       qmgr_bounce_recipient(message, recipient,
+       qmgr_bounce_recipient(message, recipient, "5.1.3",
                              "bad address syntax: \"%s\"", addr);
        return (-1);
     } else {
@@ -880,7 +881,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * the queue manager process does not help.
         */
        if (recipient->address[0] == 0) {
-           qmgr_bounce_recipient(message, recipient,
+           qmgr_bounce_recipient(message, recipient, "5.1.3",
                                  "null recipient address");
            continue;
        }
@@ -897,7 +898,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * where it cannot be bypassed.
         */
        if (var_allow_min_user == 0 && recipient->address[0] == '-') {
-           qmgr_bounce_recipient(message, recipient,
+           qmgr_bounce_recipient(message, recipient, "5.1.3",
                                  "invalid recipient syntax: \"%s\"",
                                  recipient->address);
            continue;
@@ -921,7 +922,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
                && !var_double_bounce_sender[len]) {
                status = sent(message->tflags, message->queue_id,
                              recipient->orig_rcpt, recipient->address,
-                          recipient->offset, "none", message->arrival_time,
+                             recipient->offset, "none", "2.0.0",
+                             message->arrival_time,
                         "undeliverable postmaster notification discarded");
                if (status == 0) {
                    deliver_completed(message->fp, recipient->offset);
@@ -944,7 +946,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
                if (strcmp(*cpp, STR(reply.transport)) == 0)
                    break;
            if (*cpp) {
-               qmgr_defer_recipient(message, recipient, "deferred transport");
+               qmgr_defer_recipient(message, recipient,
+                                    "4.3.2", "deferred transport");
                continue;
            }
        }
@@ -962,7 +965,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * This transport is dead. Defer delivery to this recipient.
         */
        if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) != 0) {
-           qmgr_defer_recipient(message, recipient, transport->reason);
+           qmgr_defer_recipient(message, recipient, transport->dsn,
+                                transport->reason);
            continue;
        }
 
@@ -1029,7 +1033,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * This queue is dead. Defer delivery to this recipient.
         */
        if (queue->window == 0) {
-           qmgr_defer_recipient(message, recipient, queue->reason);
+           qmgr_defer_recipient(message, recipient, queue->dsn, queue->reason);
            continue;
        }
 
index 9e9bb758ad002511229d7af0a31de1d56c4437b9..0de06e45c61ec68998aac691a030ce00ff893a64 100644 (file)
@@ -23,8 +23,9 @@
 /*     QMGR_QUEUE *qmgr_queue_select(transport)
 /*     QMGR_TRANSPORT *transport;
 /*
-/*     void    qmgr_queue_throttle(queue, reason)
+/*     void    qmgr_queue_throttle(queue, dsn, reason)
 /*     QMGR_QUEUE *queue;
+/*     const char *dsn;
 /*     const char *reason;
 /*
 /*     void    qmgr_queue_unthrottle(queue)
@@ -133,6 +134,10 @@ void    qmgr_queue_unthrottle(QMGR_QUEUE *queue)
      */
     if (queue->window == 0) {
        event_cancel_timer(qmgr_queue_unthrottle_wrapper, (char *) queue);
+       if (queue->dsn == 0)
+           msg_panic("%s: queue %s: window 0 dsn 0", myname, queue->name);
+       myfree(queue->dsn);
+       queue->dsn = 0;
        if (queue->reason == 0)
            msg_panic("%s: queue %s: window 0 reason 0", myname, queue->name);
        myfree(queue->reason);
@@ -154,18 +159,22 @@ void    qmgr_queue_unthrottle(QMGR_QUEUE *queue)
 
 /* qmgr_queue_throttle - handle destination delivery failure */
 
-void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
+void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *dsn,
+                                   const char *reason)
 {
     char   *myname = "qmgr_queue_throttle";
 
     /*
      * Sanity checks.
      */
+    if (queue->dsn)
+       msg_panic("%s: queue %s: spurious dsn %s",
+                 myname, queue->name, queue->dsn);
     if (queue->reason)
        msg_panic("%s: queue %s: spurious reason %s",
                  myname, queue->name, queue->reason);
     if (msg_verbose)
-       msg_info("%s: queue %s: %s", myname, queue->name, reason);
+       msg_info("%s: queue %s: %s %s", myname, queue->name, dsn, reason);
 
     /*
      * Decrease the destination's concurrency limit until we reach zero, at
@@ -180,6 +189,7 @@ void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
      * Special case for a site that just was declared dead.
      */
     if (queue->window == 0) {
+       queue->dsn = mystrdup(dsn);
        queue->reason = mystrdup(reason);
        event_request_timer(qmgr_queue_unthrottle_wrapper,
                            (char *) queue, var_min_backoff_time);
@@ -226,6 +236,9 @@ void    qmgr_queue_done(QMGR_QUEUE *queue)
        msg_panic("%s: queue not empty: %s", myname, queue->name);
     if (queue->window <= 0)
        msg_panic("%s: window %d", myname, queue->window);
+    if (queue->dsn)
+       msg_panic("%s: queue %s: spurious dsn %s",
+                 myname, queue->name, queue->dsn);
     if (queue->reason)
        msg_panic("%s: queue %s: spurious reason %s",
                  myname, queue->name, queue->reason);
@@ -265,6 +278,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name,
     queue->window = transport->init_dest_concurrency;
     QMGR_LIST_INIT(queue->todo);
     QMGR_LIST_INIT(queue->busy);
+    queue->dsn = 0;
     queue->reason = 0;
     queue->clog_time_to_warn = 0;
     QMGR_LIST_PREPEND(transport->queue_list, queue);
index dcb4ad1fa23ce71419c091f7c5f92244a2a77856..cbce6179a8349e0ff726c2c5faa59fe6886265df 100644 (file)
@@ -18,8 +18,9 @@
 /*     QMGR_TRANSPORT *transport;
 /*     void    (*notify)(QMGR_TRANSPORT *transport, VSTREAM *fp);
 /*
-/*     void    qmgr_transport_throttle(transport, reason)
+/*     void    qmgr_transport_throttle(transport, dsn, reason)
 /*     QMGR_TRANSPORT *transport;
+/*     const char *dsn;
 /*     const char *reason;
 /*
 /*     void    qmgr_transport_unthrottle(transport)
@@ -128,6 +129,10 @@ void    qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
        if (msg_verbose)
            msg_info("%s: transport %s", myname, transport->name);
        transport->flags &= ~QMGR_TRANSPORT_STAT_DEAD;
+       if (transport->dsn == 0)
+           msg_panic("%s: transport %s: null dsn", myname, transport->name);
+       myfree(transport->dsn);
+       transport->dsn = 0;
        if (transport->reason == 0)
            msg_panic("%s: transport %s: null reason", myname, transport->name);
        myfree(transport->reason);
@@ -139,7 +144,8 @@ void    qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
 
 /* qmgr_transport_throttle - disable delivery process allocation */
 
-void    qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
+void    qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *dsn,
+                                       const char *reason)
 {
     char   *myname = "qmgr_transport_throttle";
 
@@ -150,9 +156,13 @@ void    qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
      */
     if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) == 0) {
        if (msg_verbose)
-           msg_info("%s: transport %s: reason: %s",
-                    myname, transport->name, reason);
+           msg_info("%s: transport %s: dsn: %s reason: %s",
+                    myname, transport->name, dsn, reason);
        transport->flags |= QMGR_TRANSPORT_STAT_DEAD;
+       if (transport->dsn)
+           msg_panic("%s: transport %s: spurious dsn: %s",
+                     myname, transport->name, transport->dsn);
+       transport->dsn = mystrdup(dsn);
        if (transport->reason)
            msg_panic("%s: transport %s: spurious reason: %s",
                      myname, transport->name, transport->reason);
@@ -286,7 +296,7 @@ void    qmgr_transport_alloc(QMGR_TRANSPORT *transport, QMGR_TRANSPORT_ALLOC_NOT
 
     if ((stream = mail_connect(MAIL_CLASS_PRIVATE, transport->name, BLOCK_MODE)) == 0) {
        msg_warn("connect to transport %s: %m", transport->name);
-       qmgr_transport_throttle(transport, "transport is unavailable");
+       qmgr_transport_throttle(transport, "4.3.0", "transport is unavailable");
        return;
     }
     alloc = (QMGR_TRANSPORT_ALLOC *) mymalloc(sizeof(*alloc));
@@ -333,6 +343,7 @@ QMGR_TRANSPORT *qmgr_transport_create(const char *name)
 
     transport->queue_byname = htable_create(0);
     QMGR_LIST_INIT(transport->queue_list);
+    transport->dsn = 0;
     transport->reason = 0;
     if (qmgr_transport_byname == 0)
        qmgr_transport_byname = htable_create(10);
index 5e74360295e77c4aec44cf9e651c7ea22e971745..b5d53ee565aae0c0349dc511bacb3b29556098dc 100644 (file)
@@ -47,33 +47,34 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-pickup.o: pickup.c
-pickup.o: ../../include/sys_defs.h
-pickup.o: ../../include/msg.h
-pickup.o: ../../include/scan_dir.h
-pickup.o: ../../include/vstring.h
-pickup.o: ../../include/vbuf.h
-pickup.o: ../../include/vstream.h
-pickup.o: ../../include/set_ugid.h
-pickup.o: ../../include/safe_open.h
-pickup.o: ../../include/watchdog.h
-pickup.o: ../../include/mail_queue.h
-pickup.o: ../../include/mail_open_ok.h
-pickup.o: ../../include/mymalloc.h
-pickup.o: ../../include/mail_proto.h
-pickup.o: ../../include/iostuff.h
 pickup.o: ../../include/attr.h
 pickup.o: ../../include/cleanup_user.h
+pickup.o: ../../include/input_transp.h
+pickup.o: ../../include/iostuff.h
+pickup.o: ../../include/lex_822.h
+pickup.o: ../../include/mail_conf.h
 pickup.o: ../../include/mail_date.h
+pickup.o: ../../include/mail_open_ok.h
 pickup.o: ../../include/mail_params.h
-pickup.o: ../../include/mail_conf.h
-pickup.o: ../../include/record.h
-pickup.o: ../../include/rec_type.h
-pickup.o: ../../include/lex_822.h
-pickup.o: ../../include/input_transp.h
+pickup.o: ../../include/mail_proto.h
+pickup.o: ../../include/mail_queue.h
 pickup.o: ../../include/mail_server.h
+pickup.o: ../../include/msg.h
+pickup.o: ../../include/mymalloc.h
+pickup.o: ../../include/rec_type.h
+pickup.o: ../../include/record.h
+pickup.o: ../../include/safe_open.h
+pickup.o: ../../include/scan_dir.h
+pickup.o: ../../include/set_ugid.h
+pickup.o: ../../include/sys_defs.h
+pickup.o: ../../include/vbuf.h
+pickup.o: ../../include/vstream.h
+pickup.o: ../../include/vstring.h
+pickup.o: ../../include/watchdog.h
+pickup.o: pickup.c
index 6a676ed8f4fb98f2f672c91fb9ba7079d5c1c34a..a3b622ffe796d66d974e09f7dc8c69730ff40c4b 100644 (file)
@@ -47,41 +47,43 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-pipe.o: pipe.c
-pipe.o: ../../include/sys_defs.h
-pipe.o: ../../include/msg.h
-pipe.o: ../../include/vstream.h
-pipe.o: ../../include/vbuf.h
-pipe.o: ../../include/vstring.h
 pipe.o: ../../include/argv.h
-pipe.o: ../../include/htable.h
+pipe.o: ../../include/bounce.h
+pipe.o: ../../include/canon_addr.h
+pipe.o: ../../include/defer.h
+pipe.o: ../../include/deliver_completed.h
+pipe.o: ../../include/deliver_request.h
 pipe.o: ../../include/dict.h
+pipe.o: ../../include/dsn_util.h
+pipe.o: ../../include/flush_clnt.h
+pipe.o: ../../include/htable.h
 pipe.o: ../../include/iostuff.h
-pipe.o: ../../include/mymalloc.h
 pipe.o: ../../include/mac_parse.h
-pipe.o: ../../include/set_eugid.h
-pipe.o: ../../include/split_at.h
-pipe.o: ../../include/stringops.h
-pipe.o: ../../include/recipient_list.h
-pipe.o: ../../include/deliver_request.h
-pipe.o: ../../include/mail_params.h
+pipe.o: ../../include/mail_addr.h
 pipe.o: ../../include/mail_conf.h
-pipe.o: ../../include/bounce.h
-pipe.o: ../../include/defer.h
-pipe.o: ../../include/deliver_completed.h
-pipe.o: ../../include/sent.h
-pipe.o: ../../include/pipe_command.h
 pipe.o: ../../include/mail_copy.h
-pipe.o: ../../include/mail_addr.h
-pipe.o: ../../include/canon_addr.h
-pipe.o: ../../include/split_addr.h
+pipe.o: ../../include/mail_params.h
+pipe.o: ../../include/mail_server.h
+pipe.o: ../../include/msg.h
+pipe.o: ../../include/mymalloc.h
 pipe.o: ../../include/off_cvt.h
+pipe.o: ../../include/pipe_command.h
 pipe.o: ../../include/quote_822_local.h
 pipe.o: ../../include/quote_flags.h
-pipe.o: ../../include/flush_clnt.h
-pipe.o: ../../include/mail_server.h
+pipe.o: ../../include/recipient_list.h
+pipe.o: ../../include/sent.h
+pipe.o: ../../include/set_eugid.h
+pipe.o: ../../include/split_addr.h
+pipe.o: ../../include/split_at.h
+pipe.o: ../../include/stringops.h
+pipe.o: ../../include/sys_defs.h
+pipe.o: ../../include/vbuf.h
+pipe.o: ../../include/vstream.h
+pipe.o: ../../include/vstring.h
+pipe.o: pipe.c
index 8aae15f4dbf937de3fd255373f3f20b9b512eb30..38064111973b3508dbe5865b1070def033fa22e2 100644 (file)
 #include <off_cvt.h>
 #include <quote_822_local.h>
 #include <flush_clnt.h>
+#include <dsn_util.h>
 
 /* Single server skeleton. */
 
@@ -822,7 +823,7 @@ static void get_service_attr(PIPE_ATTR *attr, char **argv)
 
 static int eval_command_status(int command_status, char *service,
                                     DELIVER_REQUEST *request, VSTREAM *src,
-                                      char *why)
+                                      const char *dsn, const char *text)
 {
     RECIPIENT *rcpt;
     int     status;
@@ -840,31 +841,36 @@ static int eval_command_status(int command_status, char *service,
            status = sent(DEL_REQ_TRACE_FLAGS(request->flags),
                          request->queue_id, rcpt->orig_addr,
                          rcpt->address, rcpt->offset, service,
-                         request->arrival_time, "%s", request->nexthop);
+                         "2.0.0", request->arrival_time,
+                         "%s", request->nexthop);
            if (status == 0 && (request->flags & DEL_REQ_FLAG_SUCCESS))
                deliver_completed(src, rcpt->offset);
            result |= status;
        }
        break;
     case PIPE_STAT_BOUNCE:
-       for (n = 0; n < request->rcpt_list.len; n++) {
-           rcpt = request->rcpt_list.info + n;
-           status = bounce_append(DEL_REQ_TRACE_FLAGS(request->flags),
-                                  request->queue_id, rcpt->orig_addr,
-                                  rcpt->address, rcpt->offset, service,
-                                  request->arrival_time, "%s", why);
-           if (status == 0)
-               deliver_completed(src, rcpt->offset);
-           result |= status;
-       }
-       break;
     case PIPE_STAT_DEFER:
-       for (n = 0; n < request->rcpt_list.len; n++) {
-           rcpt = request->rcpt_list.info + n;
-           result |= defer_append(DEL_REQ_TRACE_FLAGS(request->flags),
-                                  request->queue_id, rcpt->orig_addr,
-                                  rcpt->address, rcpt->offset, service,
-                                  request->arrival_time, "%s", why);
+       if (dsn[0] != '4') {
+           for (n = 0; n < request->rcpt_list.len; n++) {
+               rcpt = request->rcpt_list.info + n;
+               status = bounce_append(DEL_REQ_TRACE_FLAGS(request->flags),
+                                      request->queue_id, rcpt->orig_addr,
+                                      rcpt->address, rcpt->offset, service,
+                                      dsn, request->arrival_time,
+                                      "%s", text);
+               if (status == 0)
+                   deliver_completed(src, rcpt->offset);
+               result |= status;
+           }
+       } else {
+           for (n = 0; n < request->rcpt_list.len; n++) {
+               rcpt = request->rcpt_list.info + n;
+               result |= defer_append(DEL_REQ_TRACE_FLAGS(request->flags),
+                                      request->queue_id, rcpt->orig_addr,
+                                      rcpt->address, rcpt->offset, service,
+                                      dsn, request->arrival_time,
+                                      "%s", text);
+           }
        }
        break;
     case PIPE_STAT_CORRUPT:
@@ -885,7 +891,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
     static PIPE_PARAMS conf;
     static PIPE_ATTR attr;
     RECIPIENT_LIST *rcpt_list = &request->rcpt_list;
-    VSTRING *why = vstring_alloc(100);
+    DSN_VSTRING *why = dsn_vstring_alloc(100);
     VSTRING *buf;
     ARGV   *expanded_argv = 0;
     int     deliver_status;
@@ -893,7 +899,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
     ARGV   *export_env;
 
 #define DELIVER_MSG_CLEANUP() { \
-       vstring_free(why); \
+       dsn_vstring_free(why); \
        if (expanded_argv) argv_free(expanded_argv); \
     }
 
@@ -936,7 +942,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
      */
     if ((attr.flags & MAIL_COPY_DELIVERED) && (rcpt_list->len > 1)) {
        deliver_status = eval_command_status(PIPE_STAT_DEFER, service,
-                                            request, request->fp,
+                                            request, request->fp, "4.3.5",
                                             "mailer configuration error");
        msg_warn("pipe flag `D' requires %s_destination_recipient_limit = 1",
                 service);
@@ -949,7 +955,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
      */
     if ((attr.flags & MAIL_COPY_ORIG_RCPT) && (rcpt_list->len > 1)) {
        deliver_status = eval_command_status(PIPE_STAT_DEFER, service,
-                                            request, request->fp,
+                                            request, request->fp, "4.3.5",
                                             "mailer configuration error");
        msg_warn("pipe flag `O' requires %s_destination_recipient_limit = 1",
                 service);
@@ -966,7 +972,8 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
                     myname, (long) attr.size_limit, request->data_size);
 
        deliver_status = eval_command_status(PIPE_STAT_BOUNCE, service,
-                                request, request->fp, "message too large");
+                                            request, request->fp, "5.2.3",
+                                            "message too large");
        DELIVER_MSG_CLEANUP();
        return (deliver_status);
     }
@@ -985,7 +992,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
            status = sent(DEL_REQ_TRACE_FLAGS(request->flags),
                          request->queue_id, rcpt->orig_addr,
                          rcpt->address, rcpt->offset, service,
-                         request->arrival_time,
+                         "2.0.0", request->arrival_time,
                          "delivers to command: %s", attr.command[0]);
            if (status == 0 && (request->flags & DEL_REQ_FLAG_SUCCESS))
                deliver_completed(request->fp, rcpt->offset);
@@ -1037,7 +1044,7 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
     if ((expanded_argv = expand_argv(service, attr.command,
                                     rcpt_list, attr.flags)) == 0) {
        deliver_status = eval_command_status(PIPE_STAT_DEFER, service,
-                                            request, request->fp,
+                                            request, request->fp, "4.3.5",
                                             "mailer configuration error");
        DELIVER_MSG_CLEANUP();
        return (deliver_status);
@@ -1060,7 +1067,8 @@ static int deliver_message(DELIVER_REQUEST *request, char *service, char **argv)
     argv_free(export_env);
 
     deliver_status = eval_command_status(command_status, service, request,
-                                        request->fp, vstring_str(why));
+                                        request->fp, why->dsn,
+                                        vstring_str(why->vstring));
 
     /*
      * Clean up.
index 2e414ad780eed6ff1e35e875c4b57a74c26c3c3f..84029ab7099851d1454ec135bf249fd3ebd6e7c2 100644 (file)
@@ -71,31 +71,32 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postalias.o: postalias.c
-postalias.o: ../../include/sys_defs.h
+postalias.o: ../../include/argv.h
+postalias.o: ../../include/dict.h
+postalias.o: ../../include/mail_conf.h
+postalias.o: ../../include/mail_dict.h
+postalias.o: ../../include/mail_params.h
+postalias.o: ../../include/mail_task.h
+postalias.o: ../../include/mkmap.h
 postalias.o: ../../include/msg.h
-postalias.o: ../../include/mymalloc.h
-postalias.o: ../../include/vstring.h
-postalias.o: ../../include/vbuf.h
-postalias.o: ../../include/vstream.h
-postalias.o: ../../include/msg_vstream.h
 postalias.o: ../../include/msg_syslog.h
+postalias.o: ../../include/msg_vstream.h
+postalias.o: ../../include/mymalloc.h
 postalias.o: ../../include/readlline.h
-postalias.o: ../../include/stringops.h
-postalias.o: ../../include/split_at.h
-postalias.o: ../../include/vstring_vstream.h
+postalias.o: ../../include/resolve_clnt.h
 postalias.o: ../../include/set_eugid.h
+postalias.o: ../../include/split_at.h
+postalias.o: ../../include/stringops.h
+postalias.o: ../../include/sys_defs.h
 postalias.o: ../../include/tok822.h
-postalias.o: ../../include/resolve_clnt.h
-postalias.o: ../../include/mail_conf.h
-postalias.o: ../../include/mail_dict.h
-postalias.o: ../../include/mail_params.h
-postalias.o: ../../include/mkmap.h
-postalias.o: ../../include/dict.h
-postalias.o: ../../include/argv.h
-postalias.o: ../../include/mail_task.h
+postalias.o: ../../include/vbuf.h
+postalias.o: ../../include/vstream.h
+postalias.o: ../../include/vstring.h
+postalias.o: ../../include/vstring_vstream.h
+postalias.o: postalias.c
index 4cce48332d868ba5cfdef7439e30ee276fc73730..39821d87c57d01b9309f52658e2bfa9996359287 100644 (file)
@@ -47,21 +47,22 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postcat.o: postcat.c
-postcat.o: ../../include/sys_defs.h
+postcat.o: ../../include/mail_conf.h
+postcat.o: ../../include/mail_params.h
+postcat.o: ../../include/mail_queue.h
 postcat.o: ../../include/msg.h
-postcat.o: ../../include/vstream.h
+postcat.o: ../../include/msg_vstream.h
+postcat.o: ../../include/rec_type.h
+postcat.o: ../../include/record.h
+postcat.o: ../../include/sys_defs.h
 postcat.o: ../../include/vbuf.h
+postcat.o: ../../include/vstream.h
 postcat.o: ../../include/vstring.h
-postcat.o: ../../include/msg_vstream.h
 postcat.o: ../../include/vstring_vstream.h
-postcat.o: ../../include/record.h
-postcat.o: ../../include/rec_type.h
-postcat.o: ../../include/mail_queue.h
-postcat.o: ../../include/mail_conf.h
-postcat.o: ../../include/mail_params.h
+postcat.o: postcat.c
index 069f951b088e2ef58f808813a173544927b77114..ede96260c55d38454cb9207ab36e6b1d72351e74 100644 (file)
@@ -61,50 +61,51 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postconf.o: postconf.c
-postconf.o: ../../include/sys_defs.h
-postconf.o: ../../include/msg.h
-postconf.o: ../../include/vstream.h
-postconf.o: ../../include/vbuf.h
-postconf.o: ../../include/msg_vstream.h
+postconf.o: ../../include/argv.h
+postconf.o: ../../include/attr.h
+postconf.o: ../../include/dict.h
 postconf.o: ../../include/get_hostname.h
-postconf.o: ../../include/stringops.h
-postconf.o: ../../include/vstring.h
 postconf.o: ../../include/htable.h
-postconf.o: ../../include/dict.h
-postconf.o: ../../include/argv.h
-postconf.o: ../../include/safe.h
-postconf.o: ../../include/mymalloc.h
-postconf.o: ../../include/split_at.h
-postconf.o: ../../include/vstring_vstream.h
-postconf.o: ../../include/myflock.h
 postconf.o: ../../include/inet_proto.h
-postconf.o: ../../include/mynetworks.h
+postconf.o: ../../include/iostuff.h
+postconf.o: ../../include/mail_addr.h
 postconf.o: ../../include/mail_conf.h
 postconf.o: ../../include/mail_dict.h
+postconf.o: ../../include/mail_params.h
 postconf.o: ../../include/mail_proto.h
-postconf.o: ../../include/iostuff.h
-postconf.o: ../../include/attr.h
 postconf.o: ../../include/mail_version.h
-postconf.o: ../../include/mail_params.h
-postconf.o: ../../include/mail_addr.h
 postconf.o: ../../include/mbox_conf.h
-postconf.o: time_vars.h
-postconf.o: bool_vars.h
-postconf.o: int_vars.h
-postconf.o: str_vars.h
-postconf.o: raw_vars.h
+postconf.o: ../../include/msg.h
+postconf.o: ../../include/msg_vstream.h
+postconf.o: ../../include/myflock.h
+postconf.o: ../../include/mymalloc.h
+postconf.o: ../../include/mynetworks.h
+postconf.o: ../../include/safe.h
+postconf.o: ../../include/split_at.h
+postconf.o: ../../include/stringops.h
+postconf.o: ../../include/sys_defs.h
+postconf.o: ../../include/vbuf.h
+postconf.o: ../../include/vstream.h
+postconf.o: ../../include/vstring.h
+postconf.o: ../../include/vstring_vstream.h
+postconf.o: auto_table.h
 postconf.o: auto_vars.h
-postconf.o: install_vars.h
-postconf.o: time_table.h
 postconf.o: bool_table.h
-postconf.o: int_table.h
-postconf.o: str_table.h
-postconf.o: auto_table.h
+postconf.o: bool_vars.h
 postconf.o: install_table.h
+postconf.o: install_vars.h
+postconf.o: int_table.h
+postconf.o: int_vars.h
+postconf.o: postconf.c
 postconf.o: raw_table.h
+postconf.o: raw_vars.h
+postconf.o: str_table.h
+postconf.o: str_vars.h
+postconf.o: time_table.h
+postconf.o: time_vars.h
index 6ddcf835edbb6e24272e9b3e6546ee16371e2c94..3b0b2e83aed24ec4c9af3f002243edab1b5609c7 100644 (file)
@@ -47,32 +47,33 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postdrop.o: postdrop.c
-postdrop.o: ../../include/sys_defs.h
-postdrop.o: ../../include/msg.h
-postdrop.o: ../../include/mymalloc.h
-postdrop.o: ../../include/vstream.h
-postdrop.o: ../../include/vbuf.h
-postdrop.o: ../../include/vstring.h
-postdrop.o: ../../include/msg_vstream.h
-postdrop.o: ../../include/msg_syslog.h
 postdrop.o: ../../include/argv.h
+postdrop.o: ../../include/attr.h
+postdrop.o: ../../include/clean_env.h
+postdrop.o: ../../include/cleanup_user.h
 postdrop.o: ../../include/iostuff.h
-postdrop.o: ../../include/stringops.h
+postdrop.o: ../../include/mail_conf.h
+postdrop.o: ../../include/mail_params.h
 postdrop.o: ../../include/mail_proto.h
-postdrop.o: ../../include/attr.h
 postdrop.o: ../../include/mail_queue.h
-postdrop.o: ../../include/mail_params.h
-postdrop.o: ../../include/mail_conf.h
-postdrop.o: ../../include/mail_task.h
-postdrop.o: ../../include/clean_env.h
 postdrop.o: ../../include/mail_stream.h
-postdrop.o: ../../include/cleanup_user.h
-postdrop.o: ../../include/record.h
+postdrop.o: ../../include/mail_task.h
+postdrop.o: ../../include/msg.h
+postdrop.o: ../../include/msg_syslog.h
+postdrop.o: ../../include/msg_vstream.h
+postdrop.o: ../../include/mymalloc.h
 postdrop.o: ../../include/rec_type.h
+postdrop.o: ../../include/record.h
+postdrop.o: ../../include/stringops.h
+postdrop.o: ../../include/sys_defs.h
 postdrop.o: ../../include/user_acl.h
+postdrop.o: ../../include/vbuf.h
+postdrop.o: ../../include/vstream.h
+postdrop.o: ../../include/vstring.h
+postdrop.o: postdrop.c
index dad1be2c3059eac8dc3b154b66e424ecf08d2800..50415d18b361c87bf44b4b0b56d523242ba94e65 100644 (file)
@@ -51,22 +51,23 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postfix.o: postfix.c
-postfix.o: ../../include/sys_defs.h
-postfix.o: ../../include/vstream.h
-postfix.o: ../../include/vbuf.h
+postfix.o: ../../include/argv.h
+postfix.o: ../../include/clean_env.h
+postfix.o: ../../include/mail_conf.h
+postfix.o: ../../include/mail_params.h
 postfix.o: ../../include/msg.h
-postfix.o: ../../include/msg_vstream.h
 postfix.o: ../../include/msg_syslog.h
+postfix.o: ../../include/msg_vstream.h
+postfix.o: ../../include/safe.h
 postfix.o: ../../include/stringops.h
+postfix.o: ../../include/sys_defs.h
+postfix.o: ../../include/vbuf.h
+postfix.o: ../../include/vstream.h
 postfix.o: ../../include/vstring.h
-postfix.o: ../../include/clean_env.h
-postfix.o: ../../include/argv.h
-postfix.o: ../../include/safe.h
-postfix.o: ../../include/mail_conf.h
-postfix.o: ../../include/mail_params.h
+postfix.o: postfix.c
index 568edf654eee159b1a00f05638e7e19c29595a28..afe3d565fcf9304ebd13c9c1e6aae569c1679d17 100644 (file)
@@ -47,22 +47,23 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postkick.o: postkick.c
-postkick.o: ../../include/sys_defs.h
-postkick.o: ../../include/msg.h
-postkick.o: ../../include/mymalloc.h
-postkick.o: ../../include/vstream.h
-postkick.o: ../../include/vbuf.h
-postkick.o: ../../include/msg_vstream.h
-postkick.o: ../../include/safe.h
+postkick.o: ../../include/attr.h
 postkick.o: ../../include/events.h
-postkick.o: ../../include/mail_proto.h
 postkick.o: ../../include/iostuff.h
-postkick.o: ../../include/attr.h
-postkick.o: ../../include/mail_params.h
 postkick.o: ../../include/mail_conf.h
+postkick.o: ../../include/mail_params.h
+postkick.o: ../../include/mail_proto.h
+postkick.o: ../../include/msg.h
+postkick.o: ../../include/msg_vstream.h
+postkick.o: ../../include/mymalloc.h
+postkick.o: ../../include/safe.h
+postkick.o: ../../include/sys_defs.h
+postkick.o: ../../include/vbuf.h
+postkick.o: ../../include/vstream.h
+postkick.o: postkick.c
index 48853df79196876144f92e8ea5728a760c7f54ef..c40f41da9e157b07b99f658b76ff4336521a57d5 100644 (file)
@@ -47,26 +47,28 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postlock.o: postlock.c
-postlock.o: ../../include/sys_defs.h
-postlock.o: ../../include/msg.h
-postlock.o: ../../include/vstring.h
-postlock.o: ../../include/vbuf.h
-postlock.o: ../../include/vstream.h
-postlock.o: ../../include/msg_vstream.h
-postlock.o: ../../include/iostuff.h
-postlock.o: ../../include/mail_params.h
-postlock.o: ../../include/dot_lockfile.h
+postlock.o: ../../include/argv.h
 postlock.o: ../../include/deliver_flock.h
-postlock.o: ../../include/myflock.h
+postlock.o: ../../include/dot_lockfile.h
+postlock.o: ../../include/dsn_util.h
+postlock.o: ../../include/iostuff.h
 postlock.o: ../../include/mail_conf.h
-postlock.o: ../../include/sys_exits.h
+postlock.o: ../../include/mail_params.h
 postlock.o: ../../include/mbox_conf.h
-postlock.o: ../../include/argv.h
 postlock.o: ../../include/mbox_open.h
+postlock.o: ../../include/msg.h
+postlock.o: ../../include/msg_vstream.h
+postlock.o: ../../include/myflock.h
 postlock.o: ../../include/safe_open.h
+postlock.o: ../../include/sys_defs.h
+postlock.o: ../../include/sys_exits.h
+postlock.o: ../../include/vbuf.h
+postlock.o: ../../include/vstream.h
+postlock.o: ../../include/vstring.h
+postlock.o: postlock.c
index dcd2b9d00e81930451dbd4d2a0523564714ad879..b49596008e2b3e8f4fada20d5b278c7b93e3499e 100644 (file)
 #include <sys_exits.h>
 #include <mbox_conf.h>
 #include <mbox_open.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -139,7 +140,7 @@ static void fatal_exit(void)
 
 int     main(int argc, char **argv)
 {
-    VSTRING *why;
+    DSN_VSTRING *why;
     char   *folder;
     char  **command;
     int     ch;
@@ -218,11 +219,11 @@ int     main(int argc, char **argv)
      * Lock the folder for exclusive access. Lose the lock upon exit. The
      * command is not supposed to disappear into the background.
      */
-    why = vstring_alloc(1);
+    why = dsn_vstring_alloc(1);
     if ((mp = mbox_open(folder, O_APPEND | O_WRONLY | O_CREAT,
                        S_IRUSR | S_IWUSR, (struct stat *) 0,
                        -1, -1, lock_mask, why)) == 0)
-       msg_fatal("open file %s: %s", folder, vstring_str(why));
+       msg_fatal("open file %s: %s", folder, vstring_str(why->vstring));
 
     /*
      * Run the command. Remove the lock after completion.
@@ -242,6 +243,7 @@ int     main(int argc, char **argv)
     default:
        if (waitpid(pid, &status, 0) < 0)
            msg_fatal("waitpid: %m");
+       vstream_fclose(mp->fp);
        mbox_release(mp);
        exit(WIFEXITED(status) ? WEXITSTATUS(status) : 1);
     }
index 64f32b5d4ad9334eb01db96586d07efcd5c0914f..d8f03eec00e666dc9a5d5e8e4c70df0cb7e28df2 100644 (file)
@@ -51,21 +51,22 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postlog.o: postlog.c
-postlog.o: ../../include/sys_defs.h
+postlog.o: ../../include/mail_conf.h
+postlog.o: ../../include/mail_params.h
+postlog.o: ../../include/mail_task.h
 postlog.o: ../../include/msg.h
-postlog.o: ../../include/vstring.h
+postlog.o: ../../include/msg_output.h
+postlog.o: ../../include/msg_syslog.h
+postlog.o: ../../include/msg_vstream.h
+postlog.o: ../../include/sys_defs.h
 postlog.o: ../../include/vbuf.h
 postlog.o: ../../include/vstream.h
+postlog.o: ../../include/vstring.h
 postlog.o: ../../include/vstring_vstream.h
-postlog.o: ../../include/msg_output.h
-postlog.o: ../../include/msg_vstream.h
-postlog.o: ../../include/msg_syslog.h
-postlog.o: ../../include/mail_params.h
-postlog.o: ../../include/mail_conf.h
-postlog.o: ../../include/mail_task.h
+postlog.o: postlog.c
index 7761292e48aed532a55bfaa22abb21051457647a..13b7cf7f371df15865b3bc5fdf11187bbccc4517 100644 (file)
@@ -71,29 +71,30 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postmap.o: postmap.c
-postmap.o: ../../include/sys_defs.h
+postmap.o: ../../include/argv.h
+postmap.o: ../../include/dict.h
+postmap.o: ../../include/mail_conf.h
+postmap.o: ../../include/mail_dict.h
+postmap.o: ../../include/mail_params.h
+postmap.o: ../../include/mail_task.h
+postmap.o: ../../include/mkmap.h
 postmap.o: ../../include/msg.h
-postmap.o: ../../include/mymalloc.h
-postmap.o: ../../include/vstring.h
-postmap.o: ../../include/vbuf.h
-postmap.o: ../../include/vstream.h
-postmap.o: ../../include/msg_vstream.h
 postmap.o: ../../include/msg_syslog.h
+postmap.o: ../../include/msg_vstream.h
+postmap.o: ../../include/mymalloc.h
 postmap.o: ../../include/readlline.h
-postmap.o: ../../include/stringops.h
+postmap.o: ../../include/set_eugid.h
 postmap.o: ../../include/split_at.h
+postmap.o: ../../include/stringops.h
+postmap.o: ../../include/sys_defs.h
+postmap.o: ../../include/vbuf.h
+postmap.o: ../../include/vstream.h
+postmap.o: ../../include/vstring.h
 postmap.o: ../../include/vstring_vstream.h
-postmap.o: ../../include/set_eugid.h
-postmap.o: ../../include/mail_conf.h
-postmap.o: ../../include/mail_dict.h
-postmap.o: ../../include/mail_params.h
-postmap.o: ../../include/mkmap.h
-postmap.o: ../../include/dict.h
-postmap.o: ../../include/argv.h
-postmap.o: ../../include/mail_task.h
+postmap.o: postmap.c
index f3a523b5e62367bc5f68b3479a88df23033423bb..b4b9f6a4d02497fe21520774e98e81a13cc2aad6 100644 (file)
@@ -47,35 +47,36 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postqueue.o: postqueue.c
-postqueue.o: ../../include/sys_defs.h
-postqueue.o: ../../include/msg.h
-postqueue.o: ../../include/mymalloc.h
-postqueue.o: ../../include/clean_env.h
-postqueue.o: ../../include/vstream.h
-postqueue.o: ../../include/vbuf.h
-postqueue.o: ../../include/msg_vstream.h
-postqueue.o: ../../include/msg_syslog.h
 postqueue.o: ../../include/argv.h
-postqueue.o: ../../include/safe.h
+postqueue.o: ../../include/attr.h
+postqueue.o: ../../include/clean_env.h
 postqueue.o: ../../include/connect.h
+postqueue.o: ../../include/debug_process.h
+postqueue.o: ../../include/flush_clnt.h
 postqueue.o: ../../include/iostuff.h
-postqueue.o: ../../include/valid_hostname.h
-postqueue.o: ../../include/mail_proto.h
-postqueue.o: ../../include/attr.h
-postqueue.o: ../../include/mail_params.h
 postqueue.o: ../../include/mail_conf.h
-postqueue.o: ../../include/mail_task.h
-postqueue.o: ../../include/debug_process.h
-postqueue.o: ../../include/mail_run.h
 postqueue.o: ../../include/mail_flush.h
-postqueue.o: ../../include/flush_clnt.h
+postqueue.o: ../../include/mail_params.h
+postqueue.o: ../../include/mail_proto.h
+postqueue.o: ../../include/mail_run.h
+postqueue.o: ../../include/mail_task.h
+postqueue.o: ../../include/msg.h
+postqueue.o: ../../include/msg_syslog.h
+postqueue.o: ../../include/msg_vstream.h
+postqueue.o: ../../include/mymalloc.h
+postqueue.o: ../../include/safe.h
 postqueue.o: ../../include/smtp_stream.h
-postqueue.o: ../../include/vstring.h
+postqueue.o: ../../include/sys_defs.h
 postqueue.o: ../../include/user_acl.h
+postqueue.o: ../../include/valid_hostname.h
 postqueue.o: ../../include/valid_mailhost_addr.h
+postqueue.o: ../../include/vbuf.h
+postqueue.o: ../../include/vstream.h
+postqueue.o: ../../include/vstring.h
+postqueue.o: postqueue.c
index df0dfa08ab0013dd218adfa298f7e9142b6abf04..62075eac60b7ae35edcd56ddb32357f98d8c7c40 100644 (file)
@@ -47,28 +47,29 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-postsuper.o: postsuper.c
-postsuper.o: ../../include/sys_defs.h
-postsuper.o: ../../include/mymalloc.h
+postsuper.o: ../../include/argv.h
+postsuper.o: ../../include/mail_conf.h
+postsuper.o: ../../include/mail_open_ok.h
+postsuper.o: ../../include/mail_params.h
+postsuper.o: ../../include/mail_queue.h
+postsuper.o: ../../include/mail_task.h
 postsuper.o: ../../include/msg.h
 postsuper.o: ../../include/msg_syslog.h
-postsuper.o: ../../include/vstream.h
-postsuper.o: ../../include/vbuf.h
 postsuper.o: ../../include/msg_vstream.h
-postsuper.o: ../../include/scan_dir.h
-postsuper.o: ../../include/vstring.h
+postsuper.o: ../../include/mymalloc.h
 postsuper.o: ../../include/safe.h
+postsuper.o: ../../include/sane_fsops.h
+postsuper.o: ../../include/scan_dir.h
 postsuper.o: ../../include/set_ugid.h
-postsuper.o: ../../include/argv.h
+postsuper.o: ../../include/sys_defs.h
+postsuper.o: ../../include/vbuf.h
+postsuper.o: ../../include/vstream.h
+postsuper.o: ../../include/vstring.h
 postsuper.o: ../../include/vstring_vstream.h
-postsuper.o: ../../include/sane_fsops.h
-postsuper.o: ../../include/mail_task.h
-postsuper.o: ../../include/mail_conf.h
-postsuper.o: ../../include/mail_params.h
-postsuper.o: ../../include/mail_queue.h
-postsuper.o: ../../include/mail_open_ok.h
+postsuper.o: postsuper.c
index deb28075c4c7aeaf0cfab5b68e66652f845ca57b..bc78e18ff092d55fd8a69b4aa6b5faca19f80e7b 100644 (file)
@@ -47,26 +47,27 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-proxymap.o: proxymap.c
-proxymap.o: ../../include/sys_defs.h
-proxymap.o: ../../include/msg.h
-proxymap.o: ../../include/mymalloc.h
-proxymap.o: ../../include/vstring.h
-proxymap.o: ../../include/vbuf.h
-proxymap.o: ../../include/htable.h
-proxymap.o: ../../include/stringops.h
-proxymap.o: ../../include/dict.h
-proxymap.o: ../../include/vstream.h
 proxymap.o: ../../include/argv.h
+proxymap.o: ../../include/attr.h
+proxymap.o: ../../include/dict.h
+proxymap.o: ../../include/dict_proxy.h
+proxymap.o: ../../include/htable.h
+proxymap.o: ../../include/iostuff.h
 proxymap.o: ../../include/mail_conf.h
 proxymap.o: ../../include/mail_params.h
 proxymap.o: ../../include/mail_proto.h
-proxymap.o: ../../include/iostuff.h
-proxymap.o: ../../include/attr.h
-proxymap.o: ../../include/dict_proxy.h
 proxymap.o: ../../include/mail_server.h
+proxymap.o: ../../include/msg.h
+proxymap.o: ../../include/mymalloc.h
+proxymap.o: ../../include/stringops.h
+proxymap.o: ../../include/sys_defs.h
+proxymap.o: ../../include/vbuf.h
+proxymap.o: ../../include/vstream.h
+proxymap.o: ../../include/vstring.h
+proxymap.o: proxymap.c
index 91f19f17690a8b6c34ac6273ab5d96445af681ba..6e7f130634b859c0bfd902c418ccfe97a63a3a9d 100644 (file)
@@ -54,219 +54,222 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-qmgr.o: qmgr.c
-qmgr.o: ../../include/sys_defs.h
-qmgr.o: ../../include/msg.h
-qmgr.o: ../../include/events.h
-qmgr.o: ../../include/vstream.h
-qmgr.o: ../../include/vbuf.h
-qmgr.o: ../../include/dict.h
 qmgr.o: ../../include/argv.h
-qmgr.o: ../../include/mail_queue.h
-qmgr.o: ../../include/vstring.h
-qmgr.o: ../../include/recipient_list.h
+qmgr.o: ../../include/attr.h
+qmgr.o: ../../include/dict.h
+qmgr.o: ../../include/events.h
+qmgr.o: ../../include/flush_clnt.h
+qmgr.o: ../../include/iostuff.h
 qmgr.o: ../../include/mail_conf.h
+qmgr.o: ../../include/mail_flow.h
 qmgr.o: ../../include/mail_params.h
 qmgr.o: ../../include/mail_proto.h
-qmgr.o: ../../include/iostuff.h
-qmgr.o: ../../include/attr.h
-qmgr.o: ../../include/mail_flow.h
-qmgr.o: ../../include/flush_clnt.h
-qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/mail_queue.h
 qmgr.o: ../../include/mail_server.h
-qmgr.o: qmgr.h
+qmgr.o: ../../include/master_proto.h
+qmgr.o: ../../include/msg.h
+qmgr.o: ../../include/recipient_list.h
 qmgr.o: ../../include/scan_dir.h
-qmgr_active.o: qmgr_active.c
-qmgr_active.o: ../../include/sys_defs.h
-qmgr_active.o: ../../include/msg.h
+qmgr.o: ../../include/sys_defs.h
+qmgr.o: ../../include/vbuf.h
+qmgr.o: ../../include/vstream.h
+qmgr.o: ../../include/vstring.h
+qmgr.o: qmgr.c
+qmgr.o: qmgr.h
+qmgr_active.o: ../../include/abounce.h
+qmgr_active.o: ../../include/bounce.h
+qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/deliver_request.h
 qmgr_active.o: ../../include/events.h
-qmgr_active.o: ../../include/mymalloc.h
-qmgr_active.o: ../../include/vstream.h
-qmgr_active.o: ../../include/vbuf.h
-qmgr_active.o: ../../include/mail_params.h
 qmgr_active.o: ../../include/mail_open_ok.h
+qmgr_active.o: ../../include/mail_params.h
 qmgr_active.o: ../../include/mail_queue.h
-qmgr_active.o: ../../include/vstring.h
+qmgr_active.o: ../../include/msg.h
+qmgr_active.o: ../../include/mymalloc.h
+qmgr_active.o: ../../include/rec_type.h
 qmgr_active.o: ../../include/recipient_list.h
-qmgr_active.o: ../../include/bounce.h
-qmgr_active.o: ../../include/deliver_request.h
-qmgr_active.o: ../../include/defer.h
+qmgr_active.o: ../../include/scan_dir.h
+qmgr_active.o: ../../include/sys_defs.h
 qmgr_active.o: ../../include/trace.h
-qmgr_active.o: ../../include/abounce.h
-qmgr_active.o: ../../include/rec_type.h
+qmgr_active.o: ../../include/vbuf.h
+qmgr_active.o: ../../include/vstream.h
+qmgr_active.o: ../../include/vstring.h
 qmgr_active.o: qmgr.h
-qmgr_active.o: ../../include/scan_dir.h
-qmgr_bounce.o: qmgr_bounce.c
-qmgr_bounce.o: ../../include/sys_defs.h
+qmgr_active.o: qmgr_active.c
 qmgr_bounce.o: ../../include/bounce.h
+qmgr_bounce.o: ../../include/deliver_completed.h
 qmgr_bounce.o: ../../include/deliver_request.h
-qmgr_bounce.o: ../../include/vstring.h
+qmgr_bounce.o: ../../include/recipient_list.h
+qmgr_bounce.o: ../../include/scan_dir.h
+qmgr_bounce.o: ../../include/sys_defs.h
 qmgr_bounce.o: ../../include/vbuf.h
 qmgr_bounce.o: ../../include/vstream.h
-qmgr_bounce.o: ../../include/recipient_list.h
-qmgr_bounce.o: ../../include/deliver_completed.h
+qmgr_bounce.o: ../../include/vstring.h
 qmgr_bounce.o: qmgr.h
-qmgr_bounce.o: ../../include/scan_dir.h
-qmgr_defer.o: qmgr_defer.c
-qmgr_defer.o: ../../include/sys_defs.h
-qmgr_defer.o: ../../include/msg.h
-qmgr_defer.o: ../../include/vstream.h
-qmgr_defer.o: ../../include/vbuf.h
-qmgr_defer.o: ../../include/defer.h
+qmgr_bounce.o: qmgr_bounce.c
 qmgr_defer.o: ../../include/bounce.h
+qmgr_defer.o: ../../include/defer.h
 qmgr_defer.o: ../../include/deliver_request.h
-qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: ../../include/msg.h
 qmgr_defer.o: ../../include/recipient_list.h
-qmgr_defer.o: qmgr.h
 qmgr_defer.o: ../../include/scan_dir.h
-qmgr_deliver.o: qmgr_deliver.c
-qmgr_deliver.o: ../../include/sys_defs.h
-qmgr_deliver.o: ../../include/msg.h
-qmgr_deliver.o: ../../include/vstring.h
-qmgr_deliver.o: ../../include/vbuf.h
-qmgr_deliver.o: ../../include/vstream.h
-qmgr_deliver.o: ../../include/vstring_vstream.h
+qmgr_defer.o: ../../include/sys_defs.h
+qmgr_defer.o: ../../include/vbuf.h
+qmgr_defer.o: ../../include/vstream.h
+qmgr_defer.o: ../../include/vstring.h
+qmgr_defer.o: qmgr.h
+qmgr_defer.o: qmgr_defer.c
+qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/dsn_util.h
 qmgr_deliver.o: ../../include/events.h
 qmgr_deliver.o: ../../include/iostuff.h
-qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/mail_params.h
 qmgr_deliver.o: ../../include/mail_proto.h
-qmgr_deliver.o: ../../include/attr.h
+qmgr_deliver.o: ../../include/mail_queue.h
+qmgr_deliver.o: ../../include/msg.h
 qmgr_deliver.o: ../../include/recipient_list.h
-qmgr_deliver.o: ../../include/mail_params.h
-qmgr_deliver.o: ../../include/deliver_request.h
+qmgr_deliver.o: ../../include/scan_dir.h
+qmgr_deliver.o: ../../include/stringops.h
+qmgr_deliver.o: ../../include/sys_defs.h
+qmgr_deliver.o: ../../include/vbuf.h
 qmgr_deliver.o: ../../include/verp_sender.h
+qmgr_deliver.o: ../../include/vstream.h
+qmgr_deliver.o: ../../include/vstring.h
+qmgr_deliver.o: ../../include/vstring_vstream.h
 qmgr_deliver.o: qmgr.h
-qmgr_deliver.o: ../../include/scan_dir.h
-qmgr_enable.o: qmgr_enable.c
-qmgr_enable.o: ../../include/sys_defs.h
+qmgr_deliver.o: qmgr_deliver.c
 qmgr_enable.o: ../../include/msg.h
-qmgr_enable.o: ../../include/vstream.h
+qmgr_enable.o: ../../include/scan_dir.h
+qmgr_enable.o: ../../include/sys_defs.h
 qmgr_enable.o: ../../include/vbuf.h
+qmgr_enable.o: ../../include/vstream.h
 qmgr_enable.o: qmgr.h
-qmgr_enable.o: ../../include/scan_dir.h
-qmgr_entry.o: qmgr_entry.c
-qmgr_entry.o: ../../include/sys_defs.h
+qmgr_enable.o: qmgr_enable.c
+qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/events.h
+qmgr_entry.o: ../../include/mail_params.h
 qmgr_entry.o: ../../include/msg.h
 qmgr_entry.o: ../../include/mymalloc.h
-qmgr_entry.o: ../../include/events.h
-qmgr_entry.o: ../../include/vstream.h
+qmgr_entry.o: ../../include/recipient_list.h
+qmgr_entry.o: ../../include/scan_dir.h
+qmgr_entry.o: ../../include/sys_defs.h
 qmgr_entry.o: ../../include/vbuf.h
-qmgr_entry.o: ../../include/mail_params.h
-qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/vstream.h
 qmgr_entry.o: ../../include/vstring.h
-qmgr_entry.o: ../../include/recipient_list.h
 qmgr_entry.o: qmgr.h
-qmgr_entry.o: ../../include/scan_dir.h
-qmgr_job.o: qmgr_job.c
-qmgr_job.o: ../../include/sys_defs.h
-qmgr_job.o: ../../include/msg.h
+qmgr_entry.o: qmgr_entry.c
 qmgr_job.o: ../../include/htable.h
+qmgr_job.o: ../../include/msg.h
 qmgr_job.o: ../../include/mymalloc.h
 qmgr_job.o: ../../include/sane_time.h
-qmgr_job.o: qmgr.h
-qmgr_job.o: ../../include/vstream.h
-qmgr_job.o: ../../include/vbuf.h
 qmgr_job.o: ../../include/scan_dir.h
-qmgr_message.o: qmgr_message.c
-qmgr_message.o: ../../include/sys_defs.h
-qmgr_message.o: ../../include/msg.h
-qmgr_message.o: ../../include/mymalloc.h
-qmgr_message.o: ../../include/vstring.h
-qmgr_message.o: ../../include/vbuf.h
-qmgr_message.o: ../../include/vstream.h
-qmgr_message.o: ../../include/split_at.h
-qmgr_message.o: ../../include/valid_hostname.h
+qmgr_job.o: ../../include/sys_defs.h
+qmgr_job.o: ../../include/vbuf.h
+qmgr_job.o: ../../include/vstream.h
+qmgr_job.o: qmgr.h
+qmgr_job.o: qmgr_job.c
 qmgr_message.o: ../../include/argv.h
-qmgr_message.o: ../../include/stringops.h
-qmgr_message.o: ../../include/myflock.h
-qmgr_message.o: ../../include/sane_time.h
-qmgr_message.o: ../../include/dict.h
-qmgr_message.o: ../../include/mail_queue.h
-qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/attr.h
 qmgr_message.o: ../../include/canon_addr.h
-qmgr_message.o: ../../include/record.h
-qmgr_message.o: ../../include/rec_type.h
-qmgr_message.o: ../../include/sent.h
-qmgr_message.o: ../../include/deliver_request.h
-qmgr_message.o: ../../include/recipient_list.h
 qmgr_message.o: ../../include/deliver_completed.h
-qmgr_message.o: ../../include/opened.h
-qmgr_message.o: ../../include/verp_sender.h
-qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/deliver_request.h
+qmgr_message.o: ../../include/dict.h
 qmgr_message.o: ../../include/iostuff.h
-qmgr_message.o: ../../include/attr.h
+qmgr_message.o: ../../include/mail_params.h
+qmgr_message.o: ../../include/mail_proto.h
+qmgr_message.o: ../../include/mail_queue.h
+qmgr_message.o: ../../include/msg.h
+qmgr_message.o: ../../include/myflock.h
+qmgr_message.o: ../../include/mymalloc.h
+qmgr_message.o: ../../include/opened.h
 qmgr_message.o: ../../include/qmgr_user.h
-qmgr_message.o: ../../include/split_addr.h
-qmgr_message.o: ../../include/rewrite_clnt.h
+qmgr_message.o: ../../include/rec_type.h
+qmgr_message.o: ../../include/recipient_list.h
+qmgr_message.o: ../../include/record.h
 qmgr_message.o: ../../include/resolve_clnt.h
-qmgr_message.o: qmgr.h
+qmgr_message.o: ../../include/rewrite_clnt.h
+qmgr_message.o: ../../include/sane_time.h
 qmgr_message.o: ../../include/scan_dir.h
-qmgr_move.o: qmgr_move.c
-qmgr_move.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/sent.h
+qmgr_message.o: ../../include/split_addr.h
+qmgr_message.o: ../../include/split_at.h
+qmgr_message.o: ../../include/stringops.h
+qmgr_message.o: ../../include/sys_defs.h
+qmgr_message.o: ../../include/valid_hostname.h
+qmgr_message.o: ../../include/vbuf.h
+qmgr_message.o: ../../include/verp_sender.h
+qmgr_message.o: ../../include/vstream.h
+qmgr_message.o: ../../include/vstring.h
+qmgr_message.o: qmgr.h
+qmgr_message.o: qmgr_message.c
+qmgr_move.o: ../../include/mail_queue.h
+qmgr_move.o: ../../include/mail_scan_dir.h
 qmgr_move.o: ../../include/msg.h
-qmgr_move.o: ../../include/scan_dir.h
 qmgr_move.o: ../../include/recipient_list.h
-qmgr_move.o: ../../include/mail_queue.h
-qmgr_move.o: ../../include/vstring.h
+qmgr_move.o: ../../include/scan_dir.h
+qmgr_move.o: ../../include/sys_defs.h
 qmgr_move.o: ../../include/vbuf.h
 qmgr_move.o: ../../include/vstream.h
-qmgr_move.o: ../../include/mail_scan_dir.h
+qmgr_move.o: ../../include/vstring.h
 qmgr_move.o: qmgr.h
-qmgr_peer.o: qmgr_peer.c
-qmgr_peer.o: ../../include/sys_defs.h
-qmgr_peer.o: ../../include/msg.h
+qmgr_move.o: qmgr_move.c
 qmgr_peer.o: ../../include/htable.h
+qmgr_peer.o: ../../include/msg.h
 qmgr_peer.o: ../../include/mymalloc.h
-qmgr_peer.o: qmgr.h
-qmgr_peer.o: ../../include/vstream.h
-qmgr_peer.o: ../../include/vbuf.h
 qmgr_peer.o: ../../include/scan_dir.h
-qmgr_queue.o: qmgr_queue.c
-qmgr_queue.o: ../../include/sys_defs.h
-qmgr_queue.o: ../../include/msg.h
-qmgr_queue.o: ../../include/mymalloc.h
+qmgr_peer.o: ../../include/sys_defs.h
+qmgr_peer.o: ../../include/vbuf.h
+qmgr_peer.o: ../../include/vstream.h
+qmgr_peer.o: qmgr.h
+qmgr_peer.o: qmgr_peer.c
 qmgr_queue.o: ../../include/events.h
 qmgr_queue.o: ../../include/htable.h
 qmgr_queue.o: ../../include/mail_params.h
+qmgr_queue.o: ../../include/msg.h
+qmgr_queue.o: ../../include/mymalloc.h
 qmgr_queue.o: ../../include/recipient_list.h
-qmgr_queue.o: qmgr.h
-qmgr_queue.o: ../../include/vstream.h
-qmgr_queue.o: ../../include/vbuf.h
 qmgr_queue.o: ../../include/scan_dir.h
-qmgr_rcpt_list.o: qmgr_rcpt_list.c
-qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/sys_defs.h
+qmgr_queue.o: ../../include/vbuf.h
+qmgr_queue.o: ../../include/vstream.h
+qmgr_queue.o: qmgr.h
+qmgr_queue.o: qmgr_queue.c
 qmgr_rcpt_list.o: ../../include/mymalloc.h
-qmgr_rcpt_list.o: qmgr.h
-qmgr_rcpt_list.o: ../../include/vstream.h
-qmgr_rcpt_list.o: ../../include/vbuf.h
 qmgr_rcpt_list.o: ../../include/scan_dir.h
-qmgr_scan.o: qmgr_scan.c
-qmgr_scan.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/sys_defs.h
+qmgr_rcpt_list.o: ../../include/vbuf.h
+qmgr_rcpt_list.o: ../../include/vstream.h
+qmgr_rcpt_list.o: qmgr.h
+qmgr_rcpt_list.o: qmgr_rcpt_list.c
+qmgr_scan.o: ../../include/mail_scan_dir.h
 qmgr_scan.o: ../../include/msg.h
 qmgr_scan.o: ../../include/mymalloc.h
 qmgr_scan.o: ../../include/scan_dir.h
-qmgr_scan.o: ../../include/mail_scan_dir.h
-qmgr_scan.o: qmgr.h
-qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: ../../include/sys_defs.h
 qmgr_scan.o: ../../include/vbuf.h
-qmgr_transport.o: qmgr_transport.c
-qmgr_transport.o: ../../include/sys_defs.h
-qmgr_transport.o: ../../include/msg.h
-qmgr_transport.o: ../../include/htable.h
+qmgr_scan.o: ../../include/vstream.h
+qmgr_scan.o: qmgr.h
+qmgr_scan.o: qmgr_scan.c
+qmgr_transport.o: ../../include/attr.h
 qmgr_transport.o: ../../include/events.h
-qmgr_transport.o: ../../include/mymalloc.h
-qmgr_transport.o: ../../include/vstream.h
-qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/htable.h
 qmgr_transport.o: ../../include/iostuff.h
-qmgr_transport.o: ../../include/mail_proto.h
-qmgr_transport.o: ../../include/attr.h
-qmgr_transport.o: ../../include/recipient_list.h
 qmgr_transport.o: ../../include/mail_conf.h
 qmgr_transport.o: ../../include/mail_params.h
-qmgr_transport.o: qmgr.h
+qmgr_transport.o: ../../include/mail_proto.h
+qmgr_transport.o: ../../include/msg.h
+qmgr_transport.o: ../../include/mymalloc.h
+qmgr_transport.o: ../../include/recipient_list.h
 qmgr_transport.o: ../../include/scan_dir.h
+qmgr_transport.o: ../../include/sys_defs.h
+qmgr_transport.o: ../../include/vbuf.h
+qmgr_transport.o: ../../include/vstream.h
+qmgr_transport.o: qmgr.h
+qmgr_transport.o: qmgr_transport.c
index 9765206361e0da0e3ae0069b38e8c34dc06855e9..6b394eab6eb947ed35422b9e756397f7d23b3560 100644 (file)
@@ -149,6 +149,7 @@ struct QMGR_TRANSPORT {
                                         * updated */
     int     blocker_tag;               /* for marking blocker jobs */
     QMGR_TRANSPORT_LIST peers;         /* linkage */
+    char   *dsn;                       /* why unavailable */
     char   *reason;                    /* why unavailable */
 };
 
@@ -158,7 +159,7 @@ struct QMGR_TRANSPORT {
 typedef void (*QMGR_TRANSPORT_ALLOC_NOTIFY) (QMGR_TRANSPORT *, VSTREAM *);
 extern QMGR_TRANSPORT *qmgr_transport_select(void);
 extern void qmgr_transport_alloc(QMGR_TRANSPORT *, QMGR_TRANSPORT_ALLOC_NOTIFY);
-extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *);
+extern void qmgr_transport_throttle(QMGR_TRANSPORT *, const char *, const char *);
 extern void qmgr_transport_unthrottle(QMGR_TRANSPORT *);
 extern QMGR_TRANSPORT *qmgr_transport_create(const char *);
 extern QMGR_TRANSPORT *qmgr_transport_find(const char *);
@@ -187,6 +188,7 @@ struct QMGR_QUEUE {
     QMGR_ENTRY_LIST todo;              /* todo queue entries */
     QMGR_ENTRY_LIST busy;              /* messages on the wire */
     QMGR_QUEUE_LIST peers;             /* neighbor queues */
+    char   *dsn;                       /* why unavailable */
     char   *reason;                    /* why unavailable */
     time_t  clog_time_to_warn;         /* time of last warning */
     int     blocker_tag;               /* tagged if blocks job list */
@@ -199,7 +201,7 @@ extern int qmgr_queue_count;
 
 extern QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *, const char *, const char *);
 extern void qmgr_queue_done(QMGR_QUEUE *);
-extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *);
+extern void qmgr_queue_throttle(QMGR_QUEUE *, const char *, const char *);
 extern void qmgr_queue_unthrottle(QMGR_QUEUE *);
 extern QMGR_QUEUE *qmgr_queue_find(QMGR_TRANSPORT *, const char *);
 
@@ -371,14 +373,15 @@ extern void qmgr_peer_free(QMGR_PEER *);
  /*
   * qmgr_defer.c
   */
-extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *);
-extern void qmgr_defer_todo(QMGR_QUEUE *, const char *);
-extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *);
+extern void qmgr_defer_transport(QMGR_TRANSPORT *, const char *, const char *);
+extern void qmgr_defer_todo(QMGR_QUEUE *, const char *, const char *);
+extern void qmgr_defer_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *, const char *);
 
  /*
   * qmgr_bounce.c
   */
-extern void PRINTFLIKE(3, 4) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *, const char *,...);
+extern void PRINTFLIKE(4, 5) qmgr_bounce_recipient(QMGR_MESSAGE *, QMGR_RCPT *,
+                                           const char *, const char *,...);
 
  /*
   * qmgr_deliver.c
index 92196bdaa37edf236c21db24a771fab4296e43c3..8daffb2d2aae09cb1ecb71aaf950ea8e3e7f997e 100644 (file)
@@ -6,9 +6,11 @@
 /* SYNOPSIS
 /*     #include "qmgr.h"
 /*
-/*     QMGR_QUEUE *qmgr_bounce_recipient(message, recipient, format, ...)
+/*     QMGR_QUEUE *qmgr_bounce_recipient(message, recipient,
+/*                                     dsn, format, ...)
 /*     QMGR_MESSAGE *message;
 /*     QMGR_RCPT *recipient;
+/*     const char *dsn;
 /*     const char *format;
 /* DESCRIPTION
 /*     qmgr_bounce_recipient() produces a bounce log record.
@@ -22,6 +24,8 @@
 /*     Open queue file with the message being bounced.
 /* .IP recipient
 /*     The recipient that will not be delivered.
+/* .IP dsn
+/*     RFC 1893 detail code.
 /* .IP format
 /*     Free-format text that describes why delivery will not happen.
 /* DIAGNOSTICS
@@ -61,7 +65,7 @@
 /* qmgr_bounce_recipient - bounce one message recipient */
 
 void    qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
-                                     const char *format,...)
+                                   const char *dsn, const char *format,...)
 {
     va_list ap;
     int     status;
@@ -69,8 +73,8 @@ void    qmgr_bounce_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
     va_start(ap, format);
     status = vbounce_append(message->tflags, message->queue_id,
                            recipient->orig_rcpt, recipient->address,
-                           recipient->offset, "none", message->arrival_time,
-                           format, ap);
+                           recipient->offset, "none", dsn,
+                           message->arrival_time, format, ap);
     va_end(ap);
 
     if (status == 0)
index 715adf435bd2e91404130db057adf54fbe552adf..59f1892e01faf90d795ee2aa025ef987b2ada5f9 100644 (file)
@@ -6,17 +6,20 @@
 /* SYNOPSIS
 /*     #include "qmgr.h"
 /*
-/*     void    qmgr_defer_recipient(message, recipient, reason)
+/*     void    qmgr_defer_recipient(message, recipient, dsn, reason)
 /*     QMGR_MESSAGE *message;
 /*     QMGR_RCPT *recipient;
+/*     const char *dsn;
 /*     const char *reason;
 /*
-/*     void    qmgr_defer_todo(queue, reason)
+/*     void    qmgr_defer_todo(queue, dsn, reason)
 /*     QMGR_QUEUE *queue;
+/*     const char *dsn;
 /*     const char *reason;
 /*
-/*     QMGR_QUEUE *qmgr_defer_transport(transport, reason)
+/*     QMGR_QUEUE *qmgr_defer_transport(transport, dsn, reason)
 /*     QMGR_TRANSPORT *transport;
+/*     const char *dsn;
 /*     const char *reason;
 /* DESCRIPTION
 /*     qmgr_defer_recipient() defers delivery of the named message to
@@ -43,6 +46,8 @@
 /*     host (or local user).
 /* .IP transport
 /*     Specifies a message delivery transport.
+/* .IP dsn
+/*     X.YY.ZZ Error detail as specified in RFC 1893.
 /* .IP reason
 /*     Free-format text that describes why delivery is deferred; this
 /*     used for logging purposes, and for updating the message-specific
@@ -86,7 +91,8 @@
 
 /* qmgr_defer_transport - defer todo entries for named transport */
 
-void    qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
+void    qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *dsn,
+                                    const char *reason)
 {
     char   *myname = "qmgr_defer_transport";
     QMGR_QUEUE *queue;
@@ -95,23 +101,25 @@ void    qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
     /*
      * Sanity checks.
      */
-    if (reason == 0)
+    if (dsn == 0 || *dsn == 0)
+       msg_panic("%s: null dsn", myname);
+    if (reason == 0 || *reason == 0)
        msg_panic("%s: null reason", myname);
     if (msg_verbose)
-       msg_info("defer transport %s: %s", transport->name, reason);
+       msg_info("defer transport %s: %s %s", transport->name, dsn, reason);
 
     /*
      * Proceed carefully. Queues may disappear as a side effect.
      */
     for (queue = transport->queue_list.next; queue; queue = next) {
        next = queue->peers.next;
-       qmgr_defer_todo(queue, reason);
+       qmgr_defer_todo(queue, dsn, reason);
     }
 }
 
 /* qmgr_defer_todo - defer all todo queue entries for specific site */
 
-void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
+void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *dsn, const char *reason)
 {
     char   *myname = "qmgr_defer_todo";
     QMGR_ENTRY *entry;
@@ -123,10 +131,12 @@ void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
     /*
      * Sanity checks.
      */
-    if (reason == 0)
+    if (dsn == 0 || *dsn == 0)
+       msg_panic("%s: null dsn", myname);
+    if (reason == 0 || *reason == 0)
        msg_panic("%s: null reason", myname);
     if (msg_verbose)
-       msg_info("defer site %s: %s", queue->name, reason);
+       msg_info("defer site %s: %s %s", queue->name, dsn, reason);
 
     /*
      * Proceed carefully. Queue entries will disappear as a side effect.
@@ -136,7 +146,7 @@ void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
        message = entry->message;
        for (nrcpt = 0; nrcpt < entry->rcpt_list.len; nrcpt++) {
            recipient = entry->rcpt_list.info + nrcpt;
-           qmgr_defer_recipient(message, recipient, reason);
+           qmgr_defer_recipient(message, recipient, dsn, reason);
        }
        qmgr_entry_done(entry, QMGR_QUEUE_TODO);
     }
@@ -145,14 +155,16 @@ void    qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
 /* qmgr_defer_recipient - defer delivery of specific recipient */
 
 void    qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
-                                    const char *reason)
+                                    const char *dsn, const char *reason)
 {
     char   *myname = "qmgr_defer_recipient";
 
     /*
      * Sanity checks.
      */
-    if (reason == 0)
+    if (dsn == 0 || *dsn == 0)
+       msg_panic("%s: null dsn", myname);
+    if (reason == 0 || *reason == 0)
        msg_panic("%s: reason 0", myname);
 
     /*
@@ -160,7 +172,7 @@ void    qmgr_defer_recipient(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
      */
     message->flags |= defer_append(message->tflags, message->queue_id,
                                   recipient->orig_rcpt, recipient->address,
-                                  recipient->offset, "none",
+                                  recipient->offset, "none", dsn,
                                   message->arrival_time,
-       "delivery temporarily suspended: %s", reason);
+                             "delivery temporarily suspended: %s", reason);
 }
index 28463a0e651495ad77a33fab73c83817bb6f4738..486963d53882ebcb9e4fbf25fe5bb673eb0bb122 100644 (file)
@@ -60,6 +60,7 @@
 #include <vstring_vstream.h>
 #include <events.h>
 #include <iostuff.h>
+#include <stringops.h>
 
 /* Global library. */
 
@@ -69,6 +70,7 @@
 #include <mail_params.h>
 #include <deliver_request.h>
 #include <verp_sender.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -167,9 +169,9 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
               ATTR_TYPE_STR, MAIL_ATTR_PROTO_NAME, message->client_proto,
               ATTR_TYPE_STR, MAIL_ATTR_HELO_NAME, message->client_helo,
               ATTR_TYPE_STR, MAIL_ATTR_SASL_METHOD, message->sasl_method,
-              ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
+            ATTR_TYPE_STR, MAIL_ATTR_SASL_USERNAME, message->sasl_username,
               ATTR_TYPE_STR, MAIL_ATTR_SASL_SENDER, message->sasl_sender,
-              ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
+            ATTR_TYPE_STR, MAIL_ATTR_RWR_CONTEXT, message->rewrite_context,
               ATTR_TYPE_END);
     if (sender_buf != 0)
        vstring_free(sender_buf);
@@ -215,6 +217,7 @@ static void qmgr_deliver_update(int unused_event, char *context)
     QMGR_MESSAGE *message = entry->message;
     VSTRING *reason = vstring_alloc(1);
     int     status;
+    DSN_SPLIT dp;
 
     /*
      * The message transport has responded. Stop the watchdog timer.
@@ -241,10 +244,11 @@ static void qmgr_deliver_update(int unused_event, char *context)
      */
     if (status == DELIVER_STAT_CRASH) {
        message->flags |= DELIVER_STAT_DEFER;
-       qmgr_transport_throttle(transport, "unknown mail transport error");
+       qmgr_transport_throttle(transport, "4.3.0",
+                               "unknown mail transport error");
        msg_warn("transport %s failure -- see a previous warning/fatal/panic logfile record for the problem description",
                 transport->name);
-       qmgr_defer_transport(transport, transport->reason);
+       qmgr_defer_transport(transport, transport->dsn, transport->reason);
     }
 
     /*
@@ -259,9 +263,12 @@ static void qmgr_deliver_update(int unused_event, char *context)
     if (status == DELIVER_STAT_DEFER) {
        message->flags |= DELIVER_STAT_DEFER;
        if (VSTRING_LEN(reason)) {
-           qmgr_queue_throttle(queue, vstring_str(reason));
+           /* Sanitize the DSN status from delivery agent. */
+           dsn_split(&dp, "4.0.0", printable(vstring_str(reason), '?'));
+           qmgr_queue_throttle(queue, dp.dsn, *dp.text ?
+                               dp.text : "unknown problem");
            if (queue->window == 0)
-               qmgr_defer_todo(queue, queue->reason);
+               qmgr_defer_todo(queue, queue->dsn, queue->reason);
        }
     }
 
@@ -302,8 +309,9 @@ void    qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
      * while some other queue manipulation is happening.
      */
     if (qmgr_deliver_initial_reply(stream) != 0) {
-       qmgr_transport_throttle(transport, "mail transport unavailable");
-       qmgr_defer_transport(transport, transport->reason);
+       qmgr_transport_throttle(transport, "4.3.0",
+                               "mail transport unavailable");
+       qmgr_defer_transport(transport, transport->dsn, transport->reason);
        (void) vstream_fclose(stream);
        return;
     }
@@ -328,8 +336,9 @@ void    qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
      */
     if (qmgr_deliver_send_request(entry, stream) < 0) {
        qmgr_entry_unselect(entry);
-       qmgr_transport_throttle(transport, "mail transport unavailable");
-       qmgr_defer_transport(transport, transport->reason);
+       qmgr_transport_throttle(transport, "4.3.0",
+                               "mail transport unavailable");
+       qmgr_defer_transport(transport, transport->dsn, transport->reason);
        /* warning: entry may be a dangling pointer here */
        (void) vstream_fclose(stream);
        return;
index 9d341c85c5aaf9b5321b3d30698ace7835eb67e4..84b8d278d557028c8dc967fce0b33cbc93202973 100644 (file)
@@ -826,10 +826,11 @@ static int qmgr_resolve_one(QMGR_MESSAGE *message, QMGR_RCPT *recipient,
     else
        resolve_clnt_verify(addr, reply);
     if (reply->flags & RESOLVE_FLAG_FAIL) {
-       qmgr_defer_recipient(message, recipient, "address resolver failure");
+       qmgr_defer_recipient(message, recipient,
+                            "4.3.0", "address resolver failure");
        return (-1);
     } else if (reply->flags & RESOLVE_FLAG_ERROR) {
-       qmgr_bounce_recipient(message, recipient,
+       qmgr_bounce_recipient(message, recipient, "5.1.3",
                              "bad address syntax: \"%s\"", addr);
        return (-1);
     } else {
@@ -924,7 +925,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * the queue manager process does not help.
         */
        if (recipient->address[0] == 0) {
-           qmgr_bounce_recipient(message, recipient,
+           qmgr_bounce_recipient(message, recipient, "5.1.3",
                                  "null recipient address");
            continue;
        }
@@ -941,7 +942,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * where it cannot be bypassed.
         */
        if (var_allow_min_user == 0 && recipient->address[0] == '-') {
-           qmgr_bounce_recipient(message, recipient,
+           qmgr_bounce_recipient(message, recipient, "5.1.3",
                                  "invalid recipient syntax: \"%s\"",
                                  recipient->address);
            continue;
@@ -965,7 +966,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
                && !var_double_bounce_sender[len]) {
                status = sent(message->tflags, message->queue_id,
                              recipient->orig_rcpt, recipient->address,
-                          recipient->offset, "none", message->arrival_time,
+                             recipient->offset, "none", "2.0.0",
+                             message->arrival_time,
                         "undeliverable postmaster notification discarded");
                if (status == 0) {
                    deliver_completed(message->fp, recipient->offset);
@@ -988,7 +990,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
                if (strcmp(*cpp, STR(reply.transport)) == 0)
                    break;
            if (*cpp) {
-               qmgr_defer_recipient(message, recipient, "deferred transport");
+               qmgr_defer_recipient(message, recipient,
+                                    "4.3.2", "deferred transport");
                continue;
            }
        }
@@ -1006,7 +1009,8 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * This transport is dead. Defer delivery to this recipient.
         */
        if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) != 0) {
-           qmgr_defer_recipient(message, recipient, transport->reason);
+           qmgr_defer_recipient(message, recipient, transport->dsn,
+                                transport->reason);
            continue;
        }
 
@@ -1073,7 +1077,7 @@ static void qmgr_message_resolve(QMGR_MESSAGE *message)
         * This queue is dead. Defer delivery to this recipient.
         */
        if (queue->window == 0) {
-           qmgr_defer_recipient(message, recipient, queue->reason);
+           qmgr_defer_recipient(message, recipient, queue->dsn, queue->reason);
            continue;
        }
 
index c7d88e83db6cad53130dee3c1ae85c0d41b30e46..7371a6a3d9052abd9f12f1381d587f3e0f162b24 100644 (file)
@@ -20,8 +20,9 @@
 /*     QMGR_TRANSPORT *transport;
 /*     const char *name;
 /*
-/*     void    qmgr_queue_throttle(queue, reason)
+/*     void    qmgr_queue_throttle(queue, dsn, reason)
 /*     QMGR_QUEUE *queue;
+/*     const char *dsn;
 /*     const char *reason;
 /*
 /*     void    qmgr_queue_unthrottle(queue)
@@ -131,6 +132,10 @@ void    qmgr_queue_unthrottle(QMGR_QUEUE *queue)
      */
     if (queue->window == 0) {
        event_cancel_timer(qmgr_queue_unthrottle_wrapper, (char *) queue);
+       if (queue->dsn == 0)
+           msg_panic("%s: queue %s: window 0 dsn 0", myname, queue->name);
+       myfree(queue->dsn);
+       queue->dsn = 0;
        if (queue->reason == 0)
            msg_panic("%s: queue %s: window 0 reason 0", myname, queue->name);
        myfree(queue->reason);
@@ -152,18 +157,22 @@ void    qmgr_queue_unthrottle(QMGR_QUEUE *queue)
 
 /* qmgr_queue_throttle - handle destination delivery failure */
 
-void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
+void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *dsn,
+                                   const char *reason)
 {
     char   *myname = "qmgr_queue_throttle";
 
     /*
      * Sanity checks.
      */
+    if (queue->dsn)
+       msg_panic("%s: queue %s: spurious dsn %s",
+                 myname, queue->name, queue->dsn);
     if (queue->reason)
        msg_panic("%s: queue %s: spurious reason %s",
                  myname, queue->name, queue->reason);
     if (msg_verbose)
-       msg_info("%s: queue %s: %s", myname, queue->name, reason);
+       msg_info("%s: queue %s: %s %s", myname, queue->name, dsn, reason);
 
     /*
      * Decrease the destination's concurrency limit until we reach zero, at
@@ -178,6 +187,7 @@ void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
      * Special case for a site that just was declared dead.
      */
     if (queue->window == 0) {
+       queue->dsn = mystrdup(dsn);
        queue->reason = mystrdup(reason);
        event_request_timer(qmgr_queue_unthrottle_wrapper,
                            (char *) queue, var_min_backoff_time);
@@ -203,6 +213,9 @@ void    qmgr_queue_done(QMGR_QUEUE *queue)
        msg_panic("%s: queue not empty: %s", myname, queue->name);
     if (queue->window <= 0)
        msg_panic("%s: window %d", myname, queue->window);
+    if (queue->dsn)
+       msg_panic("%s: queue %s: spurious dsn %s",
+                 myname, queue->name, queue->dsn);
     if (queue->reason)
        msg_panic("%s: queue %s: spurious reason %s",
                  myname, queue->name, queue->reason);
@@ -242,6 +255,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name,
     queue->window = transport->init_dest_concurrency;
     QMGR_LIST_INIT(queue->todo);
     QMGR_LIST_INIT(queue->busy);
+    queue->dsn = 0;
     queue->reason = 0;
     queue->clog_time_to_warn = 0;
     queue->blocker_tag = 0;
index 204880962b33970e973d0a92a92d79ba624aabce..41e9c7b2b46a8b5734cb052ef3322a0b4d52d12b 100644 (file)
@@ -18,8 +18,9 @@
 /*     QMGR_TRANSPORT *transport;
 /*     void    (*notify)(QMGR_TRANSPORT *transport, VSTREAM *fp);
 /*
-/*     void    qmgr_transport_throttle(transport, reason)
+/*     void    qmgr_transport_throttle(transport, dsn, reason)
 /*     QMGR_TRANSPORT *transport;
+/*     const char *dsn;
 /*     const char *reason;
 /*
 /*     void    qmgr_transport_unthrottle(transport)
@@ -133,6 +134,10 @@ void    qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
        if (msg_verbose)
            msg_info("%s: transport %s", myname, transport->name);
        transport->flags &= ~QMGR_TRANSPORT_STAT_DEAD;
+       if (transport->dsn == 0)
+           msg_panic("%s: transport %s: null dsn", myname, transport->name);
+       myfree(transport->dsn);
+       transport->dsn = 0;
        if (transport->reason == 0)
            msg_panic("%s: transport %s: null reason", myname, transport->name);
        myfree(transport->reason);
@@ -144,7 +149,8 @@ void    qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
 
 /* qmgr_transport_throttle - disable delivery process allocation */
 
-void    qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
+void    qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *dsn,
+                                       const char *reason)
 {
     char   *myname = "qmgr_transport_throttle";
 
@@ -155,9 +161,13 @@ void    qmgr_transport_throttle(QMGR_TRANSPORT *transport, const char *reason)
      */
     if ((transport->flags & QMGR_TRANSPORT_STAT_DEAD) == 0) {
        if (msg_verbose)
-           msg_info("%s: transport %s: reason: %s",
-                    myname, transport->name, reason);
+           msg_info("%s: transport %s: dsn: %s reason: %s",
+                    myname, transport->name, dsn, reason);
        transport->flags |= QMGR_TRANSPORT_STAT_DEAD;
+       if (transport->dsn)
+           msg_panic("%s: transport %s: spurious dsn: %s",
+                     myname, transport->name, transport->dsn);
+       transport->dsn = mystrdup(dsn);
        if (transport->reason)
            msg_panic("%s: transport %s: spurious reason: %s",
                      myname, transport->name, transport->reason);
@@ -291,7 +301,7 @@ void    qmgr_transport_alloc(QMGR_TRANSPORT *transport, QMGR_TRANSPORT_ALLOC_NOT
 
     if ((stream = mail_connect(MAIL_CLASS_PRIVATE, transport->name, BLOCK_MODE)) == 0) {
        msg_warn("connect to transport %s: %m", transport->name);
-       qmgr_transport_throttle(transport, "transport is unavailable");
+       qmgr_transport_throttle(transport, "4.3.0", "transport is unavailable");
        return;
     }
     alloc = (QMGR_TRANSPORT_ALLOC *) mymalloc(sizeof(*alloc));
@@ -361,6 +371,7 @@ QMGR_TRANSPORT *qmgr_transport_create(const char *name)
     transport->candidate_cache_current = 0;
     transport->candidate_cache_time = (time_t) 0;
     transport->blocker_tag = 1;
+    transport->dsn = 0;
     transport->reason = 0;
     if (qmgr_transport_byname == 0)
        qmgr_transport_byname = htable_create(10);
index b610438404ce76787ed7df12e3857a5f79057b00..4b83fa5e91b0d07b13c5c667e5d2e6feb3e4e441 100644 (file)
@@ -59,70 +59,71 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-qmqpd.o: qmqpd.c
-qmqpd.o: ../../include/sys_defs.h
-qmqpd.o: ../../include/msg.h
-qmqpd.o: ../../include/mymalloc.h
-qmqpd.o: ../../include/vstring.h
-qmqpd.o: ../../include/vbuf.h
-qmqpd.o: ../../include/vstream.h
-qmqpd.o: ../../include/netstring.h
-qmqpd.o: ../../include/dict.h
 qmqpd.o: ../../include/argv.h
-qmqpd.o: ../../include/mail_params.h
-qmqpd.o: ../../include/record.h
-qmqpd.o: ../../include/rec_type.h
-qmqpd.o: ../../include/mail_proto.h
-qmqpd.o: ../../include/iostuff.h
 qmqpd.o: ../../include/attr.h
 qmqpd.o: ../../include/cleanup_user.h
-qmqpd.o: ../../include/mail_date.h
-qmqpd.o: ../../include/mail_conf.h
 qmqpd.o: ../../include/debug_peer.h
+qmqpd.o: ../../include/dict.h
+qmqpd.o: ../../include/input_transp.h
+qmqpd.o: ../../include/iostuff.h
+qmqpd.o: ../../include/lex_822.h
+qmqpd.o: ../../include/mail_conf.h
+qmqpd.o: ../../include/mail_date.h
+qmqpd.o: ../../include/mail_params.h
+qmqpd.o: ../../include/mail_proto.h
+qmqpd.o: ../../include/mail_server.h
 qmqpd.o: ../../include/mail_stream.h
-qmqpd.o: ../../include/namadr_list.h
 qmqpd.o: ../../include/match_list.h
 qmqpd.o: ../../include/match_ops.h
+qmqpd.o: ../../include/match_parent_style.h
+qmqpd.o: ../../include/msg.h
+qmqpd.o: ../../include/mymalloc.h
+qmqpd.o: ../../include/namadr_list.h
+qmqpd.o: ../../include/netstring.h
 qmqpd.o: ../../include/quote_822_local.h
 qmqpd.o: ../../include/quote_flags.h
-qmqpd.o: ../../include/match_parent_style.h
-qmqpd.o: ../../include/lex_822.h
+qmqpd.o: ../../include/rec_type.h
+qmqpd.o: ../../include/record.h
+qmqpd.o: ../../include/sys_defs.h
+qmqpd.o: ../../include/vbuf.h
 qmqpd.o: ../../include/verp_sender.h
-qmqpd.o: ../../include/input_transp.h
-qmqpd.o: ../../include/mail_server.h
+qmqpd.o: ../../include/vstream.h
+qmqpd.o: ../../include/vstring.h
+qmqpd.o: qmqpd.c
 qmqpd.o: qmqpd.h
-qmqpd_peer.o: qmqpd_peer.c
-qmqpd_peer.o: ../../include/sys_defs.h
+qmqpd_peer.o: ../../include/attr.h
+qmqpd_peer.o: ../../include/inet_proto.h
+qmqpd_peer.o: ../../include/iostuff.h
+qmqpd_peer.o: ../../include/mail_proto.h
+qmqpd_peer.o: ../../include/mail_stream.h
 qmqpd_peer.o: ../../include/msg.h
+qmqpd_peer.o: ../../include/myaddrinfo.h
 qmqpd_peer.o: ../../include/mymalloc.h
+qmqpd_peer.o: ../../include/sock_addr.h
 qmqpd_peer.o: ../../include/stringops.h
-qmqpd_peer.o: ../../include/vstring.h
+qmqpd_peer.o: ../../include/sys_defs.h
+qmqpd_peer.o: ../../include/valid_hostname.h
+qmqpd_peer.o: ../../include/valid_mailhost_addr.h
 qmqpd_peer.o: ../../include/vbuf.h
-qmqpd_peer.o: ../../include/myaddrinfo.h
-qmqpd_peer.o: ../../include/sock_addr.h
-qmqpd_peer.o: ../../include/inet_proto.h
-qmqpd_peer.o: ../../include/mail_proto.h
 qmqpd_peer.o: ../../include/vstream.h
-qmqpd_peer.o: ../../include/iostuff.h
-qmqpd_peer.o: ../../include/attr.h
-qmqpd_peer.o: ../../include/valid_mailhost_addr.h
-qmqpd_peer.o: ../../include/valid_hostname.h
+qmqpd_peer.o: ../../include/vstring.h
 qmqpd_peer.o: qmqpd.h
-qmqpd_peer.o: ../../include/mail_stream.h
-qmqpd_state.o: qmqpd_state.c
-qmqpd_state.o: ../../include/sys_defs.h
+qmqpd_peer.o: qmqpd_peer.c
+qmqpd_state.o: ../../include/attr.h
+qmqpd_state.o: ../../include/cleanup_user.h
+qmqpd_state.o: ../../include/iostuff.h
+qmqpd_state.o: ../../include/mail_proto.h
+qmqpd_state.o: ../../include/mail_stream.h
 qmqpd_state.o: ../../include/mymalloc.h
-qmqpd_state.o: ../../include/vstream.h
+qmqpd_state.o: ../../include/sys_defs.h
 qmqpd_state.o: ../../include/vbuf.h
+qmqpd_state.o: ../../include/vstream.h
 qmqpd_state.o: ../../include/vstring.h
-qmqpd_state.o: ../../include/mail_stream.h
-qmqpd_state.o: ../../include/cleanup_user.h
-qmqpd_state.o: ../../include/mail_proto.h
-qmqpd_state.o: ../../include/iostuff.h
-qmqpd_state.o: ../../include/attr.h
 qmqpd_state.o: qmqpd.h
+qmqpd_state.o: qmqpd_state.c
index 9ce8504943dbc88181fa833574844b13ab5b8f3b..3274b4cbdb9cee4ea9d29c3d01a40253450ef8ec 100644 (file)
@@ -47,24 +47,25 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-scache.o: scache.c
-scache.o: ../../include/sys_defs.h
-scache.o: ../../include/msg.h
-scache.o: ../../include/iostuff.h
-scache.o: ../../include/htable.h
-scache.o: ../../include/ring.h
+scache.o: ../../include/attr.h
 scache.o: ../../include/events.h
+scache.o: ../../include/htable.h
+scache.o: ../../include/iostuff.h
+scache.o: ../../include/mail_conf.h
 scache.o: ../../include/mail_params.h
 scache.o: ../../include/mail_proto.h
-scache.o: ../../include/vstream.h
-scache.o: ../../include/vbuf.h
-scache.o: ../../include/attr.h
+scache.o: ../../include/mail_server.h
+scache.o: ../../include/msg.h
+scache.o: ../../include/ring.h
 scache.o: ../../include/scache.h
+scache.o: ../../include/sys_defs.h
+scache.o: ../../include/vbuf.h
+scache.o: ../../include/vstream.h
 scache.o: ../../include/vstring.h
-scache.o: ../../include/mail_server.h
-scache.o: ../../include/mail_conf.h
+scache.o: scache.c
index 364e6a15aedfa1afd897127ce027329e4475e197..b084ba65e7b13280b738fa0a3a131c93bbf9299a 100644 (file)
@@ -47,49 +47,50 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-sendmail.o: sendmail.c
-sendmail.o: ../../include/sys_defs.h
-sendmail.o: ../../include/msg.h
-sendmail.o: ../../include/mymalloc.h
-sendmail.o: ../../include/vstream.h
-sendmail.o: ../../include/vbuf.h
-sendmail.o: ../../include/msg_vstream.h
-sendmail.o: ../../include/msg_syslog.h
-sendmail.o: ../../include/vstring_vstream.h
-sendmail.o: ../../include/vstring.h
-sendmail.o: ../../include/username.h
-sendmail.o: ../../include/fullname.h
 sendmail.o: ../../include/argv.h
-sendmail.o: ../../include/safe.h
-sendmail.o: ../../include/iostuff.h
-sendmail.o: ../../include/stringops.h
-sendmail.o: ../../include/set_ugid.h
-sendmail.o: ../../include/connect.h
-sendmail.o: ../../include/split_at.h
-sendmail.o: ../../include/mail_queue.h
-sendmail.o: ../../include/mail_proto.h
 sendmail.o: ../../include/attr.h
-sendmail.o: ../../include/mail_params.h
-sendmail.o: ../../include/record.h
-sendmail.o: ../../include/rec_type.h
-sendmail.o: ../../include/rec_streamlf.h
-sendmail.o: ../../include/mail_conf.h
 sendmail.o: ../../include/cleanup_user.h
-sendmail.o: ../../include/mail_task.h
-sendmail.o: ../../include/mail_run.h
+sendmail.o: ../../include/connect.h
 sendmail.o: ../../include/debug_process.h
-sendmail.o: ../../include/tok822.h
-sendmail.o: ../../include/resolve_clnt.h
+sendmail.o: ../../include/deliver_request.h
+sendmail.o: ../../include/fullname.h
+sendmail.o: ../../include/header_opts.h
+sendmail.o: ../../include/iostuff.h
+sendmail.o: ../../include/mail_conf.h
 sendmail.o: ../../include/mail_flush.h
+sendmail.o: ../../include/mail_params.h
+sendmail.o: ../../include/mail_proto.h
+sendmail.o: ../../include/mail_queue.h
+sendmail.o: ../../include/mail_run.h
 sendmail.o: ../../include/mail_stream.h
-sendmail.o: ../../include/verp_sender.h
-sendmail.o: ../../include/deliver_request.h
-sendmail.o: ../../include/recipient_list.h
+sendmail.o: ../../include/mail_task.h
 sendmail.o: ../../include/mime_state.h
-sendmail.o: ../../include/header_opts.h
+sendmail.o: ../../include/msg.h
+sendmail.o: ../../include/msg_syslog.h
+sendmail.o: ../../include/msg_vstream.h
+sendmail.o: ../../include/mymalloc.h
+sendmail.o: ../../include/rec_streamlf.h
+sendmail.o: ../../include/rec_type.h
+sendmail.o: ../../include/recipient_list.h
+sendmail.o: ../../include/record.h
+sendmail.o: ../../include/resolve_clnt.h
+sendmail.o: ../../include/safe.h
+sendmail.o: ../../include/set_ugid.h
+sendmail.o: ../../include/split_at.h
+sendmail.o: ../../include/stringops.h
+sendmail.o: ../../include/sys_defs.h
+sendmail.o: ../../include/tok822.h
 sendmail.o: ../../include/user_acl.h
+sendmail.o: ../../include/username.h
+sendmail.o: ../../include/vbuf.h
+sendmail.o: ../../include/verp_sender.h
+sendmail.o: ../../include/vstream.h
+sendmail.o: ../../include/vstring.h
+sendmail.o: ../../include/vstring_vstream.h
+sendmail.o: sendmail.c
index 285d77adc0e953a6b9557639d3bc174349fddda9..4d7c8cd934c9571276b7fdb1e49a7447fc9ce34f 100644 (file)
@@ -47,35 +47,36 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-showq.o: showq.c
-showq.o: ../../include/sys_defs.h
-showq.o: ../../include/msg.h
-showq.o: ../../include/scan_dir.h
-showq.o: ../../include/vstring.h
-showq.o: ../../include/vbuf.h
-showq.o: ../../include/vstream.h
-showq.o: ../../include/vstring_vstream.h
-showq.o: ../../include/stringops.h
-showq.o: ../../include/mymalloc.h
+showq.o: ../../include/attr.h
+showq.o: ../../include/bounce_log.h
 showq.o: ../../include/htable.h
-showq.o: ../../include/mail_queue.h
-showq.o: ../../include/mail_open_ok.h
-showq.o: ../../include/mail_proto.h
 showq.o: ../../include/iostuff.h
-showq.o: ../../include/attr.h
+showq.o: ../../include/mail_addr.h
+showq.o: ../../include/mail_conf.h
 showq.o: ../../include/mail_date.h
+showq.o: ../../include/mail_open_ok.h
 showq.o: ../../include/mail_params.h
+showq.o: ../../include/mail_proto.h
+showq.o: ../../include/mail_queue.h
 showq.o: ../../include/mail_scan_dir.h
-showq.o: ../../include/mail_conf.h
-showq.o: ../../include/record.h
-showq.o: ../../include/rec_type.h
+showq.o: ../../include/mail_server.h
+showq.o: ../../include/msg.h
+showq.o: ../../include/mymalloc.h
 showq.o: ../../include/quote_822_local.h
 showq.o: ../../include/quote_flags.h
-showq.o: ../../include/mail_addr.h
-showq.o: ../../include/bounce_log.h
-showq.o: ../../include/mail_server.h
+showq.o: ../../include/rec_type.h
+showq.o: ../../include/record.h
+showq.o: ../../include/scan_dir.h
+showq.o: ../../include/stringops.h
+showq.o: ../../include/sys_defs.h
+showq.o: ../../include/vbuf.h
+showq.o: ../../include/vstream.h
+showq.o: ../../include/vstring.h
+showq.o: ../../include/vstring_vstream.h
+showq.o: showq.c
index 16cae7bd2d9c38df638aae7a39d70d0272e02b02..2e464af0aa8ea8084d6593dbeb0248b34ebe8940 100644 (file)
@@ -69,405 +69,421 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-smtp.o: smtp.c
-smtp.o: ../../include/sys_defs.h
-smtp.o: ../../include/dict.h
-smtp.o: ../../include/vstream.h
-smtp.o: ../../include/vbuf.h
 smtp.o: ../../include/argv.h
+smtp.o: ../../include/debug_peer.h
+smtp.o: ../../include/deliver_request.h
+smtp.o: ../../include/dict.h
+smtp.o: ../../include/dsn_util.h
+smtp.o: ../../include/ext_prop.h
+smtp.o: ../../include/flush_clnt.h
+smtp.o: ../../include/htable.h
+smtp.o: ../../include/mail_conf.h
+smtp.o: ../../include/mail_params.h
+smtp.o: ../../include/mail_server.h
+smtp.o: ../../include/maps.h
+smtp.o: ../../include/match_list.h
+smtp.o: ../../include/match_ops.h
 smtp.o: ../../include/msg.h
 smtp.o: ../../include/mymalloc.h
 smtp.o: ../../include/name_mask.h
-smtp.o: ../../include/deliver_request.h
-smtp.o: ../../include/vstring.h
 smtp.o: ../../include/recipient_list.h
-smtp.o: ../../include/mail_params.h
-smtp.o: ../../include/mail_conf.h
-smtp.o: ../../include/debug_peer.h
-smtp.o: ../../include/flush_clnt.h
+smtp.o: ../../include/resolve_clnt.h
 smtp.o: ../../include/scache.h
 smtp.o: ../../include/string_list.h
-smtp.o: ../../include/match_list.h
-smtp.o: ../../include/match_ops.h
-smtp.o: ../../include/maps.h
-smtp.o: ../../include/ext_prop.h
-smtp.o: ../../include/mail_server.h
-smtp.o: smtp.h
-smtp.o: ../../include/htable.h
-smtp.o: ../../include/tok822.h
-smtp.o: ../../include/resolve_clnt.h
+smtp.o: ../../include/sys_defs.h
 smtp.o: ../../include/tls.h
+smtp.o: ../../include/tok822.h
+smtp.o: ../../include/vbuf.h
+smtp.o: ../../include/vstream.h
+smtp.o: ../../include/vstring.h
+smtp.o: smtp.c
+smtp.o: smtp.h
 smtp.o: smtp_sasl.h
-smtp_addr.o: smtp_addr.c
-smtp_addr.o: ../../include/sys_defs.h
-smtp_addr.o: ../../include/msg.h
-smtp_addr.o: ../../include/vstring.h
-smtp_addr.o: ../../include/vbuf.h
-smtp_addr.o: ../../include/mymalloc.h
+smtp_addr.o: ../../include/argv.h
+smtp_addr.o: ../../include/deliver_request.h
+smtp_addr.o: ../../include/dict.h
+smtp_addr.o: ../../include/dns.h
+smtp_addr.o: ../../include/dsn_util.h
+smtp_addr.o: ../../include/htable.h
 smtp_addr.o: ../../include/inet_addr_list.h
-smtp_addr.o: ../../include/myaddrinfo.h
-smtp_addr.o: ../../include/stringops.h
 smtp_addr.o: ../../include/inet_proto.h
 smtp_addr.o: ../../include/mail_params.h
+smtp_addr.o: ../../include/maps.h
+smtp_addr.o: ../../include/match_list.h
+smtp_addr.o: ../../include/match_ops.h
+smtp_addr.o: ../../include/msg.h
+smtp_addr.o: ../../include/myaddrinfo.h
+smtp_addr.o: ../../include/mymalloc.h
 smtp_addr.o: ../../include/own_inet_addr.h
-smtp_addr.o: ../../include/dns.h
-smtp_addr.o: ../../include/sock_addr.h
-smtp_addr.o: smtp.h
-smtp_addr.o: ../../include/vstream.h
-smtp_addr.o: ../../include/argv.h
-smtp_addr.o: ../../include/htable.h
-smtp_addr.o: ../../include/deliver_request.h
 smtp_addr.o: ../../include/recipient_list.h
+smtp_addr.o: ../../include/resolve_clnt.h
 smtp_addr.o: ../../include/scache.h
+smtp_addr.o: ../../include/sock_addr.h
 smtp_addr.o: ../../include/string_list.h
-smtp_addr.o: ../../include/match_list.h
-smtp_addr.o: ../../include/match_ops.h
-smtp_addr.o: ../../include/maps.h
-smtp_addr.o: ../../include/dict.h
-smtp_addr.o: ../../include/tok822.h
-smtp_addr.o: ../../include/resolve_clnt.h
+smtp_addr.o: ../../include/stringops.h
+smtp_addr.o: ../../include/sys_defs.h
 smtp_addr.o: ../../include/tls.h
+smtp_addr.o: ../../include/tok822.h
+smtp_addr.o: ../../include/vbuf.h
+smtp_addr.o: ../../include/vstream.h
+smtp_addr.o: ../../include/vstring.h
+smtp_addr.o: smtp.h
+smtp_addr.o: smtp_addr.c
 smtp_addr.o: smtp_addr.h
-smtp_chat.o: smtp_chat.c
-smtp_chat.o: ../../include/sys_defs.h
-smtp_chat.o: ../../include/msg.h
-smtp_chat.o: ../../include/vstring.h
-smtp_chat.o: ../../include/vbuf.h
-smtp_chat.o: ../../include/vstream.h
 smtp_chat.o: ../../include/argv.h
-smtp_chat.o: ../../include/stringops.h
-smtp_chat.o: ../../include/line_wrap.h
-smtp_chat.o: ../../include/mymalloc.h
-smtp_chat.o: ../../include/recipient_list.h
+smtp_chat.o: ../../include/cleanup_user.h
 smtp_chat.o: ../../include/deliver_request.h
-smtp_chat.o: ../../include/smtp_stream.h
-smtp_chat.o: ../../include/mail_params.h
+smtp_chat.o: ../../include/dict.h
+smtp_chat.o: ../../include/dsn_util.h
+smtp_chat.o: ../../include/htable.h
+smtp_chat.o: ../../include/line_wrap.h
 smtp_chat.o: ../../include/mail_addr.h
-smtp_chat.o: ../../include/post_mail.h
-smtp_chat.o: ../../include/cleanup_user.h
 smtp_chat.o: ../../include/mail_error.h
-smtp_chat.o: ../../include/name_mask.h
-smtp_chat.o: smtp.h
-smtp_chat.o: ../../include/htable.h
-smtp_chat.o: ../../include/scache.h
-smtp_chat.o: ../../include/string_list.h
+smtp_chat.o: ../../include/mail_params.h
+smtp_chat.o: ../../include/maps.h
 smtp_chat.o: ../../include/match_list.h
 smtp_chat.o: ../../include/match_ops.h
-smtp_chat.o: ../../include/maps.h
-smtp_chat.o: ../../include/dict.h
-smtp_chat.o: ../../include/tok822.h
+smtp_chat.o: ../../include/msg.h
+smtp_chat.o: ../../include/mymalloc.h
+smtp_chat.o: ../../include/name_mask.h
+smtp_chat.o: ../../include/post_mail.h
+smtp_chat.o: ../../include/recipient_list.h
 smtp_chat.o: ../../include/resolve_clnt.h
+smtp_chat.o: ../../include/scache.h
+smtp_chat.o: ../../include/smtp_stream.h
+smtp_chat.o: ../../include/string_list.h
+smtp_chat.o: ../../include/stringops.h
+smtp_chat.o: ../../include/sys_defs.h
 smtp_chat.o: ../../include/tls.h
-smtp_connect.o: smtp_connect.c
-smtp_connect.o: ../../include/sys_defs.h
-smtp_connect.o: ../../include/msg.h
-smtp_connect.o: ../../include/vstream.h
-smtp_connect.o: ../../include/vbuf.h
-smtp_connect.o: ../../include/vstring.h
-smtp_connect.o: ../../include/split_at.h
-smtp_connect.o: ../../include/mymalloc.h
-smtp_connect.o: ../../include/inet_addr_list.h
-smtp_connect.o: ../../include/myaddrinfo.h
-smtp_connect.o: ../../include/iostuff.h
-smtp_connect.o: ../../include/timed_connect.h
-smtp_connect.o: ../../include/stringops.h
-smtp_connect.o: ../../include/host_port.h
-smtp_connect.o: ../../include/sane_connect.h
-smtp_connect.o: ../../include/sock_addr.h
-smtp_connect.o: ../../include/mail_params.h
-smtp_connect.o: ../../include/own_inet_addr.h
+smtp_chat.o: ../../include/tok822.h
+smtp_chat.o: ../../include/vbuf.h
+smtp_chat.o: ../../include/vstream.h
+smtp_chat.o: ../../include/vstring.h
+smtp_chat.o: smtp.h
+smtp_chat.o: smtp_chat.c
+smtp_connect.o: ../../include/argv.h
+smtp_connect.o: ../../include/attr.h
 smtp_connect.o: ../../include/deliver_pass.h
 smtp_connect.o: ../../include/deliver_request.h
-smtp_connect.o: ../../include/recipient_list.h
-smtp_connect.o: ../../include/mail_proto.h
-smtp_connect.o: ../../include/attr.h
-smtp_connect.o: ../../include/mail_error.h
-smtp_connect.o: ../../include/name_mask.h
+smtp_connect.o: ../../include/dict.h
 smtp_connect.o: ../../include/dns.h
-smtp_connect.o: smtp.h
-smtp_connect.o: ../../include/argv.h
+smtp_connect.o: ../../include/dsn_util.h
+smtp_connect.o: ../../include/host_port.h
 smtp_connect.o: ../../include/htable.h
-smtp_connect.o: ../../include/scache.h
-smtp_connect.o: ../../include/string_list.h
+smtp_connect.o: ../../include/inet_addr_list.h
+smtp_connect.o: ../../include/iostuff.h
+smtp_connect.o: ../../include/mail_error.h
+smtp_connect.o: ../../include/mail_params.h
+smtp_connect.o: ../../include/mail_proto.h
+smtp_connect.o: ../../include/maps.h
 smtp_connect.o: ../../include/match_list.h
 smtp_connect.o: ../../include/match_ops.h
-smtp_connect.o: ../../include/maps.h
-smtp_connect.o: ../../include/dict.h
-smtp_connect.o: ../../include/tok822.h
+smtp_connect.o: ../../include/msg.h
+smtp_connect.o: ../../include/myaddrinfo.h
+smtp_connect.o: ../../include/mymalloc.h
+smtp_connect.o: ../../include/name_mask.h
+smtp_connect.o: ../../include/own_inet_addr.h
+smtp_connect.o: ../../include/recipient_list.h
 smtp_connect.o: ../../include/resolve_clnt.h
+smtp_connect.o: ../../include/sane_connect.h
+smtp_connect.o: ../../include/scache.h
+smtp_connect.o: ../../include/sock_addr.h
+smtp_connect.o: ../../include/split_at.h
+smtp_connect.o: ../../include/string_list.h
+smtp_connect.o: ../../include/stringops.h
+smtp_connect.o: ../../include/sys_defs.h
+smtp_connect.o: ../../include/timed_connect.h
 smtp_connect.o: ../../include/tls.h
+smtp_connect.o: ../../include/tok822.h
+smtp_connect.o: ../../include/vbuf.h
+smtp_connect.o: ../../include/vstream.h
+smtp_connect.o: ../../include/vstring.h
+smtp_connect.o: smtp.h
 smtp_connect.o: smtp_addr.h
+smtp_connect.o: smtp_connect.c
 smtp_connect.o: smtp_reuse.h
-smtp_map11.o: smtp_map11.c
-smtp_map11.o: ../../include/sys_defs.h
-smtp_map11.o: ../../include/msg.h
-smtp_map11.o: ../../include/vstring.h
-smtp_map11.o: ../../include/vbuf.h
-smtp_map11.o: ../../include/dict.h
-smtp_map11.o: ../../include/vstream.h
 smtp_map11.o: ../../include/argv.h
-smtp_map11.o: ../../include/tok822.h
-smtp_map11.o: ../../include/resolve_clnt.h
-smtp_map11.o: ../../include/valid_hostname.h
+smtp_map11.o: ../../include/deliver_request.h
+smtp_map11.o: ../../include/dict.h
+smtp_map11.o: ../../include/dsn_util.h
+smtp_map11.o: ../../include/htable.h
 smtp_map11.o: ../../include/mail_addr_map.h
 smtp_map11.o: ../../include/maps.h
+smtp_map11.o: ../../include/match_list.h
+smtp_map11.o: ../../include/match_ops.h
+smtp_map11.o: ../../include/msg.h
 smtp_map11.o: ../../include/quote_822_local.h
 smtp_map11.o: ../../include/quote_flags.h
-smtp_map11.o: smtp.h
-smtp_map11.o: ../../include/htable.h
-smtp_map11.o: ../../include/deliver_request.h
 smtp_map11.o: ../../include/recipient_list.h
+smtp_map11.o: ../../include/resolve_clnt.h
 smtp_map11.o: ../../include/scache.h
 smtp_map11.o: ../../include/string_list.h
-smtp_map11.o: ../../include/match_list.h
-smtp_map11.o: ../../include/match_ops.h
+smtp_map11.o: ../../include/sys_defs.h
 smtp_map11.o: ../../include/tls.h
-smtp_proto.o: smtp_proto.c
-smtp_proto.o: ../../include/sys_defs.h
-smtp_proto.o: ../../include/msg.h
-smtp_proto.o: ../../include/vstring.h
-smtp_proto.o: ../../include/vbuf.h
-smtp_proto.o: ../../include/vstream.h
-smtp_proto.o: ../../include/vstring_vstream.h
-smtp_proto.o: ../../include/stringops.h
-smtp_proto.o: ../../include/mymalloc.h
+smtp_map11.o: ../../include/tok822.h
+smtp_map11.o: ../../include/valid_hostname.h
+smtp_map11.o: ../../include/vbuf.h
+smtp_map11.o: ../../include/vstream.h
+smtp_map11.o: ../../include/vstring.h
+smtp_map11.o: smtp.h
+smtp_map11.o: smtp_map11.c
+smtp_proto.o: ../../include/argv.h
+smtp_proto.o: ../../include/attr.h
+smtp_proto.o: ../../include/bounce.h
+smtp_proto.o: ../../include/defer.h
+smtp_proto.o: ../../include/deliver_request.h
+smtp_proto.o: ../../include/dict.h
+smtp_proto.o: ../../include/dsn_util.h
+smtp_proto.o: ../../include/ehlo_mask.h
+smtp_proto.o: ../../include/ext_prop.h
+smtp_proto.o: ../../include/header_opts.h
+smtp_proto.o: ../../include/htable.h
 smtp_proto.o: ../../include/iostuff.h
-smtp_proto.o: ../../include/split_at.h
-smtp_proto.o: ../../include/name_code.h
+smtp_proto.o: ../../include/lex_822.h
+smtp_proto.o: ../../include/mail_addr_map.h
 smtp_proto.o: ../../include/mail_params.h
-smtp_proto.o: ../../include/smtp_stream.h
+smtp_proto.o: ../../include/mail_proto.h
 smtp_proto.o: ../../include/mail_queue.h
-smtp_proto.o: ../../include/recipient_list.h
-smtp_proto.o: ../../include/deliver_request.h
-smtp_proto.o: ../../include/defer.h
-smtp_proto.o: ../../include/bounce.h
-smtp_proto.o: ../../include/record.h
-smtp_proto.o: ../../include/rec_type.h
-smtp_proto.o: ../../include/off_cvt.h
+smtp_proto.o: ../../include/maps.h
 smtp_proto.o: ../../include/mark_corrupt.h
+smtp_proto.o: ../../include/match_list.h
+smtp_proto.o: ../../include/match_ops.h
+smtp_proto.o: ../../include/mime_state.h
+smtp_proto.o: ../../include/msg.h
+smtp_proto.o: ../../include/mymalloc.h
+smtp_proto.o: ../../include/name_code.h
+smtp_proto.o: ../../include/off_cvt.h
 smtp_proto.o: ../../include/quote_821_local.h
 smtp_proto.o: ../../include/quote_flags.h
-smtp_proto.o: ../../include/mail_proto.h
-smtp_proto.o: ../../include/attr.h
-smtp_proto.o: ../../include/mime_state.h
-smtp_proto.o: ../../include/header_opts.h
-smtp_proto.o: ../../include/ehlo_mask.h
-smtp_proto.o: ../../include/maps.h
-smtp_proto.o: ../../include/dict.h
-smtp_proto.o: ../../include/argv.h
-smtp_proto.o: ../../include/tok822.h
+smtp_proto.o: ../../include/rec_type.h
+smtp_proto.o: ../../include/recipient_list.h
+smtp_proto.o: ../../include/record.h
 smtp_proto.o: ../../include/resolve_clnt.h
-smtp_proto.o: ../../include/mail_addr_map.h
-smtp_proto.o: ../../include/ext_prop.h
-smtp_proto.o: ../../include/lex_822.h
-smtp_proto.o: smtp.h
-smtp_proto.o: ../../include/htable.h
 smtp_proto.o: ../../include/scache.h
+smtp_proto.o: ../../include/smtp_stream.h
+smtp_proto.o: ../../include/split_at.h
 smtp_proto.o: ../../include/string_list.h
-smtp_proto.o: ../../include/match_list.h
-smtp_proto.o: ../../include/match_ops.h
+smtp_proto.o: ../../include/stringops.h
+smtp_proto.o: ../../include/sys_defs.h
 smtp_proto.o: ../../include/tls.h
+smtp_proto.o: ../../include/tok822.h
+smtp_proto.o: ../../include/vbuf.h
+smtp_proto.o: ../../include/vstream.h
+smtp_proto.o: ../../include/vstring.h
+smtp_proto.o: ../../include/vstring_vstream.h
+smtp_proto.o: smtp.h
+smtp_proto.o: smtp_proto.c
 smtp_proto.o: smtp_sasl.h
-smtp_rcpt.o: smtp_rcpt.c
-smtp_rcpt.o: ../../include/sys_defs.h
-smtp_rcpt.o: ../../include/msg.h
-smtp_rcpt.o: ../../include/deliver_request.h
-smtp_rcpt.o: ../../include/vstring.h
-smtp_rcpt.o: ../../include/vbuf.h
-smtp_rcpt.o: ../../include/vstream.h
-smtp_rcpt.o: ../../include/recipient_list.h
-smtp_rcpt.o: ../../include/deliver_completed.h
-smtp_rcpt.o: ../../include/sent.h
-smtp_rcpt.o: smtp.h
 smtp_rcpt.o: ../../include/argv.h
+smtp_rcpt.o: ../../include/deliver_completed.h
+smtp_rcpt.o: ../../include/deliver_request.h
+smtp_rcpt.o: ../../include/dict.h
+smtp_rcpt.o: ../../include/dsn_util.h
 smtp_rcpt.o: ../../include/htable.h
-smtp_rcpt.o: ../../include/scache.h
-smtp_rcpt.o: ../../include/string_list.h
+smtp_rcpt.o: ../../include/maps.h
 smtp_rcpt.o: ../../include/match_list.h
 smtp_rcpt.o: ../../include/match_ops.h
-smtp_rcpt.o: ../../include/maps.h
-smtp_rcpt.o: ../../include/dict.h
-smtp_rcpt.o: ../../include/tok822.h
+smtp_rcpt.o: ../../include/msg.h
+smtp_rcpt.o: ../../include/recipient_list.h
 smtp_rcpt.o: ../../include/resolve_clnt.h
+smtp_rcpt.o: ../../include/scache.h
+smtp_rcpt.o: ../../include/sent.h
+smtp_rcpt.o: ../../include/string_list.h
+smtp_rcpt.o: ../../include/sys_defs.h
 smtp_rcpt.o: ../../include/tls.h
-smtp_reuse.o: smtp_reuse.c
-smtp_reuse.o: ../../include/sys_defs.h
-smtp_reuse.o: ../../include/msg.h
-smtp_reuse.o: ../../include/mymalloc.h
-smtp_reuse.o: ../../include/vstream.h
-smtp_reuse.o: ../../include/vbuf.h
-smtp_reuse.o: ../../include/vstring.h
-smtp_reuse.o: ../../include/htable.h
-smtp_reuse.o: ../../include/stringops.h
-smtp_reuse.o: ../../include/scache.h
-smtp_reuse.o: ../../include/mail_params.h
-smtp_reuse.o: smtp.h
+smtp_rcpt.o: ../../include/tok822.h
+smtp_rcpt.o: ../../include/vbuf.h
+smtp_rcpt.o: ../../include/vstream.h
+smtp_rcpt.o: ../../include/vstring.h
+smtp_rcpt.o: smtp.h
+smtp_rcpt.o: smtp_rcpt.c
 smtp_reuse.o: ../../include/argv.h
 smtp_reuse.o: ../../include/deliver_request.h
-smtp_reuse.o: ../../include/recipient_list.h
-smtp_reuse.o: ../../include/string_list.h
+smtp_reuse.o: ../../include/dict.h
+smtp_reuse.o: ../../include/dns.h
+smtp_reuse.o: ../../include/dsn_util.h
+smtp_reuse.o: ../../include/htable.h
+smtp_reuse.o: ../../include/mail_params.h
+smtp_reuse.o: ../../include/maps.h
 smtp_reuse.o: ../../include/match_list.h
 smtp_reuse.o: ../../include/match_ops.h
-smtp_reuse.o: ../../include/maps.h
-smtp_reuse.o: ../../include/dict.h
-smtp_reuse.o: ../../include/tok822.h
+smtp_reuse.o: ../../include/msg.h
+smtp_reuse.o: ../../include/myaddrinfo.h
+smtp_reuse.o: ../../include/mymalloc.h
+smtp_reuse.o: ../../include/recipient_list.h
 smtp_reuse.o: ../../include/resolve_clnt.h
+smtp_reuse.o: ../../include/scache.h
+smtp_reuse.o: ../../include/sock_addr.h
+smtp_reuse.o: ../../include/string_list.h
+smtp_reuse.o: ../../include/stringops.h
+smtp_reuse.o: ../../include/sys_defs.h
 smtp_reuse.o: ../../include/tls.h
+smtp_reuse.o: ../../include/tok822.h
+smtp_reuse.o: ../../include/vbuf.h
+smtp_reuse.o: ../../include/vstream.h
+smtp_reuse.o: ../../include/vstring.h
+smtp_reuse.o: smtp.h
+smtp_reuse.o: smtp_reuse.c
 smtp_reuse.o: smtp_reuse.h
-smtp_reuse.o: ../../include/dns.h
-smtp_reuse.o: ../../include/sock_addr.h
-smtp_reuse.o: ../../include/myaddrinfo.h
-smtp_sasl_glue.o: smtp_sasl_glue.c
-smtp_sasl_glue.o: ../../include/sys_defs.h
-smtp_sasl_glue.o: ../../include/msg.h
-smtp_sasl_glue.o: ../../include/mymalloc.h
-smtp_sasl_glue.o: ../../include/stringops.h
-smtp_sasl_glue.o: ../../include/vstring.h
-smtp_sasl_glue.o: ../../include/vbuf.h
-smtp_sasl_glue.o: ../../include/split_at.h
-smtp_sasl_glue.o: ../../include/name_mask.h
+smtp_sasl_glue.o: ../../include/argv.h
+smtp_sasl_glue.o: ../../include/deliver_request.h
+smtp_sasl_glue.o: ../../include/dict.h
+smtp_sasl_glue.o: ../../include/dsn_util.h
+smtp_sasl_glue.o: ../../include/htable.h
 smtp_sasl_glue.o: ../../include/mail_params.h
-smtp_sasl_glue.o: ../../include/string_list.h
+smtp_sasl_glue.o: ../../include/maps.h
 smtp_sasl_glue.o: ../../include/match_list.h
 smtp_sasl_glue.o: ../../include/match_ops.h
-smtp_sasl_glue.o: ../../include/maps.h
-smtp_sasl_glue.o: ../../include/dict.h
-smtp_sasl_glue.o: ../../include/vstream.h
-smtp_sasl_glue.o: ../../include/argv.h
-smtp_sasl_glue.o: smtp.h
-smtp_sasl_glue.o: ../../include/htable.h
-smtp_sasl_glue.o: ../../include/deliver_request.h
+smtp_sasl_glue.o: ../../include/msg.h
+smtp_sasl_glue.o: ../../include/mymalloc.h
+smtp_sasl_glue.o: ../../include/name_mask.h
 smtp_sasl_glue.o: ../../include/recipient_list.h
-smtp_sasl_glue.o: ../../include/scache.h
-smtp_sasl_glue.o: ../../include/tok822.h
 smtp_sasl_glue.o: ../../include/resolve_clnt.h
+smtp_sasl_glue.o: ../../include/scache.h
+smtp_sasl_glue.o: ../../include/split_at.h
+smtp_sasl_glue.o: ../../include/string_list.h
+smtp_sasl_glue.o: ../../include/stringops.h
+smtp_sasl_glue.o: ../../include/sys_defs.h
 smtp_sasl_glue.o: ../../include/tls.h
+smtp_sasl_glue.o: ../../include/tok822.h
+smtp_sasl_glue.o: ../../include/vbuf.h
+smtp_sasl_glue.o: ../../include/vstream.h
+smtp_sasl_glue.o: ../../include/vstring.h
+smtp_sasl_glue.o: smtp.h
 smtp_sasl_glue.o: smtp_sasl.h
-smtp_sasl_proto.o: smtp_sasl_proto.c
-smtp_sasl_proto.o: ../../include/sys_defs.h
-smtp_sasl_proto.o: ../../include/msg.h
-smtp_sasl_proto.o: ../../include/mymalloc.h
-smtp_sasl_proto.o: ../../include/stringops.h
-smtp_sasl_proto.o: ../../include/vstring.h
-smtp_sasl_proto.o: ../../include/vbuf.h
-smtp_sasl_proto.o: ../../include/mail_params.h
-smtp_sasl_proto.o: smtp.h
-smtp_sasl_proto.o: ../../include/vstream.h
+smtp_sasl_glue.o: smtp_sasl_glue.c
 smtp_sasl_proto.o: ../../include/argv.h
-smtp_sasl_proto.o: ../../include/htable.h
 smtp_sasl_proto.o: ../../include/deliver_request.h
-smtp_sasl_proto.o: ../../include/recipient_list.h
-smtp_sasl_proto.o: ../../include/scache.h
-smtp_sasl_proto.o: ../../include/string_list.h
+smtp_sasl_proto.o: ../../include/dict.h
+smtp_sasl_proto.o: ../../include/dsn_util.h
+smtp_sasl_proto.o: ../../include/htable.h
+smtp_sasl_proto.o: ../../include/mail_params.h
+smtp_sasl_proto.o: ../../include/maps.h
 smtp_sasl_proto.o: ../../include/match_list.h
 smtp_sasl_proto.o: ../../include/match_ops.h
-smtp_sasl_proto.o: ../../include/maps.h
-smtp_sasl_proto.o: ../../include/dict.h
-smtp_sasl_proto.o: ../../include/tok822.h
+smtp_sasl_proto.o: ../../include/msg.h
+smtp_sasl_proto.o: ../../include/mymalloc.h
+smtp_sasl_proto.o: ../../include/recipient_list.h
 smtp_sasl_proto.o: ../../include/resolve_clnt.h
+smtp_sasl_proto.o: ../../include/scache.h
+smtp_sasl_proto.o: ../../include/string_list.h
+smtp_sasl_proto.o: ../../include/stringops.h
+smtp_sasl_proto.o: ../../include/sys_defs.h
 smtp_sasl_proto.o: ../../include/tls.h
+smtp_sasl_proto.o: ../../include/tok822.h
+smtp_sasl_proto.o: ../../include/vbuf.h
+smtp_sasl_proto.o: ../../include/vstream.h
+smtp_sasl_proto.o: ../../include/vstring.h
+smtp_sasl_proto.o: smtp.h
 smtp_sasl_proto.o: smtp_sasl.h
-smtp_session.o: smtp_session.c
-smtp_session.o: ../../include/sys_defs.h
-smtp_session.o: ../../include/msg.h
-smtp_session.o: ../../include/mymalloc.h
-smtp_session.o: ../../include/vstream.h
-smtp_session.o: ../../include/vbuf.h
-smtp_session.o: ../../include/stringops.h
-smtp_session.o: ../../include/vstring.h
-smtp_session.o: ../../include/mime_state.h
-smtp_session.o: ../../include/header_opts.h
+smtp_sasl_proto.o: smtp_sasl_proto.c
+smtp_session.o: ../../include/argv.h
 smtp_session.o: ../../include/debug_peer.h
-smtp_session.o: ../../include/mail_params.h
-smtp_session.o: ../../include/maps.h
+smtp_session.o: ../../include/deliver_request.h
 smtp_session.o: ../../include/dict.h
-smtp_session.o: ../../include/argv.h
-smtp_session.o: smtp.h
+smtp_session.o: ../../include/dsn_util.h
+smtp_session.o: ../../include/header_opts.h
 smtp_session.o: ../../include/htable.h
-smtp_session.o: ../../include/deliver_request.h
-smtp_session.o: ../../include/recipient_list.h
-smtp_session.o: ../../include/scache.h
-smtp_session.o: ../../include/string_list.h
+smtp_session.o: ../../include/mail_params.h
+smtp_session.o: ../../include/maps.h
 smtp_session.o: ../../include/match_list.h
 smtp_session.o: ../../include/match_ops.h
-smtp_session.o: ../../include/tok822.h
+smtp_session.o: ../../include/mime_state.h
+smtp_session.o: ../../include/msg.h
+smtp_session.o: ../../include/mymalloc.h
+smtp_session.o: ../../include/recipient_list.h
 smtp_session.o: ../../include/resolve_clnt.h
+smtp_session.o: ../../include/scache.h
+smtp_session.o: ../../include/string_list.h
+smtp_session.o: ../../include/stringops.h
+smtp_session.o: ../../include/sys_defs.h
 smtp_session.o: ../../include/tls.h
-smtp_state.o: smtp_state.c
-smtp_state.o: ../../include/sys_defs.h
-smtp_state.o: ../../include/mymalloc.h
-smtp_state.o: ../../include/vstring.h
-smtp_state.o: ../../include/vbuf.h
-smtp_state.o: ../../include/mail_params.h
-smtp_state.o: smtp.h
-smtp_state.o: ../../include/vstream.h
+smtp_session.o: ../../include/tok822.h
+smtp_session.o: ../../include/vbuf.h
+smtp_session.o: ../../include/vstream.h
+smtp_session.o: ../../include/vstring.h
+smtp_session.o: smtp.h
+smtp_session.o: smtp_sasl.h
+smtp_session.o: smtp_session.c
 smtp_state.o: ../../include/argv.h
-smtp_state.o: ../../include/htable.h
 smtp_state.o: ../../include/deliver_request.h
-smtp_state.o: ../../include/recipient_list.h
-smtp_state.o: ../../include/scache.h
-smtp_state.o: ../../include/string_list.h
+smtp_state.o: ../../include/dict.h
+smtp_state.o: ../../include/dsn_util.h
+smtp_state.o: ../../include/htable.h
+smtp_state.o: ../../include/mail_params.h
+smtp_state.o: ../../include/maps.h
 smtp_state.o: ../../include/match_list.h
 smtp_state.o: ../../include/match_ops.h
-smtp_state.o: ../../include/maps.h
-smtp_state.o: ../../include/dict.h
-smtp_state.o: ../../include/tok822.h
+smtp_state.o: ../../include/mymalloc.h
+smtp_state.o: ../../include/recipient_list.h
 smtp_state.o: ../../include/resolve_clnt.h
+smtp_state.o: ../../include/scache.h
+smtp_state.o: ../../include/string_list.h
+smtp_state.o: ../../include/sys_defs.h
 smtp_state.o: ../../include/tls.h
+smtp_state.o: ../../include/tok822.h
+smtp_state.o: ../../include/vbuf.h
+smtp_state.o: ../../include/vstream.h
+smtp_state.o: ../../include/vstring.h
+smtp_state.o: smtp.h
 smtp_state.o: smtp_sasl.h
-smtp_trouble.o: smtp_trouble.c
-smtp_trouble.o: ../../include/sys_defs.h
-smtp_trouble.o: ../../include/msg.h
-smtp_trouble.o: ../../include/vstring.h
-smtp_trouble.o: ../../include/vbuf.h
-smtp_trouble.o: ../../include/stringops.h
-smtp_trouble.o: ../../include/mymalloc.h
-smtp_trouble.o: ../../include/smtp_stream.h
-smtp_trouble.o: ../../include/vstream.h
-smtp_trouble.o: ../../include/deliver_request.h
-smtp_trouble.o: ../../include/recipient_list.h
-smtp_trouble.o: ../../include/deliver_completed.h
+smtp_state.o: smtp_state.c
+smtp_trouble.o: ../../include/argv.h
 smtp_trouble.o: ../../include/bounce.h
 smtp_trouble.o: ../../include/defer.h
-smtp_trouble.o: ../../include/mail_error.h
-smtp_trouble.o: ../../include/name_mask.h
-smtp_trouble.o: smtp.h
-smtp_trouble.o: ../../include/argv.h
+smtp_trouble.o: ../../include/deliver_completed.h
+smtp_trouble.o: ../../include/deliver_request.h
+smtp_trouble.o: ../../include/dict.h
+smtp_trouble.o: ../../include/dsn_util.h
 smtp_trouble.o: ../../include/htable.h
-smtp_trouble.o: ../../include/scache.h
-smtp_trouble.o: ../../include/string_list.h
+smtp_trouble.o: ../../include/mail_error.h
+smtp_trouble.o: ../../include/maps.h
 smtp_trouble.o: ../../include/match_list.h
 smtp_trouble.o: ../../include/match_ops.h
-smtp_trouble.o: ../../include/maps.h
-smtp_trouble.o: ../../include/dict.h
-smtp_trouble.o: ../../include/tok822.h
+smtp_trouble.o: ../../include/msg.h
+smtp_trouble.o: ../../include/mymalloc.h
+smtp_trouble.o: ../../include/name_mask.h
+smtp_trouble.o: ../../include/recipient_list.h
 smtp_trouble.o: ../../include/resolve_clnt.h
+smtp_trouble.o: ../../include/scache.h
+smtp_trouble.o: ../../include/smtp_stream.h
+smtp_trouble.o: ../../include/string_list.h
+smtp_trouble.o: ../../include/stringops.h
+smtp_trouble.o: ../../include/sys_defs.h
 smtp_trouble.o: ../../include/tls.h
-smtp_unalias.o: smtp_unalias.c
-smtp_unalias.o: ../../include/sys_defs.h
+smtp_trouble.o: ../../include/tok822.h
+smtp_trouble.o: ../../include/vbuf.h
+smtp_trouble.o: ../../include/vstream.h
+smtp_trouble.o: ../../include/vstring.h
+smtp_trouble.o: smtp.h
+smtp_trouble.o: smtp_trouble.c
+smtp_unalias.o: ../../include/argv.h
+smtp_unalias.o: ../../include/deliver_request.h
+smtp_unalias.o: ../../include/dict.h
+smtp_unalias.o: ../../include/dns.h
+smtp_unalias.o: ../../include/dsn_util.h
 smtp_unalias.o: ../../include/htable.h
-smtp_unalias.o: ../../include/vstring.h
-smtp_unalias.o: ../../include/vbuf.h
+smtp_unalias.o: ../../include/maps.h
+smtp_unalias.o: ../../include/match_list.h
+smtp_unalias.o: ../../include/match_ops.h
 smtp_unalias.o: ../../include/msg.h
-smtp_unalias.o: ../../include/dns.h
-smtp_unalias.o: ../../include/sock_addr.h
 smtp_unalias.o: ../../include/myaddrinfo.h
-smtp_unalias.o: smtp.h
-smtp_unalias.o: ../../include/vstream.h
-smtp_unalias.o: ../../include/argv.h
-smtp_unalias.o: ../../include/deliver_request.h
 smtp_unalias.o: ../../include/recipient_list.h
+smtp_unalias.o: ../../include/resolve_clnt.h
 smtp_unalias.o: ../../include/scache.h
+smtp_unalias.o: ../../include/sock_addr.h
 smtp_unalias.o: ../../include/string_list.h
-smtp_unalias.o: ../../include/match_list.h
-smtp_unalias.o: ../../include/match_ops.h
-smtp_unalias.o: ../../include/maps.h
-smtp_unalias.o: ../../include/dict.h
-smtp_unalias.o: ../../include/tok822.h
-smtp_unalias.o: ../../include/resolve_clnt.h
+smtp_unalias.o: ../../include/sys_defs.h
 smtp_unalias.o: ../../include/tls.h
+smtp_unalias.o: ../../include/tok822.h
+smtp_unalias.o: ../../include/vbuf.h
+smtp_unalias.o: ../../include/vstream.h
+smtp_unalias.o: ../../include/vstring.h
+smtp_unalias.o: smtp.h
+smtp_unalias.o: smtp_unalias.c
index b0bbf70ff510f5eeb48461f707bed0c5dd0f2524..5455059fdd690afdef5febf44c6f052e097c0af2 100644 (file)
@@ -47,6 +47,7 @@
 /*     RFC 1652 (8bit-MIME transport)
 /*     RFC 1870 (Message Size Declaration)
 /*     RFC 2045 (MIME: Format of Internet Message Bodies)
+/*     RFC 2034 (Enhanced Error Codes)
 /*     RFC 2046 (MIME: Media Types)
 /*     RFC 2554 (AUTH command)
 /*     RFC 2821 (SMTP protocol)
index 2aa7a363c06939ab0421cfdda0f2a25fe5a415c9..4328e642675eb2637b49cc211a78e39cf5a4cd86 100644 (file)
@@ -32,6 +32,7 @@
 #include <string_list.h>
 #include <maps.h>
 #include <tok822.h>
+#include <dsn_util.h>
 
  /*
   * Postfix TLS library.
@@ -247,6 +248,7 @@ extern int smtp_quit(SMTP_STATE *);
   */
 typedef struct SMTP_RESP {             /* server response */
     int     code;                      /* status */
+    char    dsn[DSN_BUFSIZE];          /* DSN detail */
     char   *str;                       /* text */
     VSTRING *buf;                      /* origin of text */
 } SMTP_RESP;
@@ -296,16 +298,18 @@ extern void smtp_chat_notify(SMTP_SESSION *);
 #define SMTP_RCPT_LEFT(state) (state)->rcpt_left
 
 extern void smtp_rcpt_cleanup(SMTP_STATE *);
-extern void smtp_rcpt_done(SMTP_STATE *, const char *, RECIPIENT *);
+extern void smtp_rcpt_done(SMTP_STATE *, const char *, const char *, RECIPIENT *);
 
  /*
   * smtp_trouble.c
   */
-extern int PRINTFLIKE(3, 4) smtp_conn_fail(SMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) smtp_site_fail(SMTP_STATE *, int, char *,...);
-extern int PRINTFLIKE(3, 4) smtp_mesg_fail(SMTP_STATE *, int, char *,...);
-extern void PRINTFLIKE(4, 5) smtp_rcpt_fail(SMTP_STATE *, int, RECIPIENT *, char *,...);
-extern int smtp_stream_except(SMTP_STATE *, int, char *);
+extern int PRINTFLIKE(4, 5) smtp_site_fail(SMTP_STATE *, const char *, int,
+                                                  const char *,...);
+extern int PRINTFLIKE(4, 5) smtp_mesg_fail(SMTP_STATE *, const char *, int,
+                                                  const char *,...);
+extern void PRINTFLIKE(5, 6) smtp_rcpt_fail(SMTP_STATE *, const char *, int,
+                                            RECIPIENT *, const char *,...);
+extern int smtp_stream_except(SMTP_STATE *, int, const char *);
 
  /*
   * smtp_unalias.c
index 24f08902a79bce034e0cd8453bca18d6be370859..7609800af4e5d145bf3d79c2b7014d3a1c244550 100644 (file)
@@ -9,13 +9,13 @@
 /*     DNS_RR *smtp_domain_addr(name, misc_flags, why, found_myself)
 /*     char    *name;
 /*     int     misc_flags;
-/*     VSTRING *why;
+/*     DSN_VSTRING *why;
 /*     int     *found_myself;
 /*
 /*     DNS_RR *smtp_host_addr(name, misc_flags, why)
 /*     char    *name;
 /*     int     misc_flags;
-/*     VSTRING *why;
+/*     DSN_VSTRING *why;
 /* DESCRIPTION
 /*     This module implements Internet address lookups. By default,
 /*     lookups are done via the Internet domain name service (DNS).
@@ -56,7 +56,7 @@
 /* .IP SMTP_ERR_LOOP
 /*     The local machine is the best mail exchanger.
 /* .PP
-/*     In addition, a textual description of the problem is made available
+/*     In addition, a description of the problem is made available
 /*     via the \fIwhy\fR argument.
 /* LICENSE
 /* .ad
@@ -96,6 +96,7 @@
 
 #include <mail_params.h>
 #include <own_inet_addr.h>
+#include <dsn_util.h>
 
 /* DNS library. */
 
@@ -128,7 +129,8 @@ static void smtp_print_addr(char *what, DNS_RR *addr_list)
 
 /* smtp_addr_one - address lookup for one host name */
 
-static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRING *why)
+static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref,
+                                    DSN_VSTRING *why)
 {
     char   *myname = "smtp_addr_one";
     DNS_RR *addr = 0;
@@ -146,7 +148,7 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
      * Interpret a numerical name as an address.
      */
     if (hostaddr_to_sockaddr(host, (char *) 0, 0, &res0) == 0
-       && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
+     && strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
        if ((addr = dns_sa_to_rr(host, pref, res0->ai_addr)) == 0)
            msg_fatal("host %s: conversion error for address family %d: %m",
                    host, ((struct sockaddr *) (res0->ai_addr))->sa_family);
@@ -159,21 +161,25 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
      * Use DNS lookup, but keep the option open to use native name service.
      */
     if (smtp_host_lookup_mask & SMTP_HOST_FLAG_DNS) {
-       switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0, why,
-                            DNS_REQ_FLAG_ALL, proto_info->dns_atype_list)) {
+       switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0,
+                            why->vstring, DNS_REQ_FLAG_ALL,
+                            proto_info->dns_atype_list)) {
        case DNS_OK:
            for (rr = addr; rr; rr = rr->next)
                rr->pref = pref;
            addr_list = dns_rr_append(addr_list, addr);
            return (addr_list);
        default:
+           dsn_vstring_update(why, "4.4.3", "");
            smtp_errno = SMTP_ERR_RETRY;
            return (addr_list);
        case DNS_FAIL:
+           dsn_vstring_update(why, "4.4.3", "");
            if (smtp_errno != SMTP_ERR_RETRY)
                smtp_errno = SMTP_ERR_FAIL;
            return (addr_list);
        case DNS_NOTFOUND:
+           dsn_vstring_update(why, "4.4.4", "");
            if (smtp_errno != SMTP_ERR_RETRY)
                smtp_errno = SMTP_ERR_FAIL;
            /* maybe native naming service will succeed */
@@ -186,10 +192,19 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
      */
 #define RETRY_AI_ERROR(e) \
         ((e) == EAI_AGAIN || (e) == EAI_MEMORY || (e) == EAI_SYSTEM)
+#ifdef EAI_NODATA
+#define DSN_NOHOST(e) \
+       ((e) == EAI_AGAIN || (e) == EAI_NODATA || (e) == EAI_NONAME)
+#else
+#define DSN_NOHOST(e) \
+       ((e) == EAI_AGAIN || (e) == EAI_NONAME)
+#endif
 
     if (smtp_host_lookup_mask & SMTP_HOST_FLAG_NATIVE) {
        if ((aierr = hostname_to_sockaddr(host, (char *) 0, 0, &res0)) != 0) {
-           vstring_sprintf(why, "%s: %s", host, MAI_STRERROR(aierr));
+           dsn_vstring_update(why, DSN_NOHOST(aierr) ? "4.4.4" : "4.3.0",
+                              "unable to look up host %s: %s",
+                              host, MAI_STRERROR(aierr));
            if (smtp_errno != SMTP_ERR_RETRY)
                smtp_errno =
                    (RETRY_AI_ERROR(aierr) ? SMTP_ERR_RETRY : SMTP_ERR_FAIL);
@@ -208,7 +223,7 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
            }
            freeaddrinfo(res0);
            if (found == 0) {
-               vstring_sprintf(why, "%s: host not found", host);
+               dsn_vstring_update(why, "5.4.4", "%s: host not found", host);
                smtp_errno = SMTP_ERR_FAIL;
            }
            return (addr_list);
@@ -223,7 +238,7 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI
 
 /* smtp_addr_list - address lookup for a list of mail exchangers */
 
-static DNS_RR *smtp_addr_list(DNS_RR *mx_names, VSTRING *why)
+static DNS_RR *smtp_addr_list(DNS_RR *mx_names, DSN_VSTRING *why)
 {
     DNS_RR *addr_list = 0;
     DNS_RR *rr;
@@ -333,7 +348,7 @@ static int smtp_compare_pref(DNS_RR *a, DNS_RR *b)
 
 /* smtp_domain_addr - mail exchanger address lookup */
 
-DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
+DNS_RR *smtp_domain_addr(char *name, int misc_flags, DSN_VSTRING *why,
                                 int *found_myself)
 {
     DNS_RR *mx_names;
@@ -397,13 +412,15 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
      * at hostnames provides a partial solution for MX hosts behind a NAT
      * gateway.
      */
-    switch (dns_lookup(name, T_MX, 0, &mx_names, (VSTRING *) 0, why)) {
+    switch (dns_lookup(name, T_MX, 0, &mx_names, (VSTRING *) 0, why->vstring)) {
     default:
+       dsn_vstring_update(why, "4.4.3", "");
        smtp_errno = SMTP_ERR_RETRY;
        if (var_ign_mx_lookup_err)
            addr_list = smtp_host_addr(name, misc_flags, why);
        break;
     case DNS_FAIL:
+       dsn_vstring_update(why, "5.4.3", "");
        smtp_errno = SMTP_ERR_FAIL;
        if (var_ign_mx_lookup_err)
            addr_list = smtp_host_addr(name, misc_flags, why);
@@ -414,6 +431,7 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
        addr_list = smtp_addr_list(mx_names, why);
        dns_rr_free(mx_names);
        if (addr_list == 0) {
+           /* DSN and text does not change. */
            if (var_smtp_defer_mxaddr)
                smtp_errno = SMTP_ERR_RETRY;
            msg_warn("no MX host for %s has a valid address record", name);
@@ -427,12 +445,14 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
            addr_list = smtp_truncate_self(addr_list, self->pref);
            if (addr_list == 0) {
                if (best_pref != best_found) {
-                   vstring_sprintf(why, "unable to find primary relay for %s",
-                                   name);
+                   dsn_vstring_update(why, "4.4.4",
+                                      "unable to find primary relay for %s",
+                                      name);
                    smtp_errno = SMTP_ERR_RETRY;
                } else {
-                   vstring_sprintf(why, "mail for %s loops back to myself",
-                                   name);
+                   dsn_vstring_update(why, "5.3.5",
+                                      "mail for %s loops back to myself",
+                                      name);
                    smtp_errno = SMTP_ERR_LOOP;
                }
            }
@@ -456,7 +476,7 @@ DNS_RR *smtp_domain_addr(char *name, int misc_flags, VSTRING *why,
 
 /* smtp_host_addr - direct host lookup */
 
-DNS_RR *smtp_host_addr(char *host, int misc_flags, VSTRING *why)
+DNS_RR *smtp_host_addr(char *host, int misc_flags, DSN_VSTRING *why)
 {
     DNS_RR *addr_list;
 
@@ -472,7 +492,8 @@ DNS_RR *smtp_host_addr(char *host, int misc_flags, VSTRING *why)
        && (misc_flags & SMTP_MISC_FLAG_LOOP_DETECT)
        && smtp_find_self(addr_list) != 0) {
        dns_rr_free(addr_list);
-       vstring_sprintf(why, "mail for %s loops back to myself", host);
+       dsn_vstring_update(why, "5.3.5",
+                          "mail for %s loops back to myself", host);
        smtp_errno = SMTP_ERR_LOOP;
        return (0);
     }
index 6e211fe33a033d3bdfaa8cd21e7317b91450bee3..da907c8fe7cc2a0f6a8105f5f2c5fef614d9732a 100644 (file)
@@ -8,6 +8,11 @@
 /* DESCRIPTION
 /* .nf
 
+ /*
+  * Global library.
+  */
+#include <dsn_util.h>
+
  /*
   * DNS library.
   */
@@ -16,8 +21,8 @@
  /*
   * Internal interfaces.
   */
-extern DNS_RR *smtp_host_addr(char *, int, VSTRING *);
-extern DNS_RR *smtp_domain_addr(char *, int, VSTRING *, int *);
+extern DNS_RR *smtp_host_addr(char *, int, DSN_VSTRING *);
+extern DNS_RR *smtp_domain_addr(char *, int, DSN_VSTRING *, int *);
 
 /* LICENSE
 /* .ad
index 4cb5794980bdd01b19d781ecd1e479075b88ac52..b25647a6d83d52da55d28b1fd343bc3c5a8318a1 100644 (file)
@@ -9,6 +9,7 @@
 /*     typedef struct {
 /* .in +4
 /*             int code;
+/*             char dsn[...];
 /*             char *str;
 /*             VSTRING *buf;
 /* .in -4
@@ -78,6 +79,7 @@
 #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. */
 
@@ -198,6 +201,8 @@ SMTP_RESP *smtp_chat_resp(SMTP_SESSION *session)
     static SMTP_RESP rdata;
     char   *cp;
     int     last_char;
+    int     three_digs = 0;
+    size_t  len;
 
     /*
      * Initialize the response data buffer.
@@ -238,7 +243,7 @@ SMTP_RESP *smtp_chat_resp(SMTP_SESSION *session)
         */
        for (cp = STR(session->buffer); *cp && ISDIGIT(*cp); cp++)
             /* void */ ;
-       if (cp - STR(session->buffer) == 3) {
+       if ((three_digs = (cp - STR(session->buffer) == 3)) != 0) {
            if (*cp == '-')
                continue;
            if (*cp == ' ' || *cp == 0)
@@ -246,7 +251,25 @@ SMTP_RESP *smtp_chat_resp(SMTP_SESSION *session)
        }
        session->error_mask |= MAIL_ERROR_PROTOCOL;
     }
-    rdata.code = atoi(STR(session->buffer));
+
+    /*
+     * Extract RFC 821 reply code and RFC 2034 detail. Use a default detail
+     * code if none was given.
+     */
+    rdata.dsn[0] = 0;
+    if (three_digs != 0) {
+       rdata.code = atoi(STR(session->buffer));
+       for (cp = STR(session->buffer) + 4; *cp == ' '; cp++)
+            /* void */ ;
+       if ((len = dsn_valid(cp)) > 0 && len < sizeof(rdata.dsn)) {
+           DSN_BUF_UPDATE(rdata.dsn, cp, len);
+       } else if (strchr("245", STR(session->buffer)[0]) != 0) {
+           DSN_BUF_UPDATE(rdata.dsn, "0.0.0", sizeof("0.0.0") - 1);
+           rdata.dsn[0] = STR(session->buffer)[0];
+       }
+    } else {
+       rdata.code = 0;
+    }
     VSTRING_TERMINATE(rdata.buf);
     rdata.str = STR(rdata.buf);
     return (&rdata);
index ecaa2ebfa4897d2bc2d5c4265ea17407b482c23a..b01c1201fa3a8dbfb9e0167ebbdf19588815a195 100644 (file)
@@ -91,6 +91,7 @@
 #include <own_inet_addr.h>
 #include <deliver_pass.h>
 #include <mail_error.h>
+#include <dsn_util.h>
 
 /* DNS library. */
 
@@ -126,7 +127,7 @@ static VSTRING *smtp_salvage(VSTREAM *stream)
 /* smtp_connect_addr - connect to explicit address */
 
 static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
-                                              unsigned port, VSTRING *why,
+                                           unsigned port, DSN_VSTRING *why,
                                               int sess_flags)
 {
     char   *myname = "smtp_connect_addr";
@@ -150,6 +151,8 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
     if (dns_rr_to_sa(addr, port, sa, &salen) != 0) {
        msg_warn("%s: skip address type %s: %m",
                 myname, dns_strtype(addr->type));
+       dsn_vstring_update(why, "4.4.0",
+                          "network address conversion failed: %m");
        smtp_errno = SMTP_ERR_RETRY;
        return (0);
     }
@@ -239,8 +242,8 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
        conn_stat = sane_connect(sock, sa, salen);
     }
     if (conn_stat < 0) {
-       vstring_sprintf(why, "connect to %s[%s]: %m",
-                       addr->name, hostaddr.buf);
+       dsn_vstring_update(why, "4.4.1", "connect to %s[%s]: %m",
+                          addr->name, hostaddr.buf);
        smtp_errno = SMTP_ERR_RETRY;
        close(sock);
        return (0);
@@ -250,8 +253,8 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
      * Skip this host if it takes no action within some time limit.
      */
     if (read_wait(sock, var_smtp_helo_tmout) < 0) {
-       vstring_sprintf(why, "connect to %s[%s]: read timeout",
-                       addr->name, hostaddr.buf);
+       dsn_vstring_update(why, "4.4.2", "connect to %s[%s]: read timeout",
+                          addr->name, hostaddr.buf);
        smtp_errno = SMTP_ERR_RETRY;
        close(sock);
        return (0);
@@ -262,8 +265,9 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
      */
     stream = vstream_fdopen(sock, O_RDWR);
     if ((ch = VSTREAM_GETC(stream)) == VSTREAM_EOF) {
-       vstring_sprintf(why, "connect to %s[%s]: server dropped connection without sending the initial SMTP greeting",
-                       addr->name, hostaddr.buf);
+       dsn_vstring_update(why, "4.4.0",
+                          "connect to %s[%s]: server dropped connection without sending the initial SMTP greeting",
+                          addr->name, hostaddr.buf);
        smtp_errno = SMTP_ERR_RETRY;
        vstream_fclose(stream);
        return (0);
@@ -276,12 +280,15 @@ static SMTP_SESSION *smtp_connect_addr(const char *dest, DNS_RR *addr,
      * also means that we have to salvage the server's response ourself so
      * that it can be included in logging or in non-delivery reports. It does
      * not hurt if we keep the test for a 4xx or 5xx greeting in smtp_helo().
+     * 
+     * Do not propagate the server's DSN code. We are skipping this problem!
      */
     if (ch == '4' || (ch == '5' && var_smtp_skip_5xx_greeting)) {
        VSTRING *salvage_buf = smtp_salvage(stream);
 
-       vstring_sprintf(why, "connect to %s[%s]: server refused to talk to me: %s",
-                       addr->name, hostaddr.buf, STR(salvage_buf));
+       dsn_vstring_update(why, "4.3.0",
+                     "connect to %s[%s]: server refused to talk to me: %s",
+                          addr->name, hostaddr.buf, STR(salvage_buf));
        vstring_free(salvage_buf);
        smtp_errno = SMTP_ERR_RETRY;
        vstream_fclose(stream);
@@ -506,7 +513,7 @@ static int smtp_reuse_session(SMTP_STATE *state, int lookup_mx,
 int     smtp_connect(SMTP_STATE *state)
 {
     DELIVER_REQUEST *request = state->request;
-    VSTRING *why = vstring_alloc(10);
+    DSN_VSTRING *why = dsn_vstring_alloc(10);
     char   *dest_buf;
     char   *domain;
     unsigned port;
@@ -686,7 +693,7 @@ int     smtp_connect(SMTP_STATE *state)
                    smtp_xfer(state);
                smtp_cleanup_session(state);
            } else {
-               msg_info("%s (port %d)", vstring_str(why), ntohs(port));
+               msg_info("%s (port %d)", STR(why->vstring), ntohs(port));
            }
        }
        dns_rr_free(addr_list);
@@ -715,6 +722,7 @@ int     smtp_connect(SMTP_STATE *state)
             */
            if (IS_FALLBACK_RELAY(cpp, sites, non_fallback_sites)) {
                msg_warn("%s configuration problem", VAR_FALLBACK_RELAY);
+               dsn_vstring_update(why, "4.3.5", "");
                smtp_errno = SMTP_ERR_RETRY;
            }
 
@@ -724,6 +732,7 @@ int     smtp_connect(SMTP_STATE *state)
             */
            else if (strcmp(sites->argv[0], var_relayhost) == 0) {
                msg_warn("%s configuration problem", VAR_RELAYHOST);
+               dsn_vstring_update(why, "4.3.5", "");
                smtp_errno = SMTP_ERR_RETRY;
            }
 
@@ -744,11 +753,16 @@ int     smtp_connect(SMTP_STATE *state)
 
            /*
             * We still need to bounce or defer some left-over recipients:
-            * either mail loops or some backup mail server was unavailable.
+            * either mail loops or some mail server was unavailable.
             */
            state->final_server = 1;            /* XXX */
-           smtp_site_fail(state, smtp_errno == SMTP_ERR_RETRY ? 450 : 550,
-                          "%s", vstring_str(why));
+           if (smtp_errno == SMTP_ERR_RETRY) {
+               why->dsn[0] = '4';
+               smtp_site_fail(state, why->dsn, 450, "%s", STR(why->vstring));
+           } else {
+               why->dsn[0] = '5';
+               smtp_site_fail(state, why->dsn, 550, "%s", STR(why->vstring));
+           }
 
            /*
             * Sanity check. Don't silently lose recipients.
@@ -765,6 +779,6 @@ int     smtp_connect(SMTP_STATE *state)
     if (HAVE_NEXTHOP_STATE(state))
        FREE_NEXTHOP_STATE(state);
     argv_free(sites);
-    vstring_free(why);
+    dsn_vstring_free(why);
     return (state->status);
 }
index ebbe53f1aa8d7ce970c26a98315fa2d91d47dd40..f360af9db19077783bb7022a2e71b6403d46bcd1 100644 (file)
@@ -91,6 +91,7 @@
 #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() */
@@ -272,10 +273,12 @@ int     smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
        case 2:
            break;
        case 5:
-           if (var_smtp_skip_5xx_greeting)
+           if (var_smtp_skip_5xx_greeting) {
                resp->code = 400;
+               resp->dsn[0] = '4';
+           }
        default:
-           return (smtp_site_fail(state, resp->code,
+           return (smtp_site_fail(state, resp->dsn, resp->code,
                                   "host %s refused to talk to me: %s",
                                   session->namaddr,
                                   translit(resp->str, "\n", " ")));
@@ -333,7 +336,7 @@ int     smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
     if ((session->features & SMTP_FEATURE_ESMTP) == 0) {
        smtp_chat_cmd(session, "HELO %s", var_smtp_helo_name);
        if ((resp = smtp_chat_resp(session))->code / 100 != 2)
-           return (smtp_site_fail(state, resp->code,
+           return (smtp_site_fail(state, resp->dsn, resp->code,
                                   "host %s refused to talk to me: %s",
                                   session->namaddr,
                                   translit(resp->str, "\n", " ")));
@@ -372,8 +375,11 @@ int     smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
                    && (misc_flags & SMTP_MISC_FLAG_LOOP_DETECT) != 0) {
                    msg_warn("host %s replied to HELO/EHLO with my own hostname %s",
                             session->namaddr, var_myhostname);
-                   return (smtp_site_fail(state,
-                    (session->features & SMTP_FEATURE_BEST_MX) ? 550 : 450,
+                   return ((session->features & SMTP_FEATURE_BEST_MX) ?
+                           smtp_site_fail(state, "5.3.5", 550,
+                                        "mail for %s loops back to myself",
+                                          request->nexthop) :
+                           smtp_site_fail(state, "4.3.5", 450,
                                         "mail for %s loops back to myself",
                                           request->nexthop));
                }
@@ -514,7 +520,7 @@ int     smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
             */
            session->features &= ~SMTP_FEATURE_STARTTLS;
            if (session->tls_enforce_tls)
-               return (smtp_site_fail(state, resp->code,
+               return (smtp_site_fail(state, resp->dsn, resp->code,
                    "TLS is required, but host %s refused to start TLS: %s",
                                       session->namaddr,
                                       translit(resp->str, "\n", " ")));
@@ -530,16 +536,16 @@ int     smtp_helo(SMTP_STATE *state, NOCLOBBER int misc_flags)
         */
        if (session->tls_enforce_tls) {
            if (!(session->features & SMTP_FEATURE_STARTTLS)) {
-               return (smtp_site_fail(state, 450,
+               return (smtp_site_fail(state, "4.7.4", 450,
                          "TLS is required, but was not offered by host %s",
                                       session->namaddr));
            } else if (smtp_tls_ctx == 0) {
-               return (smtp_site_fail(state, 450,
+               return (smtp_site_fail(state, "4.7.5", 450,
                     "TLS is required, but our TLS engine is unavailable"));
            } else {
                msg_warn("%s: TLS is required but unavailable, don't know why",
                         myname);
-               return (smtp_site_fail(state, 450,
+               return (smtp_site_fail(state, "4.7.0", 450,
                                     "TLS is required, but not available"));
            }
        }
@@ -594,9 +600,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
      * use TLS session caching???
      */
     serverid = vstring_alloc(10);
-    vstring_sprintf(serverid, "%s:%s:%u",
-                   session->host, session->addr,
-                   ntohs(session->port));
+    vstring_sprintf(serverid, "%s:%u", session->addr, ntohs(session->port));
     if (session->helo && strcasecmp(session->host, session->helo) != 0)
        vstring_sprintf_append(serverid, ":%s", session->helo);
     session->tls_context =
@@ -608,7 +612,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
                         &(session->tls_info));
     vstring_free(serverid);
     if (session->tls_context == 0)
-       return (smtp_site_fail(state, 450,
+       return (smtp_site_fail(state, "4.7.5", 450,
                               "Cannot start TLS: handshake failure"));
 
     /*
@@ -630,7 +634,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
                tls_client_stop(smtp_tls_ctx, session->stream,
                                var_smtp_starttls_tmout, 1,
                                &(session->tls_info));
-               return (smtp_site_fail(state, 450,
+               return (smtp_site_fail(state, "4.7.5", 450,
                          "TLS failure: Cannot verify server certificate"));
            }
        }
@@ -649,7 +653,7 @@ static int smtp_start_tls(SMTP_STATE *state, int misc_flags)
            tls_client_stop(smtp_tls_ctx, session->stream,
                            var_smtp_starttls_tmout, 1,
                            &(session->tls_info));
-           return (smtp_site_fail(state, 450,
+           return (smtp_site_fail(state, "4.7.5", 450,
                             "TLS failure: Cannot verify server hostname"));
        }
     }
@@ -1202,7 +1206,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
                     */
                case SMTP_STATE_MAIL:
                    if (resp->code / 100 != 2) {
-                       smtp_mesg_fail(state, resp->code,
+                       smtp_mesg_fail(state, resp->dsn, resp->code,
                                       "host %s said: %s (in reply to %s)",
                                       session->namaddr,
                                       translit(resp->str, "\n", " "),
@@ -1227,17 +1231,21 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
                case SMTP_STATE_RCPT:
                    if (!mail_from_rejected) {
 #ifdef notdef
-                       if (resp->code == 552)
+                       if (resp->code == 552) {
                            resp->code = 452;
+                           resp->dsn[0] = '4';
+                       }
 #endif
                        rcpt = request->rcpt_list.info + recv_rcpt;
                        if (resp->code / 100 == 2) {
                            ++nrcpt;
                            /* If trace-only, mark the recipient done. */
                            if (DEL_REQ_TRACE_ONLY(request->flags))
-                               smtp_rcpt_done(state, resp->str, rcpt);
+                               smtp_rcpt_done(state, resp->dsn,
+                                              resp->str, rcpt);
                        } else {
-                           smtp_rcpt_fail(state, resp->code, rcpt,
+                           smtp_rcpt_fail(state, resp->dsn,
+                                          resp->code, rcpt,
                                        "host %s said: %s (in reply to %s)",
                                           session->namaddr,
                                           translit(resp->str, "\n", " "),
@@ -1259,7 +1267,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
                case SMTP_STATE_DATA:
                    if (resp->code / 100 != 3) {
                        if (nrcpt > 0)
-                           smtp_mesg_fail(state, resp->code,
+                           smtp_mesg_fail(state, resp->dsn, resp->code,
                                        "host %s said: %s (in reply to %s)",
                                           session->namaddr,
                                           translit(resp->str, "\n", " "),
@@ -1281,7 +1289,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
                case SMTP_STATE_DOT:
                    if (nrcpt > 0) {
                        if (resp->code / 100 != 2) {
-                           smtp_mesg_fail(state, resp->code,
+                           smtp_mesg_fail(state, resp->dsn, resp->code,
                                        "host %s said: %s (in reply to %s)",
                                           session->namaddr,
                                           translit(resp->str, "\n", " "),
@@ -1290,7 +1298,8 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
                            for (nrcpt = 0; nrcpt < recv_rcpt; nrcpt++) {
                                rcpt = request->rcpt_list.info + nrcpt;
                                if (!SMTP_RCPT_ISMARKED(rcpt))
-                                   smtp_rcpt_done(state, resp->str, rcpt);
+                                   smtp_rcpt_done(state, resp->dsn,
+                                                  resp->str, rcpt);
                            }
                        }
                    }
@@ -1410,7 +1419,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
                                          vstring_str(session->scratch),
                                          VSTRING_LEN(session->scratch));
                    if (mime_errs) {
-                       smtp_mesg_fail(state, 554,
+                       smtp_mesg_fail(state, "5.6.5", 554,
                                       "MIME 7-bit conversion failed: %s",
                                       mime_state_error(mime_errs));
                        RETURN(0);
@@ -1432,7 +1441,7 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
                mime_errs =
                    mime_state_update(session->mime_state, rec_type, "", 0);
                if (mime_errs) {
-                   smtp_mesg_fail(state, 554,
+                   smtp_mesg_fail(state, "5.6.5", 554,
                                   "MIME 7-bit conversion failed: %s",
                                   mime_state_error(mime_errs));
                    RETURN(0);
@@ -1494,7 +1503,7 @@ int     smtp_xfer(SMTP_STATE *state)
      * connection caching.
      */
     if (session->size_limit > 0 && session->size_limit < request->data_size) {
-       smtp_mesg_fail(state, 552,
+       smtp_mesg_fail(state, "5.3.4", 552,
                    "message size %lu exceeds size limit %.0f of server %s",
                       request->data_size, (double) session->size_limit,
                       session->namaddr);
index 02799189669b9ed552fddc33ed619f1f07525535..35cdda6b0076abf0d67bac0692f4bceead1d1522 100644 (file)
@@ -26,8 +26,9 @@
 /*     int     SMTP_RCPT_LEFT(state)
 /*     SMTP_STATE *state;
 /*
-/*     void    smtp_rcpt_done(state, reply, rcpt)
+/*     void    smtp_rcpt_done(state, dsn, reply, rcpt)
 /*     SMTP_STATE *state;
+/*     const char *dsn;
 /*     const char *reply;
 /*     RECIPIENT *rcpt;
 /* DESCRIPTION
 
 /* smtp_rcpt_done - mark recipient as done or else */
 
-void    smtp_rcpt_done(SMTP_STATE *state, const char *reply, RECIPIENT *rcpt)
+void    smtp_rcpt_done(SMTP_STATE *state, const char *dsn,
+                              const char *reply, RECIPIENT *rcpt)
 {
     DELIVER_REQUEST *request = state->request;
     SMTP_SESSION *session = state->session;
@@ -136,7 +138,7 @@ void    smtp_rcpt_done(SMTP_STATE *state, const char *reply, RECIPIENT *rcpt)
     status = sent(DEL_REQ_TRACE_FLAGS(request->flags),
                  request->queue_id, rcpt->orig_addr,
                  rcpt->address, rcpt->offset,
-                 session->namaddr,
+                 session->namaddr, dsn,
                  request->arrival_time,
                  "%s", reply);
     if (status == 0)
index 4dcd20b05c630202787aaa1ad8c1abfa6bc944f8..6653f592363af0bcf06521d2351fc82e46aa4542 100644 (file)
@@ -166,7 +166,7 @@ int     smtp_sasl_helo_login(SMTP_STATE *state)
     ret = 0;
     smtp_sasl_start(session, VAR_SMTP_SASL_OPTS, var_smtp_sasl_opts);
     if (smtp_sasl_authenticate(session, why) <= 0) {
-       ret = smtp_site_fail(state, 450, "Authentication failed: %s",
+       ret = smtp_site_fail(state, "4.7.0", 450, "Authentication failed: %s",
                             vstring_str(why));
        /* Session reuse is disabled. */
     }
index 64cb7f2735eb8ddcc07fcc68cdafba0f986a829f..453cc9e690e7b1159f0c45e93f36a9ce0122bd7b 100644 (file)
 
  /*
   * 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 */
index 435a1ae35413fe11b41723363846d7e7267ba65b..e8bf0e8425892655de945a3a646a6ebb76a2e8df 100644 (file)
@@ -6,26 +6,29 @@
 /* SYNOPSIS
 /*     #include "smtp.h"
 /*
-/*     int     smtp_site_fail(state, code, format, ...)
+/*     int     smtp_site_fail(state, dsn, code, format, ...)
 /*     SMTP_STATE *state;
+/*     const char *dsn;
 /*     int     code;
-/*     char    *format;
+/*     const char *format;
 /*
-/*     int     smtp_mesg_fail(state, code, format, ...)
+/*     int     smtp_mesg_fail(state, dsn, code, format, ...)
 /*     SMTP_STATE *state;
+/*     const char *dsn;
 /*     int     code;
-/*     char    *format;
+/*     const char *format;
 /*
-/*     void    smtp_rcpt_fail(state, code, recipient, format, ...)
+/*     void    smtp_rcpt_fail(state, dsn, code, recipient, format, ...)
 /*     SMTP_STATE *state;
+/*     const char *dsn;
 /*     int     code;
 /*     RECIPIENT *recipient;
-/*     char    *format;
+/*     const char *format;
 /*
 /*     int     smtp_stream_except(state, exception, description)
 /*     SMTP_STATE *state;
 /*     int     exception;
-/*     char    *description;
+/*     const char *description;
 /* DESCRIPTION
 /*     This module handles all non-fatal errors that can happen while
 /*     attempting to deliver mail via SMTP, and implements the policy
 #include <bounce.h>
 #include <defer.h>
 #include <mail_error.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -159,7 +163,8 @@ static void smtp_check_code(SMTP_SESSION *session, int code)
 
 /* smtp_site_fail - skip site, defer or bounce all recipients */
 
-int     smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
+int     smtp_site_fail(SMTP_STATE *state, const char *dsn, int code,
+                              const char *format,...)
 {
     DELIVER_REQUEST *request = state->request;
     SMTP_SESSION *session = state->session;
@@ -174,7 +179,11 @@ int     smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
      * Initialize.
      */
     va_start(ap, format);
-    vstring_vsprintf(why, format, ap);
+    if (code < 400 || code > 599) {
+       vstring_sprintf(why, "Protocol error: ");
+       dsn = "5.5.0";
+    }
+    vstring_vsprintf_append(why, format, ap);
     va_end(ap);
 
     /*
@@ -206,7 +215,7 @@ int     smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
                (DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
                 rcpt->orig_addr, rcpt->address, rcpt->offset,
                 session ? session->namaddr : "none",
-                request->arrival_time, "%s", vstring_str(why));
+                dsn, request->arrival_time, "%s", vstring_str(why));
            if (status == 0)
                deliver_completed(state->src, rcpt->offset);
            SMTP_RCPT_DROP(state, rcpt);
@@ -214,7 +223,7 @@ int     smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
        }
        /* XXX This assumes no fall-back relay. */
        if (soft_error && request->hop_status == 0)
-           request->hop_status = mystrdup(vstring_str(why));
+           request->hop_status = dsn_prepend(dsn, vstring_str(why));
     }
     if (session)
        smtp_check_code(session, code);
@@ -234,7 +243,8 @@ int     smtp_site_fail(SMTP_STATE *state, int code, char *format,...)
 
 /* smtp_mesg_fail - skip site, defer all recipients, or bounce all recipients */
 
-int     smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
+int     smtp_mesg_fail(SMTP_STATE *state, const char *dsn,
+                              int code, const char *format,...)
 {
     DELIVER_REQUEST *request = state->request;
     SMTP_SESSION *session = state->session;
@@ -249,7 +259,11 @@ int     smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
      * Initialize.
      */
     va_start(ap, format);
-    vstring_vsprintf(why, format, ap);
+    if (code < 400 || code > 599) {
+       vstring_sprintf(why, "Protocol error: ");
+       dsn = "5.5.0";
+    }
+    vstring_vsprintf_append(why, format, ap);
     va_end(ap);
 
     /*
@@ -281,7 +295,7 @@ int     smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
                (DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
                 rcpt->orig_addr, rcpt->address, rcpt->offset,
                 session ? session->namaddr : "none",
-                request->arrival_time, "%s", vstring_str(why));
+                dsn, request->arrival_time, "%s", vstring_str(why));
            if (status == 0)
                deliver_completed(state->src, rcpt->offset);
            SMTP_RCPT_DROP(state, rcpt);
@@ -300,14 +314,15 @@ int     smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...)
 
 /* smtp_rcpt_fail - skip, defer, or bounce recipient */
 
-void    smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
-                              char *format,...)
+void    smtp_rcpt_fail(SMTP_STATE *state, const char *dsn, int code,
+                              RECIPIENT *rcpt, const char *format,...)
 {
     DELIVER_REQUEST *request = state->request;
     SMTP_SESSION *session = state->session;
     int     status;
     int     soft_error = SMTP_SOFT(code);
     va_list ap;
+    VSTRING *why = vstring_alloc(100);
 
     /*
      * Sanity check.
@@ -315,20 +330,25 @@ void    smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
     if (SMTP_RCPT_ISMARKED(rcpt))
        msg_panic("smtp_rcpt_fail: recipient <%s> is marked", rcpt->address);
 
+    /*
+     * Initialize.
+     */
+    va_start(ap, format);
+    if (code < 400 || code > 599) {
+       vstring_sprintf(why, "Protocol error: ");
+       dsn = "5.5.0";
+    }
+    vstring_vsprintf_append(why, format, ap);
+    va_end(ap);
+
     /*
      * Don't defer this recipient record just yet when this error qualifies
      * for trying other mail servers. Just log something informative to show
      * why we're skipping this recipient now.
      */
     if (soft_error && state->final_server == 0) {
-       VSTRING *buf = vstring_alloc(100);
-
-       va_start(ap, format);
-       vstring_vsprintf(buf, format, ap);
-       va_end(ap);
-       msg_info("%s: %s", request->queue_id, vstring_str(buf));
+       msg_info("%s: %s", request->queue_id, vstring_str(why));
        SMTP_RCPT_KEEP(state, rcpt);
-       vstring_free(buf);
     }
 
     /*
@@ -340,13 +360,11 @@ void    smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
      * that did qualify for delivery to a backup server.
      */
     else {
-       va_start(ap, format);
-       status = (soft_error ? vdefer_append : vbounce_append)
+       status = (soft_error ? defer_append : bounce_append)
            (DEL_REQ_TRACE_FLAGS(request->flags), request->queue_id,
             rcpt->orig_addr, rcpt->address, rcpt->offset,
             session ? session->namaddr : "none",
-            request->arrival_time, format, ap);
-       va_end(ap);
+            dsn, request->arrival_time, "%s", vstring_str(why));
        if (status == 0)
            deliver_completed(state->src, rcpt->offset);
        SMTP_RCPT_DROP(state, rcpt);
@@ -354,17 +372,23 @@ void    smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt,
     }
     if (session)
        smtp_check_code(session, code);
+
+    /*
+     * Cleanup.
+     */
+    vstring_free(why);
 }
 
 /* smtp_stream_except - defer domain after I/O problem */
 
-int     smtp_stream_except(SMTP_STATE *state, int code, char *description)
+int     smtp_stream_except(SMTP_STATE *state, int code, const char *description)
 {
     DELIVER_REQUEST *request = state->request;
     SMTP_SESSION *session = state->session;
     RECIPIENT *rcpt;
     int     nrcpt;
     VSTRING *why = vstring_alloc(100);
+    const char *dsn;
 
     /*
      * Sanity check.
@@ -381,10 +405,12 @@ int     smtp_stream_except(SMTP_STATE *state, int code, char *description)
     case SMTP_ERR_EOF:
        vstring_sprintf(why, "lost connection with %s while %s",
                        session->namaddr, description);
+       dsn = "4.4.2";
        break;
     case SMTP_ERR_TIME:
        vstring_sprintf(why, "conversation with %s timed out while %s",
                        session->namaddr, description);
+       dsn = "4.4.2";
        break;
     }
 
@@ -416,10 +442,13 @@ int     smtp_stream_except(SMTP_STATE *state, int code, char *description)
                                          request->queue_id,
                                          rcpt->orig_addr, rcpt->address,
                                          rcpt->offset, session->namaddr,
-                                         request->arrival_time,
+                                         dsn, request->arrival_time,
                                          "%s", vstring_str(why));
            SMTP_RCPT_DROP(state, rcpt);
        }
+       /* XXX This assumes no fall-back relay. */
+       if (request->hop_status == 0)
+           request->hop_status = dsn_prepend(dsn, vstring_str(why));
     }
 
     /*
index 88a8dbe9b06a759d1f19b409010506ab8b520b00..b265a4474dcf6bed528a21dd986abcaf3889ce1c 100644 (file)
@@ -59,14 +59,6 @@ clean:
 
 tidy:  clean
 
-depend: $(MAKES)
-       (sed '1,/^# do not edit/!d' Makefile.in; \
-       set -e; for i in [a-z][a-z0-9]*.c; do \
-           $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
-       @$(EXPORT) make -f Makefile.in Makefile 1>&2
-
 tests: smtpd_check_test smtpd_check_test2 smtpd_acl_test smtpd_exp_test \
        smtpd_token_test smtpd_check_test4
 
@@ -105,281 +97,292 @@ smtpd_token_test: smtpd_token smtpd_token.in smtpd_token.ref
        diff smtpd_token.ref smtpd_token.tmp
        rm -f smtpd_token.tmp
 
+depend: $(MAKES)
+       (sed '1,/^# do not edit/!d' Makefile.in; \
+       set -e; for i in [a-z][a-z0-9]*.c; do \
+           $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+       @$(EXPORT) make -f Makefile.in Makefile 1>&2
+
 # do not edit below this line - it is generated by 'make depend'
-smtpd.o: smtpd.c
-smtpd.o: ../../include/sys_defs.h
-smtpd.o: ../../include/msg.h
-smtpd.o: ../../include/mymalloc.h
-smtpd.o: ../../include/vstring.h
-smtpd.o: ../../include/vbuf.h
-smtpd.o: ../../include/vstream.h
-smtpd.o: ../../include/vstring_vstream.h
-smtpd.o: ../../include/stringops.h
-smtpd.o: ../../include/events.h
-smtpd.o: ../../include/smtp_stream.h
-smtpd.o: ../../include/valid_hostname.h
-smtpd.o: ../../include/dict.h
+smtpd.o: ../../include/anvil_clnt.h
 smtpd.o: ../../include/argv.h
-smtpd.o: ../../include/watchdog.h
-smtpd.o: ../../include/iostuff.h
-smtpd.o: ../../include/split_at.h
-smtpd.o: ../../include/name_code.h
-smtpd.o: ../../include/mail_params.h
-smtpd.o: ../../include/record.h
-smtpd.o: ../../include/rec_type.h
-smtpd.o: ../../include/mail_proto.h
 smtpd.o: ../../include/attr.h
+smtpd.o: ../../include/attr_clnt.h
 smtpd.o: ../../include/cleanup_user.h
-smtpd.o: ../../include/mail_date.h
-smtpd.o: ../../include/mail_conf.h
-smtpd.o: ../../include/off_cvt.h
 smtpd.o: ../../include/debug_peer.h
-smtpd.o: ../../include/mail_error.h
-smtpd.o: ../../include/name_mask.h
+smtpd.o: ../../include/dict.h
+smtpd.o: ../../include/ehlo_mask.h
+smtpd.o: ../../include/events.h
 smtpd.o: ../../include/flush_clnt.h
-smtpd.o: ../../include/mail_stream.h
+smtpd.o: ../../include/input_transp.h
+smtpd.o: ../../include/iostuff.h
+smtpd.o: ../../include/is_header.h
+smtpd.o: ../../include/lex_822.h
+smtpd.o: ../../include/mail_conf.h
+smtpd.o: ../../include/mail_date.h
+smtpd.o: ../../include/mail_error.h
+smtpd.o: ../../include/mail_params.h
+smtpd.o: ../../include/mail_proto.h
 smtpd.o: ../../include/mail_queue.h
-smtpd.o: ../../include/tok822.h
-smtpd.o: ../../include/resolve_clnt.h
-smtpd.o: ../../include/verp_sender.h
-smtpd.o: ../../include/string_list.h
+smtpd.o: ../../include/mail_server.h
+smtpd.o: ../../include/mail_stream.h
+smtpd.o: ../../include/maps.h
 smtpd.o: ../../include/match_list.h
 smtpd.o: ../../include/match_ops.h
+smtpd.o: ../../include/msg.h
+smtpd.o: ../../include/myaddrinfo.h
+smtpd.o: ../../include/mymalloc.h
+smtpd.o: ../../include/namadr_list.h
+smtpd.o: ../../include/name_code.h
+smtpd.o: ../../include/name_mask.h
+smtpd.o: ../../include/off_cvt.h
 smtpd.o: ../../include/quote_822_local.h
 smtpd.o: ../../include/quote_flags.h
-smtpd.o: ../../include/lex_822.h
-smtpd.o: ../../include/namadr_list.h
-smtpd.o: ../../include/input_transp.h
-smtpd.o: ../../include/is_header.h
-smtpd.o: ../../include/anvil_clnt.h
-smtpd.o: ../../include/attr_clnt.h
-smtpd.o: ../../include/ehlo_mask.h
-smtpd.o: ../../include/maps.h
+smtpd.o: ../../include/rec_type.h
+smtpd.o: ../../include/record.h
+smtpd.o: ../../include/resolve_clnt.h
+smtpd.o: ../../include/smtp_stream.h
+smtpd.o: ../../include/split_at.h
+smtpd.o: ../../include/string_list.h
+smtpd.o: ../../include/stringops.h
+smtpd.o: ../../include/sys_defs.h
+smtpd.o: ../../include/tls.h
+smtpd.o: ../../include/tok822.h
+smtpd.o: ../../include/valid_hostname.h
 smtpd.o: ../../include/valid_mailhost_addr.h
-smtpd.o: ../../include/mail_server.h
-smtpd.o: smtpd_token.h
+smtpd.o: ../../include/vbuf.h
+smtpd.o: ../../include/verp_sender.h
+smtpd.o: ../../include/vstream.h
+smtpd.o: ../../include/vstring.h
+smtpd.o: ../../include/vstring_vstream.h
+smtpd.o: ../../include/watchdog.h
+smtpd.o: smtpd.c
 smtpd.o: smtpd.h
-smtpd.o: ../../include/myaddrinfo.h
-smtpd.o: ../../include/tls.h
-smtpd.o: smtpd_check.h
 smtpd.o: smtpd_chat.h
-smtpd.o: smtpd_sasl_proto.h
-smtpd.o: smtpd_sasl_glue.h
+smtpd.o: smtpd_check.h
 smtpd.o: smtpd_proxy.h
-smtpd_chat.o: smtpd_chat.c
-smtpd_chat.o: ../../include/sys_defs.h
-smtpd_chat.o: ../../include/msg.h
+smtpd.o: smtpd_sasl_glue.h
+smtpd.o: smtpd_sasl_proto.h
+smtpd.o: smtpd_token.h
 smtpd_chat.o: ../../include/argv.h
-smtpd_chat.o: ../../include/vstring.h
-smtpd_chat.o: ../../include/vbuf.h
-smtpd_chat.o: ../../include/vstream.h
-smtpd_chat.o: ../../include/stringops.h
-smtpd_chat.o: ../../include/line_wrap.h
-smtpd_chat.o: ../../include/mymalloc.h
-smtpd_chat.o: ../../include/smtp_stream.h
-smtpd_chat.o: ../../include/record.h
-smtpd_chat.o: ../../include/rec_type.h
-smtpd_chat.o: ../../include/mail_proto.h
-smtpd_chat.o: ../../include/iostuff.h
 smtpd_chat.o: ../../include/attr.h
-smtpd_chat.o: ../../include/mail_params.h
-smtpd_chat.o: ../../include/mail_addr.h
-smtpd_chat.o: ../../include/post_mail.h
 smtpd_chat.o: ../../include/cleanup_user.h
+smtpd_chat.o: ../../include/iostuff.h
+smtpd_chat.o: ../../include/line_wrap.h
+smtpd_chat.o: ../../include/mail_addr.h
 smtpd_chat.o: ../../include/mail_error.h
-smtpd_chat.o: ../../include/name_mask.h
-smtpd_chat.o: smtpd.h
-smtpd_chat.o: ../../include/myaddrinfo.h
+smtpd_chat.o: ../../include/mail_params.h
+smtpd_chat.o: ../../include/mail_proto.h
 smtpd_chat.o: ../../include/mail_stream.h
+smtpd_chat.o: ../../include/msg.h
+smtpd_chat.o: ../../include/myaddrinfo.h
+smtpd_chat.o: ../../include/mymalloc.h
+smtpd_chat.o: ../../include/name_mask.h
+smtpd_chat.o: ../../include/post_mail.h
+smtpd_chat.o: ../../include/rec_type.h
+smtpd_chat.o: ../../include/record.h
+smtpd_chat.o: ../../include/smtp_stream.h
+smtpd_chat.o: ../../include/stringops.h
+smtpd_chat.o: ../../include/sys_defs.h
 smtpd_chat.o: ../../include/tls.h
+smtpd_chat.o: ../../include/vbuf.h
+smtpd_chat.o: ../../include/vstream.h
+smtpd_chat.o: ../../include/vstring.h
+smtpd_chat.o: smtpd.h
+smtpd_chat.o: smtpd_chat.c
 smtpd_chat.o: smtpd_chat.h
-smtpd_check.o: smtpd_check.c
-smtpd_check.o: ../../include/sys_defs.h
-smtpd_check.o: ../../include/msg.h
-smtpd_check.o: ../../include/vstring.h
-smtpd_check.o: ../../include/vbuf.h
-smtpd_check.o: ../../include/split_at.h
-smtpd_check.o: ../../include/fsspace.h
-smtpd_check.o: ../../include/stringops.h
-smtpd_check.o: ../../include/valid_hostname.h
 smtpd_check.o: ../../include/argv.h
-smtpd_check.o: ../../include/mymalloc.h
+smtpd_check.o: ../../include/attr.h
+smtpd_check.o: ../../include/attr_clnt.h
+smtpd_check.o: ../../include/cleanup_user.h
+smtpd_check.o: ../../include/ctable.h
+smtpd_check.o: ../../include/deliver_request.h
 smtpd_check.o: ../../include/dict.h
-smtpd_check.o: ../../include/vstream.h
+smtpd_check.o: ../../include/dns.h
+smtpd_check.o: ../../include/domain_list.h
+smtpd_check.o: ../../include/dsn_util.h
+smtpd_check.o: ../../include/fsspace.h
 smtpd_check.o: ../../include/htable.h
-smtpd_check.o: ../../include/ctable.h
+smtpd_check.o: ../../include/inet_addr_list.h
+smtpd_check.o: ../../include/inet_proto.h
+smtpd_check.o: ../../include/input_transp.h
+smtpd_check.o: ../../include/iostuff.h
+smtpd_check.o: ../../include/is_header.h
 smtpd_check.o: ../../include/mac_expand.h
 smtpd_check.o: ../../include/mac_parse.h
-smtpd_check.o: ../../include/attr_clnt.h
-smtpd_check.o: ../../include/attr.h
-smtpd_check.o: ../../include/myaddrinfo.h
-smtpd_check.o: ../../include/inet_proto.h
-smtpd_check.o: ../../include/dns.h
-smtpd_check.o: ../../include/sock_addr.h
-smtpd_check.o: ../../include/string_list.h
+smtpd_check.o: ../../include/mail_addr.h
+smtpd_check.o: ../../include/mail_addr_find.h
+smtpd_check.o: ../../include/mail_conf.h
+smtpd_check.o: ../../include/mail_error.h
+smtpd_check.o: ../../include/mail_params.h
+smtpd_check.o: ../../include/mail_proto.h
+smtpd_check.o: ../../include/mail_stream.h
+smtpd_check.o: ../../include/maps.h
 smtpd_check.o: ../../include/match_list.h
 smtpd_check.o: ../../include/match_ops.h
+smtpd_check.o: ../../include/match_parent_style.h
+smtpd_check.o: ../../include/msg.h
+smtpd_check.o: ../../include/myaddrinfo.h
+smtpd_check.o: ../../include/mymalloc.h
 smtpd_check.o: ../../include/namadr_list.h
-smtpd_check.o: ../../include/domain_list.h
-smtpd_check.o: ../../include/mail_params.h
-smtpd_check.o: ../../include/rewrite_clnt.h
-smtpd_check.o: ../../include/mail_proto.h
-smtpd_check.o: ../../include/iostuff.h
-smtpd_check.o: ../../include/resolve_clnt.h
-smtpd_check.o: ../../include/mail_error.h
 smtpd_check.o: ../../include/name_mask.h
-smtpd_check.o: ../../include/resolve_local.h
 smtpd_check.o: ../../include/own_inet_addr.h
-smtpd_check.o: ../../include/inet_addr_list.h
-smtpd_check.o: ../../include/mail_conf.h
-smtpd_check.o: ../../include/maps.h
-smtpd_check.o: ../../include/mail_addr_find.h
-smtpd_check.o: ../../include/match_parent_style.h
-smtpd_check.o: ../../include/strip_addr.h
-smtpd_check.o: ../../include/virtual8_maps.h
-smtpd_check.o: ../../include/cleanup_user.h
-smtpd_check.o: ../../include/record.h
 smtpd_check.o: ../../include/rec_type.h
-smtpd_check.o: ../../include/mail_addr.h
-smtpd_check.o: ../../include/verify_clnt.h
-smtpd_check.o: ../../include/deliver_request.h
 smtpd_check.o: ../../include/recipient_list.h
-smtpd_check.o: ../../include/input_transp.h
-smtpd_check.o: ../../include/is_header.h
+smtpd_check.o: ../../include/record.h
+smtpd_check.o: ../../include/resolve_clnt.h
+smtpd_check.o: ../../include/resolve_local.h
+smtpd_check.o: ../../include/rewrite_clnt.h
+smtpd_check.o: ../../include/sock_addr.h
+smtpd_check.o: ../../include/split_at.h
+smtpd_check.o: ../../include/string_list.h
+smtpd_check.o: ../../include/stringops.h
+smtpd_check.o: ../../include/strip_addr.h
+smtpd_check.o: ../../include/sys_defs.h
+smtpd_check.o: ../../include/tls.h
+smtpd_check.o: ../../include/valid_hostname.h
 smtpd_check.o: ../../include/valid_mailhost_addr.h
+smtpd_check.o: ../../include/vbuf.h
+smtpd_check.o: ../../include/verify_clnt.h
+smtpd_check.o: ../../include/virtual8_maps.h
+smtpd_check.o: ../../include/vstream.h
+smtpd_check.o: ../../include/vstring.h
 smtpd_check.o: smtpd.h
-smtpd_check.o: ../../include/mail_stream.h
-smtpd_check.o: ../../include/tls.h
-smtpd_check.o: smtpd_sasl_glue.h
+smtpd_check.o: smtpd_check.c
 smtpd_check.o: smtpd_check.h
-smtpd_peer.o: smtpd_peer.c
-smtpd_peer.o: ../../include/sys_defs.h
+smtpd_check.o: smtpd_sasl_glue.h
+smtpd_peer.o: ../../include/argv.h
+smtpd_peer.o: ../../include/attr.h
+smtpd_peer.o: ../../include/inet_proto.h
+smtpd_peer.o: ../../include/iostuff.h
+smtpd_peer.o: ../../include/mail_proto.h
+smtpd_peer.o: ../../include/mail_stream.h
 smtpd_peer.o: ../../include/msg.h
+smtpd_peer.o: ../../include/myaddrinfo.h
 smtpd_peer.o: ../../include/mymalloc.h
+smtpd_peer.o: ../../include/sock_addr.h
 smtpd_peer.o: ../../include/stringops.h
-smtpd_peer.o: ../../include/vstring.h
+smtpd_peer.o: ../../include/sys_defs.h
+smtpd_peer.o: ../../include/tls.h
+smtpd_peer.o: ../../include/valid_hostname.h
+smtpd_peer.o: ../../include/valid_mailhost_addr.h
 smtpd_peer.o: ../../include/vbuf.h
-smtpd_peer.o: ../../include/myaddrinfo.h
-smtpd_peer.o: ../../include/sock_addr.h
-smtpd_peer.o: ../../include/inet_proto.h
-smtpd_peer.o: ../../include/mail_proto.h
 smtpd_peer.o: ../../include/vstream.h
-smtpd_peer.o: ../../include/iostuff.h
-smtpd_peer.o: ../../include/attr.h
-smtpd_peer.o: ../../include/valid_mailhost_addr.h
-smtpd_peer.o: ../../include/valid_hostname.h
+smtpd_peer.o: ../../include/vstring.h
 smtpd_peer.o: smtpd.h
-smtpd_peer.o: ../../include/argv.h
-smtpd_peer.o: ../../include/mail_stream.h
-smtpd_peer.o: ../../include/tls.h
-smtpd_proxy.o: smtpd_proxy.c
-smtpd_proxy.o: ../../include/sys_defs.h
-smtpd_proxy.o: ../../include/msg.h
-smtpd_proxy.o: ../../include/vstream.h
-smtpd_proxy.o: ../../include/vbuf.h
-smtpd_proxy.o: ../../include/vstring.h
-smtpd_proxy.o: ../../include/stringops.h
+smtpd_peer.o: smtpd_peer.c
+smtpd_proxy.o: ../../include/argv.h
+smtpd_proxy.o: ../../include/attr.h
+smtpd_proxy.o: ../../include/cleanup_user.h
 smtpd_proxy.o: ../../include/connect.h
 smtpd_proxy.o: ../../include/iostuff.h
-smtpd_proxy.o: ../../include/name_code.h
 smtpd_proxy.o: ../../include/mail_error.h
-smtpd_proxy.o: ../../include/name_mask.h
-smtpd_proxy.o: ../../include/smtp_stream.h
-smtpd_proxy.o: ../../include/cleanup_user.h
 smtpd_proxy.o: ../../include/mail_params.h
-smtpd_proxy.o: ../../include/rec_type.h
 smtpd_proxy.o: ../../include/mail_proto.h
-smtpd_proxy.o: ../../include/attr.h
-smtpd_proxy.o: smtpd.h
-smtpd_proxy.o: ../../include/argv.h
-smtpd_proxy.o: ../../include/myaddrinfo.h
 smtpd_proxy.o: ../../include/mail_stream.h
+smtpd_proxy.o: ../../include/msg.h
+smtpd_proxy.o: ../../include/myaddrinfo.h
+smtpd_proxy.o: ../../include/name_code.h
+smtpd_proxy.o: ../../include/name_mask.h
+smtpd_proxy.o: ../../include/rec_type.h
+smtpd_proxy.o: ../../include/smtp_stream.h
+smtpd_proxy.o: ../../include/stringops.h
+smtpd_proxy.o: ../../include/sys_defs.h
 smtpd_proxy.o: ../../include/tls.h
+smtpd_proxy.o: ../../include/vbuf.h
+smtpd_proxy.o: ../../include/vstream.h
+smtpd_proxy.o: ../../include/vstring.h
+smtpd_proxy.o: smtpd.h
+smtpd_proxy.o: smtpd_proxy.c
 smtpd_proxy.o: smtpd_proxy.h
-smtpd_sasl_glue.o: smtpd_sasl_glue.c
-smtpd_sasl_glue.o: ../../include/sys_defs.h
+smtpd_sasl_glue.o: ../../include/argv.h
+smtpd_sasl_glue.o: ../../include/mail_params.h
+smtpd_sasl_glue.o: ../../include/mail_stream.h
+smtpd_sasl_glue.o: ../../include/match_list.h
+smtpd_sasl_glue.o: ../../include/match_ops.h
 smtpd_sasl_glue.o: ../../include/msg.h
+smtpd_sasl_glue.o: ../../include/myaddrinfo.h
 smtpd_sasl_glue.o: ../../include/mymalloc.h
 smtpd_sasl_glue.o: ../../include/namadr_list.h
-smtpd_sasl_glue.o: ../../include/match_list.h
-smtpd_sasl_glue.o: ../../include/match_ops.h
 smtpd_sasl_glue.o: ../../include/name_mask.h
-smtpd_sasl_glue.o: ../../include/mail_params.h
 smtpd_sasl_glue.o: ../../include/smtp_stream.h
-smtpd_sasl_glue.o: ../../include/vstring.h
+smtpd_sasl_glue.o: ../../include/stringops.h
+smtpd_sasl_glue.o: ../../include/sys_defs.h
+smtpd_sasl_glue.o: ../../include/tls.h
 smtpd_sasl_glue.o: ../../include/vbuf.h
 smtpd_sasl_glue.o: ../../include/vstream.h
+smtpd_sasl_glue.o: ../../include/vstring.h
 smtpd_sasl_glue.o: smtpd.h
-smtpd_sasl_glue.o: ../../include/argv.h
-smtpd_sasl_glue.o: ../../include/myaddrinfo.h
-smtpd_sasl_glue.o: ../../include/mail_stream.h
-smtpd_sasl_glue.o: ../../include/tls.h
-smtpd_sasl_glue.o: smtpd_sasl_glue.h
 smtpd_sasl_glue.o: smtpd_chat.h
-smtpd_sasl_proto.o: smtpd_sasl_proto.c
-smtpd_sasl_proto.o: ../../include/sys_defs.h
+smtpd_sasl_glue.o: smtpd_sasl_glue.c
+smtpd_sasl_glue.o: smtpd_sasl_glue.h
+smtpd_sasl_proto.o: ../../include/argv.h
+smtpd_sasl_proto.o: ../../include/attr.h
+smtpd_sasl_proto.o: ../../include/iostuff.h
+smtpd_sasl_proto.o: ../../include/mail_error.h
+smtpd_sasl_proto.o: ../../include/mail_params.h
+smtpd_sasl_proto.o: ../../include/mail_proto.h
+smtpd_sasl_proto.o: ../../include/mail_stream.h
 smtpd_sasl_proto.o: ../../include/msg.h
+smtpd_sasl_proto.o: ../../include/myaddrinfo.h
 smtpd_sasl_proto.o: ../../include/mymalloc.h
+smtpd_sasl_proto.o: ../../include/name_mask.h
 smtpd_sasl_proto.o: ../../include/stringops.h
-smtpd_sasl_proto.o: ../../include/vstring.h
+smtpd_sasl_proto.o: ../../include/sys_defs.h
+smtpd_sasl_proto.o: ../../include/tls.h
 smtpd_sasl_proto.o: ../../include/vbuf.h
-smtpd_sasl_proto.o: ../../include/mail_params.h
-smtpd_sasl_proto.o: ../../include/mail_proto.h
 smtpd_sasl_proto.o: ../../include/vstream.h
-smtpd_sasl_proto.o: ../../include/iostuff.h
-smtpd_sasl_proto.o: ../../include/attr.h
-smtpd_sasl_proto.o: ../../include/mail_error.h
-smtpd_sasl_proto.o: ../../include/name_mask.h
+smtpd_sasl_proto.o: ../../include/vstring.h
 smtpd_sasl_proto.o: smtpd.h
-smtpd_sasl_proto.o: ../../include/argv.h
-smtpd_sasl_proto.o: ../../include/myaddrinfo.h
-smtpd_sasl_proto.o: ../../include/mail_stream.h
-smtpd_sasl_proto.o: ../../include/tls.h
-smtpd_sasl_proto.o: smtpd_token.h
 smtpd_sasl_proto.o: smtpd_chat.h
-smtpd_sasl_proto.o: smtpd_sasl_proto.h
 smtpd_sasl_proto.o: smtpd_sasl_glue.h
-smtpd_state.o: smtpd_state.c
-smtpd_state.o: ../../include/sys_defs.h
-smtpd_state.o: ../../include/events.h
-smtpd_state.o: ../../include/mymalloc.h
-smtpd_state.o: ../../include/vstream.h
-smtpd_state.o: ../../include/vbuf.h
-smtpd_state.o: ../../include/name_mask.h
-smtpd_state.o: ../../include/msg.h
+smtpd_sasl_proto.o: smtpd_sasl_proto.c
+smtpd_sasl_proto.o: smtpd_sasl_proto.h
+smtpd_sasl_proto.o: smtpd_token.h
+smtpd_state.o: ../../include/argv.h
+smtpd_state.o: ../../include/attr.h
 smtpd_state.o: ../../include/cleanup_user.h
-smtpd_state.o: ../../include/mail_params.h
+smtpd_state.o: ../../include/events.h
+smtpd_state.o: ../../include/iostuff.h
 smtpd_state.o: ../../include/mail_error.h
+smtpd_state.o: ../../include/mail_params.h
 smtpd_state.o: ../../include/mail_proto.h
-smtpd_state.o: ../../include/iostuff.h
-smtpd_state.o: ../../include/attr.h
-smtpd_state.o: smtpd.h
-smtpd_state.o: ../../include/vstring.h
-smtpd_state.o: ../../include/argv.h
-smtpd_state.o: ../../include/myaddrinfo.h
 smtpd_state.o: ../../include/mail_stream.h
+smtpd_state.o: ../../include/msg.h
+smtpd_state.o: ../../include/myaddrinfo.h
+smtpd_state.o: ../../include/mymalloc.h
+smtpd_state.o: ../../include/name_mask.h
+smtpd_state.o: ../../include/sys_defs.h
 smtpd_state.o: ../../include/tls.h
+smtpd_state.o: ../../include/vbuf.h
+smtpd_state.o: ../../include/vstream.h
+smtpd_state.o: ../../include/vstring.h
+smtpd_state.o: smtpd.h
 smtpd_state.o: smtpd_chat.h
 smtpd_state.o: smtpd_sasl_glue.h
-smtpd_token.o: smtpd_token.c
-smtpd_token.o: ../../include/sys_defs.h
-smtpd_token.o: ../../include/mymalloc.h
+smtpd_state.o: smtpd_state.c
 smtpd_token.o: ../../include/mvect.h
-smtpd_token.o: smtpd_token.h
-smtpd_token.o: ../../include/vstring.h
+smtpd_token.o: ../../include/mymalloc.h
+smtpd_token.o: ../../include/sys_defs.h
 smtpd_token.o: ../../include/vbuf.h
-smtpd_xforward.o: smtpd_xforward.c
-smtpd_xforward.o: ../../include/sys_defs.h
-smtpd_xforward.o: ../../include/mymalloc.h
-smtpd_xforward.o: ../../include/msg.h
-smtpd_xforward.o: ../../include/mail_proto.h
-smtpd_xforward.o: ../../include/vstream.h
-smtpd_xforward.o: ../../include/vbuf.h
-smtpd_xforward.o: ../../include/iostuff.h
-smtpd_xforward.o: ../../include/attr.h
-smtpd_xforward.o: smtpd.h
-smtpd_xforward.o: ../../include/vstring.h
+smtpd_token.o: ../../include/vstring.h
+smtpd_token.o: smtpd_token.c
+smtpd_token.o: smtpd_token.h
 smtpd_xforward.o: ../../include/argv.h
-smtpd_xforward.o: ../../include/myaddrinfo.h
+smtpd_xforward.o: ../../include/attr.h
+smtpd_xforward.o: ../../include/iostuff.h
+smtpd_xforward.o: ../../include/mail_proto.h
 smtpd_xforward.o: ../../include/mail_stream.h
+smtpd_xforward.o: ../../include/msg.h
+smtpd_xforward.o: ../../include/myaddrinfo.h
+smtpd_xforward.o: ../../include/mymalloc.h
+smtpd_xforward.o: ../../include/sys_defs.h
 smtpd_xforward.o: ../../include/tls.h
+smtpd_xforward.o: ../../include/vbuf.h
+smtpd_xforward.o: ../../include/vstream.h
+smtpd_xforward.o: ../../include/vstring.h
+smtpd_xforward.o: smtpd.h
+smtpd_xforward.o: smtpd_xforward.c
index 756a4cd93ff2540b3ce78a95c5d9c4ecf773b2f4..f5a5eef9545ac270f51c2c60e7a5f109c4691ced 100644 (file)
@@ -36,6 +36,7 @@
 /*     RFC 1869 (SMTP service extensions)
 /*     RFC 1870 (Message Size Declaration)
 /*     RFC 1985 (ETRN command)
+/*     RFC 2034 (Enhanced Error Codes)
 /*     RFC 2554 (AUTH command)
 /*     RFC 2821 (SMTP protocol)
 /*     RFC 2920 (SMTP Pipelining)
@@ -70,7 +71,7 @@
 /*     Disable the SMTP VRFY command.
 /* .IP "\fBsmtpd_noop_commands (empty)\fR"
 /*     List of commands that the Postfix SMTP server replies to with "250
-/*     Ok", without doing any syntax checks and without changing state.
+/*     2.0.0 Ok", without doing any syntax checks and without changing state.
 /* .IP "\fBstrict_rfc821_envelopes (no)\fR"
 /*     Require that addresses received in SMTP MAIL FROM and RCPT TO
 /*     commands are enclosed with <>, and that those addresses do
@@ -1041,6 +1042,11 @@ static int helo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
 {
     char   *err;
 
+    /*
+     * RFC 2034: the text part of all 2xx, 4xx, and 5xx SMTP responses other
+     * than the initial greeting and any response to HELO or EHLO are
+     * prefaced with a status code as defined in RFC 1893.
+     */
     if (argc < 2) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
        smtpd_chat_reply(state, "501 Syntax: HELO hostname");
@@ -1084,6 +1090,10 @@ static int ehlo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
      * XXX 2821 new feature: Section 4.1.4 specifies that a server must clear
      * all buffers and reset the state exactly as if a RSET command had been
      * issued.
+     * 
+     * RFC 2034: the text part of all 2xx, 4xx, and 5xx SMTP responses other
+     * than the initial greeting and any response to HELO or EHLO are
+     * prefaced with a status code as defined in RFC 1893.
      */
     if (argc < 2) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
@@ -1330,8 +1340,8 @@ static void mail_open_stream(SMTPD_STATE *state)
 
 /* extract_addr - extract address from rubble */
 
-static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
-                                 int allow_empty_addr, int strict_rfc821)
+static int extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
+                               int allow_empty_addr, int strict_rfc821)
 {
     char   *myname = "extract_addr";
     TOK822 *tree;
@@ -1339,7 +1349,7 @@ static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
     TOK822 *addr = 0;
     int     naddr;
     int     non_addr;
-    char   *err = 0;
+    int     err = 0;
     char   *junk = 0;
     char   *text;
     char   *colon;
@@ -1402,7 +1412,7 @@ static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
        || (strict_rfc821 && (non_addr || *STR(arg->vstrval) != '<'))) {
        msg_warn("Illegal address syntax from %s in %s command: %s",
                 state->namaddr, state->where, STR(arg->vstrval));
-       err = "501 Bad address syntax";
+       err = 1;
     }
 
     /*
@@ -1428,7 +1438,7 @@ static char *extract_addr(SMTPD_STATE *state, SMTPD_TOKEN *arg,
                && smtpd_check_addr(STR(arg->vstrval)) != 0)) {
            msg_warn("Illegal address syntax from %s in %s command: %s",
                     state->namaddr, state->where, STR(arg->vstrval));
-           err = "501 Bad address syntax";
+           err = 1;
        }
 
     /*
@@ -1463,20 +1473,20 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
      */
     if (var_helo_required && state->helo_name == 0) {
        state->error_mask |= MAIL_ERROR_POLICY;
-       smtpd_chat_reply(state, "503 Error: send HELO/EHLO first");
+       smtpd_chat_reply(state, "503 5.5.1 Error: send HELO/EHLO first");
        return (-1);
     }
 #define IN_MAIL_TRANSACTION(state) ((state)->sender != 0)
 
     if (IN_MAIL_TRANSACTION(state)) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "503 Error: nested MAIL command");
+       smtpd_chat_reply(state, "503 5.5.1 Error: nested MAIL command");
        return (-1);
     }
     if (argc < 3
        || strcasecmp(argv[1].strval, "from:") != 0) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: MAIL FROM: <address>");
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: MAIL FROM: <address>");
        return (-1);
     }
 
@@ -1493,7 +1503,7 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        && anvil_clnt_mail(anvil_clnt, state->service, state->addr,
                           &rate) == ANVIL_STAT_OK
        && rate > var_smtpd_cmail_limit) {
-       smtpd_chat_reply(state, "421 %s Error: too much mail from %s",
+       smtpd_chat_reply(state, "421 4.7.0 %s Error: too much mail from %s",
                         var_myhostname, state->addr);
        msg_warn("Message delivery request rate limit exceeded: %d from %s for service %s",
                 rate, state->namaddr, state->service);
@@ -1501,12 +1511,12 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
     }
     if (argv[2].tokval == SMTPD_TOK_ERROR) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Bad sender address syntax");
+       smtpd_chat_reply(state, "501 5.1.7 Bad sender address syntax");
        return (-1);
     }
-    if ((err = extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR, var_strict_rfc821_env)) != 0) {
+    if (extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR, var_strict_rfc821_env) != 0) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "%s", err);
+       smtpd_chat_reply(state, "501 5.1.7 Bad sender address syntax");
        return (-1);
     }
     for (narg = 3; narg < argc; narg++) {
@@ -1519,12 +1529,12 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
            /* Reject non-numeric size. */
            if (!alldig(arg + 5)) {
                state->error_mask |= MAIL_ERROR_PROTOCOL;
-               smtpd_chat_reply(state, "501 Bad message size syntax");
+               smtpd_chat_reply(state, "501 5.5.4 Bad message size syntax");
                return (-1);
            }
            /* Reject size overflow. */
            if ((state->msg_size = off_cvt_string(arg + 5)) < 0) {
-               smtpd_chat_reply(state, "552 Message size exceeds file system imposed limit");
+               smtpd_chat_reply(state, "552 5.3.4 Message size exceeds file system imposed limit");
                state->error_mask |= MAIL_ERROR_POLICY;
                return (-1);
            }
@@ -1544,19 +1554,20 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
                verp_delims = arg + VERP_CMD_LEN + 1;
                if (verp_delims_verify(verp_delims) != 0) {
                    state->error_mask |= MAIL_ERROR_PROTOCOL;
-                   smtpd_chat_reply(state, "501 Error: %s needs two characters from %s",
+                   smtpd_chat_reply(state,
+                        "501 5.5.4 Error: %s needs two characters from %s",
                                     VERP_CMD, var_verp_filter);
                    return (-1);
                }
            }
        } else {
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "555 Unsupported option: %s", arg);
+           smtpd_chat_reply(state, "555 5.5.4 Unsupported option: %s", arg);
            return (-1);
        }
     }
     if (verp_delims && argv[2].strval[0] == 0) {
-       smtpd_chat_reply(state, "503 Error: %s requires non-null sender",
+       smtpd_chat_reply(state, "503 5.5.4 Error: %s requires non-null sender",
                         VERP_CMD);
        return (-1);
     }
@@ -1590,7 +1601,7 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        state->verp_delims = mystrdup(verp_delims);
     if (USE_SMTPD_PROXY(state))
        state->proxy_mail = mystrdup(STR(state->buffer));
-    smtpd_chat_reply(state, "250 Ok");
+    smtpd_chat_reply(state, "250 2.1.0 Ok");
     return (0);
 }
 
@@ -1679,13 +1690,13 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
      */
     if (!IN_MAIL_TRANSACTION(state)) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "503 Error: need MAIL command");
+       smtpd_chat_reply(state, "503 5.5.1 Error: need MAIL command");
        return (-1);
     }
     if (argc < 3
        || strcasecmp(argv[1].strval, "to:") != 0) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: RCPT TO: <address>");
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: RCPT TO: <address>");
        return (-1);
     }
 
@@ -1702,7 +1713,8 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        && anvil_clnt_rcpt(anvil_clnt, state->service, state->addr,
                           &rate) == ANVIL_STAT_OK
        && rate > var_smtpd_crcpt_limit) {
-       smtpd_chat_reply(state, "421 %s Error: too many recipients from %s",
+       smtpd_chat_reply(state,
+                        "421 4.7.0 %s Error: too many recipients from %s",
                         var_myhostname, state->addr);
        msg_warn("Recipient address rate limit exceeded: %d from %s for service %s",
                 rate, state->namaddr, state->service);
@@ -1710,24 +1722,24 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
     }
     if (argv[2].tokval == SMTPD_TOK_ERROR) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Bad recipient address syntax");
+       smtpd_chat_reply(state, "501 5.1.3 Bad recipient address syntax");
        return (-1);
     }
-    if ((err = extract_addr(state, argv + 2, REJECT_EMPTY_ADDR, var_strict_rfc821_env)) != 0) {
+    if (extract_addr(state, argv + 2, REJECT_EMPTY_ADDR, var_strict_rfc821_env) != 0) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "%s", err);
+       smtpd_chat_reply(state, "501 5.1.3 Bad recipient address syntax");
        return (-1);
     }
     for (narg = 3; narg < argc; narg++) {
        arg = argv[narg].strval;
        if (1) {
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "555 Unsupported option: %s", arg);
+           smtpd_chat_reply(state, "555 5.5.4 Unsupported option: %s", arg);
            return (-1);
        }
     }
     if (var_smtpd_rcpt_limit && state->rcpt_count >= var_smtpd_rcpt_limit) {
-       smtpd_chat_reply(state, "452 Error: too many recipients");
+       smtpd_chat_reply(state, "452 4.5.3 Error: too many recipients");
        if (state->rcpt_overshoot++ < var_smtpd_rcpt_overlim)
            return (0);
        state->error_mask |= MAIL_ERROR_POLICY;
@@ -1794,7 +1806,7 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        rec_fputs(state->cleanup, REC_TYPE_RCPT, argv[2].strval);
        vstream_fflush(state->cleanup);
     }
-    smtpd_chat_reply(state, "250 Ok");
+    smtpd_chat_reply(state, "250 2.1.5 Ok");
     return (0);
 }
 
@@ -1863,6 +1875,7 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
     VSTREAM *out_stream;
     int     out_error;
     char  **cpp;
+    CLEANUP_STAT_DETAIL *detail;
 
 #ifdef USE_TLS
     VSTRING *peer_CN;
@@ -1878,15 +1891,15 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
     if (state->rcpt_count == 0) {
        if (!IN_MAIL_TRANSACTION(state)) {
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "503 Error: need RCPT command");
+           smtpd_chat_reply(state, "503 5.5.1 Error: need RCPT command");
        } else {
-           smtpd_chat_reply(state, "554 Error: no valid recipients");
+           smtpd_chat_reply(state, "554 5.5.1 Error: no valid recipients");
        }
        return (-1);
     }
     if (argc != 1) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: DATA");
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: DATA");
        return (-1);
     }
     if (SMTPD_STAND_ALONE(state) == 0 && (err = smtpd_check_data(state)) != 0) {
@@ -2077,8 +2090,10 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
        } else {
            state->error_mask |= MAIL_ERROR_SOFTWARE;
            state->err |= CLEANUP_STAT_PROXY;
+           detail = cleanup_stat_detail(CLEANUP_STAT_PROXY);
            vstring_sprintf(state->proxy_buffer,
-                           "451 Error: queue file write error");
+                           "%d %s Error: %s",
+                           detail->smtp, detail->dsn, detail->text);
        }
     }
 
@@ -2113,34 +2128,49 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
        state->error_mask = 0;
        state->junk_cmds = 0;
        if (state->queue_id)
-           smtpd_chat_reply(state, "250 Ok: queued as %s", state->queue_id);
+           smtpd_chat_reply(state,
+                            "250 2.0.0 Ok: queued as %s", state->queue_id);
        else
            smtpd_chat_reply(state, "%s", STR(state->proxy_buffer));
     } else if ((state->err & CLEANUP_STAT_BAD) != 0) {
        state->error_mask |= MAIL_ERROR_SOFTWARE;
-       smtpd_chat_reply(state, "451 Error: internal error %d", state->err);
+       detail = cleanup_stat_detail(CLEANUP_STAT_BAD);
+       smtpd_chat_reply(state, "%d %s Error: internal error %d",
+                        detail->smtp, detail->dsn, state->err);
     } else if ((state->err & CLEANUP_STAT_SIZE) != 0) {
        state->error_mask |= MAIL_ERROR_BOUNCE;
-       smtpd_chat_reply(state, "552 Error: message too large");
+       detail = cleanup_stat_detail(CLEANUP_STAT_SIZE);
+       smtpd_chat_reply(state, "%d %s Error: %s",
+                        detail->smtp, detail->dsn, detail->text);
     } else if ((state->err & CLEANUP_STAT_HOPS) != 0) {
        state->error_mask |= MAIL_ERROR_BOUNCE;
-       smtpd_chat_reply(state, "554 Error: too many hops");
+       detail = cleanup_stat_detail(CLEANUP_STAT_HOPS);
+       smtpd_chat_reply(state, "%d %s Error: %s",
+                        detail->smtp, detail->dsn, detail->text);
     } else if ((state->err & CLEANUP_STAT_CONT) != 0) {
        state->error_mask |= MAIL_ERROR_POLICY;
-       if (state->proxy_buffer)
+       detail = cleanup_stat_detail(CLEANUP_STAT_CONT);
+       if (state->proxy_buffer) {
            smtpd_chat_reply(state, "%s", STR(state->proxy_buffer));
-       else
-           smtpd_chat_reply(state, "550 Error: %s", LEN(why) ?
-                            STR(why) : "content rejected");
+       } else if (why && LEN(why) > 0) {
+           smtpd_chat_reply(state, "%d %s", detail->smtp, STR(why));
+       } else {
+           smtpd_chat_reply(state, "%d %s Error: %s",
+                            detail->smtp, detail->dsn, detail->text);
+       }
     } else if ((state->err & CLEANUP_STAT_WRITE) != 0) {
        state->error_mask |= MAIL_ERROR_RESOURCE;
-       smtpd_chat_reply(state, "451 Error: queue file write error");
+       detail = cleanup_stat_detail(CLEANUP_STAT_WRITE);
+       smtpd_chat_reply(state, "%d %s Error: %s",
+                        detail->smtp, detail->dsn, detail->text);
     } else if ((state->err & CLEANUP_STAT_PROXY) != 0) {
        state->error_mask |= MAIL_ERROR_SOFTWARE;
        smtpd_chat_reply(state, "%s", STR(state->proxy_buffer));
     } else {
        state->error_mask |= MAIL_ERROR_SOFTWARE;
-       smtpd_chat_reply(state, "451 Error: internal error %d", state->err);
+       detail = cleanup_stat_detail(CLEANUP_STAT_BAD);
+       smtpd_chat_reply(state, "%d %s Error: internal error %d",
+                        detail->smtp, detail->dsn, state->err);
     }
 
     /*
@@ -2165,7 +2195,7 @@ static int rset_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
      */
     if (argc != 1) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: RSET");
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: RSET");
        return (-1);
     }
 
@@ -2175,7 +2205,7 @@ static int rset_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
     chat_reset(state, var_smtpd_hist_thrsh);
     mail_reset(state);
     rcpt_reset(state);
-    smtpd_chat_reply(state, "250 Ok");
+    smtpd_chat_reply(state, "250 2.0.0 Ok");
     return (0);
 }
 
@@ -2198,11 +2228,11 @@ static int noop_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
      */
     if (argc != 1) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: NOOP");
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: NOOP");
        return (-1);
     }
 #endif
-    smtpd_chat_reply(state, "250 Ok");
+    smtpd_chat_reply(state, "250 2.0.0 Ok");
     return (0);
 }
 
@@ -2238,19 +2268,19 @@ static int vrfy_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
 
     if (var_disable_vrfy_cmd) {
        state->error_mask |= MAIL_ERROR_POLICY;
-       smtpd_chat_reply(state, "502 VRFY command is disabled");
+       smtpd_chat_reply(state, "502 5.5.1 VRFY command is disabled");
        return (-1);
     }
     if (argc < 2) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: VRFY address");
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: VRFY address");
        return (-1);
     }
     if (argc > 2)
        collapse_args(argc - 1, argv + 1);
-    if ((err = extract_addr(state, argv + 1, REJECT_EMPTY_ADDR, SLOPPY)) != 0) {
+    if (extract_addr(state, argv + 1, REJECT_EMPTY_ADDR, SLOPPY) != 0) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "%s", err);
+       smtpd_chat_reply(state, "501 5.1.3 Bad recipient address syntax");
        return (-1);
     }
     if (SMTPD_STAND_ALONE(state) == 0
@@ -2268,7 +2298,7 @@ static int vrfy_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
      * Reply code 250 is reserved for the case where the address is verified;
      * reply code 252 should be used when no definitive certainty exists.
      */
-    smtpd_chat_reply(state, "252 %s", argv[1].strval);
+    smtpd_chat_reply(state, "252 2.0.0 %s", argv[1].strval);
     return (0);
 }
 
@@ -2297,7 +2327,7 @@ static int etrn_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        return (-1);
     }
     if (argv[1].strval[0] == '@' || argv[1].strval[0] == '#')
-        argv[1].strval++;
+       argv[1].strval++;
 
     /*
      * As an extension to RFC 1985 we also allow an RFC 2821 address literal
@@ -2354,7 +2384,7 @@ static int quit_cmd(SMTPD_STATE *state, int unused_argc, SMTPD_TOKEN *unused_arg
     /*
      * Don't bother checking the syntax.
      */
-    smtpd_chat_reply(state, "221 Bye");
+    smtpd_chat_reply(state, "221 2.0.0 Bye");
 
     /*
      * When the "." and quit replies are pipelined, make sure they are
@@ -2392,18 +2422,18 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
      */
     if (IN_MAIL_TRANSACTION(state)) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "503 Error: MAIL transaction in progress");
+       smtpd_chat_reply(state, "503 5.5.1 Error: MAIL transaction in progress");
        return (-1);
     }
     if (argc < 2) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: %s attribute=value...",
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: %s attribute=value...",
                         XCLIENT_CMD);
        return (-1);
     }
     if (!xclient_allowed) {
        state->error_mask |= MAIL_ERROR_POLICY;
-       smtpd_chat_reply(state, "554 Error: insufficient authorization");
+       smtpd_chat_reply(state, "550 5.7.0 Error: insufficient authorization");
        return (-1);
     }
 #define STREQ(x,y)     (strcasecmp((x), (y)) == 0)
@@ -2424,7 +2454,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
         */
        if ((attr_value = split_at(attr_name, '=')) == 0 || *attr_value == 0) {
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "501 Error: attribute=value expected");
+           smtpd_chat_reply(state, "501 5.5.4 Error: attribute=value expected");
            return (-1);
        }
        printable(attr_value, '?');
@@ -2440,7 +2470,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
            } else {
                if (!valid_hostname(attr_value, DONT_GRIPE)) {
                    state->error_mask |= MAIL_ERROR_PROTOCOL;
-                   smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+                   smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                     XCLIENT_NAME, attr_value);
                    return (-1);
                }
@@ -2460,7 +2490,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
            } else {
                if ((bare_value = valid_mailhost_addr(attr_value, DONT_GRIPE)) == 0) {
                    state->error_mask |= MAIL_ERROR_PROTOCOL;
-                   smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+                   smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                     XCLIENT_ADDR, attr_value);
                    return (-1);
                }
@@ -2480,7 +2510,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
            } else {
                if (strlen(attr_value) > VALID_HOSTNAME_LEN) {
                    state->error_mask |= MAIL_ERROR_PROTOCOL;
-                   smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+                   smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                     XCLIENT_HELO, attr_value);
                    return (-1);
                }
@@ -2495,7 +2525,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        else if (STREQ(attr_name, XCLIENT_PROTO)) {
            if (name_code(proto_names, NAME_CODE_FLAG_NONE, attr_value) < 0) {
                state->error_mask |= MAIL_ERROR_PROTOCOL;
-               smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+               smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                 XCLIENT_PROTO, attr_value);
                return (-1);
            }
@@ -2507,7 +2537,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
         */
        else {
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "501 Bad %s attribute name: %s",
+           smtpd_chat_reply(state, "501 5.5.4 Bad %s attribute name: %s",
                             XCLIENT_CMD, attr_name);
            return (-1);
        }
@@ -2522,7 +2552,7 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        state->namaddr =
            concatenate(state->name, "[", state->addr, "]", (char *) 0);
     }
-    smtpd_chat_reply(state, "250 Ok");
+    smtpd_chat_reply(state, "250 2.0.0 Ok");
     return (0);
 }
 
@@ -2560,18 +2590,18 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
      */
     if (IN_MAIL_TRANSACTION(state)) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "503 Error: MAIL transaction in progress");
+       smtpd_chat_reply(state, "503 5.5.1 Error: MAIL transaction in progress");
        return (-1);
     }
     if (argc < 2) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: %s attribute=value...",
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: %s attribute=value...",
                         XFORWARD_CMD);
        return (-1);
     }
     if (!xforward_allowed) {
        state->error_mask |= MAIL_ERROR_POLICY;
-       smtpd_chat_reply(state, "554 Error: insufficient authorization");
+       smtpd_chat_reply(state, "550 5.7.0 Error: insufficient authorization");
        return (-1);
     }
 
@@ -2593,12 +2623,12 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
         */
        if ((attr_value = split_at(attr_name, '=')) == 0 || *attr_value == 0) {
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "501 Error: attribute=value expected");
+           smtpd_chat_reply(state, "501 5.5.4 Error: attribute=value expected");
            return (-1);
        }
        if (strlen(attr_value) > 255) {
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "501 Error: attribute value too long");
+           smtpd_chat_reply(state, "501 5.5.4 Error: attribute value too long");
            return (-1);
        }
        printable(attr_value, '?');
@@ -2617,7 +2647,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
                neuter(attr_value, NEUTER_CHARACTERS, '?');
                if (!valid_hostname(attr_value, DONT_GRIPE)) {
                    state->error_mask |= MAIL_ERROR_PROTOCOL;
-                   smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+                   smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                     XFORWARD_NAME, attr_value);
                    return (-1);
                }
@@ -2638,7 +2668,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
                neuter(attr_value, NEUTER_CHARACTERS, '?');
                if ((bare_value = valid_mailhost_addr(attr_value, DONT_GRIPE)) == 0) {
                    state->error_mask |= MAIL_ERROR_PROTOCOL;
-                   smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+                   smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                     XFORWARD_ADDR, attr_value);
                    return (-1);
                }
@@ -2671,7 +2701,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
            } else {
                if (strlen(attr_value) > 64) {
                    state->error_mask |= MAIL_ERROR_PROTOCOL;
-                   smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+                   smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                     XFORWARD_PROTO, attr_value);
                    return (-1);
                }
@@ -2690,7 +2720,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
                                          NAME_CODE_FLAG_NONE,
                                          attr_value)) < 0) {
                state->error_mask |= MAIL_ERROR_PROTOCOL;
-               smtpd_chat_reply(state, "501 Bad %s syntax: %s",
+               smtpd_chat_reply(state, "501 5.5.4 Bad %s syntax: %s",
                                 XFORWARD_DOMAIN, attr_value);
                return (-1);
            }
@@ -2702,7 +2732,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
             */
        default:
            state->error_mask |= MAIL_ERROR_PROTOCOL;
-           smtpd_chat_reply(state, "501 Bad %s attribute name: %s",
+           smtpd_chat_reply(state, "501 5.5.4 Bad %s attribute name: %s",
                             XFORWARD_CMD, attr_name);
            return (-1);
        }
@@ -2723,7 +2753,7 @@ static int xforward_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
                        state->xforward.addr, "]",
                        (char *) 0) : mystrdup(state->xforward.name);
     }
-    smtpd_chat_reply(state, "250 Ok");
+    smtpd_chat_reply(state, "250 2.0.0 Ok");
     return (0);
 }
 
@@ -2766,10 +2796,10 @@ static void smtpd_start_tls(SMTPD_STATE *state)
      * verification unless TLS is required.
      */
     state->tls_context =
-       tls_server_start(smtpd_tls_ctx, state->client,
-                        var_smtpd_starttls_tmout,
-                        state->name, state->addr, &(state->tls_info),
-                      (var_smtpd_tls_req_ccert && state->tls_enforce_tls));
+    tls_server_start(smtpd_tls_ctx, state->client,
+                    var_smtpd_starttls_tmout,
+                    state->name, state->addr, &(state->tls_info),
+                    (var_smtpd_tls_req_ccert && state->tls_enforce_tls));
 
     /*
      * When the TLS handshake fails, the conversation is in an unknown state.
@@ -2799,24 +2829,24 @@ static int starttls_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
 {
     if (argc != 1) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "501 Syntax: STARTTLS");
+       smtpd_chat_reply(state, "501 5.5.4 Syntax: STARTTLS");
        return (-1);
     }
     if (state->tls_context != 0) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "554 Error: TLS already active");
+       smtpd_chat_reply(state, "554 5.5.1 Error: TLS already active");
        return (-1);
     }
     if (state->tls_use_tls == 0) {
        state->error_mask |= MAIL_ERROR_PROTOCOL;
-       smtpd_chat_reply(state, "502 Error: command not implemented");
+       smtpd_chat_reply(state, "502 5.5.1 Error: command not implemented");
        return (-1);
     }
     if (smtpd_tls_ctx == 0) {
-       smtpd_chat_reply(state, "454 TLS not available due to local problem");
+       smtpd_chat_reply(state, "454 4.3.0 TLS not available due to local problem");
        return (-1);
     }
-    smtpd_chat_reply(state, "220 Ready to start TLS");
+    smtpd_chat_reply(state, "220 2.0.0 Ready to start TLS");
     smtp_flush(state->client);
 
     /*
@@ -2937,7 +2967,7 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
     case SMTP_ERR_TIME:
        state->reason = REASON_TIMEOUT;
        if (vstream_setjmp(state->client) == 0)
-           smtpd_chat_reply(state, "421 %s Error: timeout exceeded",
+           smtpd_chat_reply(state, "421 4.4.2 %s Error: timeout exceeded",
                             var_myhostname);
        break;
 
@@ -2979,14 +3009,14 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
            && anvil_clnt_connect(anvil_clnt, service, state->addr,
                                  &count, &crate) == ANVIL_STAT_OK) {
            if (var_smtpd_cconn_limit > 0 && count > var_smtpd_cconn_limit) {
-               smtpd_chat_reply(state, "421 %s Error: too many connections from %s",
+               smtpd_chat_reply(state, "421 4.7.0 %s Error: too many connections from %s",
                                 var_myhostname, state->addr);
                msg_warn("Connection concurrency limit exceeded: %d from %s for service %s",
                         count, state->namaddr, service);
                break;
            }
            if (var_smtpd_crate_limit > 0 && crate > var_smtpd_crate_limit) {
-               smtpd_chat_reply(state, "421 %s Error: too many connections from %s",
+               smtpd_chat_reply(state, "421 4.7.0 %s Error: too many connections from %s",
                                 var_myhostname, state->addr);
                msg_warn("Connection rate limit exceeded: %d from %s for service %s",
                         crate, state->namaddr, service);
@@ -2999,7 +3029,14 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
            && (state->access_denied = smtpd_check_client(state)) != 0) {
            smtpd_chat_reply(state, "%s", state->access_denied);
            state->error_count++;
-       } else {
+       }
+
+       /*
+        * RFC 2034: the text part of all 2xx, 4xx, and 5xx SMTP responses
+        * other than the initial greeting and any response to HELO or EHLO
+        * are prefaced with a status code as defined in RFC 1893.
+        */
+       else {
            smtpd_chat_reply(state, "220 %s", var_smtpd_banner);
        }
 
@@ -3007,7 +3044,7 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
            if (state->error_count >= var_smtpd_hard_erlim) {
                state->reason = REASON_ERROR_LIMIT;
                state->error_mask |= MAIL_ERROR_PROTOCOL;
-               smtpd_chat_reply(state, "421 %s Error: too many errors",
+               smtpd_chat_reply(state, "421 4.7.0 %s Error: too many errors",
                                 var_myhostname);
                break;
            }
@@ -3015,13 +3052,13 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
            smtpd_chat_query(state);
            if ((argc = smtpd_token(vstring_str(state->buffer), &argv)) == 0) {
                state->error_mask |= MAIL_ERROR_PROTOCOL;
-               smtpd_chat_reply(state, "500 Error: bad syntax");
+               smtpd_chat_reply(state, "500 5.5.2 Error: bad syntax");
                state->error_count++;
                continue;
            }
            if (*var_smtpd_noop_cmds
                && string_list_match(smtpd_noop_cmds, argv[0].strval)) {
-               smtpd_chat_reply(state, "250 Ok");
+               smtpd_chat_reply(state, "250 2.0.0 Ok");
                if (state->junk_cmds++ > var_smtpd_junk_cmd_limit)
                    state->error_count++;
                continue;
@@ -3035,17 +3072,17 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
                 && string_list_match(smtpd_forbid_cmds, argv[0].strval))) {
                    msg_warn("%s sent non-SMTP command: %.100s",
                             state->namaddr, vstring_str(state->buffer));
-                   smtpd_chat_reply(state, "221 Error: I can break rules, too. Goodbye.");
+                   smtpd_chat_reply(state, "221 2.7.0 Error: I can break rules, too. Goodbye.");
                    break;
                }
-               smtpd_chat_reply(state, "502 Error: command not implemented");
+               smtpd_chat_reply(state, "502 5.5.2 Error: command not recognized");
                state->error_mask |= MAIL_ERROR_PROTOCOL;
                state->error_count++;
                continue;
            }
            /* XXX We use the real client for connect access control. */
            if (state->access_denied && cmdp->action != quit_cmd) {
-               smtpd_chat_reply(state, "503 Error: access denied for %s",
+               smtpd_chat_reply(state, "503 5.7.0 Error: access denied for %s",
                                 state->namaddr);       /* RFC 2821 Sec 3.1 */
                state->error_count++;
                continue;
@@ -3055,7 +3092,7 @@ static void smtpd_proto(SMTPD_STATE *state, const char *service)
                !state->tls_context &&
                (cmdp->flags & SMTPD_CMD_FLAG_PRE_TLS) == 0) {
                smtpd_chat_reply(state,
-                                "530 Must issue a STARTTLS command first");
+                          "530 5.7.0 Must issue a STARTTLS command first");
                state->error_count++;
                continue;
            }
@@ -3280,7 +3317,7 @@ static void post_jail_init(char *unused_name, char **unused_argv)
      * recipient checks, address mapping, header_body_checks?.
      */
     smtpd_input_transp_mask =
-       input_transp_mask(VAR_INPUT_TRANSP, var_input_transp);
+    input_transp_mask(VAR_INPUT_TRANSP, var_input_transp);
 
     /*
      * Sanity checks. The queue_minfree value should be at least as large as
index c17a5ba46b627268002d903c99317198fa206dbb..19aaeee9b41a84f2f3310aaaf3c7e98f6e929504 100644 (file)
@@ -50,6 +50,8 @@
 typedef struct SMTPD_DEFER {
     int     active;                    /* is this active */
     VSTRING *reason;                   /* reason for deferral */
+    VSTRING *dsn;                      /* DSN detail */
+    int     code;                      /* SMTP reply code */
     int     class;                     /* error notification class */
 } SMTPD_DEFER;
 
index 0613b949b0201a1d05ed435a17b3cc9e863ac2a6..06c40f461d27e4561442854bcb5108b8be1ab4c3 100644 (file)
@@ -16,8 +16,8 @@ OK
 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
@@ -31,8 +31,8 @@ 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
@@ -47,19 +47,19 @@ 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()
 >>> #
@@ -67,8 +67,8 @@ OK
 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
@@ -83,26 +83,26 @@ 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
@@ -119,14 +119,14 @@ 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
@@ -150,26 +150,26 @@ 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
@@ -183,5 +183,5 @@ 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
index db0a2c4b66c21084cf8736c4f0a466af836eadf4..2962b1efbe43f07de9966596faa6d4510c7f4386 100644 (file)
@@ -144,8 +144,12 @@ void    smtpd_chat_reply(SMTPD_STATE *state, char *format,...)
     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)
index 5e59e2b9cbf8a9d32b782c947ff53be28d645896..14689ec5fff142e63cb799eb9f54c2c0e763fc71 100644 (file)
 #include <is_header.h>
 #include <rewrite_clnt.h>
 #include <valid_mailhost_addr.h>
+#include <dsn_util.h>
 
 /* Application-specific. */
 
@@ -290,8 +291,10 @@ static MAPS *smtpd_sender_login_maps;
 static DOMAIN_LIST *relay_domains;
 static NAMADR_LIST *mynetworks;
 static NAMADR_LIST *perm_mx_networks;
+
 #ifdef USE_TLS
 static MAPS *relay_ccerts;
+
 #endif
 
  /*
@@ -375,31 +378,32 @@ static int check_rcpt_maps(SMTPD_STATE *, const char *, const char *);
   * 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)
 
  /*
@@ -756,7 +760,8 @@ static void log_whatsup(SMTPD_STATE *state, const char *whatsup,
 /* 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;
@@ -777,30 +782,35 @@ static int smtpd_check_reject(SMTPD_STATE *state, int error_class,
     /*
      * 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), ' ');
 
     /*
@@ -811,6 +821,8 @@ static int smtpd_check_reject(SMTPD_STATE *state, int error_class,
     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)));
     }
 
@@ -836,6 +848,12 @@ static int smtpd_check_reject(SMTPD_STATE *state, int error_class,
     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
@@ -848,7 +866,9 @@ static int smtpd_check_reject(SMTPD_STATE *state, int error_class,
 
 /* 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;
 
@@ -859,6 +879,10 @@ static void defer_if(SMTPD_DEFER *defer, int error_class, const char *fmt,...)
     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);
@@ -872,8 +896,9 @@ static void defer_if(SMTPD_DEFER *defer, int error_class, const char *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 */
@@ -903,9 +928,9 @@ static int reject_unknown_client(SMTPD_STATE *state)
 
     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);
 }
@@ -984,8 +1009,9 @@ static int reject_invalid_hostaddr(SMTPD_STATE *state, char *addr,
      */
     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;
 
@@ -1021,8 +1047,9 @@ static int reject_invalid_hostname(SMTPD_STATE *state, char *name,
     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;
 
@@ -1057,8 +1084,9 @@ static int reject_non_fqdn_hostname(SMTPD_STATE *state, char *name,
      */
     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;
 
@@ -1093,12 +1121,13 @@ static int reject_unknown_hostname(SMTPD_STATE *state, char *name,
                              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);
 }
@@ -1119,12 +1148,16 @@ static int reject_unknown_mailhost(SMTPD_STATE *state, const char *name,
                              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);
 }
@@ -1142,9 +1175,8 @@ static int permit_tls_clientcerts(SMTPD_STATE *state, int permit_all_certs)
     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);
@@ -1159,6 +1191,7 @@ static int permit_tls_clientcerts(SMTPD_STATE *state, int permit_all_certs)
     }
     return (SMTPD_CHECK_DUNNO);
 }
+
 #endif
 
 /* check_relay_domains - OK/FAIL for message relaying */
@@ -1198,8 +1231,9 @@ static int check_relay_domains(SMTPD_STATE *state, char *recipient,
      * 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 */
@@ -1270,8 +1304,9 @@ static int reject_unauth_destination(SMTPD_STATE *state, char *recipient)
      * 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 */
@@ -1291,7 +1326,8 @@ static int reject_unauth_pipelining(SMTPD_STATE *state,
        && (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);
@@ -1321,10 +1357,11 @@ static int all_auth_mx_addr(SMTPD_STATE *state, char *host,
      * 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);
     }
@@ -1378,7 +1415,8 @@ static int has_my_addr(SMTPD_STATE *state, const char *host,
     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);
     }
@@ -1548,7 +1586,8 @@ static int permit_mx_backup(SMTPD_STATE *state, const char *recipient,
                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);
     }
@@ -1615,8 +1654,9 @@ static int reject_non_fqdn_address(SMTPD_STATE *state, char *addr,
      */
     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;
 
@@ -1695,7 +1735,9 @@ static int reject_unverified_address(SMTPD_STATE *state, const char *addr,
     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 {
@@ -1707,7 +1749,9 @@ static int reject_unverified_address(SMTPD_STATE *state, const char *addr,
        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;
@@ -1718,9 +1762,13 @@ static int reject_unverified_address(SMTPD_STATE *state, const char *addr,
            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;
        }
     }
@@ -1754,7 +1802,8 @@ static int can_delegate_action(SMTPD_STATE *state, const char *table,
 /* 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)
 {
 
     /*
@@ -1795,6 +1844,8 @@ static int check_table_result(SMTPD_STATE *state, const char *table,
     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.
@@ -1820,10 +1871,12 @@ static int check_table_result(SMTPD_STATE *state, const char *table,
      * 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"));
     }
 
     /*
@@ -1927,10 +1980,12 @@ static int check_table_result(SMTPD_STATE *state, const char *table,
      * 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);
     }
 
@@ -1939,10 +1994,12 @@ static int check_table_result(SMTPD_STATE *state, const char *table,
      * 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);
     }
 
@@ -1977,13 +2034,20 @@ static int check_table_result(SMTPD_STATE *state, const char *table,
     /*
      * 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));
     }
 
     /*
@@ -2006,7 +2070,8 @@ static int check_table_result(SMTPD_STATE *state, const char *table,
        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"));
     }
 
     /*
@@ -2016,7 +2081,8 @@ static int check_table_result(SMTPD_STATE *state, const char *table,
        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"));
     }
 
     /*
@@ -2776,6 +2842,8 @@ static int rbl_reject_reply(SMTPD_STATE *state, SMTPD_RBL_STATE *rbl,
     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.
@@ -2806,7 +2874,27 @@ static int rbl_reject_reply(SMTPD_STATE *state, SMTPD_RBL_STATE *rbl,
                 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.
@@ -2987,8 +3075,8 @@ static int reject_auth_sender_login_mismatch(SMTPD_STATE *state, const char *sen
            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);
@@ -3011,8 +3099,8 @@ static int reject_unauth_sender_login_mismatch(SMTPD_STATE *state, const char *s
            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);
 }
@@ -3089,7 +3177,8 @@ static int check_policy_service(SMTPD_STATE *state, const char *server,
                          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 {
 
        /*
@@ -3121,7 +3210,8 @@ static int is_map_command(SMTPD_STATE *state, const char *name,
        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);
     }
@@ -3137,7 +3227,8 @@ static void forbid_whitelist(SMTPD_STATE *state, const char *name,
        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"));
     }
 }
 
@@ -3187,8 +3278,10 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
                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;
@@ -3204,15 +3297,17 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
                         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);
@@ -3222,25 +3317,31 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
            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
@@ -3462,9 +3563,9 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
 #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)
@@ -3505,8 +3606,9 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
            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,
@@ -3537,8 +3639,10 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
         */
        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);
@@ -3874,6 +3978,8 @@ char   *smtpd_check_rcpt(SMTPD_STATE *state, char *recipient)
      */
     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));
 
     /*
@@ -3945,6 +4051,8 @@ char   *smtpd_check_etrn(SMTPD_STATE *state, char *domain)
      */
     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);
@@ -4033,9 +4141,11 @@ static int check_rcpt_maps(SMTPD_STATE *state, const char *recipient,
      */
     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)));
 
@@ -4071,9 +4181,12 @@ static int check_rcpt_maps(SMTPD_STATE *state, const char *recipient,
                         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;
 
@@ -4084,9 +4197,12 @@ static int check_rcpt_maps(SMTPD_STATE *state, const char *recipient,
        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;
 
@@ -4097,9 +4213,12 @@ static int check_rcpt_maps(SMTPD_STATE *state, const char *recipient,
        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;
     }
@@ -4134,7 +4253,8 @@ char   *smtpd_check_size(SMTPD_STATE *state, off_t size)
 
     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);
@@ -4148,7 +4268,8 @@ char   *smtpd_check_size(SMTPD_STATE *state, off_t size)
     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);
@@ -4198,6 +4319,8 @@ char   *smtpd_check_data(SMTPD_STATE *state)
      */
     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)
@@ -4247,6 +4370,8 @@ char   *smtpd_check_eod(SMTPD_STATE *state)
      */
     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)
@@ -4323,6 +4448,7 @@ char   *var_relay_rcpt_maps;
 char   *var_verify_sender;
 char   *var_smtpd_sasl_opts;
 char   *var_local_rwr_clients;
+char   *var_smtpd_relay_ccerts;
 
 typedef struct {
     char   *name;
@@ -4365,6 +4491,7 @@ static STRING_TABLE string_table[] = {
     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,
 };
 
index 0b96f5f22010aee3c45f9033f9c596622e3ec7e8..4ee694abd8e69e6bda16e9cca61100636b55676b 100644 (file)
@@ -17,23 +17,23 @@ OK
 >>> 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
 >>> #
@@ -44,41 +44,41 @@ 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
@@ -92,8 +92,8 @@ 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=<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
@@ -107,30 +107,30 @@ OK
 >>> 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
 >>> #
@@ -141,8 +141,8 @@ 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
@@ -151,8 +151,8 @@ OK
 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
@@ -166,26 +166,26 @@ OK
 >>> 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
 >>> #
@@ -197,8 +197,8 @@ 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
 >>> #
@@ -207,8 +207,8 @@ OK
 >>> 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
@@ -220,11 +220,11 @@ OK
 >>> 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
@@ -232,11 +232,11 @@ OK
 >>> 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
@@ -266,15 +266,15 @@ OK
 >>> 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
 >>> #
@@ -289,28 +289,28 @@ OK
 >>> 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
 >>> #
@@ -321,71 +321,71 @@ OK
 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
 >>> #
@@ -394,5 +394,5 @@ OK
 >>> 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
index 8b178fb400bf0f94ef4f1974ee4683f1568f951f..71c6274edb73da871f4a53a2cd5073d8027d61aa 100644 (file)
@@ -17,23 +17,23 @@ OK
 >>> 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
 >>> #
@@ -44,24 +44,24 @@ 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
 >>> #
@@ -72,8 +72,8 @@ 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
@@ -87,30 +87,30 @@ OK
 >>> 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
 >>> #
@@ -121,8 +121,8 @@ 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
@@ -131,8 +131,8 @@ OK
 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
@@ -146,26 +146,26 @@ OK
 >>> 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
 >>> #
@@ -177,8 +177,8 @@ 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
 >>> #
@@ -191,13 +191,13 @@ OK
 >>> 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
 >>> #
@@ -208,15 +208,15 @@ OK
 >>> 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
 >>> #
@@ -229,8 +229,8 @@ 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]
index 687827480aa25c166720a2ebf40a709314686fc6..c66eb705aa0e7c483efa930b7486e8ca03ea2c27 100644 (file)
@@ -11,8 +11,8 @@ OK
 >>> 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
index fcee7f2a37474ffeba8d85aa4ead2feec6884d15..c04381ba8b5089f5cae821741474f725115fb4a4 100644 (file)
@@ -30,8 +30,8 @@ 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
@@ -42,15 +42,15 @@ 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
@@ -65,8 +65,8 @@ OK
 >>> 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
@@ -81,8 +81,8 @@ OK
 >>> 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
 >>> #
@@ -95,8 +95,8 @@ OK
 >>> 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
 >>> #
@@ -107,8 +107,8 @@ OK
 >>> 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
 >>> #
@@ -133,19 +133,19 @@ OK
 >>> 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
@@ -153,21 +153,21 @@ OK
 >>> 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
index 861f72d29a129f32608fcec085d46a8cacd530b0..9ceac0389c23d8d7ddd6b1742a1745e894934d4f 100644 (file)
@@ -248,6 +248,7 @@ int     smtpd_proxy_open(SMTPD_STATE *state, const char *service,
        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
@@ -263,8 +264,10 @@ int     smtpd_proxy_open(SMTPD_STATE *state, const char *service,
        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);
@@ -280,8 +283,10 @@ int     smtpd_proxy_open(SMTPD_STATE *state, const char *service,
      * 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);
     }
@@ -294,8 +299,10 @@ int     smtpd_proxy_open(SMTPD_STATE *state, const char *service,
      * 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);
     }
@@ -344,8 +351,10 @@ int     smtpd_proxy_open(SMTPD_STATE *state, const char *service,
            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);
        }
@@ -409,6 +418,7 @@ int     smtpd_proxy_cmd(SMTPD_STATE *state, int expect, const char *fmt,...)
     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.
@@ -420,8 +430,10 @@ int     smtpd_proxy_cmd(SMTPD_STATE *state, int expect, const char *fmt,...)
            && 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);
     }
 
index 63f3d81831ad02a0631096f1cf5ce6bbfc2c218b..74ac5e5bf75ca7741fa2188cb38a13fbd4d29315 100644 (file)
@@ -387,7 +387,7 @@ char   *smtpd_sasl_authenticate(SMTPD_STATE *state,
        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 {
@@ -439,13 +439,13 @@ char   *smtpd_sasl_authenticate(SMTPD_STATE *state,
         */
        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));
@@ -465,7 +465,7 @@ char   *smtpd_sasl_authenticate(SMTPD_STATE *state,
      * 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
index 60b2ace13ce35b064455bd0cf54383aa8557ce7f..3e200cdfcfe2d6658ac808a06c462305b17d950b 100644 (file)
@@ -128,29 +128,29 @@ int     smtpd_sasl_auth_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
 
     if (var_helo_required && state->helo_name == 0) {
        state->error_mask |= MAIL_ERROR_POLICY;
-       smtpd_chat_reply(state, "503 Error: send HELO/EHLO first");
+       smtpd_chat_reply(state, "503 5.5.1 Error: send HELO/EHLO first");
        return (-1);
     }
     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);
     }
 
@@ -168,7 +168,7 @@ int     smtpd_sasl_auth_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
        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);
 }
 
@@ -189,17 +189,17 @@ char   *smtpd_sasl_mail_opt(SMTPD_STATE *state, const char *addr)
      */
     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);
index d8116b2809cdec04564f07e28d33de5aa9e4afd8..6a78d6ec5a69a9252f4af94cf529d245f17f32c4 100644 (file)
@@ -108,7 +108,9 @@ void    smtpd_state_init(SMTPD_STATE *state, VSTREAM *stream,
     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;
@@ -176,8 +178,12 @@ void    smtpd_state_reset(SMTPD_STATE *state)
      * 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)
index e05b1bc02971fd4a175058830d925d6201b710ac..9f8d9683adc43b17692020ddd6905fe9bc3ff626 100644 (file)
@@ -68,79 +68,80 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-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
index 090a66ff75c711bd7ace15b1a068be575096857c..f42e453c070ed2e5ea8ad7b15ac5f907745d793d 100644 (file)
@@ -38,6 +38,7 @@
 /*     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"
@@ -57,6 +58,7 @@
 /*     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,
@@ -644,6 +646,7 @@ int     main(int argc, char **argv)
            break;
        case 'f':
            set_cmds_flags(optarg, FLAG_HARD_ERR);
+           disable_pipelining = 1;
            break;
        case 'F':
            disable_xforward = 1;
@@ -671,6 +674,7 @@ int     main(int argc, char **argv)
            break;
        case 'r':
            set_cmds_flags(optarg, FLAG_SOFT_ERR);
+           disable_pipelining = 1;
            break;
        case 's':
            openlog(basename(argv[0]), LOG_PID, LOG_MAIL);
index a755e3610b233cd2e8047648e91f7640e8ae6642..e2859cde48f50feaa2f21d080d86369f4192322b 100644 (file)
@@ -47,23 +47,24 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-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
index d524015fa42dc3d6570f96fef155ce576abcb7d5..113b30504663581a0189384ac11d528ad124df31 100644 (file)
@@ -75,159 +75,160 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-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
index ddfd530a6037f1b301359124dd62c0a61ba6111c..e3333d3eef67ba1272620fc0a080a63e228a362e 100644 (file)
@@ -43,36 +43,37 @@ clean:
 
 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
index dfe21f6e2e7e39e351a326443f9c7d6ed13ff8b4..ec1c77061b12c7a12725ba67c4d05b667042b16e 100644 (file)
@@ -53,104 +53,105 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-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
index ea4c68980491e9f261a1d14de4345674580b6b69..34685b848e3600e6163874b909c958cdd2711886 100644 (file)
@@ -389,14 +389,6 @@ inet_proto: $(LIB)
        $(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)
 
@@ -506,1052 +498,1061 @@ myaddrinfo4_test: myaddrinfo4 myaddrinfo4.ref myaddrinfo4.ref2
        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
index 42d166e1a109a7f853c00b4b7ddd87171338e98e..0597441dfa32fb1229339cf276ced121d909b31b 100644 (file)
@@ -8,14 +8,25 @@
 ./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
index 079c51ee32bf39dd5c2fb82e03ac96595f2258b0..c89911f54020f1eca47290a361bb9956cbea05b0 100644 (file)
@@ -266,7 +266,7 @@ DICT   *dict_open(const char *dict_spec, int open_flags, int dict_flags)
     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);
@@ -284,6 +284,9 @@ DICT   *dict_open3(const char *dict_type, const char *dict_name,
     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)
index 4745281e0f45fb30ebc332b18d7692dd75eb5610..6a554e0da2c9e16fc7d03873f78f35318955c801 100644 (file)
@@ -200,7 +200,7 @@ static int dict_pcre_expand(int type, VSTRING *buf, char *ptr)
 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;
@@ -212,6 +212,26 @@ static void dict_pcre_exec_error(const char *mapname, int lineno, int errval)
     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);
index 78f45e76dd0043dadfb4eb2a0acd3826eba1c764..8b2b894487d5e8c6726c637a45620697e86b3c4a 100644 (file)
@@ -4,17 +4,31 @@
 ./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
index 35d7c1f1b836ba76b907e3db1f1caad2382bce1a..1cda836004453c3607cd899b2042ed551acf1ed0 100644 (file)
@@ -1,10 +1,20 @@
+> 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
index e1057c6223bc9a7b28f81b1225deebecc76478cd..28c518f6307c353f449fc6fed7e7d83e4492957d 100644 (file)
@@ -19,4 +19,4 @@ unknown: warning: valid hostname or network address required in [hh.]
 >> 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
index da2ff91ecacbe9ddc2fa500f7f12e08aa27820c4..f2305dcebfe103ab5945556bb4f841bd784d917e 100644 (file)
@@ -1,5 +1,5 @@
 ./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
index 49cc49ff6debaedf1bc5a8b53a4fda1a6d995dde..86b3aaa8f98499451236935a1f927ab22b4d03bf 100644 (file)
@@ -1,7 +1,7 @@
-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
index 39215f5435e29857ebccbd83496ee4f78c89185a..73ee73f4a343d31937a6edf70b385f7d4d9989a9 100644 (file)
@@ -47,32 +47,33 @@ depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
            $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
-           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' -e 'p' -e '}'; \
-       done) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
-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
index d0e7bca7d879a381c3409a2e803397a855cd8bf3..883e827dc0884e0db4d8657d1e1ce512457fe43e 100644 (file)
@@ -48,121 +48,124 @@ 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
+           -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
index afb61978be2478f4c1ec68e3c4621a9991f61ed3..664b59466f90e1d98ee17462e5d74010ffd83e32 100644 (file)
 #include <mail_params.h>
 #include <mail_addr_find.h>
 
-#ifndef EDQUOT
-#define EDQUOT EFBIG
-#endif
-
 /* Application-specific. */
 
 #include "virtual.h"
@@ -78,7 +74,7 @@
 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;
@@ -97,7 +93,8 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
      * Don't deliver trace-only requests.
      */
     if (DEL_REQ_TRACE_ONLY(state.request->flags))
-       return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+       return (sent(BOUNCE_FLAGS(state.request),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "delivers to mailbox"));
 
     /*
@@ -108,7 +105,7 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
        msg_fatal("seek message file %s: %m", VSTREAM_PATH(state.msg_attr.fp));
     state.msg_attr.delivered = state.msg_attr.recipient;
     mail_copy_status = MAIL_COPY_STAT_WRITE;
-    why = vstring_alloc(100);
+    why = dsn_vstring_alloc(100);
 
     /*
      * Lock the mailbox and open/create the mailbox file.
@@ -124,8 +121,9 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
     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,
@@ -141,16 +139,16 @@ static int deliver_mailbox_file(LOCAL_STATE state, USER_ATTR usr_attr)
     if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
        deliver_status = DEL_STAT_DEFER;
     } else if (mail_copy_status != 0) {
-       deliver_status = (errno == 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);
 }
 
@@ -191,7 +189,7 @@ int     deliver_mailbox(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp)
            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);
@@ -208,14 +206,14 @@ int     deliver_mailbox(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp)
                             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);
@@ -229,14 +227,14 @@ int     deliver_mailbox(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp)
                             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);
index b7f46bddd1f00b8f909bac93938c75fe8acf09cf..00d2e0a463958f00f0be8b83ce8d71e3bc2b5430 100644 (file)
 #include <time.h>
 #include <errno.h>
 
-#ifndef EDQUOT
-#define EDQUOT EFBIG
-#endif
-
 /* Utility library. */
 
 #include <msg.h>
@@ -79,7 +75,7 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
     char   *curdir;
     char   *tmpfile;
     char   *newfile;
-    VSTRING *why;
+    DSN_VSTRING *why;
     VSTRING *buf;
     VSTREAM *dst;
     int     mail_copy_status;
@@ -101,7 +97,8 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
      * Don't deliver trace-only requests.
      */
     if (DEL_REQ_TRACE_ONLY(state.request->flags))
-       return (sent(BOUNCE_FLAGS(state.request), SENT_ATTR(state.msg_attr),
+       return (sent(BOUNCE_FLAGS(state.request),
+                    SENT_ATTR(state.msg_attr, "2.0.0"),
                     "delivers to maildir"));
 
     /*
@@ -113,7 +110,7 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
     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;
@@ -185,9 +182,9 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
        && (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,
@@ -202,7 +199,8 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
                && (errno != ENOENT
                    || (make_dirs(curdir, 0700), make_dirs(newdir, 0700)) < 0
                    || sane_link(tmpfile, newfile) < 0)) {
-               vstring_sprintf(why, "link to %s: %m", newfile);
+               dsn_vstring_update(why, "5.2.0",
+                                   "create maildir file %s: %m", newfile);
                mail_copy_status = MAIL_COPY_STAT_WRITE;
            }
        }
@@ -219,22 +217,23 @@ int     deliver_maildir(LOCAL_STATE state, USER_ATTR usr_attr)
     if (mail_copy_status & MAIL_COPY_STAT_CORRUPT) {
        deliver_status = DEL_STAT_DEFER;
     } else if (mail_copy_status != 0) {
-       deliver_status = (errno == 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);
index b372c507b191a59e4938dfea8f53399d642445da..24b5fce6ac255a80a585011e44a756fdede3cd08 100644 (file)
@@ -59,6 +59,6 @@ int     deliver_unknown(LOCAL_STATE state)
        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));
 }
index 83c9e14fd5a3c321c8a4d330e3caeb6ea3cbbdd0..eb1cbeda03e9a2cce700d95a891cfbfc90781cf2 100644 (file)
@@ -96,14 +96,14 @@ typedef struct LOCAL_STATE {
   */
 #define BOUNCE_FLAGS(request)  DEL_REQ_TRACE_FLAGS((request)->flags)
 
-#define BOUNCE_ATTR(attr)      attr.queue_id, attr.orig_rcpt, attr.recipient, \
-                                       attr.rcpt_offset, attr.relay, \
-                                       attr.arrival_time
-#define 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, \