2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-30 13:48:06 +00:00

postfix-2.5.0

This commit is contained in:
Wietse Venema
2008-01-23 00:00:00 -05:00
committed by Viktor Dukhovni
parent b5f31bd3e8
commit f15b7e2082
23 changed files with 421 additions and 168 deletions

View File

@@ -13870,7 +13870,7 @@ Apologies for any names omitted.
20071202 20071202
Feature: output rate control. For example, specify Feature: output rate control. For example, specify
"smtp_delivery_rate_delay = 5m" to insert a five-minute "smtp_destination_rate_delay = 5m" to insert a five-minute
delay between deliveries. This was an opportunity to define delay between deliveries. This was an opportunity to define
the mutually exclusive states that a queue can have, and the mutually exclusive states that a queue can have, and
to detect invalid transitions. This will make adding new to detect invalid transitions. This will make adding new
@@ -14270,3 +14270,10 @@ Apologies for any names omitted.
Bugfix (introduced 20080112): missing #ifdef for the SASL Bugfix (introduced 20080112): missing #ifdef for the SASL
login failure cache. File: smtp/smtp_sasl_auth_cache.h. login failure cache. File: smtp/smtp_sasl_auth_cache.h.
20080123
Name fix: renamed the mumble_delivery_rate_delay parameter
to mumble_destination_rate_delay, because it really is a
per-destination feature. With this change we keep the option
of implementing a future per-transport rate delay.

View File

@@ -290,54 +290,121 @@ If one finds oneself needing to deliver a high volume of mail to a destination
that exhibits frequent brief bursts of errors and connection caching does not that exhibits frequent brief bursts of errors and connection caching does not
solve the problem, there is a subtle workaround. solve the problem, there is a subtle workaround.
* In master.cf set up a dedicated clone of the "smtp" transport for the * Postfix version 2.5 and later:
destination in question.
* In master.cf configure a reasonable process limit for the transport (a o In master.cf set up a dedicated clone of the "smtp" transport for the
number in the 10-20 range is typical). destination in question. In the example below we will call it
"fragile".
* IMPORTANT!!! In main.cf configure a very large initial and destination o In master.cf configure a reasonable process limit for the cloned smtp
concurrency limit for this transport (say 2000). transport (a number in the 10-20 range is typical).
/etc/postfix/main.cf: o IMPORTANT!!! In main.cf configure a large per-destination pseudo-cohort
initial_destination_concurrency = 2000 failure limit for the cloned smtp transport.
transportname_destination_concurrency_limit = 2000
Where transportname is the name of the master.cf entry in question. /etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
fragile_destination_concurrency_failed_cohort_limit = 100
fragile_destination_concurrency_limit = 20
The effect of this surprising configuration is that up to 2000 consecutive /etc/postfix/transport:
errors are tolerated without marking the destination dead, while the total example.com fragile:
concurrency remains reasonable (10-20 processes). This trick is only for a very
specialized situation: high volume delivery into a channel with multi-error /etc/postfix/master.cf:
bursts that is capable of high throughput, but is repeatedly throttled by the # service type private unpriv chroot wakeup maxproc command
bursts of errors. fragile unix - - n - 20 smtp
See also the documentation for
default_destination_concurrency_failed_cohort_limit and
default_destination_concurrency_limit.
* Earlier Postfix versions:
o In master.cf set up a dedicated clone of the "smtp" transport for the
destination in question. In the example below we will call it
"fragile".
o In master.cf configure a reasonable process limit for the transport (a
number in the 10-20 range is typical).
o IMPORTANT!!! In main.cf configure a very large initial and destination
concurrency limit for this transport (say 2000).
/etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
initial_destination_concurrency = 2000
fragile_destination_concurrency_limit = 2000
/etc/postfix/transport:
example.com fragile:
/etc/postfix/master.cf:
# service type private unpriv chroot wakeup maxproc command
fragile unix - - n - 20 smtp
See also the documentation for default_destination_concurrency_limit.
The effect of this configuration is that up to 2000 consecutive errors are
tolerated without marking the destination dead, while the total concurrency
remains reasonable (10-20 processes). This trick is only for a very specialized
situation: high volume delivery into a channel with multi-error bursts that is
capable of high throughput, but is repeatedly throttled by the bursts of
errors.
When a destination is unable to handle the load even after the Postfix process When a destination is unable to handle the load even after the Postfix process
limit is reduced to 1, a desperate measure is to insert brief delays between limit is reduced to 1, a desperate measure is to insert brief delays between
delivery attempts. delivery attempts.
* In the transport map entry for the problem destination, specify a dead host * Postfix version 2.5 and later:
as the primary nexthop.
* In the master.cf entry for the transport specify the problem destination as o In master.cf set up a dedicated clone of the "smtp" transport for the
the fallback_relay and specify a small smtp_connect_timeout value. problem destination. In the example below we call it "slow".
/etc/postfix/transport: o In main.cf configure a short delay between deliveries to the same
problem.example.com slow:[dead.host] destination.
/etc/postfix/master.cf: /etc/postfix/main.cf:
# service type private unpriv chroot wakeup maxproc command transport_maps = hash:/etc/postfix/transport
slow unix - - n - 1 smtp slow_destination_rate_delay = 1
-o fallback_relay=problem.example.com
-o smtp_connect_timeout=1
This solution forces the Postfix smtp(8) client to wait for /etc/postfix/transport:
$smtp_connect_timeout seconds between deliveries. The solution depends on example.com slow:
Postfix connection management details, and needs to be updated when SMTP
connection caching is introduced.
Hopefully a more elegant solution to these problems will be found in the /etc/postfix/master.cf:
future. # service type private unpriv chroot wakeup maxproc command
slow unix - - n - - smtp
See also the documentation for default_destination_rate_delay.
This solution forces the Postfix smtp(8) client to wait for
$slow_destination_rate_delay seconds between deliveries to the same
destination.
* Earlier Postfix versions:
o In the transport map entry for the problem destination, specify a dead
host as the primary nexthop.
o In the master.cf entry for the transport specify the problem
destination as the fallback_relay and specify a small
smtp_connect_timeout value.
/etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport:
example.com slow:[dead.host]
/etc/postfix/master.cf:
# service type private unpriv chroot wakeup maxproc command
slow unix - - n - 1 smtp
-o fallback_relay=problem.example.com
-o smtp_connect_timeout=1
-o smtp_cache_connection=no
This solution forces the Postfix smtp(8) client to wait for
$smtp_connect_timeout seconds between deliveries. The connection caching
feature is disabled to prevent the client from skipping over the dead host.
PPoossttffiixx qquueeuuee ddiirreeccttoorriieess PPoossttffiixx qquueeuuee ddiirreeccttoorriieess

