mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-29 13:18:12 +00:00
postfix-2.6-20090110
This commit is contained in:
parent
dd689ed048
commit
b9cbb4a6b7
5
postfix/.indent.pro
vendored
5
postfix/.indent.pro
vendored
@ -137,11 +137,12 @@
|
||||
-TMAI_SERVNAME_STR
|
||||
-TMAI_SERVPORT_STR
|
||||
-TMAPS
|
||||
-TMASTER_INT_WATCH
|
||||
-TMASTER_PROC
|
||||
-TMASTER_SERV
|
||||
-TMASTER_STATUS
|
||||
-TMASTER_VARS_STR_WATCH
|
||||
-TMASTER_VARS_INT_WATCH
|
||||
-TMASTER_STR_WATCH
|
||||
-TMATCH_LIST
|
||||
-TMBLOCK
|
||||
-TMBOX
|
||||
-TMILTER
|
||||
|
@ -14845,10 +14845,12 @@ Apologies for any names omitted.
|
||||
and type. For example, to turn off the main SMTP listener
|
||||
use "master_service_disable = smtp.inet", and to turn off
|
||||
all TCP/IP listeners use "master_service_disable = inet".
|
||||
This feature does not distinguish services by their privacy
|
||||
property; some day, clients will not need to specify that
|
||||
anymore. Files: global/mail_params.h, master/master.c,
|
||||
master/master_vars.c, master/master_ent.c.
|
||||
This immediately terminates all processes that provide the
|
||||
specified services. The master_service_disable feature does
|
||||
not distinguish services by their privacy property; some
|
||||
day, clients will not need to specify that anymore. Files:
|
||||
global/mail_params.h, master/master.c, master/master_vars.c,
|
||||
master/master_ent.c.
|
||||
|
||||
Bugfix (introduced May 19, 1997): removing a parameter
|
||||
setting from main.cf did not reset the parameter to its
|
||||
@ -14863,8 +14865,20 @@ Apologies for any names omitted.
|
||||
smtpd/smtpd_check.c, proto/access.
|
||||
|
||||
Workaround: specify "tcp_windowsize = 65535" (or less) to
|
||||
work around routers with broken TCP window scaling
|
||||
implementations. This is perhaps easier than collecting
|
||||
tcpdump output and tuning kernel parameters. Changing this
|
||||
parameter requires "postfix stop" and "postfix start".
|
||||
Files: util/inet_connect.c, inet_listen.c, global/mail_params.[hc].
|
||||
work around broken TCP window scaling implementations. This
|
||||
is perhaps easier than collecting tcpdump output and tuning
|
||||
kernel parameters by hand. See RELEASE_NOTES for how to
|
||||
change this setting without stopping Postfix. Files:
|
||||
util/inet_connect.c, inet_listen.c, global/mail_params.[hc].
|
||||
|
||||
20090110
|
||||
|
||||
Cleanup: create separate code modules for TCP window size
|
||||
handling, master.cf service name matching, and main.cf
|
||||
change monitoring. Files: util/inet_windowsize.c,
|
||||
global/match_service.c, master/master_watch.c.
|
||||
|
||||
Feature: TCP window size override for the Postfix SMTP/LMTP
|
||||
client, and for the smtp-source and smtp-sink test programs.
|
||||
Files: smtp/smtp_connect.c, smtpstone/smtp-source.c,
|
||||
smtpstone/smtp-sink.c.
|
||||
|
@ -20,12 +20,34 @@ type or by service name + type. Specify a list of service types
|
||||
"name" is the first field of a master.cf entry and "type" is a
|
||||
service type. Examples: to turn off the main SMTP listener port,
|
||||
use "master_service_disable = smtp.inet"; to turn off all TCP/IP
|
||||
listeners, use "master_service_disable = inet".
|
||||
listeners, use "master_service_disable = inet". Changing this
|
||||
parameter requires "postfix reload".
|
||||
|
||||
Specify "tcp_windowsize = 65535" (or less) to work around routers
|
||||
with broken TCP window scaling implementations. This is perhaps
|
||||
easier than collecting tcpdump output and tuning kernel parameters.
|
||||
Changing this parameter requires "postfix stop" and "postfix start".
|
||||
more convenient than collecting tcpdump output and tuning kernel
|
||||
parameters by hand. With Postfix TCP servers (smtpd(8), qmqpd(8)),
|
||||
this feature is implemented by the Postfix master(8) daemon.
|
||||
|
||||
To change this parameter without stopping Postfix, you need to first
|
||||
terminate all Postfix TCP servers:
|
||||
|
||||
# postconf -e master_service_disable=inet
|
||||
# postfix reload
|
||||
|
||||
This immediately terminates all processes that accept network
|
||||
connections. Then you enable Postfix TCP servers with the updated
|
||||
tcp_windowsize setting:
|
||||
|
||||
# postconf -e tcp_windowsize=65535 master_service_disable=
|
||||
# postfix reload
|
||||
|
||||
If you skip these steps with a running Postfix system, then the
|
||||
tcp_windowsize change will work only for Postfix TCP clients (smtp(8),
|
||||
lmtp(8)).
|
||||
|
||||
Of course you can also do "postfix stop" and "postfix start",
|
||||
but that is more disruptive.
|
||||
|
||||
Major changes with snapshot 20081010
|
||||
====================================
|
||||
|
@ -1,11 +1,4 @@
|
||||
Wish list:
|
||||
|
||||
To work around window scaling bugs, find out if we can force
|
||||
< 65535 TCP windows with setsockopt(SO_SNDBUF/SO_RCVBUF)
|
||||
between socket() and connect()/listen(). Instead of screwing
|
||||
up lots of internal APIs with an extra buffer size parameter,
|
||||
use a -o command-line option to override a global variable
|
||||
for use by inet_connect() and inet_listen().
|
||||
|
||||
Force a panic when the VDA patch reduces the file size limit
|
||||
under the message size. They break the code that marks a
|
||||
@ -21,6 +14,9 @@ Wish list:
|
||||
Encapsulate time_t conversions (e.g. REC_TYPE_TIME) so that
|
||||
they can be made system dependent.
|
||||
|
||||
Plan for time_t larger than long, or wait for LP64 to
|
||||
dominate the world?
|
||||
|
||||
Make "AUTH=<>" appendage to MAIL FROM configurable, enabled
|
||||
by default.
|
||||
|
||||
@ -45,11 +41,11 @@ Wish list:
|
||||
and remote mail; the disadvantage is that it makes local
|
||||
submissions more dependent on networking. One possibility
|
||||
is to use "pickup -o content_filter=smtp:127.0.0.1:10025";
|
||||
we could also to suppress "mail loop" detection for loopback
|
||||
connections. Another is to have the pickup or cleanup
|
||||
server drive an SMTP client directly; this would require
|
||||
extension of the mail_stream() interface, plus a way to
|
||||
handle bounced/deferred recipients intelligently.
|
||||
we could also decide to always suppress "mail loop" detection
|
||||
for loopback connections. Another option is to have the
|
||||
pickup or cleanup server drive an SMTP client directly;
|
||||
this would require extension of the mail_stream() interface,
|
||||
plus a way to handle bounced/deferred recipients intelligently.
|
||||
|
||||
Consolidate duplicated code in *_server_accept_{pass,inet}().
|
||||
|
||||
@ -75,14 +71,6 @@ Wish list:
|
||||
Make TLS_BIO_BUFSIZE run-time adjustable, to future-proof
|
||||
Postfix for remote connections with MSS > 8 kbytes.
|
||||
|
||||
Absent a formal spec, model IPv6 RBL lookups after the IPv6
|
||||
PTR lookups (one zone per hex nibble, nibbles in reversed
|
||||
order). How to specify whether to query an RBL server for
|
||||
status info about an IPv6 address? One could argue that as
|
||||
long as IPv6 traffic is small an unsupported lookup doesn't
|
||||
matter; and once IPv6 takes off, the RBL servers better
|
||||
start supporting IPv6 client status information.
|
||||
|
||||
Don't log "warning: XXXXX: undeliverable postmaster
|
||||
notification discarded" for spam from outside.
|
||||
|
||||
@ -149,9 +137,6 @@ Wish list:
|
||||
into mailer-daemon (current bahavior) or disallow (strict
|
||||
behavior, currently implemented only in the SMTP server).
|
||||
|
||||
Plan for time_t larger than long, or wait for LP64 to
|
||||
dominate the world?
|
||||
|
||||
The type of var_message_limit (and other file size/offset
|
||||
configuration parameters or internal protocol attributes)
|
||||
should be changed from int to off_t. This also requires
|
||||
|
@ -202,22 +202,28 @@
|
||||
# text..." when the optional text is specified, oth-
|
||||
# erwise reply with a generic error response message.
|
||||
#
|
||||
# This feature is available in Postfix 2.6 and later.
|
||||
#
|
||||
# DEFER_IF_REJECT optional text...
|
||||
# Defer the request if some later restriction would
|
||||
# result in a REJECT action. Reply with
|
||||
# "$access_map_defer_code 4.7.1 optional text..."
|
||||
# when the optional text is specified, otherwise
|
||||
# Defer the request if some later restriction would
|
||||
# result in a REJECT action. Reply with
|
||||
# "$access_map_defer_code 4.7.1 optional text..."
|
||||
# when the optional text is specified, otherwise
|
||||
# reply with a generic error response message.
|
||||
#
|
||||
# Prior to Postfix 2.6, the SMTP reply code is 450.
|
||||
#
|
||||
# This feature is available in Postfix 2.1 and later.
|
||||
#
|
||||
# DEFER_IF_PERMIT optional text...
|
||||
# Defer the request if some later restriction would
|
||||
# result in a an explicit or implicit PERMIT action.
|
||||
# Reply with "$access_map_defer_code 4.7.1 optional
|
||||
# text..." when the optional text is specified, oth-
|
||||
# Defer the request if some later restriction would
|
||||
# result in a an explicit or implicit PERMIT action.
|
||||
# Reply with "$access_map_defer_code 4.7.1 optional
|
||||
# text..." when the optional text is specified, oth-
|
||||
# erwise reply with a generic error response message.
|
||||
#
|
||||
# Prior to Postfix 2.6, the SMTP reply code is 450.
|
||||
#
|
||||
# This feature is available in Postfix 2.1 and later.
|
||||
#
|
||||
# OTHER ACTIONS
|
||||
@ -226,169 +232,169 @@
|
||||
# reject_unauth_destination, and so on).
|
||||
#
|
||||
# BCC user@domain
|
||||
# Send one copy of the message to the specified
|
||||
# Send one copy of the message to the specified
|
||||
# recipient.
|
||||
#
|
||||
# If multiple BCC actions are specified within the
|
||||
# same SMTP MAIL transaction, only the last action
|
||||
# If multiple BCC actions are specified within the
|
||||
# same SMTP MAIL transaction, only the last action
|
||||
# will be used.
|
||||
#
|
||||
# This feature is not part of the stable Postfix
|
||||
# This feature is not part of the stable Postfix
|
||||
# release.
|
||||
#
|
||||
# DISCARD optional text...
|
||||
# Claim successful delivery and silently discard the
|
||||
# message. Log the optional text if specified, oth-
|
||||
# Claim successful delivery and silently discard the
|
||||
# message. Log the optional text if specified, oth-
|
||||
# erwise log a generic message.
|
||||
#
|
||||
# Note: this action currently affects all recipients
|
||||
# of the message. To discard only one recipient
|
||||
# without discarding the entire message, use the
|
||||
# Note: this action currently affects all recipients
|
||||
# of the message. To discard only one recipient
|
||||
# without discarding the entire message, use the
|
||||
# transport(5) table to direct mail to the discard(8)
|
||||
# service.
|
||||
#
|
||||
# This feature is available in Postfix 2.0 and later.
|
||||
#
|
||||
# DUNNO Pretend that the lookup key was not found. This
|
||||
# prevents Postfix from trying substrings of the
|
||||
# lookup key (such as a subdomain name, or a network
|
||||
# DUNNO Pretend that the lookup key was not found. This
|
||||
# prevents Postfix from trying substrings of the
|
||||
# lookup key (such as a subdomain name, or a network
|
||||
# address subnetwork).
|
||||
#
|
||||
# This feature is available in Postfix 2.0 and later.
|
||||
#
|
||||
# FILTER transport:destination
|
||||
# After the message is queued, send the entire mes-
|
||||
# After the message is queued, send the entire mes-
|
||||
# sage through the specified external content filter.
|
||||
# The transport:destination syntax is described in
|
||||
# the transport(5) manual page. More information
|
||||
# about external content filters is in the Postfix
|
||||
# The transport:destination syntax is described in
|
||||
# the transport(5) manual page. More information
|
||||
# about external content filters is in the Postfix
|
||||
# FILTER_README file.
|
||||
#
|
||||
# Note: this action overrides the content_filter set-
|
||||
# ting, and currently affects all recipients of the
|
||||
# ting, and currently affects all recipients of the
|
||||
# message.
|
||||
#
|
||||
# This feature is available in Postfix 2.0 and later.
|
||||
#
|
||||
# HOLD optional text...
|
||||
# Place the message on the hold queue, where it will
|
||||
# sit until someone either deletes it or releases it
|
||||
# for delivery. Log the optional text if specified,
|
||||
# Place the message on the hold queue, where it will
|
||||
# sit until someone either deletes it or releases it
|
||||
# for delivery. Log the optional text if specified,
|
||||
# otherwise log a generic message.
|
||||
#
|
||||
# Mail that is placed on hold can be examined with
|
||||
# the postcat(1) command, and can be destroyed or
|
||||
# Mail that is placed on hold can be examined with
|
||||
# the postcat(1) command, and can be destroyed or
|
||||
# released with the postsuper(1) command.
|
||||
#
|
||||
# Note: use "postsuper -r" to release mail that was
|
||||
# kept on hold for a significant fraction of $maxi-
|
||||
# Note: use "postsuper -r" to release mail that was
|
||||
# kept on hold for a significant fraction of $maxi-
|
||||
# mal_queue_lifetime or $bounce_queue_lifetime, or
|
||||
# longer. Use "postsuper -H" only for mail that will
|
||||
# longer. Use "postsuper -H" only for mail that will
|
||||
# not expire within a few delivery attempts.
|
||||
#
|
||||
# Note: this action currently affects all recipients
|
||||
# Note: this action currently affects all recipients
|
||||
# of the message.
|
||||
#
|
||||
# This feature is available in Postfix 2.0 and later.
|
||||
#
|
||||
# PREPEND headername: headervalue
|
||||
# Prepend the specified message header to the mes-
|
||||
# sage. When more than one PREPEND action executes,
|
||||
# the first prepended header appears before the sec-
|
||||
# Prepend the specified message header to the mes-
|
||||
# sage. When more than one PREPEND action executes,
|
||||
# the first prepended header appears before the sec-
|
||||
# ond etc. prepended header.
|
||||
#
|
||||
# Note: this action must execute before the message
|
||||
# content is received; it cannot execute in the con-
|
||||
# Note: this action must execute before the message
|
||||
# content is received; it cannot execute in the con-
|
||||
# text of smtpd_end_of_data_restrictions.
|
||||
#
|
||||
# This feature is available in Postfix 2.1 and later.
|
||||
#
|
||||
# REDIRECT user@domain
|
||||
# After the message is queued, send the message to
|
||||
# After the message is queued, send the message to
|
||||
# the specified address instead of the intended
|
||||
# recipient(s).
|
||||
#
|
||||
# Note: this action overrides the FILTER action, and
|
||||
# Note: this action overrides the FILTER action, and
|
||||
# currently affects all recipients of the message.
|
||||
#
|
||||
# This feature is available in Postfix 2.1 and later.
|
||||
#
|
||||
# WARN optional text...
|
||||
# Log a warning with the optional text, together with
|
||||
# client information and if available, with helo,
|
||||
# client information and if available, with helo,
|
||||
# sender, recipient and protocol information.
|
||||
#
|
||||
# This feature is available in Postfix 2.1 and later.
|
||||
#
|
||||
# ENHANCED STATUS CODES
|
||||
# Postfix version 2.3 and later support enhanced status
|
||||
# codes as defined in RFC 3463. When an enhanced status
|
||||
# code is specified in an access table, it is subject to
|
||||
# modification. The following transformations are needed
|
||||
# when the same access table is used for client, helo,
|
||||
# sender, or recipient access restrictions; they happen
|
||||
# Postfix version 2.3 and later support enhanced status
|
||||
# codes as defined in RFC 3463. When an enhanced status
|
||||
# code is specified in an access table, it is subject to
|
||||
# modification. The following transformations are needed
|
||||
# when the same access table is used for client, helo,
|
||||
# sender, or recipient access restrictions; they happen
|
||||
# regardless of whether Postfix replies to a MAIL FROM, RCPT
|
||||
# TO or other SMTP command.
|
||||
#
|
||||
# o When a sender address matches a REJECT action, the
|
||||
# Postfix SMTP server will transform a recipient DSN
|
||||
# status (e.g., 4.1.1-4.1.6) into the corresponding
|
||||
# o When a sender address matches a REJECT action, the
|
||||
# Postfix SMTP server will transform a recipient DSN
|
||||
# status (e.g., 4.1.1-4.1.6) into the corresponding
|
||||
# sender DSN status, and vice versa.
|
||||
#
|
||||
# o When non-address information matches a REJECT
|
||||
# action (such as the HELO command argument or the
|
||||
# client hostname/address), the Postfix SMTP server
|
||||
# will transform a sender or recipient DSN status
|
||||
# into a generic non-address DSN status (e.g.,
|
||||
# o When non-address information matches a REJECT
|
||||
# action (such as the HELO command argument or the
|
||||
# client hostname/address), the Postfix SMTP server
|
||||
# will transform a sender or recipient DSN status
|
||||
# into a generic non-address DSN status (e.g.,
|
||||
# 4.0.0).
|
||||
#
|
||||
# REGULAR EXPRESSION TABLES
|
||||
# This section describes how the table lookups change when
|
||||
# This section describes how the table lookups change when
|
||||
# the table is given in the form of regular expressions. For
|
||||
# a description of regular expression lookup table syntax,
|
||||
# a description of regular expression lookup table syntax,
|
||||
# see regexp_table(5) or pcre_table(5).
|
||||
#
|
||||
# Each pattern is a regular expression that is applied to
|
||||
# Each pattern is a regular expression that is applied to
|
||||
# the entire string being looked up. Depending on the appli-
|
||||
# cation, that string is an entire client hostname, an
|
||||
# cation, that string is an entire client hostname, an
|
||||
# entire client IP address, or an entire mail address. Thus,
|
||||
# no parent domain or parent network search is done,
|
||||
# user@domain mail addresses are not broken up into their
|
||||
# user@domain mail addresses are not broken up into their
|
||||
# user@ and domain constituent parts, nor is user+foo broken
|
||||
# up into user and foo.
|
||||
#
|
||||
# Patterns are applied in the order as specified in the ta-
|
||||
# ble, until a pattern is found that matches the search
|
||||
# Patterns are applied in the order as specified in the ta-
|
||||
# ble, until a pattern is found that matches the search
|
||||
# string.
|
||||
#
|
||||
# Actions are the same as with indexed file lookups, with
|
||||
# the additional feature that parenthesized substrings from
|
||||
# Actions are the same as with indexed file lookups, with
|
||||
# the additional feature that parenthesized substrings from
|
||||
# the pattern can be interpolated as $1, $2 and so on.
|
||||
#
|
||||
# TCP-BASED TABLES
|
||||
# This section describes how the table lookups change when
|
||||
# This section describes how the table lookups change when
|
||||
# lookups are directed to a TCP-based server. For a descrip-
|
||||
# tion of the TCP client/server lookup protocol, see tcp_ta-
|
||||
# ble(5). This feature is not available up to and including
|
||||
# Postfix version 2.4.
|
||||
#
|
||||
# Each lookup operation uses the entire query string once.
|
||||
# Depending on the application, that string is an entire
|
||||
# Each lookup operation uses the entire query string once.
|
||||
# Depending on the application, that string is an entire
|
||||
# client hostname, an entire client IP address, or an entire
|
||||
# mail address. Thus, no parent domain or parent network
|
||||
# search is done, user@domain mail addresses are not broken
|
||||
# up into their user@ and domain constituent parts, nor is
|
||||
# mail address. Thus, no parent domain or parent network
|
||||
# search is done, user@domain mail addresses are not broken
|
||||
# up into their user@ and domain constituent parts, nor is
|
||||
# user+foo broken up into user and foo.
|
||||
#
|
||||
# Actions are the same as with indexed file lookups.
|
||||
#
|
||||
# EXAMPLE
|
||||
# The following example uses an indexed file, so that the
|
||||
# order of table entries does not matter. The example per-
|
||||
# mits access by the client at address 1.2.3.4 but rejects
|
||||
# all other clients in 1.2.3.0/24. Instead of hash lookup
|
||||
# tables, some systems use dbm. Use the command "postconf
|
||||
# -m" to find out what lookup tables Postfix supports on
|
||||
# The following example uses an indexed file, so that the
|
||||
# order of table entries does not matter. The example per-
|
||||
# mits access by the client at address 1.2.3.4 but rejects
|
||||
# all other clients in 1.2.3.0/24. Instead of hash lookup
|
||||
# tables, some systems use dbm. Use the command "postconf
|
||||
# -m" to find out what lookup tables Postfix supports on
|
||||
# your system.
|
||||
#
|
||||
# /etc/postfix/main.cf:
|
||||
@ -399,11 +405,11 @@
|
||||
# 1.2.3 REJECT
|
||||
# 1.2.3.4 OK
|
||||
#
|
||||
# Execute the command "postmap /etc/postfix/access" after
|
||||
# Execute the command "postmap /etc/postfix/access" after
|
||||
# editing the file.
|
||||
#
|
||||
# BUGS
|
||||
# The table format does not understand quoting conventions.
|
||||
# The table format does not understand quoting conventions.
|
||||
#
|
||||
# SEE ALSO
|
||||
# postmap(1), Postfix lookup table manager
|
||||
@ -412,13 +418,13 @@
|
||||
# transport(5), transport:nexthop syntax
|
||||
#
|
||||
# README FILES
|
||||
# Use "postconf readme_directory" or "postconf html_direc-
|
||||
# Use "postconf readme_directory" or "postconf html_direc-
|
||||
# tory" to locate this information.
|
||||
# SMTPD_ACCESS_README, built-in SMTP server access control
|
||||
# DATABASE_README, Postfix lookup table overview
|
||||
#
|
||||
# LICENSE
|
||||
# The Secure Mailer license must be distributed with this
|
||||
# The Secure Mailer license must be distributed with this
|
||||
# software.
|
||||
#
|
||||
# AUTHOR(S)
|
||||
|
@ -56,7 +56,6 @@ methods simultaneously. </p>
|
||||
<a href="postconf.5.html#mailbox_delivery_lock">mailbox_delivery_lock</a> = fcntl, dotlock
|
||||
</pre>
|
||||
</blockquote>
|
||||
</body>
|
||||
|
||||
<h2> Postfix NFS workarounds </h2>
|
||||
|
||||
@ -134,4 +133,5 @@ false errors when the server reply is lost, the client retransmits
|
||||
the request, and the server does not remember that it already
|
||||
completed the request. </p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -208,22 +208,28 @@ ACCESS(5) ACCESS(5)
|
||||
<i>text...</i>" when the optional text is specified, oth-
|
||||
erwise reply with a generic error response message.
|
||||
|
||||
This feature is available in Postfix 2.6 and later.
|
||||
|
||||
<b>DEFER_IF_REJECT</b> <i>optional text...</i>
|
||||
Defer the request if some later restriction would
|
||||
result in a REJECT action. Reply with
|
||||
"<b>$<a href="postconf.5.html#access_map_defer_code">access_map_defer_code</a> 4.7.1</b> <i>optional text...</i>"
|
||||
when the optional text is specified, otherwise
|
||||
Defer the request if some later restriction would
|
||||
result in a REJECT action. Reply with
|
||||
"<b>$<a href="postconf.5.html#access_map_defer_code">access_map_defer_code</a> 4.7.1</b> <i>optional text...</i>"
|
||||
when the optional text is specified, otherwise
|
||||
reply with a generic error response message.
|
||||
|
||||
Prior to Postfix 2.6, the SMTP reply code is 450.
|
||||
|
||||
This feature is available in Postfix 2.1 and later.
|
||||
|
||||
<b>DEFER_IF_PERMIT</b> <i>optional text...</i>
|
||||
Defer the request if some later restriction would
|
||||
result in a an explicit or implicit PERMIT action.
|
||||
Reply with "<b>$<a href="postconf.5.html#access_map_defer_code">access_map_defer_code</a> 4.7.1</b> <i>optional</i>
|
||||
<i>text...</i>" when the optional text is specified, oth-
|
||||
Defer the request if some later restriction would
|
||||
result in a an explicit or implicit PERMIT action.
|
||||
Reply with "<b>$<a href="postconf.5.html#access_map_defer_code">access_map_defer_code</a> 4.7.1</b> <i>optional</i>
|
||||
<i>text...</i>" when the optional text is specified, oth-
|
||||
erwise reply with a generic error response message.
|
||||
|
||||
Prior to Postfix 2.6, the SMTP reply code is 450.
|
||||
|
||||
This feature is available in Postfix 2.1 and later.
|
||||
|
||||
<b>OTHER ACTIONS</b>
|
||||
@ -232,169 +238,169 @@ ACCESS(5) ACCESS(5)
|
||||
<b><a href="postconf.5.html#reject_unauth_destination">reject_unauth_destination</a></b>, and so on).
|
||||
|
||||
<b>BCC</b> <i>user@domain</i>
|
||||
Send one copy of the message to the specified
|
||||
Send one copy of the message to the specified
|
||||
recipient.
|
||||
|
||||
If multiple BCC actions are specified within the
|
||||
same SMTP MAIL transaction, only the last action
|
||||
If multiple BCC actions are specified within the
|
||||
same SMTP MAIL transaction, only the last action
|
||||
will be used.
|
||||
|
||||
This feature is not part of the stable Postfix
|
||||
This feature is not part of the stable Postfix
|
||||
release.
|
||||
|
||||
<b>DISCARD</b> <i>optional text...</i>
|
||||
Claim successful delivery and silently discard the
|
||||
message. Log the optional text if specified, oth-
|
||||
Claim successful delivery and silently discard the
|
||||
message. Log the optional text if specified, oth-
|
||||
erwise log a generic message.
|
||||
|
||||
Note: this action currently affects all recipients
|
||||
of the message. To discard only one recipient
|
||||
without discarding the entire message, use the
|
||||
Note: this action currently affects all recipients
|
||||
of the message. To discard only one recipient
|
||||
without discarding the entire message, use the
|
||||
<a href="transport.5.html">transport(5)</a> table to direct mail to the <a href="discard.8.html">discard(8)</a>
|
||||
service.
|
||||
|
||||
This feature is available in Postfix 2.0 and later.
|
||||
|
||||
<b>DUNNO</b> Pretend that the lookup key was not found. This
|
||||
prevents Postfix from trying substrings of the
|
||||
lookup key (such as a subdomain name, or a network
|
||||
<b>DUNNO</b> Pretend that the lookup key was not found. This
|
||||
prevents Postfix from trying substrings of the
|
||||
lookup key (such as a subdomain name, or a network
|
||||
address subnetwork).
|
||||
|
||||
This feature is available in Postfix 2.0 and later.
|
||||
|
||||
<b>FILTER</b> <i>transport:destination</i>
|
||||
After the message is queued, send the entire mes-
|
||||
After the message is queued, send the entire mes-
|
||||
sage through the specified external content filter.
|
||||
The <i>transport:destination</i> syntax is described in
|
||||
the <a href="transport.5.html"><b>transport</b>(5)</a> manual page. More information
|
||||
about external content filters is in the Postfix
|
||||
The <i>transport:destination</i> syntax is described in
|
||||
the <a href="transport.5.html"><b>transport</b>(5)</a> manual page. More information
|
||||
about external content filters is in the Postfix
|
||||
<a href="FILTER_README.html">FILTER_README</a> file.
|
||||
|
||||
Note: this action overrides the <b><a href="postconf.5.html#content_filter">content_filter</a></b> set-
|
||||
ting, and currently affects all recipients of the
|
||||
ting, and currently affects all recipients of the
|
||||
message.
|
||||
|
||||
This feature is available in Postfix 2.0 and later.
|
||||
|
||||
<b>HOLD</b> <i>optional text...</i>
|
||||
Place the message on the <b>hold</b> queue, where it will
|
||||
sit until someone either deletes it or releases it
|
||||
for delivery. Log the optional text if specified,
|
||||
Place the message on the <b>hold</b> queue, where it will
|
||||
sit until someone either deletes it or releases it
|
||||
for delivery. Log the optional text if specified,
|
||||
otherwise log a generic message.
|
||||
|
||||
Mail that is placed on hold can be examined with
|
||||
the <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or
|
||||
Mail that is placed on hold can be examined with
|
||||
the <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or
|
||||
released with the <a href="postsuper.1.html"><b>postsuper</b>(1)</a> command.
|
||||
|
||||
Note: use "<b>postsuper -r</b>" to release mail that was
|
||||
kept on hold for a significant fraction of <b>$<a href="postconf.5.html#maximal_queue_lifetime">maxi</a>-</b>
|
||||
Note: use "<b>postsuper -r</b>" to release mail that was
|
||||
kept on hold for a significant fraction of <b>$<a href="postconf.5.html#maximal_queue_lifetime">maxi</a>-</b>
|
||||
<b><a href="postconf.5.html#maximal_queue_lifetime">mal_queue_lifetime</a></b> or <b>$<a href="postconf.5.html#bounce_queue_lifetime">bounce_queue_lifetime</a></b>, or
|
||||
longer. Use "<b>postsuper -H</b>" only for mail that will
|
||||
longer. Use "<b>postsuper -H</b>" only for mail that will
|
||||
not expire within a few delivery attempts.
|
||||
|
||||
Note: this action currently affects all recipients
|
||||
Note: this action currently affects all recipients
|
||||
of the message.
|
||||
|
||||
This feature is available in Postfix 2.0 and later.
|
||||
|
||||
<b>PREPEND</b> <i>headername: headervalue</i>
|
||||
Prepend the specified message header to the mes-
|
||||
sage. When more than one PREPEND action executes,
|
||||
the first prepended header appears before the sec-
|
||||
Prepend the specified message header to the mes-
|
||||
sage. When more than one PREPEND action executes,
|
||||
the first prepended header appears before the sec-
|
||||
ond etc. prepended header.
|
||||
|
||||
Note: this action must execute before the message
|
||||
content is received; it cannot execute in the con-
|
||||
Note: this action must execute before the message
|
||||
content is received; it cannot execute in the con-
|
||||
text of <b><a href="postconf.5.html#smtpd_end_of_data_restrictions">smtpd_end_of_data_restrictions</a></b>.
|
||||
|
||||
This feature is available in Postfix 2.1 and later.
|
||||
|
||||
<b>REDIRECT</b> <i>user@domain</i>
|
||||
After the message is queued, send the message to
|
||||
After the message is queued, send the message to
|
||||
the specified address instead of the intended
|
||||
recipient(s).
|
||||
|
||||
Note: this action overrides the FILTER action, and
|
||||
Note: this action overrides the FILTER action, and
|
||||
currently affects all recipients of the message.
|
||||
|
||||
This feature is available in Postfix 2.1 and later.
|
||||
|
||||
<b>WARN</b> <i>optional text...</i>
|
||||
Log a warning with the optional text, together with
|
||||
client information and if available, with helo,
|
||||
client information and if available, with helo,
|
||||
sender, recipient and protocol information.
|
||||
|
||||
This feature is available in Postfix 2.1 and later.
|
||||
|
||||
<b>ENHANCED STATUS CODES</b>
|
||||
Postfix version 2.3 and later support enhanced status
|
||||
codes as defined in <a href="http://tools.ietf.org/html/rfc3463">RFC 3463</a>. When an enhanced status
|
||||
code is specified in an access table, it is subject to
|
||||
modification. The following transformations are needed
|
||||
when the same access table is used for client, helo,
|
||||
sender, or recipient access restrictions; they happen
|
||||
Postfix version 2.3 and later support enhanced status
|
||||
codes as defined in <a href="http://tools.ietf.org/html/rfc3463">RFC 3463</a>. When an enhanced status
|
||||
code is specified in an access table, it is subject to
|
||||
modification. The following transformations are needed
|
||||
when the same access table is used for client, helo,
|
||||
sender, or recipient access restrictions; they happen
|
||||
regardless of whether Postfix replies to a MAIL FROM, RCPT
|
||||
TO or other SMTP command.
|
||||
|
||||
<b>o</b> When a sender address matches a REJECT action, the
|
||||
Postfix SMTP server will transform a recipient DSN
|
||||
status (e.g., 4.1.1-4.1.6) into the corresponding
|
||||
<b>o</b> When a sender address matches a REJECT action, the
|
||||
Postfix SMTP server will transform a recipient DSN
|
||||
status (e.g., 4.1.1-4.1.6) into the corresponding
|
||||
sender DSN status, and vice versa.
|
||||
|
||||
<b>o</b> When non-address information matches a REJECT
|
||||
action (such as the HELO command argument or the
|
||||
client hostname/address), the Postfix SMTP server
|
||||
will transform a sender or recipient DSN status
|
||||
into a generic non-address DSN status (e.g.,
|
||||
<b>o</b> When non-address information matches a REJECT
|
||||
action (such as the HELO command argument or the
|
||||
client hostname/address), the Postfix SMTP server
|
||||
will transform a sender or recipient DSN status
|
||||
into a generic non-address DSN status (e.g.,
|
||||
4.0.0).
|
||||
|
||||
<b>REGULAR EXPRESSION TABLES</b>
|
||||
This section describes how the table lookups change when
|
||||
This section describes how the table lookups change when
|
||||
the table is given in the form of regular expressions. For
|
||||
a description of regular expression lookup table syntax,
|
||||
a description of regular expression lookup table syntax,
|
||||
see <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a>.
|
||||
|
||||
Each pattern is a regular expression that is applied to
|
||||
Each pattern is a regular expression that is applied to
|
||||
the entire string being looked up. Depending on the appli-
|
||||
cation, that string is an entire client hostname, an
|
||||
cation, that string is an entire client hostname, an
|
||||
entire client IP address, or an entire mail address. Thus,
|
||||
no parent domain or parent network search is done,
|
||||
<i>user@domain</i> mail addresses are not broken up into their
|
||||
<i>user@domain</i> mail addresses are not broken up into their
|
||||
<i>user@</i> and <i>domain</i> constituent parts, nor is <i>user+foo</i> broken
|
||||
up into <i>user</i> and <i>foo</i>.
|
||||
|
||||
Patterns are applied in the order as specified in the ta-
|
||||
ble, until a pattern is found that matches the search
|
||||
Patterns are applied in the order as specified in the ta-
|
||||
ble, until a pattern is found that matches the search
|
||||
string.
|
||||
|
||||
Actions are the same as with indexed file lookups, with
|
||||
the additional feature that parenthesized substrings from
|
||||
Actions are the same as with indexed file lookups, with
|
||||
the additional feature that parenthesized substrings from
|
||||
the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on.
|
||||
|
||||
<b>TCP-BASED TABLES</b>
|
||||
This section describes how the table lookups change when
|
||||
This section describes how the table lookups change when
|
||||
lookups are directed to a TCP-based server. For a descrip-
|
||||
tion of the TCP client/server lookup protocol, see <a href="tcp_table.5.html"><b>tcp_ta-</b></a>
|
||||
<a href="tcp_table.5.html"><b>ble</b>(5)</a>. This feature is not available up to and including
|
||||
Postfix version 2.4.
|
||||
|
||||
Each lookup operation uses the entire query string once.
|
||||
Depending on the application, that string is an entire
|
||||
Each lookup operation uses the entire query string once.
|
||||
Depending on the application, that string is an entire
|
||||
client hostname, an entire client IP address, or an entire
|
||||
mail address. Thus, no parent domain or parent network
|
||||
search is done, <i>user@domain</i> mail addresses are not broken
|
||||
up into their <i>user@</i> and <i>domain</i> constituent parts, nor is
|
||||
mail address. Thus, no parent domain or parent network
|
||||
search is done, <i>user@domain</i> mail addresses are not broken
|
||||
up into their <i>user@</i> and <i>domain</i> constituent parts, nor is
|
||||
<i>user+foo</i> broken up into <i>user</i> and <i>foo</i>.
|
||||
|
||||
Actions are the same as with indexed file lookups.
|
||||
|
||||
<b>EXAMPLE</b>
|
||||
The following example uses an indexed file, so that the
|
||||
order of table entries does not matter. The example per-
|
||||
mits access by the client at address 1.2.3.4 but rejects
|
||||
all other clients in 1.2.3.0/24. Instead of <b>hash</b> lookup
|
||||
tables, some systems use <b>dbm</b>. Use the command "<b>postconf</b>
|
||||
<b>-m</b>" to find out what lookup tables Postfix supports on
|
||||
The following example uses an indexed file, so that the
|
||||
order of table entries does not matter. The example per-
|
||||
mits access by the client at address 1.2.3.4 but rejects
|
||||
all other clients in 1.2.3.0/24. Instead of <b>hash</b> lookup
|
||||
tables, some systems use <b>dbm</b>. Use the command "<b>postconf</b>
|
||||
<b>-m</b>" to find out what lookup tables Postfix supports on
|
||||
your system.
|
||||
|
||||
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
|
||||
@ -405,11 +411,11 @@ ACCESS(5) ACCESS(5)
|
||||
1.2.3 REJECT
|
||||
1.2.3.4 OK
|
||||
|
||||
Execute the command "<b>postmap /etc/postfix/access</b>" after
|
||||
Execute the command "<b>postmap /etc/postfix/access</b>" after
|
||||
editing the file.
|
||||
|
||||
<b>BUGS</b>
|
||||
The table format does not understand quoting conventions.
|
||||
The table format does not understand quoting conventions.
|
||||
|
||||
<b>SEE ALSO</b>
|
||||
<a href="postmap.1.html">postmap(1)</a>, Postfix lookup table manager
|
||||
@ -422,7 +428,7 @@ ACCESS(5) ACCESS(5)
|
||||
<a href="DATABASE_README.html">DATABASE_README</a>, Postfix lookup table overview
|
||||
|
||||
<b>LICENSE</b>
|
||||
The Secure Mailer license must be distributed with this
|
||||
The Secure Mailer license must be distributed with this
|
||||
software.
|
||||
|
||||
<b>AUTHOR(S)</b>
|
||||
|
@ -5347,6 +5347,10 @@ service type. As with other Postfix matchlists, a search stops at
|
||||
the first match. Specify "!pattern" to exclude a service from the
|
||||
list. By default, all <a href="master.8.html">master(8)</a> listener ports are enabled. </p>
|
||||
|
||||
<p> Note: this feature does not support "/file/name" or "<a href="DATABASE_README.html">type:table</a>"
|
||||
patterns, nor does it support wildcards such as "*" or "all". This
|
||||
is intentional. </p>
|
||||
|
||||
<p> Examples: </p>
|
||||
|
||||
<pre>
|
||||
@ -13068,10 +13072,34 @@ while accessing the Postfix <a href="postconf.5.html">main.cf</a> configuration
|
||||
(default: 0)</b></DT><DD>
|
||||
|
||||
<p> An optional workaround for routers that break TCP window scaling.
|
||||
Specify a value > 0 and < 65536 to enable this feature. </p>
|
||||
Specify a value > 0 and < 65536 to enable this feature. With
|
||||
Postfix TCP servers (<a href="smtpd.8.html">smtpd(8)</a>, <a href="qmqpd.8.html">qmqpd(8)</a>), this feature is implemented
|
||||
by the Postfix <a href="master.8.html">master(8)</a> daemon. </p>
|
||||
|
||||
<p> Note: for Postfix servers, this feature is implemented by the
|
||||
Postfix <a href="master.8.html">master(8)</a> daemon, not by the servers themselves. </p>
|
||||
<p> To change this parameter without stopping Postfix, you need to
|
||||
first terminate all Postfix TCP servers: </p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
# postconf -e <a href="postconf.5.html#master_service_disable">master_service_disable</a>=inet
|
||||
# postfix reload
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p> This immediately terminates all processes that accept network
|
||||
connections. Next, you enable Postfix TCP servers with the updated
|
||||
<a href="postconf.5.html#tcp_windowsize">tcp_windowsize</a> setting: </p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
# postconf -e <a href="postconf.5.html#tcp_windowsize">tcp_windowsize</a>=65535 <a href="postconf.5.html#master_service_disable">master_service_disable</a>=
|
||||
# postfix reload
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p> If you skip these steps with a running Postfix system, then the
|
||||
<a href="postconf.5.html#tcp_windowsize">tcp_windowsize</a> change will work only for Postfix TCP clients (<a href="smtp.8.html">smtp(8)</a>,
|
||||
<a href="lmtp.8.html">lmtp(8)</a>). </p>
|
||||
|
||||
<p> This feature is available in Postfix 2.6 and later. </p>
|
||||
|
||||
|
@ -184,6 +184,11 @@ SMTP-SINK(1) SMTP-SINK(1)
|
||||
Limit the time for receiving a command or sending a
|
||||
response. The time limit is specified in seconds.
|
||||
|
||||
<b>-T</b> <i>windowsize</i>
|
||||
Override the default TCP window size. To work
|
||||
around broken TCP window scaling implementations,
|
||||
specify a value > 0 and < 65536.
|
||||
|
||||
<b>-u</b> <i>username</i>
|
||||
Switch to the specified user privileges after open-
|
||||
ing the network socket and optionally changing the
|
||||
|
@ -106,6 +106,11 @@ SMTP-SOURCE(1) SMTP-SOURCE(1)
|
||||
<b>-t</b> <i>to</i> Use the specified recipient address (default:
|
||||
<foo@<a href="postconf.5.html#myhostname">myhostname</a>>).
|
||||
|
||||
<b>-T</b> <i>windowsize</i>
|
||||
Override the default TCP window size. To work
|
||||
around broken TCP window scaling implementations,
|
||||
specify a value > 0 and < 65536.
|
||||
|
||||
<b>-v</b> Make the program more verbose, for debugging pur-
|
||||
poses.
|
||||
|
||||
|
@ -157,6 +157,10 @@ character).
|
||||
.IP "\fB-t \fItimeout\fR (default: 100)"
|
||||
Limit the time for receiving a command or sending a response.
|
||||
The time limit is specified in seconds.
|
||||
.IP "\fB-T \fIwindowsize\fR"
|
||||
Override the default TCP window size. To work around
|
||||
broken TCP window scaling implementations, specify a
|
||||
value > 0 and < 65536.
|
||||
.IP "\fB-u \fIusername\fR"
|
||||
Switch to the specified user privileges after opening the
|
||||
network socket and optionally changing the process root
|
||||
|
@ -85,6 +85,10 @@ Run the specified number of SMTP sessions in parallel (default: 1).
|
||||
Send mail with the named subject line (default: none).
|
||||
.IP "\fB-t \fIto\fR"
|
||||
Use the specified recipient address (default: <foo@myhostname>).
|
||||
.IP "\fB-T \fIwindowsize\fR"
|
||||
Override the default TCP window size. To work around
|
||||
broken TCP window scaling implementations, specify a
|
||||
value > 0 and < 65536.
|
||||
.IP \fB-v\fR
|
||||
Make the program more verbose, for debugging purposes.
|
||||
.IP "\fB-w \fIinterval\fR"
|
||||
|
@ -198,6 +198,8 @@ Reject the address etc. that matches the pattern. Reply with
|
||||
"\fB$access_map_defer_code \fIoptional text...\fR" when the
|
||||
optional text is
|
||||
specified, otherwise reply with a generic error response message.
|
||||
.sp
|
||||
This feature is available in Postfix 2.6 and later.
|
||||
.IP "\fBDEFER_IF_REJECT \fIoptional text...\fR
|
||||
Defer the request if some later restriction would result in a
|
||||
REJECT action. Reply with "\fB$access_map_defer_code 4.7.1
|
||||
@ -205,6 +207,8 @@ REJECT action. Reply with "\fB$access_map_defer_code 4.7.1
|
||||
optional text is specified, otherwise reply with a generic error
|
||||
response message.
|
||||
.sp
|
||||
Prior to Postfix 2.6, the SMTP reply code is 450.
|
||||
.sp
|
||||
This feature is available in Postfix 2.1 and later.
|
||||
.IP "\fBDEFER_IF_PERMIT \fIoptional text...\fR
|
||||
Defer the request if some later restriction would result in a
|
||||
@ -214,6 +218,8 @@ text...\fR" when the
|
||||
optional text is specified, otherwise reply with a generic error
|
||||
response message.
|
||||
.sp
|
||||
Prior to Postfix 2.6, the SMTP reply code is 450.
|
||||
.sp
|
||||
This feature is available in Postfix 2.1 and later.
|
||||
.SH "OTHER ACTIONS"
|
||||
.na
|
||||
|
@ -2957,6 +2957,10 @@ service type. As with other Postfix matchlists, a search stops at
|
||||
the first match. Specify "!pattern" to exclude a service from the
|
||||
list. By default, all \fBmaster\fR(8) listener ports are enabled.
|
||||
.PP
|
||||
Note: this feature does not support "/file/name" or "type:table"
|
||||
patterns, nor does it support wildcards such as "*" or "all". This
|
||||
is intentional.
|
||||
.PP
|
||||
Examples:
|
||||
.PP
|
||||
.nf
|
||||
@ -8180,10 +8184,42 @@ are errors while parsing the command line arguments, and errors
|
||||
while accessing the Postfix main.cf configuration file.
|
||||
.SH tcp_windowsize (default: 0)
|
||||
An optional workaround for routers that break TCP window scaling.
|
||||
Specify a value > 0 and < 65536 to enable this feature.
|
||||
Specify a value > 0 and < 65536 to enable this feature. With
|
||||
Postfix TCP servers (\fBsmtpd\fR(8), \fBqmqpd\fR(8)), this feature is implemented
|
||||
by the Postfix \fBmaster\fR(8) daemon.
|
||||
.PP
|
||||
Note: for Postfix servers, this feature is implemented by the
|
||||
Postfix \fBmaster\fR(8) daemon, not by the servers themselves.
|
||||
To change this parameter without stopping Postfix, you need to
|
||||
first terminate all Postfix TCP servers:
|
||||
.sp
|
||||
.in +4
|
||||
.nf
|
||||
.na
|
||||
.ft C
|
||||
# postconf -e master_service_disable=inet
|
||||
# postfix reload
|
||||
.fi
|
||||
.ad
|
||||
.ft R
|
||||
.in -4
|
||||
.PP
|
||||
This immediately terminates all processes that accept network
|
||||
connections. Next, you enable Postfix TCP servers with the updated
|
||||
tcp_windowsize setting:
|
||||
.sp
|
||||
.in +4
|
||||
.nf
|
||||
.na
|
||||
.ft C
|
||||
# postconf -e tcp_windowsize=65535 master_service_disable=
|
||||
# postfix reload
|
||||
.fi
|
||||
.ad
|
||||
.ft R
|
||||
.in -4
|
||||
.PP
|
||||
If you skip these steps with a running Postfix system, then the
|
||||
tcp_windowsize change will work only for Postfix TCP clients (\fBsmtp\fR(8),
|
||||
\fBlmtp\fR(8)).
|
||||
.PP
|
||||
This feature is available in Postfix 2.6 and later.
|
||||
.SH tls_daemon_random_bytes (default: 32)
|
||||
|
@ -56,7 +56,6 @@ methods simultaneously. </p>
|
||||
mailbox_delivery_lock = fcntl, dotlock
|
||||
</pre>
|
||||
</blockquote>
|
||||
</body>
|
||||
|
||||
<h2> Postfix NFS workarounds </h2>
|
||||
|
||||
@ -134,4 +133,5 @@ false errors when the server reply is lost, the client retransmits
|
||||
the request, and the server does not remember that it already
|
||||
completed the request. </p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -11971,6 +11971,10 @@ service type. As with other Postfix matchlists, a search stops at
|
||||
the first match. Specify "!pattern" to exclude a service from the
|
||||
list. By default, all master(8) listener ports are enabled. </p>
|
||||
|
||||
<p> Note: this feature does not support "/file/name" or "type:table"
|
||||
patterns, nor does it support wildcards such as "*" or "all". This
|
||||
is intentional. </p>
|
||||
|
||||
<p> Examples: </p>
|
||||
|
||||
<pre>
|
||||
@ -11986,13 +11990,36 @@ master_service_disable = !foo.inet, inet
|
||||
|
||||
<p> This feature is available in Postfix 2.6 and later. </p>
|
||||
|
||||
%PARAM tcp_windowsize 0
|
||||
%PARAM tcp_windowsize 0
|
||||
|
||||
<p> An optional workaround for routers that break TCP window scaling.
|
||||
Specify a value > 0 and < 65536 to enable this feature. </p>
|
||||
Specify a value > 0 and < 65536 to enable this feature. With
|
||||
Postfix TCP servers (smtpd(8), qmqpd(8)), this feature is implemented
|
||||
by the Postfix master(8) daemon. </p>
|
||||
|
||||
<p> Note: for Postfix servers, this feature is implemented by the
|
||||
Postfix master(8) daemon, not by the servers themselves. The Postfix
|
||||
master must be restarted for a parameter change to take effect. </p>
|
||||
<p> To change this parameter without stopping Postfix, you need to
|
||||
first terminate all Postfix TCP servers: </p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
# postconf -e master_service_disable=inet
|
||||
# postfix reload
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p> This immediately terminates all processes that accept network
|
||||
connections. Next, you enable Postfix TCP servers with the updated
|
||||
tcp_windowsize setting: </p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
# postconf -e tcp_windowsize=65535 master_service_disable=
|
||||
# postfix reload
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p> If you skip these steps with a running Postfix system, then the
|
||||
tcp_windowsize change will work only for Postfix TCP clients (smtp(8),
|
||||
lmtp(8)). </p>
|
||||
|
||||
<p> This feature is available in Postfix 2.6 and later. </p>
|
||||
|
@ -28,7 +28,8 @@ SRCS = abounce.c anvil_clnt.c been_here.c bounce.c bounce_log.c \
|
||||
tok822_resolve.c tok822_rewrite.c tok822_tree.c trace.c \
|
||||
user_acl.c valid_mailhost_addr.c verify.c verify_clnt.c \
|
||||
verp_sender.c wildcard_inet_addr.c xtext.c delivered_hdr.c \
|
||||
fold_addr.c header_body_checks.c mkmap_proxy.c data_redirect.c
|
||||
fold_addr.c header_body_checks.c mkmap_proxy.c data_redirect.c \
|
||||
match_service.c
|
||||
OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
|
||||
canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
|
||||
clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \
|
||||
@ -58,7 +59,8 @@ OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
|
||||
tok822_resolve.o tok822_rewrite.o tok822_tree.o trace.o \
|
||||
user_acl.o valid_mailhost_addr.o verify.o verify_clnt.o \
|
||||
verp_sender.o wildcard_inet_addr.o xtext.o delivered_hdr.o \
|
||||
fold_addr.o header_body_checks.o mkmap_proxy.o data_redirect.o
|
||||
fold_addr.o header_body_checks.o mkmap_proxy.o data_redirect.o \
|
||||
match_service.o
|
||||
HDRS = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
|
||||
canon_addr.h cfg_parser.h cleanup_user.h clnt_stream.h config.h \
|
||||
conv_time.h db_common.h debug_peer.h debug_process.h defer.h \
|
||||
@ -82,7 +84,7 @@ HDRS = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
|
||||
string_list.h strip_addr.h sys_exits.h timed_ipc.h tok822.h \
|
||||
trace.h user_acl.h valid_mailhost_addr.h verify.h verify_clnt.h \
|
||||
verp_sender.h wildcard_inet_addr.h xtext.h delivered_hdr.h \
|
||||
fold_addr.h header_body_checks.h data_redirect.h
|
||||
fold_addr.h header_body_checks.h data_redirect.h match_service.h
|
||||
TESTSRC = rec2stream.c stream2rec.c recdump.c
|
||||
DEFS = -I. -I$(INC_DIR) -D$(SYSTYPE)
|
||||
CFLAGS = $(DEBUG) $(OPT) $(DEFS)
|
||||
@ -1384,6 +1386,15 @@ match_parent_style.o: mail_params.h
|
||||
match_parent_style.o: match_parent_style.c
|
||||
match_parent_style.o: match_parent_style.h
|
||||
match_parent_style.o: string_list.h
|
||||
match_service.o: ../../include/argv.h
|
||||
match_service.o: ../../include/msg.h
|
||||
match_service.o: ../../include/mymalloc.h
|
||||
match_service.o: ../../include/stringops.h
|
||||
match_service.o: ../../include/sys_defs.h
|
||||
match_service.o: ../../include/vbuf.h
|
||||
match_service.o: ../../include/vstring.h
|
||||
match_service.o: match_service.c
|
||||
match_service.o: match_service.h
|
||||
mbox_conf.o: ../../include/argv.h
|
||||
mbox_conf.o: ../../include/name_mask.h
|
||||
mbox_conf.o: ../../include/sys_defs.h
|
||||
|
@ -170,8 +170,7 @@
|
||||
#endif
|
||||
#include <inet_proto.h>
|
||||
#include <vstring_vstream.h>
|
||||
#include <connect.h>
|
||||
#include <listen.h>
|
||||
#include <iostuff.h>
|
||||
|
||||
/* Global library. */
|
||||
|
||||
|
@ -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 "20090109"
|
||||
#define MAIL_RELEASE_DATE "20090110"
|
||||
#define MAIL_VERSION_NUMBER "2.6"
|
||||
|
||||
#ifdef SNAPSHOT
|
||||
|
139
postfix/src/global/match_service.c
Normal file
139
postfix/src/global/match_service.c
Normal file
@ -0,0 +1,139 @@
|
||||
/*++
|
||||
/* NAME
|
||||
/* match_service 3
|
||||
/* SUMMARY
|
||||
/* simple master.cf service name.type pattern matcher
|
||||
/* SYNOPSIS
|
||||
/* #include <match_service.h>
|
||||
/*
|
||||
/* ARGV *match_service_init(pattern_list)
|
||||
/* const char *pattern_list;
|
||||
/*
|
||||
/* int match_service_match(list, name_type)
|
||||
/* ARGV *list;
|
||||
/* const char *name_type;
|
||||
/*
|
||||
/* void match_service_free(list)
|
||||
/* ARGV *list;
|
||||
/* DESCRIPTION
|
||||
/* This module implements pattern matching for Postfix master.cf
|
||||
/* services. This is more precise than using domain_list(3),
|
||||
/* because match_service(3) won't treat a dotted service name
|
||||
/* as a domain hierarchy. Moreover, this module has the advantage
|
||||
/* that it does not drag in all the LDAP, SQL and other map
|
||||
/* lookup client code into programs that don't need it.
|
||||
/*
|
||||
/* Each pattern is of the form "name.type" or "type", where
|
||||
/* "name" and "type" are the first two fields of a master.cf
|
||||
/* entry. Patterns are separated by whitespace and/or commas.
|
||||
/* Matches are case insensitive. Patterns are matched in the
|
||||
/* specified order, and the matching process stops at the first
|
||||
/* match. In order to reverse the result of a pattern match,
|
||||
/* precede a pattern with an exclamation point (!).
|
||||
/*
|
||||
/* match_service_init() parses the pattern list. The result
|
||||
/* must be passed to match_service_match() or match_service_free().
|
||||
/*
|
||||
/* match_service_match() matches one service name.type string
|
||||
/* against the specified pattern list.
|
||||
/*
|
||||
/* match_service_free() releases storage allocated by
|
||||
/* match_service_init().
|
||||
/* DIAGNOSTICS
|
||||
/* Fatal error: out of memory, malformed pattern.
|
||||
/* Panic: malformed search string.
|
||||
/* SEE ALSO
|
||||
/* domain_list(3) match domain names.
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
/* The Secure Mailer license must be distributed with this software.
|
||||
/* AUTHOR(S)
|
||||
/* Wietse Venema
|
||||
/* IBM T.J. Watson Research
|
||||
/* P.O. Box 704
|
||||
/* Yorktown Heights, NY 10598, USA
|
||||
/*--*/
|
||||
|
||||
/* System library. */
|
||||
|
||||
#include <sys_defs.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef STRCASECMP_IN_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
/* Utility library. */
|
||||
|
||||
#include <msg.h>
|
||||
#include <argv.h>
|
||||
#include <mymalloc.h>
|
||||
#include <stringops.h>
|
||||
#include <match_service.h>
|
||||
|
||||
/* match_service_init - initialize pattern list */
|
||||
|
||||
ARGV *match_service_init(const char *patterns)
|
||||
{
|
||||
const char *delim = " ,\t\r\n";
|
||||
ARGV *list = argv_alloc(1);
|
||||
char *saved_patterns = mystrdup(patterns);
|
||||
char *bp = saved_patterns;
|
||||
const char *item;
|
||||
|
||||
while ((item = mystrtok(&bp, delim)) != 0)
|
||||
argv_add(list, item, (char *) 0);
|
||||
argv_terminate(list);
|
||||
myfree(saved_patterns);
|
||||
return (list);
|
||||
}
|
||||
|
||||
/* match_service_match - match service name.type against pattern list */
|
||||
|
||||
int match_service_match(ARGV *list, const char *name_type)
|
||||
{
|
||||
const char *myname = "match_service_match";
|
||||
const char *type;
|
||||
char **cpp;
|
||||
char *pattern;
|
||||
int match;
|
||||
|
||||
/*
|
||||
* Quick check for empty list.
|
||||
*/
|
||||
if (list->argv[0] == 0)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Sanity check.
|
||||
*/
|
||||
if ((type = strrchr(name_type, '.')) == 0 || *++type == 0)
|
||||
msg_panic("%s: malformed service: \"%s\"; need \"name.type\" format",
|
||||
myname, name_type);
|
||||
|
||||
/*
|
||||
* Iterate over all patterns in the list, stop at the first match.
|
||||
*/
|
||||
for (cpp = list->argv; (pattern = *cpp) != 0; cpp++) {
|
||||
if (msg_verbose)
|
||||
msg_info("%s: %s ~? %s", myname, name_type, pattern);
|
||||
for (match = 1; *pattern == '!'; pattern++)
|
||||
match = !match;
|
||||
if (strcasecmp(strchr(pattern, '.') ? name_type : type, pattern) == 0) {
|
||||
if (msg_verbose)
|
||||
msg_info("%s: %s: found match", myname, name_type);
|
||||
return (match);
|
||||
}
|
||||
}
|
||||
if (msg_verbose)
|
||||
msg_info("%s: %s: no match", myname, name_type);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* match_service_free - release storage */
|
||||
|
||||
void match_service_free(ARGV *list)
|
||||
{
|
||||
argv_free(list);
|
||||
}
|
31
postfix/src/global/match_service.h
Normal file
31
postfix/src/global/match_service.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef _MATCH_SERVICE_H_INCLUDED_
|
||||
#define _MATCH_SERVICE_H_INCLUDED_
|
||||
|
||||
/*++
|
||||
/* NAME
|
||||
/* match_service 3h
|
||||
/* SUMMARY
|
||||
/* simple master.cf service name.type pattern matcher
|
||||
/* SYNOPSIS
|
||||
/* #include <match_service.h>
|
||||
/* DESCRIPTION
|
||||
/* .nf
|
||||
|
||||
/* External interface. */
|
||||
|
||||
extern ARGV *match_service_init(const char *);
|
||||
extern int match_service_match(ARGV *, const char *);
|
||||
extern void match_service_free(ARGV *);
|
||||
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
/* The Secure Mailer license must be distributed with this software.
|
||||
/* AUTHOR(S)
|
||||
/* Wietse Venema
|
||||
/* IBM T.J. Watson Research
|
||||
/* P.O. Box 704
|
||||
/* Yorktown Heights, NY 10598, USA
|
||||
/*--*/
|
||||
|
||||
#endif
|
@ -2,10 +2,10 @@ SHELL = /bin/sh
|
||||
SRCS = master.c master_conf.c master_ent.c master_sig.c master_avail.c \
|
||||
master_spawn.c master_service.c master_status.c master_listen.c \
|
||||
master_proto.c single_server.c multi_server.c master_vars.c \
|
||||
master_wakeup.c master_flow.c mail_flow.c
|
||||
master_wakeup.c master_flow.c master_watch.c mail_flow.c
|
||||
OBJS = master.o master_conf.o master_ent.o master_sig.o master_avail.o \
|
||||
master_spawn.o master_service.o master_status.o master_listen.o \
|
||||
master_vars.o master_wakeup.o master_flow.o
|
||||
master_vars.o master_wakeup.o master_watch.o master_flow.o
|
||||
LIB_OBJ = single_server.o multi_server.o trigger_server.o master_proto.o \
|
||||
mail_flow.o
|
||||
HDRS = mail_server.h master_proto.h mail_flow.h
|
||||
@ -128,7 +128,6 @@ master_conf.o: master.h
|
||||
master_conf.o: master_conf.c
|
||||
master_ent.o: ../../include/argv.h
|
||||
master_ent.o: ../../include/attr.h
|
||||
master_ent.o: ../../include/domain_list.h
|
||||
master_ent.o: ../../include/host_port.h
|
||||
master_ent.o: ../../include/inet_addr_host.h
|
||||
master_ent.o: ../../include/inet_addr_list.h
|
||||
@ -136,8 +135,7 @@ master_ent.o: ../../include/iostuff.h
|
||||
master_ent.o: ../../include/mail_conf.h
|
||||
master_ent.o: ../../include/mail_params.h
|
||||
master_ent.o: ../../include/mail_proto.h
|
||||
master_ent.o: ../../include/match_list.h
|
||||
master_ent.o: ../../include/match_ops.h
|
||||
master_ent.o: ../../include/match_service.h
|
||||
master_ent.o: ../../include/msg.h
|
||||
master_ent.o: ../../include/myaddrinfo.h
|
||||
master_ent.o: ../../include/mymalloc.h
|
||||
@ -237,6 +235,11 @@ master_wakeup.o: ../../include/vstream.h
|
||||
master_wakeup.o: mail_server.h
|
||||
master_wakeup.o: master.h
|
||||
master_wakeup.o: master_wakeup.c
|
||||
master_watch.o: ../../include/msg.h
|
||||
master_watch.o: ../../include/mymalloc.h
|
||||
master_watch.o: ../../include/sys_defs.h
|
||||
master_watch.o: master.h
|
||||
master_watch.o: master_watch.c
|
||||
multi_server.o: ../../include/chroot_uid.h
|
||||
multi_server.o: ../../include/debug_process.h
|
||||
multi_server.o: ../../include/events.h
|
||||
|
@ -184,6 +184,35 @@ extern void master_delete_children(MASTER_SERV *);
|
||||
extern void master_flow_init(void);
|
||||
extern int master_flow_pipe[2];
|
||||
|
||||
/*
|
||||
* master_watch.c
|
||||
*
|
||||
* Support to warn about main.cf parameters that can only be initialized but
|
||||
* not updated, and to initialize or update data structures that derive
|
||||
* values from main.cf parameters.
|
||||
*/
|
||||
typedef struct {
|
||||
const char *name; /* parameter name */
|
||||
char **value; /* current main.cf value */
|
||||
char **backup; /* actual value that is being used */
|
||||
int flags; /* see below */
|
||||
void (*notify) (void); /* init or update data structure */
|
||||
} MASTER_STR_WATCH;
|
||||
|
||||
typedef struct {
|
||||
const char *name; /* parameter name */
|
||||
int *value; /* current main.cf value */
|
||||
int backup; /* actual value that is being used */
|
||||
int flags; /* see below */
|
||||
void (*notify) (void); /* init or update data structure */
|
||||
} MASTER_INT_WATCH;
|
||||
|
||||
#define MASTER_WATCH_FLAG_UPDATABLE (1<<0) /* support update after init */
|
||||
#define MASTER_WATCH_FLAG_ISSET (1<<1) /* backup is initialized */
|
||||
|
||||
extern void master_str_watch(const MASTER_STR_WATCH *);
|
||||
extern void master_int_watch(MASTER_INT_WATCH *);
|
||||
|
||||
/* DIAGNOSTICS
|
||||
/* BUGS
|
||||
/* SEE ALSO
|
||||
|
@ -90,7 +90,7 @@
|
||||
|
||||
/* Global library. */
|
||||
|
||||
#include <domain_list.h>
|
||||
#include <match_service.h>
|
||||
#include <mail_proto.h>
|
||||
#include <mail_params.h>
|
||||
#include <own_inet_addr.h>
|
||||
@ -105,7 +105,7 @@
|
||||
static char *master_path; /* config file name */
|
||||
static VSTREAM *master_fp; /* config file pointer */
|
||||
static int master_line; /* config file line number */
|
||||
static DOMAIN_LIST *master_disable; /* disabled services */
|
||||
static ARGV *master_disable; /* disabled service patterns */
|
||||
|
||||
static char master_blanks[] = " \t\r\n";/* field delimiters */
|
||||
|
||||
@ -136,7 +136,7 @@ void set_master_ent()
|
||||
master_line = 0;
|
||||
if (master_disable != 0)
|
||||
msg_panic("%s: service disable list still exists", myname);
|
||||
master_disable = domain_list_init(MATCH_FLAG_PARENT, var_master_disable);
|
||||
master_disable = match_service_init(var_master_disable);
|
||||
}
|
||||
|
||||
/* end_master_ent - close configuration file */
|
||||
@ -152,7 +152,7 @@ void end_master_ent()
|
||||
master_fp = 0;
|
||||
if (master_disable == 0)
|
||||
msg_panic("%s: no service disable list", myname);
|
||||
domain_list_free(master_disable);
|
||||
match_service_free(master_disable);
|
||||
master_disable = 0;
|
||||
}
|
||||
|
||||
@ -284,7 +284,7 @@ MASTER_SERV *get_master_ent()
|
||||
name = cp;
|
||||
transport = get_str_ent(&bufp, "transport type", (char *) 0);
|
||||
vstring_sprintf(junk, "%s.%s", name, transport);
|
||||
} while (domain_list_match(master_disable, vstring_str(junk)) != 0);
|
||||
} while (match_service_match(master_disable, vstring_str(junk)) != 0);
|
||||
|
||||
/*
|
||||
* Parse one logical line from the configuration file. Initialize service
|
||||
|
@ -51,109 +51,6 @@ int var_proc_limit;
|
||||
int var_throttle_time;
|
||||
char *var_master_disable;
|
||||
|
||||
/*
|
||||
* Support to warn about main.cf parameters that can only be initialized but
|
||||
* not updated, and to initialize or update data structures that derive
|
||||
* values from main.cf parameters. Add similar code if we also need to
|
||||
* monitor non-string parameters.
|
||||
*/
|
||||
typedef struct MASTER_VARS_STR_WATCH {
|
||||
const char *name; /* parameter name */
|
||||
char **value; /* current main.cf value */
|
||||
char **backup; /* actual value that is being used */
|
||||
int flags; /* see below */
|
||||
void (*assign) (void); /* init or update data structure */
|
||||
} MASTER_VARS_STR_WATCH;
|
||||
|
||||
typedef struct MASTER_VARS_INT_WATCH {
|
||||
const char *name; /* parameter name */
|
||||
int *value; /* current main.cf value */
|
||||
int *backup; /* actual value that is being used */
|
||||
int flags; /* see below */
|
||||
void (*assign) (void); /* init or update data structure */
|
||||
} MASTER_VARS_INT_WATCH;
|
||||
|
||||
#define MASTER_VARS_WATCH_FLAG_UPDATE (1<<0) /* support update after init */
|
||||
#define MASTER_VARS_WATCH_FLAG_ISSET (1<<1) /* backup is initialized */
|
||||
|
||||
/* master_vars_str_watch - watch string-valued parameters for change */
|
||||
|
||||
static void master_vars_str_watch(MASTER_VARS_STR_WATCH *str_watch_table)
|
||||
{
|
||||
MASTER_VARS_STR_WATCH *wp;
|
||||
|
||||
for (wp = str_watch_table; wp->name != 0; wp++) {
|
||||
|
||||
/*
|
||||
* Detect changes to monitored parameter values. If a change is
|
||||
* supported, we discard the backed up value and update it to the
|
||||
* current value later. Otherwise we complain.
|
||||
*/
|
||||
if (wp->backup[0] != 0
|
||||
&& strcmp(wp->backup[0], wp->value[0]) != 0) {
|
||||
if ((wp->flags & MASTER_VARS_WATCH_FLAG_UPDATE) == 0) {
|
||||
msg_warn("ignoring %s parameter value change", wp->name);
|
||||
msg_warn("old value: \"%s\", new value: \"%s\"",
|
||||
wp->backup[0], wp->value[0]);
|
||||
msg_warn("to change %s, stop and start Postfix", wp->name);
|
||||
} else {
|
||||
myfree(wp->backup[0]);
|
||||
wp->backup[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the backed up parameter value, or update if it this
|
||||
* parameter supports updates after initialization. Optionally assign
|
||||
* the parameter value to an application-specific data structure.
|
||||
*/
|
||||
if (wp->backup[0] == 0) {
|
||||
if (wp->assign != 0)
|
||||
wp->assign();
|
||||
wp->backup[0] = mystrdup(wp->value[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* master_vars_int_watch - watch integer-valued parameters for change */
|
||||
|
||||
static void master_vars_int_watch(MASTER_VARS_INT_WATCH *str_watch_table)
|
||||
{
|
||||
MASTER_VARS_INT_WATCH *wp;
|
||||
|
||||
for (wp = str_watch_table; wp->name != 0; wp++) {
|
||||
|
||||
/*
|
||||
* Detect changes to monitored parameter values. If a change is
|
||||
* supported, we discard the backed up value and update it to the
|
||||
* current value later. Otherwise we complain.
|
||||
*/
|
||||
if ((wp->flags & MASTER_VARS_WATCH_FLAG_ISSET) != 0
|
||||
&& wp->backup[0] != wp->value[0]) {
|
||||
if ((wp->flags & MASTER_VARS_WATCH_FLAG_UPDATE) == 0) {
|
||||
msg_warn("ignoring %s parameter value change", wp->name);
|
||||
msg_warn("old value: \"%d\", new value: \"%d\"",
|
||||
wp->backup[0], wp->value[0]);
|
||||
msg_warn("to change %s, stop and start Postfix", wp->name);
|
||||
} else {
|
||||
wp->flags &= ~MASTER_VARS_WATCH_FLAG_ISSET;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the backed up parameter value, or update if it this
|
||||
* parameter supports updates after initialization. Optionally assign
|
||||
* the parameter value to an application-specific data structure.
|
||||
*/
|
||||
if ((wp->flags & MASTER_VARS_WATCH_FLAG_ISSET) == 0) {
|
||||
if (wp->assign != 0)
|
||||
wp->assign();
|
||||
wp->flags |= MASTER_VARS_WATCH_FLAG_ISSET;
|
||||
wp->backup[0] = wp->value[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* master_vars_init - initialize from global Postfix configuration file */
|
||||
|
||||
void master_vars_init(void)
|
||||
@ -175,18 +72,13 @@ void master_vars_init(void)
|
||||
static char *saved_inet_protocols;
|
||||
static char *saved_queue_dir;
|
||||
static char *saved_config_dir;
|
||||
static MASTER_VARS_STR_WATCH str_watch_table[] = {
|
||||
static const MASTER_STR_WATCH str_watch_table[] = {
|
||||
VAR_CONFIG_DIR, &var_config_dir, &saved_config_dir, 0, 0,
|
||||
VAR_QUEUE_DIR, &var_queue_dir, &saved_queue_dir, 0, 0,
|
||||
VAR_INET_PROTOCOLS, &var_inet_protocols, &saved_inet_protocols, 0, 0,
|
||||
/* XXX Add inet_interfaces here after this code is burned in. */
|
||||
0,
|
||||
};
|
||||
static int saved_inet_windowsize;
|
||||
static MASTER_VARS_INT_WATCH int_watch_table[] = {
|
||||
VAR_INET_WINDOW, &var_inet_windowsize, &saved_inet_windowsize, 0, 0,
|
||||
0,
|
||||
};
|
||||
|
||||
/*
|
||||
* Flush existing main.cf settings, so that we handle deleted main.cf
|
||||
@ -205,6 +97,5 @@ void master_vars_init(void)
|
||||
/*
|
||||
* Look for parameter changes that require special attention.
|
||||
*/
|
||||
master_vars_str_watch(str_watch_table);
|
||||
master_vars_int_watch(int_watch_table);
|
||||
master_str_watch(str_watch_table);
|
||||
}
|
||||
|
151
postfix/src/master/master_watch.c
Normal file
151
postfix/src/master/master_watch.c
Normal file
@ -0,0 +1,151 @@
|
||||
/*++
|
||||
/* NAME
|
||||
/* master_watch 3
|
||||
/* SUMMARY
|
||||
/* Postfix master - monitor main.cf changes
|
||||
/* SYNOPSIS
|
||||
/* #include "master.h"
|
||||
/*
|
||||
/* void master_str_watch(str_watch_table)
|
||||
/* const MASTER_STR_WATCH *str_watch_table;
|
||||
/*
|
||||
/* void master_int_watch(int_watch_table)
|
||||
/* MASTER_INT_WATCH *int_watch_table;
|
||||
/* DESCRIPTION
|
||||
/* The Postfix master daemon is a long-running process. After
|
||||
/* main.cf is changed, some parameter changes may require that
|
||||
/* master data structures be recomputed.
|
||||
/*
|
||||
/* Unfortunately, some main.cf changes cannot be applied
|
||||
/* on-the-fly, either because they require killing off existing
|
||||
/* child processes and thus disrupt service, or because the
|
||||
/* necessary support for on-the-fly data structure update has
|
||||
/* not yet been implemented. Such main.cf changes trigger a
|
||||
/* warning that they require that Postfix be stopped and
|
||||
/* restarted.
|
||||
/*
|
||||
/* This module provides functions that monitor selected main.cf
|
||||
/* parameters for change. The operation of these functions is
|
||||
/* controlled by tables that specify the parameter name, the
|
||||
/* current parameter value, a historical parameter value,
|
||||
/* optional flags, and an optional notify call-back function.
|
||||
/*
|
||||
/* master_str_watch() monitors string-valued parameters for
|
||||
/* change, and master_int_watch() does the same for integer-valued
|
||||
/* parameters. Note that master_int_watch() needs read-write
|
||||
/* access to its argument table, while master_str_watch() needs
|
||||
/* read-only access only.
|
||||
/*
|
||||
/* The functions log a warning when a parameter value has
|
||||
/* changed after re-reading main.cf, but the parameter is not
|
||||
/* flagged in the MASTER_*_WATCH table as "updatable" with
|
||||
/* MASTER_WATCH_FLAG_UPDATABLE.
|
||||
/*
|
||||
/* If the parameter has a notify call-back function, then the
|
||||
/* function is called after main.cf is read for the first time.
|
||||
/* If the parameter is flagged as "updatable", then the function
|
||||
/* is also called when the parameter value changes after
|
||||
/* re-reading main.cf.
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
/* The Secure Mailer license must be distributed with this software.
|
||||
/* AUTHOR(S)
|
||||
/* Wietse Venema
|
||||
/* IBM T.J. Watson Research
|
||||
/* P.O. Box 704
|
||||
/* Yorktown Heights, NY 10598, USA
|
||||
/*--*/
|
||||
|
||||
/* System library. */
|
||||
|
||||
#include <sys_defs.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Utility library. */
|
||||
|
||||
#include <msg.h>
|
||||
#include <mymalloc.h>
|
||||
|
||||
/* Application-specific. */
|
||||
|
||||
#include "master.h"
|
||||
|
||||
/* master_str_watch - watch string-valued parameters for change */
|
||||
|
||||
void master_str_watch(const MASTER_STR_WATCH *str_watch_table)
|
||||
{
|
||||
const MASTER_STR_WATCH *wp;
|
||||
|
||||
for (wp = str_watch_table; wp->name != 0; wp++) {
|
||||
|
||||
/*
|
||||
* Detect changes to monitored parameter values. If a change is
|
||||
* supported, we discard the backed up value and update it to the
|
||||
* current value later. Otherwise we complain.
|
||||
*/
|
||||
if (wp->backup[0] != 0
|
||||
&& strcmp(wp->backup[0], wp->value[0]) != 0) {
|
||||
if ((wp->flags & MASTER_WATCH_FLAG_UPDATABLE) == 0) {
|
||||
msg_warn("ignoring %s parameter value change", wp->name);
|
||||
msg_warn("old value: \"%s\", new value: \"%s\"",
|
||||
wp->backup[0], wp->value[0]);
|
||||
msg_warn("to change %s, stop and start Postfix", wp->name);
|
||||
} else {
|
||||
myfree(wp->backup[0]);
|
||||
wp->backup[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the backed up parameter value, or update it if this
|
||||
* parameter supports updates after initialization. Optionally
|
||||
* notify the application that this parameter has changed.
|
||||
*/
|
||||
if (wp->backup[0] == 0) {
|
||||
if (wp->notify != 0)
|
||||
wp->notify();
|
||||
wp->backup[0] = mystrdup(wp->value[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* master_int_watch - watch integer-valued parameters for change */
|
||||
|
||||
void master_int_watch(MASTER_INT_WATCH *int_watch_table)
|
||||
{
|
||||
MASTER_INT_WATCH *wp;
|
||||
|
||||
for (wp = int_watch_table; wp->name != 0; wp++) {
|
||||
|
||||
/*
|
||||
* Detect changes to monitored parameter values. If a change is
|
||||
* supported, we discard the backed up value and update it to the
|
||||
* current value later. Otherwise we complain.
|
||||
*/
|
||||
if ((wp->flags & MASTER_WATCH_FLAG_ISSET) != 0
|
||||
&& wp->backup != wp->value[0]) {
|
||||
if ((wp->flags & MASTER_WATCH_FLAG_UPDATABLE) == 0) {
|
||||
msg_warn("ignoring %s parameter value change", wp->name);
|
||||
msg_warn("old value: \"%d\", new value: \"%d\"",
|
||||
wp->backup, wp->value[0]);
|
||||
msg_warn("to change %s, stop and start Postfix", wp->name);
|
||||
} else {
|
||||
wp->flags &= ~MASTER_WATCH_FLAG_ISSET;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the backed up parameter value, or update if it this
|
||||
* parameter supports updates after initialization. Optionally
|
||||
* notify the application that this parameter has changed.
|
||||
*/
|
||||
if ((wp->flags & MASTER_WATCH_FLAG_ISSET) == 0) {
|
||||
if (wp->notify != 0)
|
||||
wp->notify();
|
||||
wp->flags |= MASTER_WATCH_FLAG_ISSET;
|
||||
wp->backup = wp->value[0];
|
||||
}
|
||||
}
|
||||
}
|
@ -197,6 +197,9 @@ static SMTP_SESSION *smtp_connect_addr(const char *destination, DNS_RR *addr,
|
||||
if ((sock = socket(sa->sa_family, SOCK_STREAM, 0)) < 0)
|
||||
msg_fatal("%s: socket: %m", myname);
|
||||
|
||||
if (inet_windowsize > 0)
|
||||
set_inet_windowsize(sock, inet_windowsize);
|
||||
|
||||
/*
|
||||
* Allow the sysadmin to specify the source address, for example, as "-o
|
||||
* smtp_bind_address=x.x.x.x" in the master.cf file.
|
||||
|
@ -151,6 +151,10 @@
|
||||
/* .IP "\fB-t \fItimeout\fR (default: 100)"
|
||||
/* Limit the time for receiving a command or sending a response.
|
||||
/* The time limit is specified in seconds.
|
||||
/* .IP "\fB-T \fIwindowsize\fR"
|
||||
/* Override the default TCP window size. To work around
|
||||
/* broken TCP window scaling implementations, specify a
|
||||
/* value > 0 and < 65536.
|
||||
/* .IP "\fB-u \fIusername\fR"
|
||||
/* Switch to the specified user privileges after opening the
|
||||
/* network socket and optionally changing the process root
|
||||
@ -1395,7 +1399,7 @@ int main(int argc, char **argv)
|
||||
/*
|
||||
* Parse JCL.
|
||||
*/
|
||||
while ((ch = GETOPT(argc, argv, "468aA:cCd:D:eEf:Fh:Ln:m:M:pPq:Q:r:R:s:S:t:u:vw:W:")) > 0) {
|
||||
while ((ch = GETOPT(argc, argv, "468aA:cCd:D:eEf:Fh:Ln:m:M:pPq:Q:r:R:s:S:t:T:u:vw:W:")) > 0) {
|
||||
switch (ch) {
|
||||
case '4':
|
||||
protocols = INET_PROTO_NAME_IPV4;
|
||||
@ -1490,6 +1494,10 @@ int main(int argc, char **argv)
|
||||
if ((var_tmout = atoi(optarg)) <= 0)
|
||||
msg_fatal("bad timeout: %s", optarg);
|
||||
break;
|
||||
case 'T':
|
||||
if ((inet_windowsize = atoi(optarg)) <= 0)
|
||||
msg_fatal("bad TCP window size: %s", optarg);
|
||||
break;
|
||||
case 'u':
|
||||
user_privs = optarg;
|
||||
break;
|
||||
|
@ -79,6 +79,10 @@
|
||||
/* Send mail with the named subject line (default: none).
|
||||
/* .IP "\fB-t \fIto\fR"
|
||||
/* Use the specified recipient address (default: <foo@myhostname>).
|
||||
/* .IP "\fB-T \fIwindowsize\fR"
|
||||
/* Override the default TCP window size. To work around
|
||||
/* broken TCP window scaling implementations, specify a
|
||||
/* value > 0 and < 65536.
|
||||
/* .IP \fB-v\fR
|
||||
/* Make the program more verbose, for debugging purposes.
|
||||
/* .IP "\fB-w \fIinterval\fR"
|
||||
@ -460,6 +464,8 @@ static void start_connect(SESSION *session)
|
||||
session->stream = vstream_fdopen(fd, O_RDWR);
|
||||
event_enable_write(fd, connect_done, (char *) session);
|
||||
smtp_timeout_setup(session->stream, var_timeout);
|
||||
if (inet_windowsize > 0)
|
||||
set_inet_windowsize(fd, inet_windowsize);
|
||||
if (sane_connect(fd, sa, sa_length) < 0 && errno != EINPROGRESS)
|
||||
fail_connect(session);
|
||||
}
|
||||
@ -922,7 +928,7 @@ int main(int argc, char **argv)
|
||||
/*
|
||||
* Parse JCL.
|
||||
*/
|
||||
while ((ch = GETOPT(argc, argv, "46AcC:df:F:l:Lm:M:Nor:R:s:S:t:vw:")) > 0) {
|
||||
while ((ch = GETOPT(argc, argv, "46AcC:df:F:l:Lm:M:Nor:R:s:S:t:T:vw:")) > 0) {
|
||||
switch (ch) {
|
||||
case '4':
|
||||
protocols = INET_PROTO_NAME_IPV4;
|
||||
@ -1001,6 +1007,10 @@ int main(int argc, char **argv)
|
||||
case 't':
|
||||
recipient = optarg;
|
||||
break;
|
||||
case 'T':
|
||||
if ((inet_windowsize = atoi(optarg)) <= 0)
|
||||
msg_fatal("bad TCP window size: %s", optarg);
|
||||
break;
|
||||
case 'v':
|
||||
msg_verbose++;
|
||||
break;
|
||||
|
@ -31,7 +31,7 @@ SRCS = alldig.c allprint.c argv.c argv_split.c attr_clnt.c attr_print0.c \
|
||||
vstream_popen.c vstring.c vstring_vstream.c watchdog.c writable.c \
|
||||
write_buf.c write_wait.c sane_basename.c format_tv.c allspace.c \
|
||||
allascii.c load_file.c killme_after.c vstream_tweak.c upass_connect.c \
|
||||
upass_listen.c upass_trigger.c edit_file.c
|
||||
upass_listen.c upass_trigger.c edit_file.c inet_windowsize.c
|
||||
OBJS = alldig.o allprint.o argv.o argv_split.o attr_clnt.o attr_print0.o \
|
||||
attr_print64.o attr_print_plain.o attr_scan0.o attr_scan64.o \
|
||||
attr_scan_plain.o auto_clnt.o base64_code.o basename.o binhash.o \
|
||||
@ -64,7 +64,7 @@ OBJS = alldig.o allprint.o argv.o argv_split.o attr_clnt.o attr_print0.o \
|
||||
vstream_popen.o vstring.o vstring_vstream.o watchdog.o writable.o \
|
||||
write_buf.o write_wait.o sane_basename.o format_tv.o allspace.o \
|
||||
allascii.o load_file.o killme_after.o vstream_tweak.o upass_connect.o \
|
||||
upass_listen.o upass_trigger.o edit_file.o
|
||||
upass_listen.o upass_trigger.o edit_file.o inet_windowsize.o
|
||||
HDRS = argv.h attr.h attr_clnt.h auto_clnt.h base64_code.h binhash.h \
|
||||
chroot_uid.h cidr_match.h clean_env.h connect.h ctable.h dict.h \
|
||||
dict_cdb.h dict_cidr.h dict_db.h dict_dbm.h dict_env.h dict_ht.h \
|
||||
@ -1137,6 +1137,10 @@ inet_trigger.o: msg.h
|
||||
inet_trigger.o: mymalloc.h
|
||||
inet_trigger.o: sys_defs.h
|
||||
inet_trigger.o: trigger.h
|
||||
inet_windowsize.o: inet_windowsize.c
|
||||
inet_windowsize.o: iostuff.h
|
||||
inet_windowsize.o: msg.h
|
||||
inet_windowsize.o: sys_defs.h
|
||||
killme_after.o: killme_after.c
|
||||
killme_after.o: killme_after.h
|
||||
killme_after.o: sys_defs.h
|
||||
|
@ -24,8 +24,6 @@ extern int inet_connect(const char *, int, int);
|
||||
extern int stream_connect(const char *, int, int);
|
||||
extern int upass_connect(const char *, int, int);
|
||||
|
||||
extern int inet_windowsize;
|
||||
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
|
@ -16,7 +16,7 @@
|
||||
/* inet_connect connects to a TCP listener at
|
||||
/* the specified address, and returns the resulting file descriptor.
|
||||
/*
|
||||
/* Specify an inet_windowsize value > 0 to override the default
|
||||
/* Specify an inet_windowsize value > 0 to override the TCP
|
||||
/* window size that the client advertises to the server.
|
||||
/*
|
||||
/* Arguments:
|
||||
@ -149,14 +149,8 @@ static int inet_connect_one(struct addrinfo * res, int block_mode, int timeout)
|
||||
/*
|
||||
* Window scaling workaround.
|
||||
*/
|
||||
if (inet_windowsize > 0) {
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *) &inet_windowsize,
|
||||
sizeof(inet_windowsize)) < 0)
|
||||
msg_warn("setsockopt SO_SNDBUF %d: %m", inet_windowsize);
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *) &inet_windowsize,
|
||||
sizeof(inet_windowsize)) < 0)
|
||||
msg_warn("setsockopt SO_RCVBUF %d: %m", inet_windowsize);
|
||||
}
|
||||
if (inet_windowsize > 0)
|
||||
set_inet_windowsize(sock, inet_windowsize);
|
||||
|
||||
/*
|
||||
* Timed connect.
|
||||
|
@ -22,8 +22,8 @@
|
||||
/*
|
||||
/* inet_accept() accepts a connection and sanitizes error results.
|
||||
/*
|
||||
/* Specify an inet_windowsize value > 0 to override the default
|
||||
/* TCP window size that the server advertises to the server.
|
||||
/* Specify an inet_windowsize value > 0 to override the TCP
|
||||
/* window size that the server advertises to the client.
|
||||
/*
|
||||
/* Arguments:
|
||||
/* .IP addr
|
||||
@ -145,12 +145,12 @@ int inet_listen(const char *addr, int backlog, int block_mode)
|
||||
if ((sock = socket(res->ai_family, res->ai_socktype, 0)) < 0)
|
||||
msg_fatal("socket: %m");
|
||||
#ifdef HAS_IPV6
|
||||
#if defined(IPV6_V6ONLY) && !defined(BROKEN_AI_PASSIVE_NULL_HOST)
|
||||
# if defined(IPV6_V6ONLY) && !defined(BROKEN_AI_PASSIVE_NULL_HOST)
|
||||
if (res->ai_family == AF_INET6
|
||||
&& setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY,
|
||||
(char *) &on, sizeof(on)) < 0)
|
||||
msg_fatal("setsockopt(IPV6_V6ONLY): %m");
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
|
||||
(char *) &on, sizeof(on)) < 0)
|
||||
@ -160,16 +160,10 @@ int inet_listen(const char *addr, int backlog, int block_mode)
|
||||
&hostaddr, &portnum, 0);
|
||||
msg_fatal("bind %s port %s: %m", hostaddr.buf, portnum.buf);
|
||||
}
|
||||
if (inet_windowsize > 0) {
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *) &inet_windowsize,
|
||||
sizeof(inet_windowsize)) < 0)
|
||||
msg_warn("setsockopt SO_SNDBUF %d: %m", inet_windowsize);
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *) &inet_windowsize,
|
||||
sizeof(inet_windowsize)) < 0)
|
||||
msg_warn("setsockopt SO_RCVBUF %d: %m", inet_windowsize);
|
||||
}
|
||||
freeaddrinfo(res0);
|
||||
non_blocking(sock, block_mode);
|
||||
if (inet_windowsize > 0)
|
||||
set_inet_windowsize(sock, inet_windowsize);
|
||||
if (listen(sock, backlog) < 0)
|
||||
msg_fatal("listen: %m");
|
||||
return (sock);
|
||||
|
79
postfix/src/util/inet_windowsize.c
Normal file
79
postfix/src/util/inet_windowsize.c
Normal file
@ -0,0 +1,79 @@
|
||||
/*++
|
||||
/* NAME
|
||||
/* inet_windowsize 3
|
||||
/* SUMMARY
|
||||
/* TCP window scaling control
|
||||
/* SYNOPSIS
|
||||
/* #include <iostuff.h>
|
||||
/*
|
||||
/* int inet_windowsize;
|
||||
/*
|
||||
/* void set_inet_windowsize(sock, windowsize)
|
||||
/* int sock;
|
||||
/* int windowsize;
|
||||
/* DESCRIPTION
|
||||
/* set_inet_windowsize() overrides the default TCP window size
|
||||
/* with the specified value. When called before listen() or
|
||||
/* accept(), this works around broken infrastructure that
|
||||
/* mis-handles TCP window scaling options.
|
||||
/*
|
||||
/* The global inet_windowsize variable is available for other
|
||||
/* routines to remember that they wish to override the default
|
||||
/* TCP window size. The variable is not accessed by the
|
||||
/* set_inet_windowsize() function itself.
|
||||
/*
|
||||
/* Arguments:
|
||||
/* .IP sock
|
||||
/* TCP communication endpoint, before the connect(2) or listen(2) call.
|
||||
/* .IP windowsize
|
||||
/* The preferred TCP window size. This must be > 0.
|
||||
/* DIAGNOSTICS
|
||||
/* Panic: interface violation.
|
||||
/* Warnings: some error return from setsockopt().
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
/* The Secure Mailer license must be distributed with this software.
|
||||
/* AUTHOR(S)
|
||||
/* Wietse Venema
|
||||
/* IBM T.J. Watson Research
|
||||
/* P.O. Box 704
|
||||
/* Yorktown Heights, NY 10598, USA
|
||||
/*--*/
|
||||
|
||||
/* System libraries. */
|
||||
|
||||
#include <sys_defs.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
/* Utility library. */
|
||||
|
||||
#include <msg.h>
|
||||
#include <iostuff.h>
|
||||
|
||||
/* Application storage. */
|
||||
|
||||
int inet_windowsize;
|
||||
|
||||
/* set_inet_windowsize - set TCP send/receive window size */
|
||||
|
||||
void set_inet_windowsize(int sock, int windowsize)
|
||||
{
|
||||
|
||||
/*
|
||||
* Sanity check.
|
||||
*/
|
||||
if (windowsize <= 0)
|
||||
msg_panic("inet_windowsize: bad window size %d", windowsize);
|
||||
|
||||
/*
|
||||
* Generic implementation: set the send and receive buffer size before
|
||||
* listen() or connect().
|
||||
*/
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *) &windowsize,
|
||||
sizeof(windowsize)) < 0)
|
||||
msg_warn("setsockopt SO_SNDBUF %d: %m", windowsize);
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *) &windowsize,
|
||||
sizeof(windowsize)) < 0)
|
||||
msg_warn("setsockopt SO_RCVBUF %d: %m", windowsize);
|
||||
}
|
@ -36,6 +36,9 @@ extern int unix_send_fd(int, int);
|
||||
extern ssize_t dummy_read(int, void *, size_t, int, void *);
|
||||
extern ssize_t dummy_write(int, void *, size_t, int, void *);
|
||||
|
||||
extern int inet_windowsize;
|
||||
extern void set_inet_windowsize(int, int);
|
||||
|
||||
#define BLOCKING 0
|
||||
#define NON_BLOCKING 1
|
||||
|
||||
|
@ -31,8 +31,6 @@ extern int unix_accept(int);
|
||||
extern int stream_accept(int);
|
||||
extern int upass_accept(int);
|
||||
|
||||
extern int inet_windowsize;
|
||||
|
||||
/* LICENSE
|
||||
/* .ad
|
||||
/* .fi
|
||||
|
Loading…
x
Reference in New Issue
Block a user