diff --git a/postfix/HISTORY b/postfix/HISTORY
index fe7540a70..e306ca0e0 100644
--- a/postfix/HISTORY
+++ b/postfix/HISTORY
@@ -13248,7 +13248,7 @@ Apologies for any names omitted.
cleanup/cleanup_final.c, cleanup/cleanup_bounce.c,
cleanup/cleanup_api.c.
-20050217
+20070217
Streamline the compile time selection of event handling
styles, replacing multiple on/off macros by just one
@@ -14642,3 +14642,27 @@ Apologies for any names omitted.
Cleanup: remove obsolete Rhapsody and MacOS targets from
makedefs.
+
+20080929
+
+ Workaround: don't log "file has 2 links" warnings when the
+ condition appears to be temporary. As kernels have evolved
+ from non-interruptible system calls towards fine-grained
+ locks, the showq command has become likely to observe a
+ file while the queue manager is in the middle of a rename
+ operation, when the file has links to both the old and new
+ name. File: global/mail_open_ok.c.
+
+ Workaround: don't loop forever when write() fails with a
+ persistent EAGAIN error on a writable file descriptor.
+ File: util/write_buf.c.
+
+20081002
+
+ Bugfix (introduced Postfix 2.1): the introduction of XFORWARD
+ support resulted in inaccurate logging and (delivery agent)
+ $name expansion. Specifically, Postfix no longer properly
+ distinguished between local submissions and submissions
+ from clients with unknown hostname etc. attributes. Files:
+ smtpd/smtpd.c, qmqpd/qmqpd.c, smtp/smtp_proto.c,
+ cleanup/cleanup_envelope.c.
diff --git a/postfix/README_FILES/XFORWARD_README b/postfix/README_FILES/XFORWARD_README
index a9ff30b55..d75f4aed5 100644
--- a/postfix/README_FILES/XFORWARD_README
+++ b/postfix/README_FILES/XFORWARD_README
@@ -32,9 +32,9 @@ In SMTP server EHLO replies, the keyword associated with this extension is
XFORWARD. The keyword is followed by the names of the attributes that the
XFORWARD implementation supports.
-The client may send the XFORWARD request at any time except in the middle of a
-mail delivery transaction (i.e. between MAIL and RSET or DOT). The command may
-be pipelined when the server supports ESMTP command pipelining.
+The client may send one or more XFORWARD requests at any time except in the
+middle of a mail delivery transaction (i.e. between MAIL and RSET or DOT). The
+command may be pipelined when the server supports ESMTP command pipelining.
The syntax of XFORWARD requests is described below. Upper case and quoted
strings specify terminals, lowercase strings specify meta terminals, and SP is
@@ -93,12 +93,22 @@ Note 5: Postfix implementations prior to version 2.3 do not xtext encode
attribute values. Servers that wish to interoperate with these older
implementations should be prepared to receive unencoded information.
-XXFFOORRWWAARRDD SSeerrvveerr rreessppoonnssee
+XXFFOORRWWAARRDD SSeerrvveerr ooppeerraattiioonn
-Upon receipt of a correctly formatted XFORWARD command, the server stores the
-specified attribute values, and erases the attributes whose value was specified
-as [UNAVAILABLE]. All XFORWARD attributes are reset to the real client
-information after the MAIL FROM transaction completes (i.e. after RSET or DOT).
+Upon receipt of an initial XFORWARD command, the SMTP server initializes all
+XFORWARD attributes to [UNAVAILABLE]. With each XFORWARD command, the server
+overwrites attributes with the specified attribute values, and erases
+attributes whose value is specified as [UNAVAILABLE]. Attributes that are not
+specified in an XFORWARD command retain their current value.
+
+An ADDR attribute value of [UNAVAILABLE] indicates that the next MAIL FROM
+transaction is a forwarded local submission. In this case the SMTP server
+should ignore other client attributes. This behavior is available with Postfix
+version 2.6.
+
+At the end of the next MAIL FROM transaction (i.e. RSET or DOT), all XFORWARD
+attributes are reset to the real client information, and the SMTP server is
+ready to receive another initial XFORWARD command.
XXFFOORRWWAARRDD SSeerrvveerr rreeppllyy ccooddeess
diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES
index 5cd47296a..a2e153f53 100644
--- a/postfix/RELEASE_NOTES
+++ b/postfix/RELEASE_NOTES
@@ -11,6 +11,22 @@ instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release.
+Incompatibility with snapshot 20081002
+======================================
+
+There is a minor change in the way that XFORWARD attributes are
+stored in queue files. These attributes are used to propagate remote
+client information through an SMTP-based content filter. If you
+don't use such filters, then the following incompatibility does not
+affect your system.
+
+If you downgrade from this Postfix version to an older version while
+you still have new local submissions in the mail queue, the older
+Postfix cleanup server may log "spurious null attribute value"
+warnings when it processes queue files from the newer Postfix
+version. The older cleanup server will ignore the null-valued
+attributes, and no harm will be done.
+
Incompatibility with snapshot 20080814
======================================
diff --git a/postfix/WISHLIST b/postfix/WISHLIST
index e5d993a6f..3badd2ce4 100644
--- a/postfix/WISHLIST
+++ b/postfix/WISHLIST
@@ -1,5 +1,5 @@
Wish list:
-
+
Force a panic when the VDA patch reduces the file size limit
under the message size. They break the code that marks a
recipient as "done", when that recipient was added late
diff --git a/postfix/html/XFORWARD_README.html b/postfix/html/XFORWARD_README.html
index 656e0d8da..100e8d38b 100644
--- a/postfix/html/XFORWARD_README.html
+++ b/postfix/html/XFORWARD_README.html
@@ -55,7 +55,8 @@ of this document.
extension is XFORWARD. The keyword is followed by the names of the
attributes that the XFORWARD implementation supports.
- The client may send the XFORWARD request at any time except in
+
The client may send one or more XFORWARD requests at any time
+except in
the middle of a mail delivery transaction (i.e. between MAIL and
RSET or DOT). The command may be pipelined when the server supports
ESMTP command pipelining.
@@ -139,13 +140,24 @@ xtext encode attribute values. Servers that wish to interoperate
with these older implementations should be prepared to receive
unencoded information.
- XFORWARD Server response
+ XFORWARD Server operation
- Upon receipt of a correctly formatted XFORWARD command, the
-server stores the specified attribute values, and erases the
-attributes whose value was specified as [UNAVAILABLE]. All XFORWARD
-attributes are reset to the real client information after the MAIL
-FROM transaction completes (i.e. after RSET or DOT).
+ Upon receipt of an initial XFORWARD command, the SMTP server
+initializes all XFORWARD attributes to [UNAVAILABLE]. With each
+XFORWARD command, the server overwrites attributes with the specified
+attribute values, and erases attributes whose value is specified
+as [UNAVAILABLE]. Attributes that are not specified in an XFORWARD
+command retain their current value.
+
+ An ADDR attribute value of [UNAVAILABLE] indicates that the
+next MAIL FROM transaction is a forwarded local submission. In
+this case the SMTP server should ignore other client attributes.
+This behavior is available with Postfix version 2.6.
+
+ At the end of the next MAIL FROM transaction (i.e. RSET or DOT),
+all XFORWARD attributes are reset to the real client information,
+and the SMTP server is ready to receive another initial XFORWARD
+command.
XFORWARD Server reply codes
diff --git a/postfix/proto/XFORWARD_README.html b/postfix/proto/XFORWARD_README.html
index 46dcdac12..da08b80a4 100644
--- a/postfix/proto/XFORWARD_README.html
+++ b/postfix/proto/XFORWARD_README.html
@@ -55,7 +55,8 @@ of this document.
extension is XFORWARD. The keyword is followed by the names of the
attributes that the XFORWARD implementation supports.
- The client may send the XFORWARD request at any time except in
+
The client may send one or more XFORWARD requests at any time
+except in
the middle of a mail delivery transaction (i.e. between MAIL and
RSET or DOT). The command may be pipelined when the server supports
ESMTP command pipelining.
@@ -139,13 +140,24 @@ xtext encode attribute values. Servers that wish to interoperate
with these older implementations should be prepared to receive
unencoded information.
- XFORWARD Server response
+ XFORWARD Server operation
- Upon receipt of a correctly formatted XFORWARD command, the
-server stores the specified attribute values, and erases the
-attributes whose value was specified as [UNAVAILABLE]. All XFORWARD
-attributes are reset to the real client information after the MAIL
-FROM transaction completes (i.e. after RSET or DOT).
+ Upon receipt of an initial XFORWARD command, the SMTP server
+initializes all XFORWARD attributes to [UNAVAILABLE]. With each
+XFORWARD command, the server overwrites attributes with the specified
+attribute values, and erases attributes whose value is specified
+as [UNAVAILABLE]. Attributes that are not specified in an XFORWARD
+command retain their current value.
+
+ An ADDR attribute value of [UNAVAILABLE] indicates that the
+next MAIL FROM transaction is a forwarded local submission. In
+this case the SMTP server should ignore other client attributes.
+This behavior is available with Postfix version 2.6.
+
+ At the end of the next MAIL FROM transaction (i.e. RSET or DOT),
+all XFORWARD attributes are reset to the real client information,
+and the SMTP server is ready to receive another initial XFORWARD
+command.
XFORWARD Server reply codes
diff --git a/postfix/src/bounce/Makefile.in b/postfix/src/bounce/Makefile.in
index 09de6e9d0..93d484caa 100644
--- a/postfix/src/bounce/Makefile.in
+++ b/postfix/src/bounce/Makefile.in
@@ -168,9 +168,11 @@ bounce_notify_service.o: ../../include/dsn.h
bounce_notify_service.o: ../../include/dsn_buf.h
bounce_notify_service.o: ../../include/dsn_mask.h
bounce_notify_service.o: ../../include/int_filt.h
+bounce_notify_service.o: ../../include/iostuff.h
bounce_notify_service.o: ../../include/mail_addr.h
bounce_notify_service.o: ../../include/mail_error.h
bounce_notify_service.o: ../../include/mail_params.h
+bounce_notify_service.o: ../../include/mail_proto.h
bounce_notify_service.o: ../../include/mail_queue.h
bounce_notify_service.o: ../../include/msg.h
bounce_notify_service.o: ../../include/msg_stats.h
@@ -232,9 +234,11 @@ bounce_notify_verp.o: ../../include/dsn.h
bounce_notify_verp.o: ../../include/dsn_buf.h
bounce_notify_verp.o: ../../include/dsn_mask.h
bounce_notify_verp.o: ../../include/int_filt.h
+bounce_notify_verp.o: ../../include/iostuff.h
bounce_notify_verp.o: ../../include/mail_addr.h
bounce_notify_verp.o: ../../include/mail_error.h
bounce_notify_verp.o: ../../include/mail_params.h
+bounce_notify_verp.o: ../../include/mail_proto.h
bounce_notify_verp.o: ../../include/mail_queue.h
bounce_notify_verp.o: ../../include/msg.h
bounce_notify_verp.o: ../../include/msg_stats.h
@@ -259,9 +263,11 @@ bounce_one_service.o: ../../include/dsn.h
bounce_one_service.o: ../../include/dsn_buf.h
bounce_one_service.o: ../../include/dsn_mask.h
bounce_one_service.o: ../../include/int_filt.h
+bounce_one_service.o: ../../include/iostuff.h
bounce_one_service.o: ../../include/mail_addr.h
bounce_one_service.o: ../../include/mail_error.h
bounce_one_service.o: ../../include/mail_params.h
+bounce_one_service.o: ../../include/mail_proto.h
bounce_one_service.o: ../../include/msg.h
bounce_one_service.o: ../../include/msg_stats.h
bounce_one_service.o: ../../include/name_mask.h
@@ -315,9 +321,11 @@ bounce_trace_service.o: ../../include/dsn.h
bounce_trace_service.o: ../../include/dsn_buf.h
bounce_trace_service.o: ../../include/dsn_mask.h
bounce_trace_service.o: ../../include/int_filt.h
+bounce_trace_service.o: ../../include/iostuff.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_proto.h
bounce_trace_service.o: ../../include/mail_queue.h
bounce_trace_service.o: ../../include/msg.h
bounce_trace_service.o: ../../include/msg_stats.h
diff --git a/postfix/src/cleanup/Makefile.in b/postfix/src/cleanup/Makefile.in
index fa98471ae..d2bc00fcf 100644
--- a/postfix/src/cleanup/Makefile.in
+++ b/postfix/src/cleanup/Makefile.in
@@ -414,6 +414,7 @@ cleanup_api.o: ../../include/vstring.h
cleanup_api.o: cleanup.h
cleanup_api.o: cleanup_api.c
cleanup_body_edit.o: ../../include/argv.h
+cleanup_body_edit.o: ../../include/attr.h
cleanup_body_edit.o: ../../include/been_here.h
cleanup_body_edit.o: ../../include/cleanup_user.h
cleanup_body_edit.o: ../../include/dict.h
@@ -554,6 +555,7 @@ cleanup_extracted.o: ../../include/vstring.h
cleanup_extracted.o: cleanup.h
cleanup_extracted.o: cleanup_extracted.c
cleanup_final.o: ../../include/argv.h
+cleanup_final.o: ../../include/attr.h
cleanup_final.o: ../../include/been_here.h
cleanup_final.o: ../../include/cleanup_user.h
cleanup_final.o: ../../include/dict.h
@@ -580,6 +582,7 @@ cleanup_final.o: ../../include/vstring.h
cleanup_final.o: cleanup.h
cleanup_final.o: cleanup_final.c
cleanup_init.o: ../../include/argv.h
+cleanup_init.o: ../../include/attr.h
cleanup_init.o: ../../include/been_here.h
cleanup_init.o: ../../include/cleanup_user.h
cleanup_init.o: ../../include/dict.h
@@ -613,6 +616,7 @@ 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/attr.h
cleanup_map11.o: ../../include/been_here.h
cleanup_map11.o: ../../include/cleanup_user.h
cleanup_map11.o: ../../include/dict.h
@@ -641,6 +645,7 @@ 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/attr.h
cleanup_map1n.o: ../../include/been_here.h
cleanup_map1n.o: ../../include/cleanup_user.h
cleanup_map1n.o: ../../include/dict.h
@@ -670,6 +675,7 @@ 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/attr.h
cleanup_masquerade.o: ../../include/been_here.h
cleanup_masquerade.o: ../../include/cleanup_user.h
cleanup_masquerade.o: ../../include/dict.h
@@ -780,6 +786,7 @@ cleanup_milter.o: ../../include/vstring.h
cleanup_milter.o: cleanup.h
cleanup_milter.o: cleanup_milter.c
cleanup_out.o: ../../include/argv.h
+cleanup_out.o: ../../include/attr.h
cleanup_out.o: ../../include/been_here.h
cleanup_out.o: ../../include/cleanup_user.h
cleanup_out.o: ../../include/dict.h
@@ -850,6 +857,7 @@ cleanup_out_recipient.o: ../../include/vstring.h
cleanup_out_recipient.o: cleanup.h
cleanup_out_recipient.o: cleanup_out_recipient.c
cleanup_region.o: ../../include/argv.h
+cleanup_region.o: ../../include/attr.h
cleanup_region.o: ../../include/been_here.h
cleanup_region.o: ../../include/cleanup_user.h
cleanup_region.o: ../../include/dict.h
diff --git a/postfix/src/cleanup/cleanup_envelope.c b/postfix/src/cleanup/cleanup_envelope.c
index b21da3e85..2e91df4d0 100644
--- a/postfix/src/cleanup/cleanup_envelope.c
+++ b/postfix/src/cleanup/cleanup_envelope.c
@@ -176,12 +176,14 @@ static void cleanup_envelope_process(CLEANUP_STATE *state, int type,
state->errs |= CLEANUP_STAT_BAD;
return;
}
+#if 0
/* Zero-length values are place holders for unavailable values. */
if (*attr_value == 0) {
msg_warn("%s: spurious null attribute value for \"%s\" -- ignored",
state->queue_id, attr_name);
return;
}
+#endif
if ((junk = rec_attr_map(attr_name)) != 0) {
mapped_buf = attr_value;
mapped_type = junk;
@@ -466,7 +468,9 @@ static void cleanup_envelope_process(CLEANUP_STATE *state, int type,
return;
}
}
- nvtable_update(state->attr, attr_name, attr_value);
+ /* Zero-length values are place holders for non-existent values. */
+ if (*attr_value)
+ nvtable_update(state->attr, attr_name, attr_value);
cleanup_out(state, type, buf, len);
return;
} else {
diff --git a/postfix/src/discard/Makefile.in b/postfix/src/discard/Makefile.in
index 00a5d5c34..1692de1cf 100644
--- a/postfix/src/discard/Makefile.in
+++ b/postfix/src/discard/Makefile.in
@@ -65,6 +65,8 @@ discard.o: ../../include/dsn.h
discard.o: ../../include/dsn_buf.h
discard.o: ../../include/dsn_util.h
discard.o: ../../include/flush_clnt.h
+discard.o: ../../include/iostuff.h
+discard.o: ../../include/mail_proto.h
discard.o: ../../include/mail_queue.h
discard.o: ../../include/mail_server.h
discard.o: ../../include/mail_version.h
diff --git a/postfix/src/global/deliver_request.h b/postfix/src/global/deliver_request.h
index 2c74c00f7..1d8372e0b 100644
--- a/postfix/src/global/deliver_request.h
+++ b/postfix/src/global/deliver_request.h
@@ -53,12 +53,6 @@ typedef struct DELIVER_REQUEST {
int dsn_ret; /* DSN full/header notification */
} DELIVER_REQUEST;
- /*
- * Since we can't send null pointers, null strings represent unavailable
- * attributes instead. They're less likely to explode in our face, too.
- */
-#define DEL_REQ_ATTR_AVAIL(a) (*(a))
-
/*
* How to deliver, really?
*/
diff --git a/postfix/src/global/mail_open_ok.c b/postfix/src/global/mail_open_ok.c
index 8f9ffb253..31504c58d 100644
--- a/postfix/src/global/mail_open_ok.c
+++ b/postfix/src/global/mail_open_ok.c
@@ -59,6 +59,7 @@
#include
#include
+#include
#include
/* Utility library. */
@@ -102,9 +103,24 @@ int mail_open_ok(const char *queue_name, const char *queue_id,
}
if ((statp->st_mode & S_IRWXU) != MAIL_QUEUE_STAT_READY)
return (MAIL_OPEN_NO);
+
+ /*
+ * Workaround for spurious "file has 2 links" warnings in showq. As
+ * kernels have evolved from non-interruptible system calls towards
+ * fine-grained locks, the showq command has become likely to observe a
+ * file while the queue manager is in the middle of renaming it, at a
+ * time when the file has links to both the old and new name. We now log
+ * the warning only when the condition appears to be persistent.
+ */
+#define MINUTE_SECONDS 60 /* XXX should be centralized */
+
if (statp->st_nlink > 1) {
- msg_warn("%s: uid %ld: file has %d links", *path,
- (long) statp->st_uid, (int) statp->st_nlink);
+ if (msg_verbose)
+ msg_info("%s: uid %ld: file has %d links", *path,
+ (long) statp->st_uid, (int) statp->st_nlink);
+ else if (statp->st_ctime < time((time_t *) 0) - MINUTE_SECONDS)
+ msg_warn("%s: uid %ld: file has %d links", *path,
+ (long) statp->st_uid, (int) statp->st_nlink);
}
return (MAIL_OPEN_YES);
}
diff --git a/postfix/src/global/mail_proto.h b/postfix/src/global/mail_proto.h
index 4f92c15e5..82a026ca8 100644
--- a/postfix/src/global/mail_proto.h
+++ b/postfix/src/global/mail_proto.h
@@ -190,6 +190,19 @@ extern char *mail_pathname(const char *, const char *);
#define MAIL_ATTR_ORG_NONE "unknown" /* origin unknown */
#define MAIL_ATTR_ORG_LOCAL "local" /* local submission */
+ /*
+ * Non-existent attribute values are represented as empty strings (e.g. no
+ * remote client, or no HELO hostname). Unknown attribute values are
+ * represented as "unknown" (e.g., unknown remote client hostname). An empty
+ * string is more convenient to send than a null pointer, and is less likely
+ * to blow up.
+ */
+#define MAIL_ATTR_VAL_NONEXIST ""
+#define MAIL_ATTR_VAL_UNKNOWN "unknown"
+
+#define MAIL_ATTR_IS_EXIST(a) (*(a))
+#define MAIL_ATTR_IS_KNOWN(a) (*(a)) && strcmp((a), MAIL_ATTR_VAL_UNKNOWN)
+
/*
* XCLIENT/XFORWARD in SMTP.
*/
diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h
index 649d7a664..27e4c43de 100644
--- a/postfix/src/global/mail_version.h
+++ b/postfix/src/global/mail_version.h
@@ -20,7 +20,7 @@
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20080903"
+#define MAIL_RELEASE_DATE "20081002"
#define MAIL_VERSION_NUMBER "2.6"
#ifdef SNAPSHOT
diff --git a/postfix/src/local/Makefile.in b/postfix/src/local/Makefile.in
index 13a2788a1..34cecd2a2 100644
--- a/postfix/src/local/Makefile.in
+++ b/postfix/src/local/Makefile.in
@@ -78,7 +78,9 @@ alias.o: ../../include/dsn_buf.h
alias.o: ../../include/dsn_mask.h
alias.o: ../../include/fold_addr.h
alias.o: ../../include/htable.h
+alias.o: ../../include/iostuff.h
alias.o: ../../include/mail_params.h
+alias.o: ../../include/mail_proto.h
alias.o: ../../include/maps.h
alias.o: ../../include/mbox_conf.h
alias.o: ../../include/msg.h
@@ -114,9 +116,11 @@ command.o: ../../include/dsn_buf.h
command.o: ../../include/dsn_util.h
command.o: ../../include/fold_addr.h
command.o: ../../include/htable.h
+command.o: ../../include/iostuff.h
command.o: ../../include/mac_parse.h
command.o: ../../include/mail_copy.h
command.o: ../../include/mail_params.h
+command.o: ../../include/mail_proto.h
command.o: ../../include/maps.h
command.o: ../../include/mbox_conf.h
command.o: ../../include/msg.h
@@ -142,6 +146,8 @@ deliver_attr.o: ../../include/dsn.h
deliver_attr.o: ../../include/dsn_buf.h
deliver_attr.o: ../../include/fold_addr.h
deliver_attr.o: ../../include/htable.h
+deliver_attr.o: ../../include/iostuff.h
+deliver_attr.o: ../../include/mail_proto.h
deliver_attr.o: ../../include/maps.h
deliver_attr.o: ../../include/mbox_conf.h
deliver_attr.o: ../../include/msg.h
@@ -174,6 +180,7 @@ 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/mail_proto.h
dotforward.o: ../../include/maps.h
dotforward.o: ../../include/mbox_conf.h
dotforward.o: ../../include/msg.h
@@ -207,8 +214,10 @@ file.o: ../../include/dsn_buf.h
file.o: ../../include/dsn_util.h
file.o: ../../include/fold_addr.h
file.o: ../../include/htable.h
+file.o: ../../include/iostuff.h
file.o: ../../include/mail_copy.h
file.o: ../../include/mail_params.h
+file.o: ../../include/mail_proto.h
file.o: ../../include/maps.h
file.o: ../../include/mbox_conf.h
file.o: ../../include/mbox_open.h
@@ -279,6 +288,7 @@ include.o: ../../include/fold_addr.h
include.o: ../../include/htable.h
include.o: ../../include/iostuff.h
include.o: ../../include/mail_params.h
+include.o: ../../include/mail_proto.h
include.o: ../../include/maps.h
include.o: ../../include/mbox_conf.h
include.o: ../../include/msg.h
@@ -309,7 +319,9 @@ indirect.o: ../../include/dsn.h
indirect.o: ../../include/dsn_buf.h
indirect.o: ../../include/fold_addr.h
indirect.o: ../../include/htable.h
+indirect.o: ../../include/iostuff.h
indirect.o: ../../include/mail_params.h
+indirect.o: ../../include/mail_proto.h
indirect.o: ../../include/maps.h
indirect.o: ../../include/mbox_conf.h
indirect.o: ../../include/msg.h
@@ -341,6 +353,7 @@ 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_proto.h
local.o: ../../include/mail_server.h
local.o: ../../include/mail_version.h
local.o: ../../include/maps.h
@@ -369,9 +382,11 @@ local_expand.o: ../../include/dsn.h
local_expand.o: ../../include/dsn_buf.h
local_expand.o: ../../include/fold_addr.h
local_expand.o: ../../include/htable.h
+local_expand.o: ../../include/iostuff.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: ../../include/mail_proto.h
local_expand.o: ../../include/maps.h
local_expand.o: ../../include/mbox_conf.h
local_expand.o: ../../include/msg_stats.h
@@ -437,8 +452,10 @@ maildir.o: ../../include/dsn_util.h
maildir.o: ../../include/fold_addr.h
maildir.o: ../../include/get_hostname.h
maildir.o: ../../include/htable.h
+maildir.o: ../../include/iostuff.h
maildir.o: ../../include/mail_copy.h
maildir.o: ../../include/mail_params.h
+maildir.o: ../../include/mail_proto.h
maildir.o: ../../include/make_dirs.h
maildir.o: ../../include/maps.h
maildir.o: ../../include/mbox_conf.h
@@ -474,7 +491,9 @@ recipient.o: ../../include/dsn_buf.h
recipient.o: ../../include/ext_prop.h
recipient.o: ../../include/fold_addr.h
recipient.o: ../../include/htable.h
+recipient.o: ../../include/iostuff.h
recipient.o: ../../include/mail_params.h
+recipient.o: ../../include/mail_proto.h
recipient.o: ../../include/maps.h
recipient.o: ../../include/mbox_conf.h
recipient.o: ../../include/msg.h
@@ -536,7 +555,9 @@ token.o: ../../include/dsn.h
token.o: ../../include/dsn_buf.h
token.o: ../../include/fold_addr.h
token.o: ../../include/htable.h
+token.o: ../../include/iostuff.h
token.o: ../../include/mail_params.h
+token.o: ../../include/mail_proto.h
token.o: ../../include/maps.h
token.o: ../../include/mbox_conf.h
token.o: ../../include/msg.h
diff --git a/postfix/src/milter/Makefile.in b/postfix/src/milter/Makefile.in
index 8bb27c08a..c28263a5e 100644
--- a/postfix/src/milter/Makefile.in
+++ b/postfix/src/milter/Makefile.in
@@ -121,6 +121,7 @@ milter_macros.o: ../../include/argv.h
milter_macros.o: ../../include/attr.h
milter_macros.o: ../../include/iostuff.h
milter_macros.o: ../../include/mail_proto.h
+milter_macros.o: ../../include/msg.h
milter_macros.o: ../../include/mymalloc.h
milter_macros.o: ../../include/sys_defs.h
milter_macros.o: ../../include/vbuf.h
diff --git a/postfix/src/oqmgr/Makefile.in b/postfix/src/oqmgr/Makefile.in
index 979c3caee..52caec261 100644
--- a/postfix/src/oqmgr/Makefile.in
+++ b/postfix/src/oqmgr/Makefile.in
@@ -97,8 +97,10 @@ qmgr_active.o: ../../include/dsn.h
qmgr_active.o: ../../include/dsn_buf.h
qmgr_active.o: ../../include/dsn_mask.h
qmgr_active.o: ../../include/events.h
+qmgr_active.o: ../../include/iostuff.h
qmgr_active.o: ../../include/mail_open_ok.h
qmgr_active.o: ../../include/mail_params.h
+qmgr_active.o: ../../include/mail_proto.h
qmgr_active.o: ../../include/mail_queue.h
qmgr_active.o: ../../include/msg.h
qmgr_active.o: ../../include/msg_stats.h
@@ -120,6 +122,8 @@ qmgr_bounce.o: ../../include/deliver_completed.h
qmgr_bounce.o: ../../include/deliver_request.h
qmgr_bounce.o: ../../include/dsn.h
qmgr_bounce.o: ../../include/dsn_buf.h
+qmgr_bounce.o: ../../include/iostuff.h
+qmgr_bounce.o: ../../include/mail_proto.h
qmgr_bounce.o: ../../include/msg_stats.h
qmgr_bounce.o: ../../include/recipient_list.h
qmgr_bounce.o: ../../include/scan_dir.h
@@ -186,7 +190,9 @@ qmgr_entry.o: ../../include/attr.h
qmgr_entry.o: ../../include/deliver_request.h
qmgr_entry.o: ../../include/dsn.h
qmgr_entry.o: ../../include/events.h
+qmgr_entry.o: ../../include/iostuff.h
qmgr_entry.o: ../../include/mail_params.h
+qmgr_entry.o: ../../include/mail_proto.h
qmgr_entry.o: ../../include/msg.h
qmgr_entry.o: ../../include/msg_stats.h
qmgr_entry.o: ../../include/mymalloc.h
diff --git a/postfix/src/oqmgr/qmgr_deliver.c b/postfix/src/oqmgr/qmgr_deliver.c
index 47c75d7eb..0a339aad3 100644
--- a/postfix/src/oqmgr/qmgr_deliver.c
+++ b/postfix/src/oqmgr/qmgr_deliver.c
@@ -26,7 +26,8 @@
/* qmgr_deliver() executes when a delivery process announces its
/* availability for the named transport. It arranges for delivery
/* of a suitable queue entry. The \fIfp\fR argument specifies a
-/* stream that is connected to the delivery process. Upon completion
+/* stream that is connected to the delivery process, or a null
+/* pointer if the transport accepts no connection. Upon completion
/* of delivery (successful or not), the stream is closed, so that the
/* delivery process is released.
/* DIAGNOSTICS
diff --git a/postfix/src/oqmgr/qmgr_message.c b/postfix/src/oqmgr/qmgr_message.c
index 4334d8684..c4e012013 100644
--- a/postfix/src/oqmgr/qmgr_message.c
+++ b/postfix/src/oqmgr/qmgr_message.c
@@ -632,6 +632,9 @@ static int qmgr_message_read(QMGR_MESSAGE *message)
} else if (strcmp(name, MAIL_ATTR_ACT_HELO_NAME) == 0) {
if (have_log_client_attr == 0 && message->client_helo == 0)
message->client_helo = mystrdup(value);
+ } else if (strcmp(name, MAIL_ATTR_ACT_CLIENT_PORT) == 0) {
+ if (have_log_client_attr == 0 && message->client_port == 0)
+ message->client_port = mystrdup(value);
}
/* Original client attributes. */
else if (strcmp(name, MAIL_ATTR_LOG_CLIENT_NAME) == 0) {
diff --git a/postfix/src/oqmgr/qmgr_transport.c b/postfix/src/oqmgr/qmgr_transport.c
index aac9dc35c..8006873ec 100644
--- a/postfix/src/oqmgr/qmgr_transport.c
+++ b/postfix/src/oqmgr/qmgr_transport.c
@@ -337,7 +337,8 @@ void qmgr_transport_alloc(QMGR_TRANSPORT *transport, QMGR_TRANSPORT_ALLOC_NOT
transport->pending += 1;
if ((alloc->stream = mail_connect(MAIL_CLASS_PRIVATE, transport->name,
NON_BLOCKING)) == 0) {
- msg_warn("connect to transport %s: %m", transport->name);
+ msg_warn("connect to transport %s/%s: %m",
+ MAIL_CLASS_PRIVATE, transport->name);
event_request_timer(qmgr_transport_event, (char *) alloc, 0);
return;
}
diff --git a/postfix/src/pipe/Makefile.in b/postfix/src/pipe/Makefile.in
index 6a10d5ff6..2d2cfc4a8 100644
--- a/postfix/src/pipe/Makefile.in
+++ b/postfix/src/pipe/Makefile.in
@@ -78,6 +78,7 @@ pipe.o: ../../include/mail_addr.h
pipe.o: ../../include/mail_conf.h
pipe.o: ../../include/mail_copy.h
pipe.o: ../../include/mail_params.h
+pipe.o: ../../include/mail_proto.h
pipe.o: ../../include/mail_server.h
pipe.o: ../../include/mail_version.h
pipe.o: ../../include/msg.h
diff --git a/postfix/src/qmgr/Makefile.in b/postfix/src/qmgr/Makefile.in
index c1a7f2051..352668bff 100644
--- a/postfix/src/qmgr/Makefile.in
+++ b/postfix/src/qmgr/Makefile.in
@@ -99,8 +99,10 @@ qmgr_active.o: ../../include/dsn.h
qmgr_active.o: ../../include/dsn_buf.h
qmgr_active.o: ../../include/dsn_mask.h
qmgr_active.o: ../../include/events.h
+qmgr_active.o: ../../include/iostuff.h
qmgr_active.o: ../../include/mail_open_ok.h
qmgr_active.o: ../../include/mail_params.h
+qmgr_active.o: ../../include/mail_proto.h
qmgr_active.o: ../../include/mail_queue.h
qmgr_active.o: ../../include/msg.h
qmgr_active.o: ../../include/msg_stats.h
@@ -122,6 +124,8 @@ qmgr_bounce.o: ../../include/deliver_completed.h
qmgr_bounce.o: ../../include/deliver_request.h
qmgr_bounce.o: ../../include/dsn.h
qmgr_bounce.o: ../../include/dsn_buf.h
+qmgr_bounce.o: ../../include/iostuff.h
+qmgr_bounce.o: ../../include/mail_proto.h
qmgr_bounce.o: ../../include/msg_stats.h
qmgr_bounce.o: ../../include/recipient_list.h
qmgr_bounce.o: ../../include/scan_dir.h
@@ -188,7 +192,9 @@ qmgr_entry.o: ../../include/attr.h
qmgr_entry.o: ../../include/deliver_request.h
qmgr_entry.o: ../../include/dsn.h
qmgr_entry.o: ../../include/events.h
+qmgr_entry.o: ../../include/iostuff.h
qmgr_entry.o: ../../include/mail_params.h
+qmgr_entry.o: ../../include/mail_proto.h
qmgr_entry.o: ../../include/msg.h
qmgr_entry.o: ../../include/msg_stats.h
qmgr_entry.o: ../../include/mymalloc.h
diff --git a/postfix/src/qmgr/qmgr_deliver.c b/postfix/src/qmgr/qmgr_deliver.c
index 668c92449..811e1233c 100644
--- a/postfix/src/qmgr/qmgr_deliver.c
+++ b/postfix/src/qmgr/qmgr_deliver.c
@@ -26,7 +26,8 @@
/* qmgr_deliver() executes when a delivery process announces its
/* availability for the named transport. It arranges for delivery
/* of a suitable queue entry. The \fIfp\fR argument specifies a
-/* stream that is connected to the delivery process. Upon completion
+/* stream that is connected to a delivery process, or a null
+/* pointer if the transport accepts no connection. Upon completion
/* of delivery (successful or not), the stream is closed, so that the
/* delivery process is released.
/* DIAGNOSTICS
diff --git a/postfix/src/qmgr/qmgr_message.c b/postfix/src/qmgr/qmgr_message.c
index f683fe0aa..5fd73e924 100644
--- a/postfix/src/qmgr/qmgr_message.c
+++ b/postfix/src/qmgr/qmgr_message.c
@@ -673,6 +673,9 @@ static int qmgr_message_read(QMGR_MESSAGE *message)
} else if (strcmp(name, MAIL_ATTR_ACT_HELO_NAME) == 0) {
if (have_log_client_attr == 0 && message->client_helo == 0)
message->client_helo = mystrdup(value);
+ } else if (strcmp(name, MAIL_ATTR_ACT_CLIENT_PORT) == 0) {
+ if (have_log_client_attr == 0 && message->client_port == 0)
+ message->client_port = mystrdup(value);
}
/* Original client attributes. */
else if (strcmp(name, MAIL_ATTR_LOG_CLIENT_NAME) == 0) {
diff --git a/postfix/src/qmgr/qmgr_transport.c b/postfix/src/qmgr/qmgr_transport.c
index 1265c6f0c..29a1f53e1 100644
--- a/postfix/src/qmgr/qmgr_transport.c
+++ b/postfix/src/qmgr/qmgr_transport.c
@@ -342,7 +342,8 @@ void qmgr_transport_alloc(QMGR_TRANSPORT *transport, QMGR_TRANSPORT_ALLOC_NOT
transport->pending += 1;
if ((alloc->stream = mail_connect(MAIL_CLASS_PRIVATE, transport->name,
NON_BLOCKING)) == 0) {
- msg_warn("connect to transport %s: %m", transport->name);
+ msg_warn("connect to transport %s/%s: %m",
+ MAIL_CLASS_PRIVATE, transport->name);
event_request_timer(qmgr_transport_event, (char *) alloc, 0);
return;
}
@@ -390,7 +391,7 @@ QMGR_TRANSPORT *qmgr_transport_create(const char *name)
get_mail_conf_int2(name, _INIT_DEST_CON,
var_init_dest_concurrency, 1, 0);
transport->rate_delay = get_mail_conf_time2(name, _DEST_RATE_DELAY,
- var_dest_rate_delay,
+ var_dest_rate_delay,
's', 0, 0);
if (transport->rate_delay > 0)
diff --git a/postfix/src/qmqpd/qmqpd.c b/postfix/src/qmqpd/qmqpd.c
index a6b5e66f4..0ee036cd0 100644
--- a/postfix/src/qmqpd/qmqpd.c
+++ b/postfix/src/qmqpd/qmqpd.c
@@ -317,24 +317,6 @@ static void qmqpd_copy_sender(QMQPD_STATE *state)
static void qmqpd_write_attributes(QMQPD_STATE *state)
{
- /*
- * Logging attributes, also used for XFORWARD.
- */
- if (IS_AVAIL_CLIENT_NAME(state->name))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
- MAIL_ATTR_LOG_CLIENT_NAME, state->name);
- if (IS_AVAIL_CLIENT_ADDR(state->addr))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
- MAIL_ATTR_LOG_CLIENT_ADDR, state->rfc_addr);
- if (IS_AVAIL_CLIENT_PORT(state->port))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
- MAIL_ATTR_LOG_CLIENT_PORT, state->port);
- if (IS_AVAIL_CLIENT_NAMADDR(state->namaddr))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
- MAIL_ATTR_LOG_ORIGIN, state->namaddr);
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
- MAIL_ATTR_LOG_PROTO_NAME, state->protocol);
-
/*
* Provenance attributes for Milter policy etc.
*/
diff --git a/postfix/src/qmqpd/qmqpd.h b/postfix/src/qmqpd/qmqpd.h
index 86e98efaa..aad185b77 100644
--- a/postfix/src/qmqpd/qmqpd.h
+++ b/postfix/src/qmqpd/qmqpd.h
@@ -64,13 +64,6 @@ typedef struct {
#define CLIENT_PORT_UNKNOWN CLIENT_ATTR_UNKNOWN
#define CLIENT_NAMADDR_UNKNOWN CLIENT_ATTR_UNKNOWN
-#define IS_AVAIL_CLIENT_ATTR(v) ((v) && strcmp((v), CLIENT_ATTR_UNKNOWN))
-
-#define IS_AVAIL_CLIENT_NAME(v) IS_AVAIL_CLIENT_ATTR(v)
-#define IS_AVAIL_CLIENT_ADDR(v) IS_AVAIL_CLIENT_ATTR(v)
-#define IS_AVAIL_CLIENT_PORT(v) IS_AVAIL_CLIENT_ATTR(v)
-#define IS_AVAIL_CLIENT_NAMADDR(v) IS_AVAIL_CLIENT_ATTR(v)
-
/*
* QMQP protocol status codes.
*/
diff --git a/postfix/src/smtp/Makefile.in b/postfix/src/smtp/Makefile.in
index f5ae8f07f..c4629dd1a 100644
--- a/postfix/src/smtp/Makefile.in
+++ b/postfix/src/smtp/Makefile.in
@@ -100,8 +100,10 @@ smtp.o: ../../include/flush_clnt.h
smtp.o: ../../include/header_body_checks.h
smtp.o: ../../include/header_opts.h
smtp.o: ../../include/htable.h
+smtp.o: ../../include/iostuff.h
smtp.o: ../../include/mail_conf.h
smtp.o: ../../include/mail_params.h
+smtp.o: ../../include/mail_proto.h
smtp.o: ../../include/mail_server.h
smtp.o: ../../include/mail_version.h
smtp.o: ../../include/maps.h
@@ -141,7 +143,9 @@ smtp_addr.o: ../../include/header_opts.h
smtp_addr.o: ../../include/htable.h
smtp_addr.o: ../../include/inet_addr_list.h
smtp_addr.o: ../../include/inet_proto.h
+smtp_addr.o: ../../include/iostuff.h
smtp_addr.o: ../../include/mail_params.h
+smtp_addr.o: ../../include/mail_proto.h
smtp_addr.o: ../../include/maps.h
smtp_addr.o: ../../include/match_list.h
smtp_addr.o: ../../include/match_ops.h
@@ -151,6 +155,7 @@ smtp_addr.o: ../../include/msg_stats.h
smtp_addr.o: ../../include/myaddrinfo.h
smtp_addr.o: ../../include/mymalloc.h
smtp_addr.o: ../../include/name_code.h
+smtp_addr.o: ../../include/name_mask.h
smtp_addr.o: ../../include/own_inet_addr.h
smtp_addr.o: ../../include/recipient_list.h
smtp_addr.o: ../../include/resolve_clnt.h
@@ -179,10 +184,12 @@ smtp_chat.o: ../../include/header_body_checks.h
smtp_chat.o: ../../include/header_opts.h
smtp_chat.o: ../../include/htable.h
smtp_chat.o: ../../include/int_filt.h
+smtp_chat.o: ../../include/iostuff.h
smtp_chat.o: ../../include/line_wrap.h
smtp_chat.o: ../../include/mail_addr.h
smtp_chat.o: ../../include/mail_error.h
smtp_chat.o: ../../include/mail_params.h
+smtp_chat.o: ../../include/mail_proto.h
smtp_chat.o: ../../include/maps.h
smtp_chat.o: ../../include/match_list.h
smtp_chat.o: ../../include/match_ops.h
@@ -263,7 +270,9 @@ smtp_map11.o: ../../include/dsn_buf.h
smtp_map11.o: ../../include/header_body_checks.h
smtp_map11.o: ../../include/header_opts.h
smtp_map11.o: ../../include/htable.h
+smtp_map11.o: ../../include/iostuff.h
smtp_map11.o: ../../include/mail_addr_map.h
+smtp_map11.o: ../../include/mail_proto.h
smtp_map11.o: ../../include/maps.h
smtp_map11.o: ../../include/match_list.h
smtp_map11.o: ../../include/match_ops.h
@@ -271,6 +280,7 @@ smtp_map11.o: ../../include/mime_state.h
smtp_map11.o: ../../include/msg.h
smtp_map11.o: ../../include/msg_stats.h
smtp_map11.o: ../../include/name_code.h
+smtp_map11.o: ../../include/name_mask.h
smtp_map11.o: ../../include/quote_822_local.h
smtp_map11.o: ../../include/quote_flags.h
smtp_map11.o: ../../include/recipient_list.h
@@ -353,6 +363,8 @@ smtp_rcpt.o: ../../include/dsn_mask.h
smtp_rcpt.o: ../../include/header_body_checks.h
smtp_rcpt.o: ../../include/header_opts.h
smtp_rcpt.o: ../../include/htable.h
+smtp_rcpt.o: ../../include/iostuff.h
+smtp_rcpt.o: ../../include/mail_proto.h
smtp_rcpt.o: ../../include/maps.h
smtp_rcpt.o: ../../include/match_list.h
smtp_rcpt.o: ../../include/match_ops.h
@@ -361,6 +373,7 @@ smtp_rcpt.o: ../../include/msg.h
smtp_rcpt.o: ../../include/msg_stats.h
smtp_rcpt.o: ../../include/mymalloc.h
smtp_rcpt.o: ../../include/name_code.h
+smtp_rcpt.o: ../../include/name_mask.h
smtp_rcpt.o: ../../include/recipient_list.h
smtp_rcpt.o: ../../include/resolve_clnt.h
smtp_rcpt.o: ../../include/scache.h
@@ -384,7 +397,9 @@ smtp_reuse.o: ../../include/dsn_buf.h
smtp_reuse.o: ../../include/header_body_checks.h
smtp_reuse.o: ../../include/header_opts.h
smtp_reuse.o: ../../include/htable.h
+smtp_reuse.o: ../../include/iostuff.h
smtp_reuse.o: ../../include/mail_params.h
+smtp_reuse.o: ../../include/mail_proto.h
smtp_reuse.o: ../../include/maps.h
smtp_reuse.o: ../../include/match_list.h
smtp_reuse.o: ../../include/match_ops.h
@@ -393,6 +408,7 @@ smtp_reuse.o: ../../include/msg.h
smtp_reuse.o: ../../include/msg_stats.h
smtp_reuse.o: ../../include/mymalloc.h
smtp_reuse.o: ../../include/name_code.h
+smtp_reuse.o: ../../include/name_mask.h
smtp_reuse.o: ../../include/recipient_list.h
smtp_reuse.o: ../../include/resolve_clnt.h
smtp_reuse.o: ../../include/scache.h
@@ -419,6 +435,8 @@ smtp_sasl_auth_cache.o: ../../include/dsn_util.h
smtp_sasl_auth_cache.o: ../../include/header_body_checks.h
smtp_sasl_auth_cache.o: ../../include/header_opts.h
smtp_sasl_auth_cache.o: ../../include/htable.h
+smtp_sasl_auth_cache.o: ../../include/iostuff.h
+smtp_sasl_auth_cache.o: ../../include/mail_proto.h
smtp_sasl_auth_cache.o: ../../include/maps.h
smtp_sasl_auth_cache.o: ../../include/match_list.h
smtp_sasl_auth_cache.o: ../../include/match_ops.h
@@ -427,6 +445,7 @@ smtp_sasl_auth_cache.o: ../../include/msg.h
smtp_sasl_auth_cache.o: ../../include/msg_stats.h
smtp_sasl_auth_cache.o: ../../include/mymalloc.h
smtp_sasl_auth_cache.o: ../../include/name_code.h
+smtp_sasl_auth_cache.o: ../../include/name_mask.h
smtp_sasl_auth_cache.o: ../../include/recipient_list.h
smtp_sasl_auth_cache.o: ../../include/resolve_clnt.h
smtp_sasl_auth_cache.o: ../../include/scache.h
@@ -450,8 +469,10 @@ smtp_sasl_glue.o: ../../include/dsn_buf.h
smtp_sasl_glue.o: ../../include/header_body_checks.h
smtp_sasl_glue.o: ../../include/header_opts.h
smtp_sasl_glue.o: ../../include/htable.h
+smtp_sasl_glue.o: ../../include/iostuff.h
smtp_sasl_glue.o: ../../include/mail_addr_find.h
smtp_sasl_glue.o: ../../include/mail_params.h
+smtp_sasl_glue.o: ../../include/mail_proto.h
smtp_sasl_glue.o: ../../include/maps.h
smtp_sasl_glue.o: ../../include/match_list.h
smtp_sasl_glue.o: ../../include/match_ops.h
@@ -460,6 +481,7 @@ smtp_sasl_glue.o: ../../include/msg.h
smtp_sasl_glue.o: ../../include/msg_stats.h
smtp_sasl_glue.o: ../../include/mymalloc.h
smtp_sasl_glue.o: ../../include/name_code.h
+smtp_sasl_glue.o: ../../include/name_mask.h
smtp_sasl_glue.o: ../../include/recipient_list.h
smtp_sasl_glue.o: ../../include/resolve_clnt.h
smtp_sasl_glue.o: ../../include/scache.h
@@ -486,7 +508,9 @@ smtp_sasl_proto.o: ../../include/dsn_buf.h
smtp_sasl_proto.o: ../../include/header_body_checks.h
smtp_sasl_proto.o: ../../include/header_opts.h
smtp_sasl_proto.o: ../../include/htable.h
+smtp_sasl_proto.o: ../../include/iostuff.h
smtp_sasl_proto.o: ../../include/mail_params.h
+smtp_sasl_proto.o: ../../include/mail_proto.h
smtp_sasl_proto.o: ../../include/maps.h
smtp_sasl_proto.o: ../../include/match_list.h
smtp_sasl_proto.o: ../../include/match_ops.h
@@ -495,6 +519,7 @@ smtp_sasl_proto.o: ../../include/msg.h
smtp_sasl_proto.o: ../../include/msg_stats.h
smtp_sasl_proto.o: ../../include/mymalloc.h
smtp_sasl_proto.o: ../../include/name_code.h
+smtp_sasl_proto.o: ../../include/name_mask.h
smtp_sasl_proto.o: ../../include/recipient_list.h
smtp_sasl_proto.o: ../../include/resolve_clnt.h
smtp_sasl_proto.o: ../../include/scache.h
@@ -519,7 +544,9 @@ smtp_session.o: ../../include/dsn_buf.h
smtp_session.o: ../../include/header_body_checks.h
smtp_session.o: ../../include/header_opts.h
smtp_session.o: ../../include/htable.h
+smtp_session.o: ../../include/iostuff.h
smtp_session.o: ../../include/mail_params.h
+smtp_session.o: ../../include/mail_proto.h
smtp_session.o: ../../include/maps.h
smtp_session.o: ../../include/match_list.h
smtp_session.o: ../../include/match_ops.h
@@ -528,6 +555,7 @@ smtp_session.o: ../../include/msg.h
smtp_session.o: ../../include/msg_stats.h
smtp_session.o: ../../include/mymalloc.h
smtp_session.o: ../../include/name_code.h
+smtp_session.o: ../../include/name_mask.h
smtp_session.o: ../../include/recipient_list.h
smtp_session.o: ../../include/resolve_clnt.h
smtp_session.o: ../../include/scache.h
@@ -552,7 +580,9 @@ smtp_state.o: ../../include/dsn_buf.h
smtp_state.o: ../../include/header_body_checks.h
smtp_state.o: ../../include/header_opts.h
smtp_state.o: ../../include/htable.h
+smtp_state.o: ../../include/iostuff.h
smtp_state.o: ../../include/mail_params.h
+smtp_state.o: ../../include/mail_proto.h
smtp_state.o: ../../include/maps.h
smtp_state.o: ../../include/match_list.h
smtp_state.o: ../../include/match_ops.h
@@ -561,6 +591,7 @@ smtp_state.o: ../../include/msg.h
smtp_state.o: ../../include/msg_stats.h
smtp_state.o: ../../include/mymalloc.h
smtp_state.o: ../../include/name_code.h
+smtp_state.o: ../../include/name_mask.h
smtp_state.o: ../../include/recipient_list.h
smtp_state.o: ../../include/resolve_clnt.h
smtp_state.o: ../../include/scache.h
@@ -586,7 +617,9 @@ smtp_trouble.o: ../../include/dsn_buf.h
smtp_trouble.o: ../../include/header_body_checks.h
smtp_trouble.o: ../../include/header_opts.h
smtp_trouble.o: ../../include/htable.h
+smtp_trouble.o: ../../include/iostuff.h
smtp_trouble.o: ../../include/mail_error.h
+smtp_trouble.o: ../../include/mail_proto.h
smtp_trouble.o: ../../include/maps.h
smtp_trouble.o: ../../include/match_list.h
smtp_trouble.o: ../../include/match_ops.h
@@ -619,6 +652,8 @@ smtp_unalias.o: ../../include/dsn_buf.h
smtp_unalias.o: ../../include/header_body_checks.h
smtp_unalias.o: ../../include/header_opts.h
smtp_unalias.o: ../../include/htable.h
+smtp_unalias.o: ../../include/iostuff.h
+smtp_unalias.o: ../../include/mail_proto.h
smtp_unalias.o: ../../include/maps.h
smtp_unalias.o: ../../include/match_list.h
smtp_unalias.o: ../../include/match_ops.h
@@ -627,6 +662,7 @@ smtp_unalias.o: ../../include/msg.h
smtp_unalias.o: ../../include/msg_stats.h
smtp_unalias.o: ../../include/myaddrinfo.h
smtp_unalias.o: ../../include/name_code.h
+smtp_unalias.o: ../../include/name_mask.h
smtp_unalias.o: ../../include/recipient_list.h
smtp_unalias.o: ../../include/resolve_clnt.h
smtp_unalias.o: ../../include/scache.h
diff --git a/postfix/src/smtp/smtp_proto.c b/postfix/src/smtp/smtp_proto.c
index ed40eff5b..e00ef6454 100644
--- a/postfix/src/smtp/smtp_proto.c
+++ b/postfix/src/smtp/smtp_proto.c
@@ -1224,19 +1224,19 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
if (session->features & SMTP_FEATURE_XFORWARD_NAME) {
vstring_strcat(next_command, " " XFORWARD_NAME "=");
xtext_quote_append(next_command,
- DEL_REQ_ATTR_AVAIL(request->client_name) ?
+ MAIL_ATTR_IS_KNOWN(request->client_name) ?
request->client_name : XFORWARD_UNAVAILABLE, "");
}
if (session->features & SMTP_FEATURE_XFORWARD_ADDR) {
vstring_strcat(next_command, " " XFORWARD_ADDR "=");
xtext_quote_append(next_command,
- DEL_REQ_ATTR_AVAIL(request->client_addr) ?
+ MAIL_ATTR_IS_KNOWN(request->client_addr) ?
request->client_addr : XFORWARD_UNAVAILABLE, "");
}
if (session->features & SMTP_FEATURE_XFORWARD_PORT) {
vstring_strcat(next_command, " " XFORWARD_PORT "=");
xtext_quote_append(next_command,
- DEL_REQ_ATTR_AVAIL(request->client_port) ?
+ MAIL_ATTR_IS_KNOWN(request->client_port) ?
request->client_port : XFORWARD_UNAVAILABLE, "");
}
if (session->send_proto_helo)
@@ -1250,19 +1250,19 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
if (session->features & SMTP_FEATURE_XFORWARD_PROTO) {
vstring_strcat(next_command, " " XFORWARD_PROTO "=");
xtext_quote_append(next_command,
- DEL_REQ_ATTR_AVAIL(request->client_proto) ?
+ MAIL_ATTR_IS_KNOWN(request->client_proto) ?
request->client_proto : XFORWARD_UNAVAILABLE, "");
}
if (session->features & SMTP_FEATURE_XFORWARD_HELO) {
vstring_strcat(next_command, " " XFORWARD_HELO "=");
xtext_quote_append(next_command,
- DEL_REQ_ATTR_AVAIL(request->client_helo) ?
+ MAIL_ATTR_IS_EXIST(request->client_helo) ?
request->client_helo : XFORWARD_UNAVAILABLE, "");
}
if (session->features & SMTP_FEATURE_XFORWARD_DOMAIN) {
vstring_strcat(next_command, " " XFORWARD_DOMAIN "=");
xtext_quote_append(next_command,
- DEL_REQ_ATTR_AVAIL(request->rewrite_context) == 0 ?
+ MAIL_ATTR_IS_EXIST(request->rewrite_context) == 0 ?
XFORWARD_UNAVAILABLE :
strcmp(request->rewrite_context, MAIL_ATTR_RWR_LOCAL) ?
XFORWARD_DOM_REMOTE : XFORWARD_DOM_LOCAL, "");
@@ -1931,21 +1931,17 @@ int smtp_xfer(SMTP_STATE *state)
}
/*
- * Use the XFORWARD command to forward client attributes only when a
- * minimal amount of information is available.
+ * Use the XFORWARD command to send local/remote submission information.
*/
send_name_addr =
var_smtp_send_xforward
- && (((session->features & SMTP_FEATURE_XFORWARD_NAME)
- && DEL_REQ_ATTR_AVAIL(request->client_name))
- || ((session->features & SMTP_FEATURE_XFORWARD_ADDR)
- && DEL_REQ_ATTR_AVAIL(request->client_addr)));
+ && (session->features & (SMTP_FEATURE_XFORWARD_NAME
+ | SMTP_FEATURE_XFORWARD_ADDR));
session->send_proto_helo =
var_smtp_send_xforward
- && (((session->features & SMTP_FEATURE_XFORWARD_PROTO)
- && DEL_REQ_ATTR_AVAIL(request->client_proto))
- || ((session->features & SMTP_FEATURE_XFORWARD_HELO)
- && DEL_REQ_ATTR_AVAIL(request->client_helo)));
+ && (session->features & (SMTP_FEATURE_XFORWARD_PROTO
+ | SMTP_FEATURE_XFORWARD_HELO
+ | SMTP_FEATURE_XFORWARD_DOMAIN));
if (send_name_addr)
recv_state = send_state = SMTP_STATE_XFORWARD_NAME_ADDR;
else if (session->send_proto_helo)
diff --git a/postfix/src/smtpd/smtpd.c b/postfix/src/smtpd/smtpd.c
index 4080bcb8e..de017cf8e 100644
--- a/postfix/src/smtpd/smtpd.c
+++ b/postfix/src/smtpd/smtpd.c
@@ -1754,26 +1754,37 @@ static int mail_open_stream(SMTPD_STATE *state)
if (SMTPD_STAND_ALONE(state) == 0) {
/*
- * Attributes for logging, also used for XFORWARD.
+ * Forwarded client attributes.
+ *
+ * In the case of a forwarded remote submission, store original
+ * client attributes in our own internal representation: either
+ * actual values or "unknown"; don't bother with storing
+ * non-existent HELO attributes.
+ *
+ * In the case of a forwarded local submission, specify explicitly
+ * that the original client attributes are non-existent.
*/
- if (IS_AVAIL_CLIENT_NAME(FORWARD_NAME(state)))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
+ if (state->xforward.flags & SMTPD_STATE_XFORWARD_CLIENT_MASK) {
+ if (MAIL_ATTR_IS_KNOWN(FORWARD_ADDR(state))) {
+ rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
MAIL_ATTR_LOG_CLIENT_NAME, FORWARD_NAME(state));
- if (IS_AVAIL_CLIENT_ADDR(FORWARD_ADDR(state)))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
+ rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
MAIL_ATTR_LOG_CLIENT_ADDR, FORWARD_ADDR(state));
- if (IS_AVAIL_CLIENT_PORT(FORWARD_PORT(state)))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
+ rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
MAIL_ATTR_LOG_CLIENT_PORT, FORWARD_PORT(state));
- if (IS_AVAIL_CLIENT_NAMADDR(FORWARD_NAMADDR(state)))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
- MAIL_ATTR_LOG_ORIGIN, FORWARD_NAMADDR(state));
- if (IS_AVAIL_CLIENT_HELO(FORWARD_HELO(state)))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
- MAIL_ATTR_LOG_HELO_NAME, FORWARD_HELO(state));
- if (IS_AVAIL_CLIENT_PROTO(FORWARD_PROTO(state)))
- rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
+ rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
+ MAIL_ATTR_LOG_ORIGIN, FORWARD_NAMADDR(state));
+ if (FORWARD_HELO(state))
+ rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
+ MAIL_ATTR_LOG_HELO_NAME, FORWARD_HELO(state));
+ rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
MAIL_ATTR_LOG_PROTO_NAME, FORWARD_PROTO(state));
+ } else {
+ /* Local submission. */
+ rec_fprintf(state->cleanup, REC_TYPE_ATTR, "%s=%s",
+ MAIL_ATTR_LOG_CLIENT_ADDR, MAIL_ATTR_VAL_NONEXIST);
+ }
+ }
/*
* Attributes with actual client information. These are used by
diff --git a/postfix/src/smtpd/smtpd.h b/postfix/src/smtpd/smtpd.h
index bc3aa25c6..f00d07852 100644
--- a/postfix/src/smtpd/smtpd.h
+++ b/postfix/src/smtpd/smtpd.h
@@ -292,13 +292,14 @@ extern void smtpd_peer_reset(SMTPD_STATE *state);
*
* Note 1: inside the SMTP server, forwarded attributes must have the exact
* same representation as normal attributes: unknown string values are
- * "unknown", except for HELO which defaults to null. This is better than
- * having to change every piece of code that accesses a possibly forwarded
- * attribute.
+ * "unknown", and non-existent HELO is null.
*
- * Note 2: outside the SMTP server, the representation of unknown/known
- * attribute values is different in queue files, in queue manager delivery
- * requests, and in over-the-network XFORWARD commands.
+ * Note 2: the SMTP server representation of unknown/known attribute values is
+ * also used in queue files and in delivery requests, while non-existent
+ * information is represented in those contexts as empty strings. In queue
+ * files and delivery requests, forwarded local submissions are represented
+ * by forwarded client attributes with empty string values (actually one
+ * attribute is sufficient).
*
* Note 3: if forwarding client information, don't mix information from the
* current SMTP session with forwarded information from an up-stream
diff --git a/postfix/src/smtpd/smtpd_xforward.c b/postfix/src/smtpd/smtpd_xforward.c
index 977640946..4ae89f969 100644
--- a/postfix/src/smtpd/smtpd_xforward.c
+++ b/postfix/src/smtpd/smtpd_xforward.c
@@ -9,6 +9,9 @@
/* void smtpd_xforward_init(state)
/* SMTPD_STATE *state;
/*
+/* void smtpd_xforward_preset(state)
+/* SMTPD_STATE *state;
+/*
/* void smtpd_xforward_reset(state)
/* SMTPD_STATE *state;
/* DESCRIPTION
diff --git a/postfix/src/util/Makefile.in b/postfix/src/util/Makefile.in
index 11dff3e49..1b28c324f 100644
--- a/postfix/src/util/Makefile.in
+++ b/postfix/src/util/Makefile.in
@@ -1356,6 +1356,7 @@ safe_getenv.o: sys_defs.h
safe_open.o: msg.h
safe_open.o: safe_open.c
safe_open.o: safe_open.h
+safe_open.o: stringops.h
safe_open.o: sys_defs.h
safe_open.o: vbuf.h
safe_open.o: vstream.h
diff --git a/postfix/src/util/write_buf.c b/postfix/src/util/write_buf.c
index 7674095da..968a468ac 100644
--- a/postfix/src/util/write_buf.c
+++ b/postfix/src/util/write_buf.c
@@ -46,6 +46,7 @@
#include
#include
#include
+#include
/* Utility library. */
@@ -58,21 +59,31 @@ ssize_t write_buf(int fd, const char *buf, ssize_t len, int timeout)
{
const char *start = buf;
ssize_t count;
+ time_t expire;
+ int time_left = timeout;
+
+ if (time_left > 0)
+ expire = time((time_t *) 0) + time_left;
while (len > 0) {
- if (timeout > 0 && write_wait(fd, timeout) < 0)
+ if (time_left > 0 && write_wait(fd, time_left) < 0)
return (-1);
if ((count = write(fd, buf, len)) < 0) {
- if (errno == EAGAIN && timeout > 0)
- continue;
- if (errno == EINTR)
- continue;
- return (-1);
+ if ((errno == EAGAIN && time_left > 0) || errno == EINTR)
+ /* void */ ;
+ else
+ return (-1);
+ } else {
+ buf += count;
+ len -= count;
+ }
+ if (len > 0 && time_left > 0) {
+ time_left = expire - time((time_t *) 0);
+ if (time_left <= 0) {
+ errno = ETIMEDOUT;
+ return (-1);
+ }
}
- if (count == 0)
- msg_fatal("write returned 0");
- buf += count;
- len -= count;
}
return (buf - start);
}
diff --git a/postfix/src/virtual/Makefile.in b/postfix/src/virtual/Makefile.in
index 9aed39f41..bb443b23b 100644
--- a/postfix/src/virtual/Makefile.in
+++ b/postfix/src/virtual/Makefile.in
@@ -64,6 +64,8 @@ deliver_attr.o: ../../include/deliver_request.h
deliver_attr.o: ../../include/dict.h
deliver_attr.o: ../../include/dsn.h
deliver_attr.o: ../../include/dsn_buf.h
+deliver_attr.o: ../../include/iostuff.h
+deliver_attr.o: ../../include/mail_proto.h
deliver_attr.o: ../../include/maps.h
deliver_attr.o: ../../include/mbox_conf.h
deliver_attr.o: ../../include/msg.h
@@ -84,9 +86,11 @@ mailbox.o: ../../include/dict.h
mailbox.o: ../../include/dsn.h
mailbox.o: ../../include/dsn_buf.h
mailbox.o: ../../include/dsn_util.h
+mailbox.o: ../../include/iostuff.h
mailbox.o: ../../include/mail_addr_find.h
mailbox.o: ../../include/mail_copy.h
mailbox.o: ../../include/mail_params.h
+mailbox.o: ../../include/mail_proto.h
mailbox.o: ../../include/maps.h
mailbox.o: ../../include/mbox_conf.h
mailbox.o: ../../include/mbox_open.h
@@ -114,8 +118,10 @@ maildir.o: ../../include/dsn.h
maildir.o: ../../include/dsn_buf.h
maildir.o: ../../include/dsn_util.h
maildir.o: ../../include/get_hostname.h
+maildir.o: ../../include/iostuff.h
maildir.o: ../../include/mail_copy.h
maildir.o: ../../include/mail_params.h
+maildir.o: ../../include/mail_proto.h
maildir.o: ../../include/make_dirs.h
maildir.o: ../../include/maps.h
maildir.o: ../../include/mbox_conf.h
@@ -142,6 +148,8 @@ recipient.o: ../../include/deliver_request.h
recipient.o: ../../include/dict.h
recipient.o: ../../include/dsn.h
recipient.o: ../../include/dsn_buf.h
+recipient.o: ../../include/iostuff.h
+recipient.o: ../../include/mail_proto.h
recipient.o: ../../include/maps.h
recipient.o: ../../include/mbox_conf.h
recipient.o: ../../include/msg.h
@@ -162,6 +170,8 @@ unknown.o: ../../include/deliver_request.h
unknown.o: ../../include/dict.h
unknown.o: ../../include/dsn.h
unknown.o: ../../include/dsn_buf.h
+unknown.o: ../../include/iostuff.h
+unknown.o: ../../include/mail_proto.h
unknown.o: ../../include/maps.h
unknown.o: ../../include/mbox_conf.h
unknown.o: ../../include/msg.h
@@ -185,6 +195,7 @@ 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_proto.h
virtual.o: ../../include/mail_queue.h
virtual.o: ../../include/mail_server.h
virtual.o: ../../include/mail_version.h