View File

@@ -220,9 +220,9 @@ easier to find. This document describes the "mail sending" side
only. only.
[Feature 20071202] Output rate control in the queue manager. For [Feature 20071202] Output rate control in the queue manager. For
example, specify "smtp_delivery_rate_delay = 5m", to pause five example, specify "smtp_destination_rate_delay = 5m", to pause five
minutes between message deliveries. More information in the postconf(5) minutes between message deliveries. More information in the postconf(5)
manual under "default_delivery_rate_delay". manual under "default_destination_rate_delay".
Major changes - smtp client Major changes - smtp client
--------------------------- ---------------------------

View File

@@ -192,10 +192,10 @@ $manpage_directory/man8/verify.8:f:root:-:644
$manpage_directory/man8/virtual.8:f:root:-:644 $manpage_directory/man8/virtual.8:f:root:-:644
$sample_directory/sample-aliases.cf:f:root:-:644:o $sample_directory/sample-aliases.cf:f:root:-:644:o
$sample_directory/sample-auth.cf:f:root:-:644:o $sample_directory/sample-auth.cf:f:root:-:644:o
$sample_directory/sample-canonical.cf:f:root:-:644:o:o $sample_directory/sample-canonical.cf:f:root:-:644:o
$sample_directory/sample-compatibility.cf:f:root:-:644:o $sample_directory/sample-compatibility.cf:f:root:-:644:o
$sample_directory/sample-debug.cf:f:root:-:644:o $sample_directory/sample-debug.cf:f:root:-:644:o
$sample_directory/sample-filter.cf:f:root:-:644:o:o $sample_directory/sample-filter.cf:f:root:-:644:o
$sample_directory/sample-flush.cf:f:root:-:644:o $sample_directory/sample-flush.cf:f:root:-:644:o
$sample_directory/sample-ipv6.cf:f:root:-:644:o $sample_directory/sample-ipv6.cf:f:root:-:644:o
$sample_directory/sample-ldap.cf:f:root:-:644:o $sample_directory/sample-ldap.cf:f:root:-:644:o
@@ -203,15 +203,15 @@ $sample_directory/sample-lmtp.cf:f:root:-:644:o
$sample_directory/sample-local.cf:f:root:-:644:o $sample_directory/sample-local.cf:f:root:-:644:o
$sample_directory/sample-mime.cf:f:root:-:644:o $sample_directory/sample-mime.cf:f:root:-:644:o
$sample_directory/sample-misc.cf:f:root:-:644:o $sample_directory/sample-misc.cf:f:root:-:644:o
$sample_directory/sample-pcre-access.cf:f:root:-:644:o:o $sample_directory/sample-pcre-access.cf:f:root:-:644:o
$sample_directory/sample-pcre-body.cf:f:root:-:644:o:o $sample_directory/sample-pcre-body.cf:f:root:-:644:o
$sample_directory/sample-pcre-header.cf:f:root:-:644:o:o $sample_directory/sample-pcre-header.cf:f:root:-:644:o
$sample_directory/sample-pgsql-aliases.cf:f:root:-:644:o $sample_directory/sample-pgsql-aliases.cf:f:root:-:644:o
$sample_directory/sample-qmqpd.cf:f:root:-:644:o $sample_directory/sample-qmqpd.cf:f:root:-:644:o
$sample_directory/sample-rate.cf:f:root:-:644:o $sample_directory/sample-rate.cf:f:root:-:644:o
$sample_directory/sample-regexp-access.cf:f:root:-:644:o:o $sample_directory/sample-regexp-access.cf:f:root:-:644:o
$sample_directory/sample-regexp-body.cf:f:root:-:644:o:o $sample_directory/sample-regexp-body.cf:f:root:-:644:o
$sample_directory/sample-regexp-header.cf:f:root:-:644:o:o $sample_directory/sample-regexp-header.cf:f:root:-:644:o
$sample_directory/sample-relocated.cf:f:root:-:644:o $sample_directory/sample-relocated.cf:f:root:-:644:o
$sample_directory/sample-resource.cf:f:root:-:644:o $sample_directory/sample-resource.cf:f:root:-:644:o
$sample_directory/sample-rewrite.cf:f:root:-:644:o $sample_directory/sample-rewrite.cf:f:root:-:644:o

View File

@@ -409,8 +409,47 @@ caching does not solve the problem, there is a subtle workaround. </p>
<ul> <ul>
<li> <p> Postfix version 2.5 and later: </p>
<ul>
<li> <p> In <a href="master.5.html">master.cf</a> set up a dedicated clone of the "smtp" transport
for the destination in question. In the example below we will call
it "fragile". </p>
<li> <p> In <a href="master.5.html">master.cf</a> configure a reasonable process limit for the
cloned smtp transport (a number in the 10-20 range is typical). </p>
<li> <p> IMPORTANT!!! In <a href="postconf.5.html">main.cf</a> configure a large per-destination
pseudo-cohort failure limit for the cloned smtp transport. </p>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#transport_maps">transport_maps</a> = hash:/etc/postfix/transport
fragile_destination_concurrency_failed_cohort_limit = 100
fragile_destination_concurrency_limit = 20
/etc/postfix/transport:
example.com fragile:
/etc/postfix/<a href="master.5.html">master.cf</a>:
# service type private unpriv chroot wakeup maxproc command
fragile unix - - n - 20 smtp
</pre>
<p> See also the documentation for
<a href="postconf.5.html#default_destination_concurrency_failed_cohort_limit">default_destination_concurrency_failed_cohort_limit</a> and
<a href="postconf.5.html#default_destination_concurrency_limit">default_destination_concurrency_limit</a>. </p>
</ul>
<li> <p> Earlier Postfix versions: </p>
<ul>
<li> <p> In <a href="master.5.html">master.cf</a> set up a dedicated clone of the "smtp" <li> <p> In <a href="master.5.html">master.cf</a> set up a dedicated clone of the "smtp"
transport for the destination in question. </p> transport for the destination in question. In the example below
we will call it "fragile". </p>
<li> <p> In <a href="master.5.html">master.cf</a> configure a reasonable process limit for the <li> <p> In <a href="master.5.html">master.cf</a> configure a reasonable process limit for the
transport (a number in the 10-20 range is typical). </p> transport (a number in the 10-20 range is typical). </p>
@@ -420,16 +459,26 @@ and destination concurrency limit for this transport (say 2000). </p>
<pre> <pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>: /etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#transport_maps">transport_maps</a> = hash:/etc/postfix/transport
<a href="postconf.5.html#initial_destination_concurrency">initial_destination_concurrency</a> = 2000 <a href="postconf.5.html#initial_destination_concurrency">initial_destination_concurrency</a> = 2000
<i>transportname</i>_destination_concurrency_limit = 2000 fragile_destination_concurrency_limit = 2000
/etc/postfix/transport:
example.com fragile:
/etc/postfix/<a href="master.5.html">master.cf</a>:
# service type private unpriv chroot wakeup maxproc command
fragile unix - - n - 20 smtp
</pre> </pre>
<p> Where <i>transportname</i> is the name of the <a href="master.5.html">master.cf</a> entry <p> See also the documentation for <a href="postconf.5.html#default_destination_concurrency_limit">default_destination_concurrency_limit</a>.
in question. </p> </p>
</ul> </ul>
<p> The effect of this surprising configuration is that up to 2000 </ul>
<p> The effect of this configuration is that up to 2000
consecutive errors are tolerated without marking the destination consecutive errors are tolerated without marking the destination
dead, while the total concurrency remains reasonable (10-20 dead, while the total concurrency remains reasonable (10-20
processes). This trick is only for a very specialized situation: processes). This trick is only for a very specialized situation:
@@ -443,6 +492,42 @@ insert brief delays between delivery attempts. </p>
<ul> <ul>
<li> <p> Postfix version 2.5 and later: </p>
<ul>
<li> <p> In <a href="master.5.html">master.cf</a> set up a dedicated clone of the "smtp" transport
for the problem destination. In the example below we call it "slow".
</p>
<li> <p> In <a href="postconf.5.html">main.cf</a> configure a short delay between deliveries to
the same destination. </p>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#transport_maps">transport_maps</a> = hash:/etc/postfix/transport
slow_destination_rate_delay = 1
/etc/postfix/transport:
example.com slow:
/etc/postfix/<a href="master.5.html">master.cf</a>:
# service type private unpriv chroot wakeup maxproc command
slow unix - - n - - smtp
</pre>
</ul>
<p> See also the documentation for <a href="postconf.5.html#default_destination_rate_delay">default_destination_rate_delay</a>. </p>
<p> This solution forces the Postfix <a href="smtp.8.html">smtp(8)</a> client to wait for
$slow_destination_rate_delay seconds between deliveries to the same
destination. </p>
<li> <p> Earlier Postfix versions: </p>
<ul>
<li> <p> In the transport map entry for the problem destination, <li> <p> In the transport map entry for the problem destination,
specify a dead host as the primary nexthop. </p> specify a dead host as the primary nexthop. </p>
@@ -451,25 +536,28 @@ problem destination as the <a href="postconf.5.html#fallback_relay">fallback_rel
<a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a> value. </p> <a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a> value. </p>
<pre> <pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#transport_maps">transport_maps</a> = hash:/etc/postfix/transport
/etc/postfix/transport: /etc/postfix/transport:
problem.example.com slow:[dead.host] example.com slow:[dead.host]
/etc/postfix/<a href="master.5.html">master.cf</a>: /etc/postfix/<a href="master.5.html">master.cf</a>:
# service type private unpriv chroot wakeup maxproc command # service type private unpriv chroot wakeup maxproc command
slow unix - - n - 1 smtp slow unix - - n - 1 smtp
-o <a href="postconf.5.html#fallback_relay">fallback_relay</a>=problem.example.com -o <a href="postconf.5.html#fallback_relay">fallback_relay</a>=problem.example.com
-o <a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a>=1 -o <a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a>=1
-o smtp_cache_connection=no
</pre> </pre>
</ul> </ul>
<p> This solution forces the Postfix <a href="smtp.8.html">smtp(8)</a> client to wait for <p> This solution forces the Postfix <a href="smtp.8.html">smtp(8)</a> client to wait for
$<a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a> seconds between deliveries. The solution $<a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a> seconds between deliveries. The connection
depends on Postfix connection management details, and needs to be caching feature is disabled to prevent the client from skipping
updated when SMTP connection caching is introduced. </p> over the dead host. </p>
<p> Hopefully a more elegant solution to these problems will be </ul>
found in the future. </p>
<h2><a name="queues">Postfix queue directories</a></h2> <h2><a name="queues">Postfix queue directories</a></h2>

View File

@@ -305,14 +305,15 @@ OQMGR(8) OQMGR(8)
Available in Postfix version 2.5 and later: Available in Postfix version 2.5 and later:
<b><a href="postconf.5.html#default_delivery_rate_delay">default_delivery_rate_delay</a> (0s)</b> <b><a href="postconf.5.html#default_destination_rate_delay">default_destination_rate_delay</a> (0s)</b>
The default amount of delay that is inserted The default amount of delay that is inserted
between individual deliveries to the same destina- between individual deliveries to the same destina-
tion; with per-destination recipient limit &gt; 1, a tion; with per-destination recipient limit &gt; 1, a
destination is a domain, otherwise it is a recipi- destination is a domain, otherwise it is a recipi-
ent. ent.
<b><a href="postconf.5.html#transport_delivery_rate_delay"><i>transport</i>_delivery_rate_delay</a> $<a href="postconf.5.html#default_delivery_rate_delay">default_delivery_rate_delay</a></b> <b><a href="postconf.5.html#transport_destination_rate_delay"><i>transport</i>_destination_rate_delay</a> $<a href="postconf.5.html#default_destination_rate_delay">default_destina</a>-</b>
<b><a href="postconf.5.html#default_destination_rate_delay">tion_rate_delay</a></b>
Idem, for delivery via the named message <i>transport</i>. Idem, for delivery via the named message <i>transport</i>.
<b>MISCELLANEOUS CONTROLS</b> <b>MISCELLANEOUS CONTROLS</b>

View File

@@ -1595,35 +1595,6 @@ Examples:
</pre> </pre>
</DD>
<DT><b><a name="default_delivery_rate_delay">default_delivery_rate_delay</a>
(default: 0s)</b></DT><DD>
<p> The default amount of delay that is inserted between individual
deliveries to the same destination; with per-destination recipient
limit &gt; 1, a destination is a domain, otherwise it is a recipient.
</p>
<p> To enable the delay, specify a non-zero time value (an integral
value plus an optional one-letter suffix that specifies the time
unit). </p>
<p> Time units: s (seconds), m (minutes), h (hours), d (days), w
(weeks). The default time unit is s (seconds). </p>
<p> NOTE: the delay is enforced by the queue manager. The delay
timer state does not survive "postfix reload" or "postfix stop".
</p>
<p> Use <a href="postconf.5.html#transport_delivery_rate_delay"><i>transport</i>_delivery_rate_delay</a> to specify a
transport-specific override, where <i>transport</i> is the <a href="master.5.html">master.cf</a>
name of the message delivery transport.
</p>
<p> This feature is available in Postfix 2.5 and later. </p>
</DD> </DD>
<DT><b><a name="default_delivery_slot_cost">default_delivery_slot_cost</a> <DT><b><a name="default_delivery_slot_cost">default_delivery_slot_cost</a>
@@ -1875,6 +1846,35 @@ is the <a href="master.5.html">master.cf</a> name of the message delivery transp
<p> This feature is available in Postfix 2.5 and later. </p> <p> This feature is available in Postfix 2.5 and later. </p>
</DD>
<DT><b><a name="default_destination_rate_delay">default_destination_rate_delay</a>
(default: 0s)</b></DT><DD>
<p> The default amount of delay that is inserted between individual
deliveries to the same destination; with per-destination recipient
limit &gt; 1, a destination is a domain, otherwise it is a recipient.
</p>
<p> To enable the delay, specify a non-zero time value (an integral
value plus an optional one-letter suffix that specifies the time
unit). </p>
<p> Time units: s (seconds), m (minutes), h (hours), d (days), w
(weeks). The default time unit is s (seconds). </p>
<p> NOTE: the delay is enforced by the queue manager. The delay
timer state does not survive "postfix reload" or "postfix stop".
</p>
<p> Use <a href="postconf.5.html#transport_destination_rate_delay"><i>transport</i>_destination_rate_delay</a> to specify a
transport-specific override, where <i>transport</i> is the <a href="master.5.html">master.cf</a>
name of the message delivery transport.
</p>
<p> This feature is available in Postfix 2.5 and later. </p>
</DD> </DD>
<DT><b><a name="default_destination_recipient_limit">default_destination_recipient_limit</a> <DT><b><a name="default_destination_recipient_limit">default_destination_recipient_limit</a>
@@ -12798,18 +12798,6 @@ This feature is available in Postfix 2.1 and later.
</p> </p>
</DD>
<DT><b><a name="transport_delivery_rate_delay">transport_delivery_rate_delay</a>
(default: $<a href="postconf.5.html#default_delivery_rate_delay">default_delivery_rate_delay</a>)</b></DT><DD>
<p> A transport-specific override for the <a href="postconf.5.html#default_recipient_refill_delay">default_recipient_refill_delay</a>
parameter value, where <i>transport</i> is the <a href="master.5.html">master.cf</a> name of
the message delivery transport. </p>
<p> This feature is available in Postfix 2.5 and later. </p>
</DD> </DD>
<DT><b><a name="transport_delivery_slot_cost">transport_delivery_slot_cost</a> <DT><b><a name="transport_delivery_slot_cost">transport_delivery_slot_cost</a>
@@ -12890,6 +12878,18 @@ transport. </p>
<p> This feature is available in Postfix 2.5 and later. </p> <p> This feature is available in Postfix 2.5 and later. </p>
</DD>
<DT><b><a name="transport_destination_rate_delay">transport_destination_rate_delay</a>
(default: $<a href="postconf.5.html#default_destination_rate_delay">default_destination_rate_delay</a>)</b></DT><DD>
<p> A transport-specific override for the <a href="postconf.5.html#default_destination_rate_delay">default_destination_rate_delay</a>
parameter value, where <i>transport</i> is the <a href="master.5.html">master.cf</a> name of
the message delivery transport. </p>
<p> This feature is available in Postfix 2.5 and later. </p>
</DD> </DD>
<DT><b><a name="transport_destination_recipient_limit">transport_destination_recipient_limit</a> <DT><b><a name="transport_destination_recipient_limit">transport_destination_recipient_limit</a>

View File

@@ -377,14 +377,15 @@ QMGR(8) QMGR(8)
Available in Postfix version 2.5 and later: Available in Postfix version 2.5 and later:
<b><a href="postconf.5.html#default_delivery_rate_delay">default_delivery_rate_delay</a> (0s)</b> <b><a href="postconf.5.html#default_destination_rate_delay">default_destination_rate_delay</a> (0s)</b>
The default amount of delay that is inserted The default amount of delay that is inserted
between individual deliveries to the same destina- between individual deliveries to the same destina-
tion; with per-destination recipient limit &gt; 1, a tion; with per-destination recipient limit &gt; 1, a
destination is a domain, otherwise it is a recipi- destination is a domain, otherwise it is a recipi-
ent. ent.
<b><a href="postconf.5.html#transport_delivery_rate_delay"><i>transport</i>_delivery_rate_delay</a> $<a href="postconf.5.html#default_delivery_rate_delay">default_delivery_rate_delay</a></b> <b><a href="postconf.5.html#transport_destination_rate_delay"><i>transport</i>_destination_rate_delay</a> $<a href="postconf.5.html#default_destination_rate_delay">default_destina</a>-</b>
<b><a href="postconf.5.html#default_destination_rate_delay">tion_rate_delay</a></b>
Idem, for delivery via the named message <i>transport</i>. Idem, for delivery via the named message <i>transport</i>.
<b>MISCELLANEOUS CONTROLS</b> <b>MISCELLANEOUS CONTROLS</b>

View File

@@ -886,26 +886,6 @@ default_database_type = dbm
.fi .fi
.ad .ad
.ft R .ft R
.SH default_delivery_rate_delay (default: 0s)
The default amount of delay that is inserted between individual
deliveries to the same destination; with per-destination recipient
limit > 1, a destination is a domain, otherwise it is a recipient.
.PP
To enable the delay, specify a non-zero time value (an integral
value plus an optional one-letter suffix that specifies the time
unit).
.PP
Time units: s (seconds), m (minutes), h (hours), d (days), w
(weeks). The default time unit is s (seconds).
.PP
NOTE: the delay is enforced by the queue manager. The delay
timer state does not survive "postfix reload" or "postfix stop".
.PP
Use \fItransport\fR_delivery_rate_delay to specify a
transport-specific override, where \fItransport\fR is the master.cf
name of the message delivery transport.
.PP
This feature is available in Postfix 2.5 and later.
.SH default_delivery_slot_cost (default: 5) .SH default_delivery_slot_cost (default: 5)
How often the Postfix queue manager's scheduler is allowed to How often the Postfix queue manager's scheduler is allowed to
preempt delivery of one message with another. preempt delivery of one message with another.
@@ -1077,6 +1057,26 @@ to specify a transport-specific override, where \fItransport\fR
is the master.cf name of the message delivery transport. is the master.cf name of the message delivery transport.
.PP .PP
This feature is available in Postfix 2.5 and later. This feature is available in Postfix 2.5 and later.
.SH default_destination_rate_delay (default: 0s)
The default amount of delay that is inserted between individual
deliveries to the same destination; with per-destination recipient
limit > 1, a destination is a domain, otherwise it is a recipient.
.PP
To enable the delay, specify a non-zero time value (an integral
value plus an optional one-letter suffix that specifies the time
unit).
.PP
Time units: s (seconds), m (minutes), h (hours), d (days), w
(weeks). The default time unit is s (seconds).
.PP
NOTE: the delay is enforced by the queue manager. The delay
timer state does not survive "postfix reload" or "postfix stop".
.PP
Use \fItransport\fR_destination_rate_delay to specify a
transport-specific override, where \fItransport\fR is the master.cf
name of the message delivery transport.
.PP
This feature is available in Postfix 2.5 and later.
.SH default_destination_recipient_limit (default: 50) .SH default_destination_recipient_limit (default: 50)
The default maximal number of recipients per message delivery. The default maximal number of recipients per message delivery.
This is the default limit for delivery via the \fBlmtp\fR(8), \fBpipe\fR(8), This is the default limit for delivery via the \fBlmtp\fR(8), \fBpipe\fR(8),
@@ -7938,12 +7938,6 @@ of mail deliveries and produces a mail delivery report when verbose
delivery is requested with "\fBsendmail -v\fR". delivery is requested with "\fBsendmail -v\fR".
.PP .PP
This feature is available in Postfix 2.1 and later. This feature is available in Postfix 2.1 and later.
.SH transport_delivery_rate_delay (default: $default_delivery_rate_delay)
A transport-specific override for the default_recipient_refill_delay
parameter value, where \fItransport\fR is the master.cf name of
the message delivery transport.
.PP
This feature is available in Postfix 2.5 and later.
.SH transport_delivery_slot_cost (default: $default_delivery_slot_cost) .SH transport_delivery_slot_cost (default: $default_delivery_slot_cost)
A transport-specific override for the default_delivery_slot_cost A transport-specific override for the default_delivery_slot_cost
parameter value, where \fItransport\fR is the master.cf name of parameter value, where \fItransport\fR is the master.cf name of
@@ -7982,6 +7976,12 @@ where \fItransport\fR is the master.cf name of the message delivery
transport. transport.
.PP .PP
This feature is available in Postfix 2.5 and later. This feature is available in Postfix 2.5 and later.
.SH transport_destination_rate_delay (default: $default_destination_rate_delay)
A transport-specific override for the default_destination_rate_delay
parameter value, where \fItransport\fR is the master.cf name of
the message delivery transport.
.PP
This feature is available in Postfix 2.5 and later.
.SH transport_destination_recipient_limit (default: $default_destination_recipient_limit) .SH transport_destination_recipient_limit (default: $default_destination_recipient_limit)
A transport-specific override for the A transport-specific override for the
default_destination_recipient_limit parameter value, where default_destination_recipient_limit parameter value, where

View File

@@ -275,11 +275,11 @@ The maximal time a bounce message is queued before it is considered
undeliverable. undeliverable.
.PP .PP
Available in Postfix version 2.5 and later: Available in Postfix version 2.5 and later:
.IP "\fBdefault_delivery_rate_delay (0s)\fR" .IP "\fBdefault_destination_rate_delay (0s)\fR"
The default amount of delay that is inserted between individual The default amount of delay that is inserted between individual
deliveries to the same destination; with per-destination recipient deliveries to the same destination; with per-destination recipient
limit > 1, a destination is a domain, otherwise it is a recipient. limit > 1, a destination is a domain, otherwise it is a recipient.
.IP "\fItransport\fB_delivery_rate_delay $default_delivery_rate_delay .IP "\fItransport\fB_destination_rate_delay $default_destination_rate_delay
Idem, for delivery via the named message \fItransport\fR. Idem, for delivery via the named message \fItransport\fR.
.SH MISCELLANEOUS CONTROLS .SH MISCELLANEOUS CONTROLS
.ad .ad

View File

@@ -323,11 +323,11 @@ The maximal time a bounce message is queued before it is considered
undeliverable. undeliverable.
.PP .PP
Available in Postfix version 2.5 and later: Available in Postfix version 2.5 and later:
.IP "\fBdefault_delivery_rate_delay (0s)\fR" .IP "\fBdefault_destination_rate_delay (0s)\fR"
The default amount of delay that is inserted between individual The default amount of delay that is inserted between individual
deliveries to the same destination; with per-destination recipient deliveries to the same destination; with per-destination recipient
limit > 1, a destination is a domain, otherwise it is a recipient. limit > 1, a destination is a domain, otherwise it is a recipient.
.IP "\fItransport\fB_delivery_rate_delay $default_delivery_rate_delay .IP "\fItransport\fB_destination_rate_delay $default_destination_rate_delay
Idem, for delivery via the named message \fItransport\fR. Idem, for delivery via the named message \fItransport\fR.
.SH "MISCELLANEOUS CONTROLS" .SH "MISCELLANEOUS CONTROLS"
.na .na

View File

@@ -346,7 +346,7 @@ while (<>) {
s;\bdefault_destination_concur[-</Bb>]*\n* *[<Bb>]*rency_positive_feedback\b;<a href="postconf.5.html#default_destination_concurrency_positive_feedback">$&</a>;g; s;\bdefault_destination_concur[-</Bb>]*\n* *[<Bb>]*rency_positive_feedback\b;<a href="postconf.5.html#default_destination_concurrency_positive_feedback">$&</a>;g;
s;\bdefault_destination_con[-</Bb>]*\n* *[<Bb>]*currency_failed_cohort_limit\b;<a href="postconf.5.html#default_destination_concurrency_failed_cohort_limit">$&</a>;g; s;\bdefault_destination_con[-</Bb>]*\n* *[<Bb>]*currency_failed_cohort_limit\b;<a href="postconf.5.html#default_destination_concurrency_failed_cohort_limit">$&</a>;g;
s;\bdestination_concurrency_feedback_debug\b;<a href="postconf.5.html#destination_concurrency_feedback_debug">$&</a>;g; s;\bdestination_concurrency_feedback_debug\b;<a href="postconf.5.html#destination_concurrency_feedback_debug">$&</a>;g;
s;\bdefault_delivery_rate_delay\b;<a href="postconf.5.html#default_delivery_rate_delay">$&</a>;g; s;\bdefault_destina[-</Bb>]*\n* *[<Bb>]*tion_rate_delay\b;<a href="postconf.5.html#default_destination_rate_delay">$&</a>;g;
s;\bqmqpd_error_delay\b;<a href="postconf.5.html#qmqpd_error_delay">$&</a>;g; s;\bqmqpd_error_delay\b;<a href="postconf.5.html#qmqpd_error_delay">$&</a>;g;
s;\bqmqpd_timeout\b;<a href="postconf.5.html#qmqpd_timeout">$&</a>;g; s;\bqmqpd_timeout\b;<a href="postconf.5.html#qmqpd_timeout">$&</a>;g;
@@ -649,7 +649,7 @@ while (<>) {
s;(<i>transport</i>)(<b>)?(_recipient_refill_delay)\b;$2<a href="postconf.5.html#transport_recipient_refill_delay">$1$3</a>;g; s;(<i>transport</i>)(<b>)?(_recipient_refill_delay)\b;$2<a href="postconf.5.html#transport_recipient_refill_delay">$1$3</a>;g;
s;(<i>transport</i>)(<b>)?(_recipient_refill_limit)\b;$2<a href="postconf.5.html#transport_recipient_refill_limit">$1$3</a>;g; s;(<i>transport</i>)(<b>)?(_recipient_refill_limit)\b;$2<a href="postconf.5.html#transport_recipient_refill_limit">$1$3</a>;g;
s;(<i>transport</i>)(<b>)?(_time_limit)\b;$2<a href="postconf.5.html#transport_time_limit">$1$3</a>;g; s;(<i>transport</i>)(<b>)?(_time_limit)\b;$2<a href="postconf.5.html#transport_time_limit">$1$3</a>;g;
s;(<i>transport</i>)(<b>)?(_delivery_rate_delay)\b;$2<a href="postconf.5.html#transport_delivery_rate_delay">$1$3</a>;g; s;(<i>transport</i>)(<b>)?(_destination_rate_delay)\b;$2<a href="postconf.5.html#transport_destination_rate_delay">$1$3</a>;g;
# Undo hyperlinks of manual pages with the same name as parameters. # Undo hyperlinks of manual pages with the same name as parameters.

View File

@@ -409,8 +409,47 @@ caching does not solve the problem, there is a subtle workaround. </p>
<ul> <ul>
<li> <p> Postfix version 2.5 and later: </p>
<ul>
<li> <p> In master.cf set up a dedicated clone of the "smtp" transport
for the destination in question. In the example below we will call
it "fragile". </p>
<li> <p> In master.cf configure a reasonable process limit for the
cloned smtp transport (a number in the 10-20 range is typical). </p>
<li> <p> IMPORTANT!!! In main.cf configure a large per-destination
pseudo-cohort failure limit for the cloned smtp transport. </p>
<pre>
/etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
fragile_destination_concurrency_failed_cohort_limit = 100
fragile_destination_concurrency_limit = 20
/etc/postfix/transport:
example.com fragile:
/etc/postfix/master.cf:
# service type private unpriv chroot wakeup maxproc command
fragile unix - - n - 20 smtp
</pre>
<p> See also the documentation for
default_destination_concurrency_failed_cohort_limit and
default_destination_concurrency_limit. </p>
</ul>
<li> <p> Earlier Postfix versions: </p>
<ul>
<li> <p> In master.cf set up a dedicated clone of the "smtp" <li> <p> In master.cf set up a dedicated clone of the "smtp"
transport for the destination in question. </p> transport for the destination in question. In the example below
we will call it "fragile". </p>
<li> <p> In master.cf configure a reasonable process limit for the <li> <p> In master.cf configure a reasonable process limit for the
transport (a number in the 10-20 range is typical). </p> transport (a number in the 10-20 range is typical). </p>
@@ -420,16 +459,26 @@ and destination concurrency limit for this transport (say 2000). </p>
<pre> <pre>
/etc/postfix/main.cf: /etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
initial_destination_concurrency = 2000 initial_destination_concurrency = 2000
<i>transportname</i>_destination_concurrency_limit = 2000 fragile_destination_concurrency_limit = 2000
/etc/postfix/transport:
example.com fragile:
/etc/postfix/master.cf:
# service type private unpriv chroot wakeup maxproc command
fragile unix - - n - 20 smtp
</pre> </pre>
<p> Where <i>transportname</i> is the name of the master.cf entry <p> See also the documentation for default_destination_concurrency_limit.
in question. </p> </p>
</ul> </ul>
<p> The effect of this surprising configuration is that up to 2000 </ul>
<p> The effect of this configuration is that up to 2000
consecutive errors are tolerated without marking the destination consecutive errors are tolerated without marking the destination
dead, while the total concurrency remains reasonable (10-20 dead, while the total concurrency remains reasonable (10-20
processes). This trick is only for a very specialized situation: processes). This trick is only for a very specialized situation:
@@ -443,6 +492,42 @@ insert brief delays between delivery attempts. </p>
<ul> <ul>
<li> <p> Postfix version 2.5 and later: </p>
<ul>
<li> <p> In master.cf set up a dedicated clone of the "smtp" transport
for the problem destination. In the example below we call it "slow".
</p>
<li> <p> In main.cf configure a short delay between deliveries to
the same destination. </p>
<pre>
/etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
slow_destination_rate_delay = 1
/etc/postfix/transport:
example.com slow:
/etc/postfix/master.cf:
# service type private unpriv chroot wakeup maxproc command
slow unix - - n - - smtp
</pre>
</ul>
<p> See also the documentation for default_destination_rate_delay. </p>
<p> This solution forces the Postfix smtp(8) client to wait for
$slow_destination_rate_delay seconds between deliveries to the same
destination. </p>
<li> <p> Earlier Postfix versions: </p>
<ul>
<li> <p> In the transport map entry for the problem destination, <li> <p> In the transport map entry for the problem destination,
specify a dead host as the primary nexthop. </p> specify a dead host as the primary nexthop. </p>
@@ -451,25 +536,28 @@ problem destination as the fallback_relay and specify a small
smtp_connect_timeout value. </p> smtp_connect_timeout value. </p>
<pre> <pre>
/etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport: /etc/postfix/transport:
problem.example.com slow:[dead.host] example.com slow:[dead.host]
/etc/postfix/master.cf: /etc/postfix/master.cf:
# service type private unpriv chroot wakeup maxproc command # service type private unpriv chroot wakeup maxproc command
slow unix - - n - 1 smtp slow unix - - n - 1 smtp
-o fallback_relay=problem.example.com -o fallback_relay=problem.example.com
-o smtp_connect_timeout=1 -o smtp_connect_timeout=1
-o smtp_cache_connection=no
</pre> </pre>
</ul> </ul>
<p> This solution forces the Postfix smtp(8) client to wait for <p> This solution forces the Postfix smtp(8) client to wait for
$smtp_connect_timeout seconds between deliveries. The solution $smtp_connect_timeout seconds between deliveries. The connection
depends on Postfix connection management details, and needs to be caching feature is disabled to prevent the client from skipping
updated when SMTP connection caching is introduced. </p> over the dead host. </p>
<p> Hopefully a more elegant solution to these problems will be </ul>
found in the future. </p>
<h2><a name="queues">Postfix queue directories</a></h2> <h2><a name="queues">Postfix queue directories</a></h2>

View File

@@ -11382,7 +11382,7 @@ the message delivery transport. </p>
<p> This feature is available in Postfix 2.4 and later. </p> <p> This feature is available in Postfix 2.4 and later. </p>
%PARAM default_delivery_rate_delay 0s %PARAM default_destination_rate_delay 0s
<p> The default amount of delay that is inserted between individual <p> The default amount of delay that is inserted between individual
deliveries to the same destination; with per-destination recipient deliveries to the same destination; with per-destination recipient
@@ -11400,16 +11400,16 @@ unit). </p>
timer state does not survive "postfix reload" or "postfix stop". timer state does not survive "postfix reload" or "postfix stop".
</p> </p>
<p> Use <i>transport</i>_delivery_rate_delay to specify a <p> Use <i>transport</i>_destination_rate_delay to specify a
transport-specific override, where <i>transport</i> is the master.cf transport-specific override, where <i>transport</i> is the master.cf
name of the message delivery transport. name of the message delivery transport.
</p> </p>
<p> This feature is available in Postfix 2.5 and later. </p> <p> This feature is available in Postfix 2.5 and later. </p>
%PARAM transport_delivery_rate_delay $default_delivery_rate_delay %PARAM transport_destination_rate_delay $default_destination_rate_delay
<p> A transport-specific override for the default_recipient_refill_delay <p> A transport-specific override for the default_destination_rate_delay
parameter value, where <i>transport</i> is the master.cf name of parameter value, where <i>transport</i> is the master.cf name of
the message delivery transport. </p> the message delivery transport. </p>

View File

@@ -2916,8 +2916,8 @@ extern int var_conc_cohort_limit;
#define DEF_CONC_FDBACK_DEBUG 0 #define DEF_CONC_FDBACK_DEBUG 0
extern bool var_conc_feedback_debug; extern bool var_conc_feedback_debug;
#define VAR_DEST_RATE_DELAY "default_delivery_rate_delay" #define VAR_DEST_RATE_DELAY "default_destination_rate_delay"
#define _DEST_RATE_DELAY "_delivery_rate_delay" #define _DEST_RATE_DELAY "_destination_rate_delay"
#define DEF_DEST_RATE_DELAY "0s" #define DEF_DEST_RATE_DELAY "0s"
extern int var_dest_rate_delay; extern int var_dest_rate_delay;

View File

@@ -20,8 +20,8 @@
* Patches change both the patchlevel and the release date. Snapshots have no * Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only. * patchlevel; they change the release date only.
*/ */
#define MAIL_RELEASE_DATE "20080116" #define MAIL_RELEASE_DATE "20080123"
#define MAIL_VERSION_NUMBER "2.5.0-RC2" #define MAIL_VERSION_NUMBER "2.5.0"
#ifdef SNAPSHOT #ifdef SNAPSHOT
# define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE # define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE

View File

@@ -241,11 +241,11 @@
/* undeliverable. /* undeliverable.
/* .PP /* .PP
/* Available in Postfix version 2.5 and later: /* Available in Postfix version 2.5 and later:
/* .IP "\fBdefault_delivery_rate_delay (0s)\fR" /* .IP "\fBdefault_destination_rate_delay (0s)\fR"
/* The default amount of delay that is inserted between individual /* The default amount of delay that is inserted between individual
/* deliveries to the same destination; with per-destination recipient /* deliveries to the same destination; with per-destination recipient
/* limit > 1, a destination is a domain, otherwise it is a recipient. /* limit > 1, a destination is a domain, otherwise it is a recipient.
/* .IP "\fItransport\fB_delivery_rate_delay $default_delivery_rate_delay /* .IP "\fItransport\fB_destination_rate_delay $default_destination_rate_delay
/* Idem, for delivery via the named message \fItransport\fR. /* Idem, for delivery via the named message \fItransport\fR.
/* .SH MISCELLANEOUS CONTROLS /* .SH MISCELLANEOUS CONTROLS
/* .ad /* .ad

View File

@@ -8,7 +8,7 @@ BEGIN {
vars["destination_concurrency_positive_feedback"] = "default_destination_concurrency_positive_feedback" vars["destination_concurrency_positive_feedback"] = "default_destination_concurrency_positive_feedback"
vars["destination_recipient_limit"] = "default_destination_recipient_limit" vars["destination_recipient_limit"] = "default_destination_recipient_limit"
vars["initial_destination_concurrency"] = "initial_destination_concurrency" vars["initial_destination_concurrency"] = "initial_destination_concurrency"
vars["delivery_rate_delay"] = "default_delivery_rate_delay" vars["destination_rate_delay"] = "default_destination_rate_delay"
# auto_table.h # auto_table.h

View File

@@ -287,11 +287,11 @@
/* undeliverable. /* undeliverable.
/* .PP /* .PP
/* Available in Postfix version 2.5 and later: /* Available in Postfix version 2.5 and later:
/* .IP "\fBdefault_delivery_rate_delay (0s)\fR" /* .IP "\fBdefault_destination_rate_delay (0s)\fR"
/* The default amount of delay that is inserted between individual /* The default amount of delay that is inserted between individual
/* deliveries to the same destination; with per-destination recipient /* deliveries to the same destination; with per-destination recipient
/* limit > 1, a destination is a domain, otherwise it is a recipient. /* limit > 1, a destination is a domain, otherwise it is a recipient.
/* .IP "\fItransport\fB_delivery_rate_delay $default_delivery_rate_delay /* .IP "\fItransport\fB_destination_rate_delay $default_destination_rate_delay
/* Idem, for delivery via the named message \fItransport\fR. /* Idem, for delivery via the named message \fItransport\fR.
/* MISCELLANEOUS CONTROLS /* MISCELLANEOUS CONTROLS
/* .ad /* .ad

View File

@@ -132,11 +132,12 @@ SMTP_SASL_AUTH_CACHE *smtp_sasl_auth_cache_init(const char *map, int ttl)
*/ */
#define CACHE_DICT_OPEN_FLAGS \ #define CACHE_DICT_OPEN_FLAGS \
(DICT_FLAG_DUP_REPLACE | DICT_FLAG_SYNC_UPDATE) (DICT_FLAG_DUP_REPLACE | DICT_FLAG_SYNC_UPDATE)
#define PROXY_COLON DICT_TYPE_PROXY ":"
#define PROXY_COLON_LEN (sizeof(PROXY_COLON) - 1)
if (strncmp(map, DICT_TYPE_PROXY, sizeof(DICT_TYPE_PROXY) - 1) != 0 if (strncmp(map, PROXY_COLON, PROXY_COLON_LEN) != 0)
|| map[sizeof(DICT_TYPE_PROXY) - 1] != ':')
msg_fatal("SASL authentication cache name \"%s\" must start with \"" msg_fatal("SASL authentication cache name \"%s\" must start with \""
DICT_TYPE_PROXY "\":", map); PROXY_COLON, map);
auth_cache = (SMTP_SASL_AUTH_CACHE *) mymalloc(sizeof(*auth_cache)); auth_cache = (SMTP_SASL_AUTH_CACHE *) mymalloc(sizeof(*auth_cache));
auth_cache->dict = dict_open(map, O_CREAT | O_RDWR, CACHE_DICT_OPEN_FLAGS); auth_cache->dict = dict_open(map, O_CREAT | O_RDWR, CACHE_DICT_OPEN_FLAGS);
@@ -192,9 +193,9 @@ static char *smtp_sasl_auth_cache_make_value(const char *password,
return (vstring_export(val_buf)); return (vstring_export(val_buf));
} }
/* smtp_sasl_auth_cache_valid - validate auth failure cache value */ /* smtp_sasl_auth_cache_valid_value - validate auth failure cache value */
static int smtp_sasl_auth_cache_valid(SMTP_SASL_AUTH_CACHE *auth_cache, static int smtp_sasl_auth_cache_valid_value(SMTP_SASL_AUTH_CACHE *auth_cache,
const char *entry, const char *entry,
const char *password) const char *password)
{ {
@@ -235,7 +236,7 @@ int smtp_sasl_auth_cache_find(SMTP_SASL_AUTH_CACHE *auth_cache,
key = smtp_sasl_auth_cache_make_key(session->host, session->sasl_username); key = smtp_sasl_auth_cache_make_key(session->host, session->sasl_username);
if ((entry = dict_get(auth_cache->dict, key)) != 0) if ((entry = dict_get(auth_cache->dict, key)) != 0)
if ((valid = smtp_sasl_auth_cache_valid(auth_cache, entry, if ((valid = smtp_sasl_auth_cache_valid_value(auth_cache, entry,
session->sasl_passwd)) == 0) session->sasl_passwd)) == 0)
/* Remove expired, password changed, or malformed cache entry. */ /* Remove expired, password changed, or malformed cache entry. */
if (dict_del(auth_cache->dict, key) == 0) if (dict_del(auth_cache->dict, key) == 0)

View File

@@ -18,8 +18,8 @@
/* workarounds may be enabled that depend on the socket type. /* workarounds may be enabled that depend on the socket type.
/* BUGS /* BUGS
/* Bizarre systems may have other harmless error results. Such /* Bizarre systems may have other harmless error results. Such
/* systems encourage programers to ignore error results, and /* systems encourage programmers to ignore error results, and
/* penalizes programmers who code defensively. /* penalize programmers who code defensively.
/* LICENSE /* LICENSE
/* .ad /* .ad
/* .fi /* .fi

View File

@@ -15,8 +15,8 @@
/* known harmless error results to EAGAIN. /* known harmless error results to EAGAIN.
/* BUGS /* BUGS
/* Bizarre systems may have other harmless error results. Such /* Bizarre systems may have other harmless error results. Such
/* systems encourage programers to ignore error results, and /* systems encourage programmers to ignore error results, and
/* penalizes programmers who code defensively. /* penalize programmers who code defensively.
/* LICENSE /* LICENSE
/* .ad /* .ad
/* .fi /* .fi

View File

@@ -16,8 +16,8 @@
/* skips over silly error results such as EINTR. /* skips over silly error results such as EINTR.
/* BUGS /* BUGS
/* Bizarre systems may have other harmless error results. Such /* Bizarre systems may have other harmless error results. Such
/* systems encourage programers to ignore error results, and /* systems encourage programmers to ignore error results, and
/* penalizes programmers who code defensively. /* penalize programmers who code defensively.
/* LICENSE /* LICENSE
/* .ad /* .ad
/* .fi /* .fi