2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-09-02 15:15:24 +00:00

snapshot-20001027

This commit is contained in:
Wietse Venema
2000-10-27 00:00:00 -05:00
committed by Viktor Dukhovni
parent 92472d4e5d
commit 14ffa91298
69 changed files with 1056 additions and 808 deletions

View File

@@ -49,8 +49,8 @@ Mail addresses (PLEASE send questions to the mailing list)
In order to subscribe to a mailing list, see http://www.postfix.org/. In order to subscribe to a mailing list, see http://www.postfix.org/.
Acknowledgements Acknowledgments
================ ===============
This release could not have happened without the input from a team This release could not have happened without the input from a team
of competent alpha testers. Their names appear in numerous places of competent alpha testers. Their names appear in numerous places

View File

@@ -2,7 +2,7 @@ LINUX SYSLOGD PERFORMANCE
========================= =========================
LINUX syslogd uses synchronous writes by default, which is very LINUX syslogd uses synchronous writes by default, which is very
expensive. For services such a mail it is recommended that you expensive. For services such as mail it is recommended that you
disable synchronous logfile writes by editing /etc/syslog.conf and disable synchronous logfile writes by editing /etc/syslog.conf and
by prepending a - to the logfile name: by prepending a - to the logfile name:

View File

@@ -14,7 +14,7 @@ delivered-to yes
dsn not yet dsn not yet
errors-to: yes errors-to: yes
esmtp yes esmtp yes
etrn support yes (flushes entire queue) etrn support yes (uses per-destination log or flushes entire queue)
fcntl locking yes (compile time) fcntl locking yes (compile time)
flock locking yes (compile time) flock locking yes (compile time)
home mailbox yes home mailbox yes

21
postfix/DB_README Normal file
View File

@@ -0,0 +1,21 @@
Purpose of this document
========================
This document describes how to build Postfix with Berkeley DB
support on systems that ship without DB library. The canonical
third-party source for Berkeley DB is www.sleepycat.com.
The information can also be used to build Postfix with a non-default
Berkeley DB version. However, the file formats of Berkeley DB
version 2 and later are not compatible with the older Berkeley DB
version that ships with, for example, 4.4BSD.
Building Postfix with third-party Berkeley DB support
=====================================================
If you installed the Berkeley DB from Sleepycat, use something like:
% make tidy
% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
AUXLIBS=/usr/local/BerkeleyDB/lib/libdb.a
% make

View File

@@ -128,7 +128,7 @@ In order to compile Postfix with optimizations turned off:
% make makefiles OPT= % make makefiles OPT=
This produces a set of Makefiles that do not request compiler This produces a set of Makefiles that do not request compiler
optomization. optimization.
Once the makefiles are set up, build the software: Once the makefiles are set up, build the software:

View File

@@ -45,7 +45,7 @@ in the main.cf configuration file.
By default, Postfix "fast ETRN/sendmail -qR" service is available By default, Postfix "fast ETRN/sendmail -qR" service is available
only for destinations that Postfix is willing to relay mail to: only for destinations that Postfix is willing to relay mail to:
fast_flush_policy = relay fast_flush_domains = $relay_domains
The "relay_domains" parameter specifies what destinations Postfix The "relay_domains" parameter specifies what destinations Postfix
will relay to. will relay to.
@@ -54,14 +54,14 @@ For destinations that are not eligible for the new "fast ETRN/sendmail
-qR" service, Postfix falls back to the old "slow ETRN" method -qR" service, Postfix falls back to the old "slow ETRN" method
which attempts to deliver all queued mail. which attempts to deliver all queued mail.
To enable "fast ETRN/sendmail -qR" for all destinations, specify: To enable "fast ETRN/sendmail -qR" for some other destination, specify:
fast_flush_policy = all fast_flush_domains = $relay_domains, some.other.domain
To disable "fast ETRN/sendmail -qR", so that Postfix always uses To disable "fast ETRN/sendmail -qR", so that Postfix always uses
the old "slow ETRN" which delivers all queued mail, specify: the old "slow ETRN" which delivers all queued mail, specify:
fast_flush_policy = none fast_flush_domains =
Testing the fast ETRN service Testing the fast ETRN service
============================= =============================

View File

@@ -104,7 +104,7 @@ Apologies for any names omitted.
that use short hostnames will have to specify their FQDN that use short hostnames will have to specify their FQDN
in main.cf (this will eventually be done by the system in main.cf (this will eventually be done by the system
installation/configuration procedure). Should the config installation/configuration procedure). Should the config
language support backtics so one can say `domainname`? What language support backticks so one can say `domainname`? What
about $name stuff between the backtics? about $name stuff between the backtics?
Security: the master now creates FIFOs and UNIX-domain Security: the master now creates FIFOs and UNIX-domain
@@ -822,7 +822,7 @@ Apologies for any names omitted.
Feature: hashed queues. Rewrote parts of the mail queue Feature: hashed queues. Rewrote parts of the mail queue
API. Configuration parameters: "hash_queue_names" specifies API. Configuration parameters: "hash_queue_names" specifies
what queue directories will be hashed (default: the defer what queue directories will be hashed (default: the defer
log drectory), "hash_queue_depth" specifies the number of log directory), "hash_queue_depth" specifies the number of
subdirectories used for hashing (default 2). subdirectories used for hashing (default 2).
19980802 19980802
@@ -2321,7 +2321,7 @@ Apologies for any names omitted.
Bugfix: the SMTPD check scaffolding didn't apply the same Bugfix: the SMTPD check scaffolding didn't apply the same
sanity checks as the production code. Problem reported by sanity checks as the production code. Problem reported by
Alain Thivillon, Herv<EFBFBD> Schauer Consultants, France. File: Alain Thivillon, Herve Schauer Consultants, France. File:
smtpd/smtpd_check.c. smtpd/smtpd_check.c.
Portability: some systems can have more than 59 seconds in Portability: some systems can have more than 59 seconds in
@@ -2491,7 +2491,7 @@ Apologies for any names omitted.
This needed the partial lookup key support to avoid passing This needed the partial lookup key support to avoid passing
partial addresses to regexp-based lookup tables (user, partial addresses to regexp-based lookup tables (user,
@domain, user@, domain). Files: global/maps.c @domain, user@, domain). Files: global/maps.c
globl/mail_addr_find.c. global/mail_addr_find.c.
Feature: new dictionary types can be registered with Feature: new dictionary types can be registered with
dict_open_register(). File: util/dict_open.c. dict_open_register(). File: util/dict_open.c.
@@ -2670,7 +2670,7 @@ Apologies for any names omitted.
Workaround: renamed config.h to mail_conf.h etc. in order Workaround: renamed config.h to mail_conf.h etc. in order
to avoid name collisions with LINUX (yes, they have a system to avoid name collisions with LINUX (yes, they have a system
include file calle config.h). For compatibility with people include file called config.h). For compatibility with people
who have written software for Postfix, there's a config.h who have written software for Postfix, there's a config.h
that aliases the old names to the new ones. That file will that aliases the old names to the new ones. That file will
go away eventually. go away eventually.
@@ -2906,7 +2906,7 @@ Apologies for any names omitted.
Workaround: in the INSTALL file, use `&&' instead of `;' Workaround: in the INSTALL file, use `&&' instead of `;'
in (cd path; tar ...) pipelines because some UNIX re-invented in (cd path; tar ...) pipelines because some UNIX re-invented
shells don't bail out when cd fails. Matthias Andree shells don't bail out when cd fails. Matthias Andree
@dosis.uni-dortmund.de. @stud.uni-dortmund.de.
19990709 19990709
@@ -3566,7 +3566,7 @@ Apologies for any names omitted.
Workaround: rename() over NFS can fail with ENOENT even Workaround: rename() over NFS can fail with ENOENT even
when the operation succeeds (Graham Orndorff @ WebTV). This when the operation succeeds (Graham Orndorff @ WebTV). This
is not news. Any non-idempotent operation can fail over is not news. Any non-idempotent operation can fail over
NFS when the NFS server's acknowledgement is lost and the NFS when the NFS server's acknowledgment is lost and the
NFS client code retries the operation (other examples are: NFS client code retries the operation (other examples are:
create, symlink, link, unlink, mkdir, rmdir). Postfix has create, symlink, link, unlink, mkdir, rmdir). Postfix has
workarounds for the cases where this is most likely to workarounds for the cases where this is most likely to
@@ -3658,7 +3658,7 @@ Apologies for any names omitted.
Robustness: limit the number of recipient addresses that Robustness: limit the number of recipient addresses that
can be extracted from message headers. Parameter: can be extracted from message headers. Parameter:
extract_recipient_limit (default: 10240). Files: extract_recipient_limit (default: 10240). Files:
cleaup/cleanup_message.c, cleanup/cleanup_extracted.c. cleanup/cleanup_message.c, cleanup/cleanup_extracted.c.
Cleanup: the message header reject logging now includes Cleanup: the message header reject logging now includes
sender and recipient address (if possible), so that the sender and recipient address (if possible), so that the
@@ -3712,7 +3712,7 @@ Apologies for any names omitted.
Cleanup: the manual pages in Postfix configuration files Cleanup: the manual pages in Postfix configuration files
no longer contain troff formatting codes. The text is now no longer contain troff formatting codes. The text is now
generated from prototype files in a new "proto" subdirectory. generated from prototype files in a new "proto" subdirectory.
Requested by Matthias Andree @ dt.e-technik.uni-dortmund.de. Requested by Matthias Andree @ stud.uni-dortmund.de.
20000308 20000308
@@ -3853,7 +3853,7 @@ Apologies for any names omitted.
VSTREAM_CTL_TIMEOUT...) sets the timeout deadline on a VSTREAM_CTL_TIMEOUT...) sets the timeout deadline on a
stream, and vstream_ftimeout(stream) queries a stream for stream, and vstream_ftimeout(stream) queries a stream for
timeout errors. This change simplified timeout handling timeout errors. This change simplified timeout handling
considerably. Files: util/vbuf.h, util/vstrean.[hc], considerably. Files: util/vbuf.h, util/vstream.[hc],
global/smtp_stream.c, global/timed_ipc.c. global/smtp_stream.c, global/timed_ipc.c.
20000504 20000504
@@ -4063,7 +4063,7 @@ Apologies for any names omitted.
20000623 20000623
Bugfix: the SMTP server did not reset the so-called junk Bugfix: the SMTP server did not reset the so-called junk
command counter after successfull delivery (Mark Hoffman command counter after successful delivery (Mark Hoffman
@ wallst.com). File: smtpd/smtpd.c. @ wallst.com). File: smtpd/smtpd.c.
20000625 20000625
@@ -4286,7 +4286,7 @@ Apologies for any names omitted.
Feature: Postfix bounced mail and delayed mail notifications Feature: Postfix bounced mail and delayed mail notifications
now have the standard RFC 1894 form (DSN). The bounce now have the standard RFC 1894 form (DSN). The bounce
service now uses the's generic bounce logfile API. File: service now uses the generic bounce logfile API. File:
bounce/bounce_notify_service.c, bounce/bounce_notify_util.c. bounce/bounce_notify_service.c, bounce/bounce_notify_util.c.
Cleanup: deleted the per-recipient bounce protocol. Future Cleanup: deleted the per-recipient bounce protocol. Future
@@ -4353,3 +4353,45 @@ Apologies for any names omitted.
Portability: Redhat 7 library interfaces have changed Portability: Redhat 7 library interfaces have changed
incompatibly, which breaks existing software. File makedefs. incompatibly, which breaks existing software. File makedefs.
Bugfix: the fallback_relay parameter did not work with []
or with network ports, and Postfix would always attempt to
perform MX record lookups. Files: smtp/smtp_addr.c
Convenience: you can now specify multiple destinations in
the relayhost configuration parameter. They will be tried
in the specified order. File: smtp/smtp_connect.c.
Typographical corrections by Matthias Andree.
20001024
Documentation: the canonical, virtual etc. manual pages
did not document the effect of leading whitespace.
20001025
Bugfix: virtual map expansion stopped too early with
self-referential aliases. Reported by Michael Douglass
@ datafoundry.net. File: cleanup/cleanup_map1n.c.
20001026
Horror: postmap and postalias (newaliases) silently lose
the file lock while building a lookup table with Berkeley
DB 2.x and later on Solaris, HP-UX or IRIX. The result is
that table lookups fail while the table is being built, so
that mail is lost. In order to avoid this misbehavior one
has to use an undocumented feature that is NOT available
with the DB1.85 compatibility interface. Therefore, Postfix
now supports three Berkeley DB programming interfaces of
increasing complexity. File: util/dict_db.c.
Bugfix: made some character manipulations independent of
signed/unsigned characters. Files: global/quote_821_local.c,
global/quote_822_local.c.
Workaround: some software sends SMTP mail that begins with
"From sender time-stamp". Sendmail accepts such RFC vioating
garbage, and therefore Postfix needs to jump another hoop.
File: smtpd/smtpd.c.

View File

@@ -31,7 +31,7 @@ should be executed as an unprivileged user.
================= =================
Documentation is available as HTML web pages (point your browser Documentation is available as HTML web pages (point your browser
to html/index.html) and as UNIX-style manpages (point your MANPATH to html/index.html) and as UNIX-style man pages (point your MANPATH
environment variable to the `man' subdirectory; be sure to use an environment variable to the `man' subdirectory; be sure to use an
absolute path). absolute path).
@@ -419,7 +419,7 @@ every Postfix daemon can run chrooted.
By default, no Postfix daemon runs chrooted. In order to enable By default, no Postfix daemon runs chrooted. In order to enable
chroot operation, edit the file /etc/postfix/master.cf. It is chroot operation, edit the file /etc/postfix/master.cf. It is
highy recommended to chroot the daemons that talk to the network: highly recommended to chroot the daemons that talk to the network:
the smtp and smtpd processes. the smtp and smtpd processes.
Note that a chrooted daemon resolves all filenames relative to the Note that a chrooted daemon resolves all filenames relative to the
@@ -432,7 +432,7 @@ Postfix systems.
12 - Security: writable versus protected maildrop directory 12 - Security: writable versus protected maildrop directory
=========================================================== ===========================================================
Postfix offers a choice of submission mechanims. Postfix offers a choice of submission mechanisms.
1 - Postfix can use a world-writable, sticky, mode 1733 maildrop 1 - Postfix can use a world-writable, sticky, mode 1733 maildrop
directory where local users can submit mail. This approach directory where local users can submit mail. This approach

View File

@@ -31,7 +31,7 @@ Next, put the following in /etc/inetd.conf:
/usr/sbin/tcpd is from the tcp_wrappers package. You want this to /usr/sbin/tcpd is from the tcp_wrappers package. You want this to
make sure only your mail relay(s) can talk to the LMTP server. make sure only your mail relay(s) can talk to the LMTP server.
Postfix by default does multiple deliveries per LMTP session Postfix by default does multiple deliveries per LMTP session
(connection cacheing), so do not worry about the overhead of (connection caching), so do not worry about the overhead of
tcp_wrapping the LMTP port. tcp_wrapping the LMTP port.
On some systems, tcpd is built into inetd, so you do not have to On some systems, tcpd is built into inetd, so you do not have to
@@ -63,15 +63,15 @@ Instead of "hash", use the map type of your choice. Some systems
use "dbm" instead. Use "postconf -m" to find out what map types use "dbm" instead. Use "postconf -m" to find out what map types
are supported. are supported.
Improving connection cacheing performance Improving connection caching performance
========================================= ========================================
After delivering a message via LMTP, Postfix will keep the connection After delivering a message via LMTP, Postfix will keep the connection
open for a while, so that it can be reused for a subsequent delivery. open for a while, so that it can be reused for a subsequent delivery.
This reduces overhead of LMTP servers that create one process per This reduces overhead of LMTP servers that create one process per
connection. connection.
For LMTP connection cacheing to work, the Postfix LMTP client should For LMTP connection caching to work, the Postfix LMTP client should
not switch destination hosts. This is no problem when you run only not switch destination hosts. This is no problem when you run only
one LMTP server. However, if you run multiple LMTP servers, this one LMTP server. However, if you run multiple LMTP servers, this
can be an issue. can be an issue.

View File

@@ -37,7 +37,7 @@ map config file follows:
# the user name and password to log into the mysql server # the user name and password to log into the mysql server
user = someone user = someone
password = some_passwordd password = some_password
# the database name on the servers # the database name on the servers
dbname = customer_database dbname = customer_database
@@ -79,7 +79,7 @@ databases on two or more hosts. Whenever queries fail with an error
at one host, the rest of the hosts will be tried in order. Each host at one host, the rest of the hosts will be tried in order. Each host
that is in an error state will undergo a reconnection attempt every so that is in an error state will undergo a reconnection attempt every so
often, and if no mysql server hosts are reachable, then mail will be often, and if no mysql server hosts are reachable, then mail will be
deferred until atleast one of those hosts is reachable. deferred until at least one of those hosts is reachable.
Performance of postfix with mysql has not been thoroughly tested, Performance of postfix with mysql has not been thoroughly tested,
however, we have found it to be stable. Busy mail servers using mysql however, we have found it to be stable. Busy mail servers using mysql

View File

@@ -1,3 +1,17 @@
Incompatible changes with snapshot-20001027
===========================================
Berkeley DB support has changed for Solaris, HP-UX, UNIXWARE, IRIX.
You can no longer use the DB 1.85 compatibility interface, because
that interface loses the file lock while building a table, so that
table lookups fail and mail is lost. See the DB_README file for
instructions on how to build with third-party Berkeley DB support.
The "fast ETRN" policy configuration has changed. You now specify
the list of eligible "fast ETRN" domains with the fast_flush_domains
parameter (default: $relay_domains). In order to disable the feature,
specify an empty value (fast_flush_domains =).
Incompatible changes with snapshot-20001005 Incompatible changes with snapshot-20001005
=========================================== ===========================================
@@ -229,12 +243,12 @@ connections to a specific local interface. Or override the default
setting in master.cf with "smtp -o smtp_bind_address=x.x.x.x". setting in master.cf with "smtp -o smtp_bind_address=x.x.x.x".
For now, you must specify a numeric IP address. For now, you must specify a numeric IP address.
Preliminary LMTP client support over TCP with connection cacheing. Preliminary LMTP client support over TCP with connection caching.
Support for LMTP over UNIX-domain sockets will be added later as Support for LMTP over UNIX-domain sockets will be added later as
an enhancement to the transport table syntax. See the LMTP_README an enhancement to the transport table syntax. See the LMTP_README
file for more details. file for more details.
By the way, LMTP client-side connection cacheing is a good example By the way, LMTP client-side connection caching is a good example
for how to do the same in the SMTP client. for how to do the same in the SMTP client.
Preliminary support for SASL authentication, both in the SMTP server Preliminary support for SASL authentication, both in the SMTP server
@@ -684,7 +698,7 @@ Incompatible changes with postfix-beta-19990122:
customer.org smtp:[gateway.customer.org] customer.org smtp:[gateway.customer.org]
.customer.org smtp:[gateway.customer.org] .customer.org smtp:[gateway.customer.org]
This change makes tranport tables more compatible with This change makes transport tables more compatible with
sendmail mailer tables. sendmail mailer tables.
- The format of syslog records has changed. A client is now always - The format of syslog records has changed. A client is now always

View File

@@ -35,6 +35,10 @@
# Blank lines are ignored, as are lines beginning # Blank lines are ignored, as are lines beginning
# with `#'. # with `#'.
# #
# leading whitespace
# Lines that begin with whitespace continue the pre-
# vious line.
#
# pattern action # pattern action
# When pattern matches a mail address, domain or host # When pattern matches a mail address, domain or host
# address, perform the corresponding action. # address, perform the corresponding action.
@@ -52,13 +56,13 @@
# thereof, either in hostnames or in mail addresses. # thereof, either in hostnames or in mail addresses.
# Top-level domains will never be matched. # Top-level domains will never be matched.
# #
# user@ Matches all mail addresses with the specified user
# part.
#
# 1 # 1
# #
# ACCESS(5) ACCESS(5) # ACCESS(5) ACCESS(5)
# #
# user@ Matches all mail addresses with the specified user
# part.
#
# net.work.addr.ess # net.work.addr.ess
# #
# net.work.addr # net.work.addr
@@ -110,13 +114,14 @@
# SEE ALSO # SEE ALSO
# postmap(1) create mapping table # postmap(1) create mapping table
# smtpd(8) smtp server # smtpd(8) smtp server
# pcre_table(5) format of PCRE tables
# regexp_table(5) format of POSIX regular expression tables
# #
# 2 # 2
# #
# ACCESS(5) ACCESS(5) # ACCESS(5) ACCESS(5)
# #
# pcre_table(5) format of PCRE tables
# regexp_table(5) format of POSIX regular expression tables
#
# LICENSE # LICENSE
# The Secure Mailer license must be distributed with this # The Secure Mailer license must be distributed with this
# software. # software.

View File

@@ -50,16 +50,19 @@
# Blank lines are ignored, as are lines beginning # Blank lines are ignored, as are lines beginning
# with `#'. # with `#'.
# #
# pattern result # leading whitespace
# When pattern matches a mail address, replace it by # Lines that begin with whitespace continue the pre-
# the corresponding result. # vious line.
#
# With lookups from indexed files such as DB or DBM, or from
# #
# 1 # 1
# #
# CANONICAL(5) CANONICAL(5) # CANONICAL(5) CANONICAL(5)
# #
# pattern result
# When pattern matches a mail address, replace it by
# the corresponding result.
#
# With lookups from indexed files such as DB or DBM, or from
# networked tables such as NIS, LDAP or SQL, patterns are # networked tables such as NIS, LDAP or SQL, patterns are
# tried in the order as listed below: # tried in the order as listed below:
# #
@@ -109,16 +112,16 @@
# foo. # foo.
# #
# Patterns are applied in the order as specified in the # Patterns are applied in the order as specified in the
# table, until a pattern is found that matches the search
# string.
#
# Results are the same as with normal indexed file lookups,
# with the additional feature that parenthesized substrings
# #
# 2 # 2
# #
# CANONICAL(5) CANONICAL(5) # CANONICAL(5) CANONICAL(5)
# #
# table, until a pattern is found that matches the search
# string.
#
# Results are the same as with normal indexed file lookups,
# with the additional feature that parenthesized substrings
# from the pattern can be interpolated as $1, $2 and so on. # from the pattern can be interpolated as $1, $2 and so on.
# #
# BUGS # BUGS
@@ -168,15 +171,16 @@
# #
# SEE ALSO # SEE ALSO
# cleanup(8) canonicalize and enqueue mail # cleanup(8) canonicalize and enqueue mail
# postmap(1) create mapping table
# virtual(5) virtual domain mapping
# pcre_table(5) format of PCRE tables
# regexp_table(5) format of POSIX regular expression tables
# #
# 3 # 3
# #
# CANONICAL(5) CANONICAL(5) # CANONICAL(5) CANONICAL(5)
# #
# postmap(1) create mapping table
# virtual(5) virtual domain mapping
# pcre_table(5) format of PCRE tables
# regexp_table(5) format of POSIX regular expression tables
#
# LICENSE # LICENSE
# The Secure Mailer license must be distributed with this # The Secure Mailer license must be distributed with this
# software. # software.

View File

@@ -288,7 +288,8 @@ mail_owner = postfix
# headers. This requires that POSIX or PCRE regular expression support # headers. This requires that POSIX or PCRE regular expression support
# is built-in. Specify "/^header-name: stuff you do not want/ REJECT" # is built-in. Specify "/^header-name: stuff you do not want/ REJECT"
# in the pattern file. Patterns are case-insensitive by default. Note: # in the pattern file. Patterns are case-insensitive by default. Note:
# specify only patterns ending in REJECT. Patterns ending in OK are # specify only patterns ending in REJECT (reject entire message) or
# IGNORE (silently discard this header). Patterns ending in OK are
# mostly a waste of cycles. # mostly a waste of cycles.
# #
#header_checks = regexp:/etc/postfix/filename #header_checks = regexp:/etc/postfix/filename
@@ -354,14 +355,11 @@ mail_owner = postfix
# SMTP "ETRN domain.name" command, or after execution of "sendmail # SMTP "ETRN domain.name" command, or after execution of "sendmail
# -qRdomain.name". This can be slow when a lot of mail is queued. # -qRdomain.name". This can be slow when a lot of mail is queued.
# #
# The fast_flush_policy controls what destinations are eligible for # The fast_flush_domains controls what destinations are eligible for
# this "fast ETRN/sendmail -qR" service. Specify "all" to make all # this "fast ETRN/sendmail -qR" service.
# destinations eligible, "relay" for relay destinations only (the
# default), and "none" to turn this feature off.
# #
#fast_flush_policy = all #fast_flush_domains = $relay_domains
#fast_flush_policy = relay #fast_flush_policy =
#fast_flush_policy = none
# SHOW SOFTWARE VERSION OR NOT # SHOW SOFTWARE VERSION OR NOT
# #

View File

@@ -22,6 +22,10 @@
# Blank lines are ignored, as are lines beginning # Blank lines are ignored, as are lines beginning
# with `#'. # with `#'.
# #
# leading whitespace
# Lines that begin with whitespace continue the pre-
# vious line.
#
# pattern result # pattern result
# When pattern matches a search string, use the cor- # When pattern matches a search string, use the cor-
# responding result. A line that starts with white # responding result. A line that starts with white
@@ -51,16 +55,15 @@
# table, until a pattern is found that matches the search # table, until a pattern is found that matches the search
# string. # string.
# #
# Substitution of sub-strings from the matched expression is
# possible using the conventional perl syntax ($1, $2,
# etc.). The macros in the replacement string may need to be
# written as ${n} or $(n) if they aren't followed by
#
# 1 # 1
# #
# PCRE_TABLE(5) PCRE_TABLE(5) # PCRE_TABLE(5) PCRE_TABLE(5)
# #
# whitespace. # Substitution of sub-strings from the matched expression is
# possible using the conventional perl syntax ($1, $2,
# etc.). The macros in the replacement string may need to be
# written as ${n} or $(n) if they aren't followed by whites-
# pace.
# #
# EXAMPLES # EXAMPLES
# # Protect your outgoing majordomo exploders # # Protect your outgoing majordomo exploders

View File

@@ -22,6 +22,10 @@
# Blank lines are ignored, as are lines beginning # Blank lines are ignored, as are lines beginning
# with `#'. # with `#'.
# #
# leading whitespace
# Lines that begin with whitespace continue the pre-
# vious line.
#
# pattern result # pattern result
# When pattern matches a search string, use the cor- # When pattern matches a search string, use the cor-
# responding result. A line that starts with white # responding result. A line that starts with white
@@ -51,15 +55,15 @@
# parts, nor is user+foo broken up into user and foo. # parts, nor is user+foo broken up into user and foo.
# #
# Patterns are applied in the order as specified in the # Patterns are applied in the order as specified in the
# table, until a pattern is found that matches the search
# string.
#
# Substitution of sub-strings from the matched expression is
# #
# 1 # 1
# #
# REGEXP_TABLE(5) REGEXP_TABLE(5) # REGEXP_TABLE(5) REGEXP_TABLE(5)
# #
# table, until a pattern is found that matches the search
# string.
#
# Substitution of sub-strings from the matched expression is
# possible using $1, $2, etc.. The macros in the replacement # possible using $1, $2, etc.. The macros in the replacement
# string may need to be written as ${n} or $(n) if they # string may need to be written as ${n} or $(n) if they
# aren't followed by whitespace. # aren't followed by whitespace.

View File

@@ -35,6 +35,9 @@
# o Blank lines are ignored, as are lines beginning # o Blank lines are ignored, as are lines beginning
# with `#'. # with `#'.
# #
# o Lines that begin with whitespace continue the pre-
# vious line.
#
# o An entry has one of the following form: # o An entry has one of the following form:
# key new_location # key new_location
# Where new_location specifies contact information # Where new_location specifies contact information
@@ -53,13 +56,12 @@
# is listed in $mydestination, or when site is listed # is listed in $mydestination, or when site is listed
# in $inet_interfaces. # in $inet_interfaces.
# #
# @domain
# Matches every address in domain. This form has the
#
# 1 # 1
# #
# RELOCATED(5) RELOCATED(5) # RELOCATED(5) RELOCATED(5)
# #
# @domain
# Matches every address in domain. This form has the
# lowest precedence. # lowest precedence.
# #
# ADDRESS EXTENSION # ADDRESS EXTENSION

View File

@@ -8,8 +8,15 @@
# that each logical message header is matched against, including # that each logical message header is matched against, including
# headers that span multiple physical lines. Patterns are matched # headers that span multiple physical lines. Patterns are matched
# in the specified order, and the search stops upon the first match. # in the specified order, and the search stops upon the first match.
# When a pattern matches, and the associated action is REJECT, the # When a pattern matches, what happens next depends on the associated
# entire message is rejected. # action:
#
# REJECT the entire message is rejected.
#
# IGNORE the header line is silently discarded.
#
# OK Nothing happens. the message will still be rejected when some
# other header line matches a REJECT pattern.
# #
# These patterns do not apply to MIME headers in the message body. # These patterns do not apply to MIME headers in the message body.
# #
@@ -21,7 +28,14 @@ header_checks = regexp:/etc/postfix/header_checks
# recognize multi-line MIME headers). Lines are matched one at a # recognize multi-line MIME headers). Lines are matched one at a
# time. Long lines are matched in chunks of at most $line_length_limit # time. Long lines are matched in chunks of at most $line_length_limit
# characters. Patterns are matched in the specified order, and the # characters. Patterns are matched in the specified order, and the
# search stops upon the first match. When a pattern matches, and # search stops upon the first match. When a pattern matches, what
# the associated action is REJECT, the entire message is rejected. # happens next depends on the associated action:
#
# REJECT the entire message is rejected.
#
# IGNORE the body line is silently discarded.
#
# OK Nothing happens. The message will still be rejected when some
# other body line matches a REJECT pattern.
# #
body_checks = regexp:/etc/postfix/body_checks body_checks = regexp:/etc/postfix/body_checks

View File

@@ -5,7 +5,7 @@
# control the fast flush service, which is the code that implements # control the fast flush service, which is the code that implements
# fast ETRN and fast "sendmail -qR". # fast ETRN and fast "sendmail -qR".
# The fast_flush_policy parameter specifies what destinations are # The fast_flush_domains parameter specifies what destinations are
# eligible for per-destination logfiles with mail that is queued to # eligible for per-destination logfiles with mail that is queued to
# those destinations. # those destinations.
# #
@@ -25,12 +25,10 @@
# destinations that the Postfix SMTP server is willing to relay to # destinations that the Postfix SMTP server is willing to relay to
# (see the relay_domains parameter in sample-smtpd.cf). # (see the relay_domains parameter in sample-smtpd.cf).
# #
# Specify "all" to enable "fast flush" logfiles for all destinations, # Specify "fast_flush_policy =" to disable the feature altogether.
# "none" to disable the logfiles altogether.
# #
#fast_flush_policy = all fast_flush_policy = $relay_domains
fast_flush_policy = relay #fast_flush_policy =
#fast_flush_policy = none
# The fast_flush_purge_time parameter controls how long an empty # The fast_flush_purge_time parameter controls how long an empty
# per-destination "fast flush" logfile is allowed to live. # per-destination "fast flush" logfile is allowed to live.

View File

@@ -35,6 +35,10 @@
# Blank lines are ignored, as are lines beginning # Blank lines are ignored, as are lines beginning
# with `#'. # with `#'.
# #
# leading whitespace
# Lines that begin with whitespace continue the pre-
# vious line.
#
# pattern result # pattern result
# When pattern matches the domain, use the corre- # When pattern matches the domain, use the corre-
# sponding result. # sponding result.
@@ -51,16 +55,15 @@
# Mail for any subdomain of domain is delivered # Mail for any subdomain of domain is delivered
# through transport to nexthop. # through transport to nexthop.
# #
# Note: transport map entries take precedence over domains
# specified in the mydestination parameter. If you use the
# optional transport map, it may be safer to specify
# explicit entries for all domains specified in
#
# 1 # 1
# #
# TRANSPORT(5) TRANSPORT(5) # TRANSPORT(5) TRANSPORT(5)
# #
# mydestination, for example: # Note: transport map entries take precedence over domains
# specified in the mydestination parameter. If you use the
# optional transport map, it may be safer to specify
# explicit entries for all domains specified in mydestina-
# tion, for example:
# #
# hostname.my.domain local: # hostname.my.domain local:
# localhost.my.domain local: # localhost.my.domain local:
@@ -110,15 +113,15 @@
# used. Specify [] around the hostname in order to disable # used. Specify [] around the hostname in order to disable
# MX lookups. # MX lookups.
# #
# 2
#
# TRANSPORT(5) TRANSPORT(5)
#
# The error mailer can be used to bounce mail: # The error mailer can be used to bounce mail:
# #
# .foo.org error:mail for *.foo.org is not deliv- # .foo.org error:mail for *.foo.org is not deliv-
# erable # erable
# #
# 2
#
# TRANSPORT(5) TRANSPORT(5)
#
# This causes all mail for user@anything.foo.org to be # This causes all mail for user@anything.foo.org to be
# bounced. # bounced.
# #
@@ -169,15 +172,14 @@
# The Secure Mailer license must be distributed with this # The Secure Mailer license must be distributed with this
# software. # software.
# #
# AUTHOR(S)
# Wietse Venema
# IBM T.J. Watson Research
# P.O. Box 704
#
# 3 # 3
# #
# TRANSPORT(5) TRANSPORT(5) # TRANSPORT(5) TRANSPORT(5)
# #
# AUTHOR(S)
# Wietse Venema
# IBM T.J. Watson Research
# P.O. Box 704
# Yorktown Heights, NY 10598, USA # Yorktown Heights, NY 10598, USA
# #
# 4 # 4

View File

@@ -58,6 +58,10 @@
# #
# VIRTUAL(5) VIRTUAL(5) # VIRTUAL(5) VIRTUAL(5)
# #
# leading whitespace
# Lines that begin with whitespace continue the pre-
# vious line.
#
# pattern result # pattern result
# When pattern matches a mail address, replace it by # When pattern matches a mail address, replace it by
# the corresponding result. # the corresponding result.
@@ -109,14 +113,14 @@
# constituent parts, nor is user+foo broken up into user and # constituent parts, nor is user+foo broken up into user and
# foo. # foo.
# #
# Patterns are applied in the order as specified in the
# table, until a pattern is found that matches the search
# string.
#
# 2 # 2
# #
# VIRTUAL(5) VIRTUAL(5) # VIRTUAL(5) VIRTUAL(5)
# #
# Patterns are applied in the order as specified in the
# table, until a pattern is found that matches the search
# string.
#
# Results are the same as with normal indexed file lookups, # Results are the same as with normal indexed file lookups,
# with the additional feature that parenthesized substrings # with the additional feature that parenthesized substrings
# from the pattern can be interpolated as $1, $2 and so on. # from the pattern can be interpolated as $1, $2 and so on.

View File

@@ -39,6 +39,10 @@ ACCESS(5) ACCESS(5)
Blank lines are ignored, as are lines beginning Blank lines are ignored, as are lines beginning
with `#'. with `#'.
leading whitespace
Lines that begin with whitespace continue the pre-
vious line.
<i>pattern</i> <i>action</i> <i>pattern</i> <i>action</i>
When <i>pattern</i> matches a mail address, domain or host When <i>pattern</i> matches a mail address, domain or host
address, perform the corresponding <i>action</i>. address, perform the corresponding <i>action</i>.
@@ -56,10 +60,6 @@ ACCESS(5) ACCESS(5)
thereof, either in hostnames or in mail addresses. thereof, either in hostnames or in mail addresses.
Top-level domains will never be matched. Top-level domains will never be matched.
<i>user</i>@ Matches all mail addresses with the specified user
part.
1 1
@@ -71,6 +71,9 @@ ACCESS(5) ACCESS(5)
ACCESS(5) ACCESS(5) ACCESS(5) ACCESS(5)
<i>user</i>@ Matches all mail addresses with the specified user
part.
<i>net.work.addr.ess</i> <i>net.work.addr.ess</i>
<i>net.work.addr</i> <i>net.work.addr</i>
@@ -122,9 +125,6 @@ ACCESS(5) ACCESS(5)
<b>SEE</b> <b>ALSO</b> <b>SEE</b> <b>ALSO</b>
<a href="postmap.1.html">postmap(1)</a> create mapping table <a href="postmap.1.html">postmap(1)</a> create mapping table
<a href="smtpd.8.html">smtpd(8)</a> smtp server <a href="smtpd.8.html">smtpd(8)</a> smtp server
<a href="pcre_table.5.html">pcre_table(5)</a> format of PCRE tables
<a href="regexp_table.5.html">regexp_table(5)</a> format of POSIX regular expression tables
@@ -137,6 +137,9 @@ ACCESS(5) ACCESS(5)
ACCESS(5) ACCESS(5) ACCESS(5) ACCESS(5)
<a href="pcre_table.5.html">pcre_table(5)</a> format of PCRE tables
<a href="regexp_table.5.html">regexp_table(5)</a> format of POSIX regular expression tables
<b>LICENSE</b> <b>LICENSE</b>
The Secure Mailer license must be distributed with this The Secure Mailer license must be distributed with this
software. software.
@@ -187,9 +190,6 @@ ACCESS(5) ACCESS(5)

View File

@@ -54,11 +54,11 @@ CANONICAL(5) CANONICAL(5)
Blank lines are ignored, as are lines beginning Blank lines are ignored, as are lines beginning
with `#'. with `#'.
<i>pattern</i> <i>result</i> leading whitespace
When <i>pattern</i> matches a mail address, replace it by Lines that begin with whitespace continue the pre-
the corresponding <i>result</i>. vious line.
With lookups from indexed files such as DB or DBM, or from
@@ -71,6 +71,11 @@ CANONICAL(5) CANONICAL(5)
CANONICAL(5) CANONICAL(5) CANONICAL(5) CANONICAL(5)
<i>pattern</i> <i>result</i>
When <i>pattern</i> matches a mail address, replace it by
the corresponding <i>result</i>.
With lookups from indexed files such as DB or DBM, or from
networked tables such as NIS, LDAP or SQL, patterns are networked tables such as NIS, LDAP or SQL, patterns are
tried in the order as listed below: tried in the order as listed below:
@@ -120,11 +125,6 @@ CANONICAL(5) CANONICAL(5)
<i>foo</i>. <i>foo</i>.
Patterns are applied in the order as specified in the Patterns are applied in the order as specified in the
table, until a pattern is found that matches the search
string.
Results are the same as with normal indexed file lookups,
with the additional feature that parenthesized substrings
@@ -137,6 +137,11 @@ CANONICAL(5) CANONICAL(5)
CANONICAL(5) CANONICAL(5) CANONICAL(5) CANONICAL(5)
table, until a pattern is found that matches the search
string.
Results are the same as with normal 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. from the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on.
<b>BUGS</b> <b>BUGS</b>
@@ -186,11 +191,6 @@ CANONICAL(5) CANONICAL(5)
<b>SEE</b> <b>ALSO</b> <b>SEE</b> <b>ALSO</b>
<a href="cleanup.8.html">cleanup(8)</a> canonicalize and enqueue mail <a href="cleanup.8.html">cleanup(8)</a> canonicalize and enqueue mail
<a href="postmap.1.html">postmap(1)</a> create mapping table
<a href="virtual.5.html">virtual(5)</a> virtual domain mapping
<a href="pcre_table.5.html">pcre_table(5)</a> format of PCRE tables
<a href="regexp_table.5.html">regexp_table(5)</a> format of POSIX regular expression tables
@@ -203,6 +203,11 @@ CANONICAL(5) CANONICAL(5)
CANONICAL(5) CANONICAL(5) CANONICAL(5) CANONICAL(5)
<a href="postmap.1.html">postmap(1)</a> create mapping table
<a href="virtual.5.html">virtual(5)</a> virtual domain mapping
<a href="pcre_table.5.html">pcre_table(5)</a> format of PCRE tables
<a href="regexp_table.5.html">regexp_table(5)</a> format of POSIX regular expression tables
<b>LICENSE</b> <b>LICENSE</b>
The Secure Mailer license must be distributed with this The Secure Mailer license must be distributed with this
software. software.
@@ -249,11 +254,6 @@ CANONICAL(5) CANONICAL(5)

View File

@@ -26,19 +26,9 @@ FLUSH(8) FLUSH(8)
an email address. an email address.
Per-destination logfiles of deferred mail are maintained Per-destination logfiles of deferred mail are maintained
only for eligible destinations. The policy is specified only for eligible destinations. The list of eligible des-
with the <b>fast</b><i>_</i><b>flush</b><i>_</i><b>policy</b> configuration parameter: tinations is specified with the <b>fast</b><i>_</i><b>flush</b><i>_</i><b>domains</b> config-
uration parameter, which defaults to <b>$relay</b><i>_</i><b>domains</b>.
<b>all</b> Maintain per-destination logfiles for all destina-
tions.
<b>relay</b> (default policy)
Maintain per-destination logfiles only for destina-
tions that this system is willing to relay mail to
(as controlled by the <b>relay</b><i>_</i><b>domains</b> configuration
parameter).
<b>none</b> Do not maintain per-destination logfiles.
This server implements the following requests: This server implements the following requests:
@@ -60,6 +50,16 @@ FLUSH(8) FLUSH(8)
logfile, this request triggers delivery of all logfile, this request triggers delivery of all
queued mail. queued mail.
<b>TRIGGER</b><i>_</i><b>REQ</b><i>_</i><b>WAKEUP</b>
This wakeup request from the master is an alterna-
tive way to request <b>FLUSH</b><i>_</i><b>REQ</b><i>_</i><b>REFRESH</b>.
<b>FLUSH</b><i>_</i><b>REQ</b><i>_</i><b>REFRESH</b> (completes in the background)
Refresh non-empty per-destination logfiles that
were not read in $<b>fast</b><i>_</i><b>flush</b><i>_</i><b>refresh</b><i>_</i><b>time</b> hours, by
simulating send requests (see above) for the corre-
sponding destinations.
1 1
@@ -71,16 +71,6 @@ FLUSH(8) FLUSH(8)
FLUSH(8) FLUSH(8) FLUSH(8) FLUSH(8)
<b>TRIGGER</b><i>_</i><b>REQ</b><i>_</i><b>WAKEUP</b>
This wakeup request from the master is an alterna-
tive way to request <b>FLUSH</b><i>_</i><b>REQ</b><i>_</i><b>REFRESH</b>.
<b>FLUSH</b><i>_</i><b>REQ</b><i>_</i><b>REFRESH</b> (completes in the background)
Refresh non-empty per-destination logfiles that
were not read in $<b>fast</b><i>_</i><b>flush</b><i>_</i><b>refresh</b><i>_</i><b>time</b> hours, by
simulating send requests (see above) for the corre-
sponding destinations.
Delete empty per-destination logfiles that were not Delete empty per-destination logfiles that were not
updated in <b>fast</b><i>_</i><b>flush</b><i>_</i><b>purge</b><i>_</i><b>time</b> days. updated in <b>fast</b><i>_</i><b>flush</b><i>_</i><b>purge</b><i>_</i><b>time</b> days.
@@ -124,7 +114,17 @@ FLUSH(8) FLUSH(8)
suitable wakeup timer setting in the <b>master.cf</b> configura- suitable wakeup timer setting in the <b>master.cf</b> configura-
tion file. tion file.
Upon receipt of a request to deliver all mail for an Upon receipt of a request to deliver all mail for an eli-
gible destination, this server requests delivery of all
messages that are listed in that destination's logfile,
regardless of the recipients of those messages. This is
not an issue for mail that is sent to a <b>relay</b><i>_</i><b>domains</b> des-
tination because such mail typically only has recipients
in one domain.
<b>FILES</b>
/var/spool/postfix/flush, location of "fast flush" logfiles.
@@ -137,24 +137,14 @@ FLUSH(8) FLUSH(8)
FLUSH(8) FLUSH(8) FLUSH(8) FLUSH(8)
eligible destination, this server requests delivery of all
messages that are listed in that destination's logfile,
regardless of the recipients of those messages. This is
not an issue for mail that is sent to a <b>relay</b><i>_</i><b>domains</b> des-
tination because such mail typically only has recipients
in one domain.
<b>FILES</b>
/var/spool/postfix/flush, location of "fast flush" logfiles.
<b>CONFIGURATION</b> <b>PARAMETERS</b> <b>CONFIGURATION</b> <b>PARAMETERS</b>
See the Postfix <b>main.cf</b> file for syntax details and for See the Postfix <b>main.cf</b> file for syntax details and for
default values. Use the <b>postfix</b> <b>reload</b> command after a default values. Use the <b>postfix</b> <b>reload</b> command after a
configuration change. configuration change.
<b>fast</b><i>_</i><b>flush</b><i>_</i><b>policy</b> <b>fast</b><i>_</i><b>flush</b><i>_</i><b>domains</b>
What destinations can have a "fast flush" logfile: What destinations can have a "fast flush" logfile.
<b>all</b>, <b>relay</b> (relay destinations) or <b>none</b>. By default, this is set to <b>$relay</b><i>_</i><b>domains</b>.
<b>fast</b><i>_</i><b>flush</b><i>_</i><b>refresh</b><i>_</i><b>time</b> <b>fast</b><i>_</i><b>flush</b><i>_</i><b>refresh</b><i>_</i><b>time</b>
Refresh a non-empty "fast flush" logfile that was Refresh a non-empty "fast flush" logfile that was
@@ -191,6 +181,16 @@ FLUSH(8) FLUSH(8)

View File

@@ -26,6 +26,10 @@ PCRE_TABLE(5) PCRE_TABLE(5)
Blank lines are ignored, as are lines beginning Blank lines are ignored, as are lines beginning
with `#'. with `#'.
leading whitespace
Lines that begin with whitespace continue the pre-
vious line.
<i>pattern</i> <i>result</i> <i>pattern</i> <i>result</i>
When <i>pattern</i> matches a search string, use the cor- When <i>pattern</i> matches a search string, use the cor-
responding <i>result</i>. A line that starts with white responding <i>result</i>. A line that starts with white
@@ -55,10 +59,6 @@ PCRE_TABLE(5) PCRE_TABLE(5)
table, until a pattern is found that matches the search table, until a pattern is found that matches the search
string. string.
Substitution of sub-strings from the matched expression is
possible using the conventional perl syntax ($1, $2,
etc.). The macros in the replacement string may need to be
written as ${n} or $(n) if they aren't followed by
@@ -71,7 +71,11 @@ PCRE_TABLE(5) PCRE_TABLE(5)
PCRE_TABLE(5) PCRE_TABLE(5) PCRE_TABLE(5) PCRE_TABLE(5)
whitespace. Substitution of sub-strings from the matched expression is
possible using the conventional perl syntax ($1, $2,
etc.). The macros in the replacement string may need to be
written as ${n} or $(n) if they aren't followed by whites-
pace.
<b>EXAMPLES</b> <b>EXAMPLES</b>
# Protect your outgoing majordomo exploders # Protect your outgoing majordomo exploders
@@ -119,10 +123,6 @@ PCRE_TABLE(5) PCRE_TABLE(5)

View File

@@ -26,6 +26,10 @@ REGEXP_TABLE(5) REGEXP_TABLE(5)
Blank lines are ignored, as are lines beginning Blank lines are ignored, as are lines beginning
with `#'. with `#'.
leading whitespace
Lines that begin with whitespace continue the pre-
vious line.
<i>pattern</i> <i>result</i> <i>pattern</i> <i>result</i>
When <i>pattern</i> matches a search string, use the cor- When <i>pattern</i> matches a search string, use the cor-
responding <i>result</i>. A line that starts with white responding <i>result</i>. A line that starts with white
@@ -55,10 +59,6 @@ REGEXP_TABLE(5) REGEXP_TABLE(5)
parts, nor is <i>user+foo</i> broken up into <i>user</i> and <i>foo</i>. 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 Patterns are applied in the order as specified in the
table, until a pattern is found that matches the search
string.
Substitution of sub-strings from the matched expression is
@@ -71,6 +71,10 @@ REGEXP_TABLE(5) REGEXP_TABLE(5)
REGEXP_TABLE(5) REGEXP_TABLE(5) REGEXP_TABLE(5) REGEXP_TABLE(5)
table, until a pattern is found that matches the search
string.
Substitution of sub-strings from the matched expression is
possible using $1, $2, etc.. The macros in the replacement possible using $1, $2, etc.. The macros in the replacement
string may need to be written as ${n} or $(n) if they string may need to be written as ${n} or $(n) if they
aren't followed by whitespace. aren't followed by whitespace.
@@ -123,10 +127,6 @@ REGEXP_TABLE(5) REGEXP_TABLE(5)
2 2

View File

@@ -39,6 +39,9 @@ RELOCATED(5) RELOCATED(5)
<b>o</b> Blank lines are ignored, as are lines beginning <b>o</b> Blank lines are ignored, as are lines beginning
with `#'. with `#'.
<b>o</b> Lines that begin with whitespace continue the pre-
vious line.
<b>o</b> An entry has one of the following form: <b>o</b> An entry has one of the following form:
<i>key</i> <i>new_location</i> <i>key</i> <i>new_location</i>
Where <i>new_location</i> specifies contact information Where <i>new_location</i> specifies contact information
@@ -57,9 +60,6 @@ RELOCATED(5) RELOCATED(5)
is listed in $<b>mydestination</b>, or when <i>site</i> is listed is listed in $<b>mydestination</b>, or when <i>site</i> is listed
in $<b>inet</b><i>_</i><b>interfaces</b>. in $<b>inet</b><i>_</i><b>interfaces</b>.
@<i>domain</i>
Matches every address in <i>domain</i>. This form has the
1 1
@@ -71,6 +71,8 @@ RELOCATED(5) RELOCATED(5)
RELOCATED(5) RELOCATED(5) RELOCATED(5) RELOCATED(5)
@<i>domain</i>
Matches every address in <i>domain</i>. This form has the
lowest precedence. lowest precedence.
<b>ADDRESS</b> <b>EXTENSION</b> <b>ADDRESS</b> <b>EXTENSION</b>
@@ -126,8 +128,6 @@ RELOCATED(5) RELOCATED(5)
2 2

View File

@@ -39,6 +39,10 @@ TRANSPORT(5) TRANSPORT(5)
Blank lines are ignored, as are lines beginning Blank lines are ignored, as are lines beginning
with `#'. with `#'.
leading whitespace
Lines that begin with whitespace continue the pre-
vious line.
<i>pattern</i> <i>result</i> <i>pattern</i> <i>result</i>
When <i>pattern</i> matches the domain, use the corre- When <i>pattern</i> matches the domain, use the corre-
sponding <i>result</i>. sponding <i>result</i>.
@@ -55,10 +59,6 @@ TRANSPORT(5) TRANSPORT(5)
Mail for any subdomain of <i>domain</i> is delivered Mail for any subdomain of <i>domain</i> is delivered
through <i>transport</i> to <i>nexthop</i>. through <i>transport</i> to <i>nexthop</i>.
Note: transport map entries take precedence over domains
specified in the <b>mydestination</b> parameter. If you use the
optional transport map, it may be safer to specify
explicit entries for all domains specified in
@@ -71,7 +71,11 @@ TRANSPORT(5) TRANSPORT(5)
TRANSPORT(5) TRANSPORT(5) TRANSPORT(5) TRANSPORT(5)
<b>mydestination</b>, for example: Note: transport map entries take precedence over domains
specified in the <b>mydestination</b> parameter. If you use the
optional transport map, it may be safer to specify
explicit entries for all domains specified in <b>mydestina-</b>
<b>tion</b>, for example:
<b>hostname.my.domain</b> <b>local:</b> <b>hostname.my.domain</b> <b>local:</b>
<b>localhost.my.domain</b> <b>local:</b> <b>localhost.my.domain</b> <b>local:</b>
@@ -121,10 +125,6 @@ TRANSPORT(5) TRANSPORT(5)
used. Specify [] around the hostname in order to disable used. Specify [] around the hostname in order to disable
MX lookups. MX lookups.
The error mailer can be used to bounce mail:
<b>.foo.org</b> <b>error:mail</b> <b>for</b> <b>*.foo.org</b> <b>is</b> <b>not</b> <b>deliv-</b>
<b>erable</b>
@@ -137,6 +137,11 @@ TRANSPORT(5) TRANSPORT(5)
TRANSPORT(5) TRANSPORT(5) TRANSPORT(5) TRANSPORT(5)
The error mailer can be used to bounce mail:
<b>.foo.org</b> <b>error:mail</b> <b>for</b> <b>*.foo.org</b> <b>is</b> <b>not</b> <b>deliv-</b>
<b>erable</b>
This causes all mail for <i>user</i>@<i>anything</i><b>.foo.org</b> to be This causes all mail for <i>user</i>@<i>anything</i><b>.foo.org</b> to be
bounced. bounced.
@@ -187,11 +192,6 @@ TRANSPORT(5) TRANSPORT(5)
The Secure Mailer license must be distributed with this The Secure Mailer license must be distributed with this
software. software.
<b>AUTHOR(S)</b>
Wietse Venema
IBM T.J. Watson Research
P.O. Box 704
3 3
@@ -203,6 +203,10 @@ TRANSPORT(5) TRANSPORT(5)
TRANSPORT(5) TRANSPORT(5) TRANSPORT(5) TRANSPORT(5)
<b>AUTHOR(S)</b>
Wietse Venema
IBM T.J. Watson Research
P.O. Box 704
Yorktown Heights, NY 10598, USA Yorktown Heights, NY 10598, USA
@@ -251,10 +255,6 @@ TRANSPORT(5) TRANSPORT(5)

View File

@@ -71,6 +71,10 @@ VIRTUAL(5) VIRTUAL(5)
VIRTUAL(5) VIRTUAL(5) VIRTUAL(5) VIRTUAL(5)
leading whitespace
Lines that begin with whitespace continue the pre-
vious line.
<i>pattern</i> <i>result</i> <i>pattern</i> <i>result</i>
When <i>pattern</i> matches a mail address, replace it by When <i>pattern</i> matches a mail address, replace it by
the corresponding <i>result</i>. the corresponding <i>result</i>.
@@ -122,10 +126,6 @@ VIRTUAL(5) VIRTUAL(5)
constituent parts, nor is <i>user+foo</i> broken up into <i>user</i> and constituent parts, nor is <i>user+foo</i> broken up into <i>user</i> and
<i>foo</i>. <i>foo</i>.
Patterns are applied in the order as specified in the
table, until a pattern is found that matches the search
string.
2 2
@@ -137,6 +137,10 @@ VIRTUAL(5) VIRTUAL(5)
VIRTUAL(5) VIRTUAL(5) VIRTUAL(5) VIRTUAL(5)
Patterns are applied in the order as specified in the
table, until a pattern is found that matches the search
string.
Results are the same as with normal indexed file lookups, Results are the same as with normal indexed file lookups,
with the additional feature that parenthesized substrings with the additional feature that parenthesized substrings
from the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on. from the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on.
@@ -190,10 +194,6 @@ VIRTUAL(5) VIRTUAL(5)
3 3

View File

@@ -159,17 +159,14 @@ case "$SYSTEM.$RELEASE" in
*) echo "Unknown AIX version: `uname -v`." 1>&2; exit 1;; *) echo "Unknown AIX version: `uname -v`." 1>&2; exit 1;;
esac;; esac;;
Linux.2*) SYSTYPE=LINUX2 Linux.2*) SYSTYPE=LINUX2
if [ -f /usr/lib/lib/db-3.1.a -a -f /usr/include/db3/db_185.h ] if [ -f /usr/lib/libdb-3.1.a ]
then then
CCARGS="$CCARGS -DPATH_DB_H='<db3/db_185.h>'" CCARGS="$CCARGS -I/usr/include/db3"
SYSLIBS="$SYSLIBS -ldb-3.1" SYSLIBS="$SYSLIBS -ldb-3.1"
else else
if [ -f /usr/include/db_185.h ] if [ -f /usr/include/db/db.h ]
then then
CCARGS="$CCARGS -DPATH_DB_H='<db_185.h>'" CCARGS="$CCARGS -I/usr/include/db"
elif [ -f /usr/include/db/db.h ]
then
CCARGS="$CCARGS -DPATH_DB_H='<db/db.h>'"
fi fi
test -f /usr/lib/libdb.a && SYSLIBS="$SYSLIBS -ldb" test -f /usr/lib/libdb.a && SYSLIBS="$SYSLIBS -ldb"
fi fi

View File

@@ -36,6 +36,8 @@ the lookups are done in a slightly different way as described below.
The format of the access table is as follows: The format of the access table is as follows:
.IP "blanks and comments" .IP "blanks and comments"
Blank lines are ignored, as are lines beginning with `#'. Blank lines are ignored, as are lines beginning with `#'.
.IP "leading whitespace"
Lines that begin with whitespace continue the previous line.
.IP "\fIpattern action\fR" .IP "\fIpattern action\fR"
When \fIpattern\fR matches a mail address, domain or host address, When \fIpattern\fR matches a mail address, domain or host address,
perform the corresponding \fIaction\fR. perform the corresponding \fIaction\fR.

View File

@@ -51,6 +51,8 @@ Use the \fBaliases\fR(5) map for that purpose.
The format of the \fBcanonical\fR table is as follows: The format of the \fBcanonical\fR table is as follows:
.IP "blanks and comments" .IP "blanks and comments"
Blank lines are ignored, as are lines beginning with `#'. Blank lines are ignored, as are lines beginning with `#'.
.IP "leading whitespace"
Lines that begin with whitespace continue the previous line.
.IP "\fIpattern result\fR" .IP "\fIpattern result\fR"
When \fIpattern\fR matches a mail address, replace it by the When \fIpattern\fR matches a mail address, replace it by the
corresponding \fIresult\fR. corresponding \fIresult\fR.

View File

@@ -23,6 +23,8 @@ supports use the \fBpostconf -m\fR command.
The general form of a PCRE table is: The general form of a PCRE table is:
.IP "blanks and comments" .IP "blanks and comments"
Blank lines are ignored, as are lines beginning with `#'. Blank lines are ignored, as are lines beginning with `#'.
.IP "leading whitespace"
Lines that begin with whitespace continue the previous line.
.IP "\fIpattern result\fR" .IP "\fIpattern result\fR"
When \fIpattern\fR matches a search string, use the corresponding When \fIpattern\fR matches a search string, use the corresponding
\fIresult\fR. A line that starts with white space continues the \fIresult\fR. A line that starts with white space continues the

View File

@@ -23,6 +23,8 @@ supports use the \fBpostconf -m\fR command.
The general form of a Postfix regular expression table is: The general form of a Postfix regular expression table is:
.IP "blanks and comments" .IP "blanks and comments"
Blank lines are ignored, as are lines beginning with `#'. Blank lines are ignored, as are lines beginning with `#'.
.IP "leading whitespace"
Lines that begin with whitespace continue the previous line.
.IP "\fIpattern result\fR" .IP "\fIpattern result\fR"
When \fIpattern\fR matches a search string, use the corresponding When \fIpattern\fR matches a search string, use the corresponding
\fIresult\fR. A line that starts with white space continues the \fIresult\fR. A line that starts with white space continues the

View File

@@ -38,6 +38,8 @@ The format of the table is as follows:
.IP \(bu .IP \(bu
Blank lines are ignored, as are lines beginning with `#'. Blank lines are ignored, as are lines beginning with `#'.
.IP \(bu .IP \(bu
Lines that begin with whitespace continue the previous line.
.IP \(bu
An entry has one of the following form: An entry has one of the following form:
.ti +5 .ti +5
\fIkey new_location\fR \fIkey new_location\fR

View File

@@ -36,6 +36,8 @@ the lookups are done in a slightly different way as described below.
The format of the transport table is as follows: The format of the transport table is as follows:
.IP "blanks and comments" .IP "blanks and comments"
Blank lines are ignored, as are lines beginning with `#'. Blank lines are ignored, as are lines beginning with `#'.
.IP "leading whitespace"
Lines that begin with whitespace continue the previous line.
.IP "\fIpattern result\fR" .IP "\fIpattern result\fR"
When \fIpattern\fR matches the domain, use the corresponding When \fIpattern\fR matches the domain, use the corresponding
\fIresult\fR. \fIresult\fR.

View File

@@ -56,6 +56,8 @@ The format of the virtual table is as follows, mappings being
tried in the order as listed in this manual page: tried in the order as listed in this manual page:
.IP "blanks and comments" .IP "blanks and comments"
Blank lines are ignored, as are lines beginning with `#'. Blank lines are ignored, as are lines beginning with `#'.
.IP "leading whitespace"
Lines that begin with whitespace continue the previous line.
.IP "\fIpattern result\fR" .IP "\fIpattern result\fR"
When \fIpattern\fR matches a mail address, replace it by the When \fIpattern\fR matches a mail address, replace it by the
corresponding \fIresult\fR. corresponding \fIresult\fR.

View File

@@ -27,17 +27,10 @@ part on the right-hand side of the right-most \fB@\fR in
an email address. an email address.
Per-destination logfiles of deferred mail are maintained only for Per-destination logfiles of deferred mail are maintained only for
eligible destinations. The policy is specified with the eligible destinations. The list of eligible destinations is
\fBfast_flush_policy\fR configuration parameter: specified with the \fBfast_flush_domains\fR configuration parameter,
.IP \fBall\fR which defaults to \fB$relay_domains\fR.
Maintain per-destination logfiles for all destinations.
.IP "\fBrelay\fR (default policy)"
Maintain per-destination logfiles only for destinations
that this system is willing to relay mail to (as controlled
by the \fBrelay_domains\fR configuration parameter).
.IP \fBnone\fR
Do not maintain per-destination logfiles.
.PP
This server implements the following requests: This server implements the following requests:
.IP "\fBFLUSH_REQ_ADD\fI sitename queue_id\fR" .IP "\fBFLUSH_REQ_ADD\fI sitename queue_id\fR"
Inform the fast flush server that the specified message is queued for Inform the fast flush server that the specified message is queued for
@@ -119,9 +112,9 @@ such mail typically only has recipients in one domain.
See the Postfix \fBmain.cf\fR file for syntax details and for See the Postfix \fBmain.cf\fR file for syntax details and for
default values. Use the \fBpostfix reload\fR command after a default values. Use the \fBpostfix reload\fR command after a
configuration change. configuration change.
.IP \fBfast_flush_policy\fR .IP \fBfast_flush_domains\fR
What destinations can have a "fast flush" logfile: \fBall\fR, What destinations can have a "fast flush" logfile. By default,
\fBrelay\fR (relay destinations) or \fBnone\fR. this is set to \fB$relay_domains\fR.
.IP \fBfast_flush_refresh_time\fR .IP \fBfast_flush_refresh_time\fR
Refresh a non-empty "fast flush" logfile that was not read in Refresh a non-empty "fast flush" logfile that was not read in
this amount of time (default time unit: hours), by simulating this amount of time (default time unit: hours), by simulating

View File

@@ -28,6 +28,8 @@
# The format of the access table is as follows: # The format of the access table is as follows:
# .IP "blanks and comments" # .IP "blanks and comments"
# Blank lines are ignored, as are lines beginning with `#'. # Blank lines are ignored, as are lines beginning with `#'.
# .IP "leading whitespace"
# Lines that begin with whitespace continue the previous line.
# .IP "\fIpattern action\fR" # .IP "\fIpattern action\fR"
# When \fIpattern\fR matches a mail address, domain or host address, # When \fIpattern\fR matches a mail address, domain or host address,
# perform the corresponding \fIaction\fR. # perform the corresponding \fIaction\fR.

View File

@@ -43,6 +43,8 @@
# The format of the \fBcanonical\fR table is as follows: # The format of the \fBcanonical\fR table is as follows:
# .IP "blanks and comments" # .IP "blanks and comments"
# Blank lines are ignored, as are lines beginning with `#'. # Blank lines are ignored, as are lines beginning with `#'.
# .IP "leading whitespace"
# Lines that begin with whitespace continue the previous line.
# .IP "\fIpattern result\fR" # .IP "\fIpattern result\fR"
# When \fIpattern\fR matches a mail address, replace it by the # When \fIpattern\fR matches a mail address, replace it by the
# corresponding \fIresult\fR. # corresponding \fIresult\fR.

View File

@@ -17,6 +17,8 @@
# The general form of a PCRE table is: # The general form of a PCRE table is:
# .IP "blanks and comments" # .IP "blanks and comments"
# Blank lines are ignored, as are lines beginning with `#'. # Blank lines are ignored, as are lines beginning with `#'.
# .IP "leading whitespace"
# Lines that begin with whitespace continue the previous line.
# .IP "\fIpattern result\fR" # .IP "\fIpattern result\fR"
# When \fIpattern\fR matches a search string, use the corresponding # When \fIpattern\fR matches a search string, use the corresponding
# \fIresult\fR. A line that starts with white space continues the # \fIresult\fR. A line that starts with white space continues the

View File

@@ -17,6 +17,8 @@
# The general form of a Postfix regular expression table is: # The general form of a Postfix regular expression table is:
# .IP "blanks and comments" # .IP "blanks and comments"
# Blank lines are ignored, as are lines beginning with `#'. # Blank lines are ignored, as are lines beginning with `#'.
# .IP "leading whitespace"
# Lines that begin with whitespace continue the previous line.
# .IP "\fIpattern result\fR" # .IP "\fIpattern result\fR"
# When \fIpattern\fR matches a search string, use the corresponding # When \fIpattern\fR matches a search string, use the corresponding
# \fIresult\fR. A line that starts with white space continues the # \fIresult\fR. A line that starts with white space continues the

View File

@@ -30,6 +30,8 @@
# .IP \(bu # .IP \(bu
# Blank lines are ignored, as are lines beginning with `#'. # Blank lines are ignored, as are lines beginning with `#'.
# .IP \(bu # .IP \(bu
# Lines that begin with whitespace continue the previous line.
# .IP \(bu
# An entry has one of the following form: # An entry has one of the following form:
# .ti +5 # .ti +5
# \fIkey new_location\fR # \fIkey new_location\fR

View File

@@ -28,6 +28,8 @@
# The format of the transport table is as follows: # The format of the transport table is as follows:
# .IP "blanks and comments" # .IP "blanks and comments"
# Blank lines are ignored, as are lines beginning with `#'. # Blank lines are ignored, as are lines beginning with `#'.
# .IP "leading whitespace"
# Lines that begin with whitespace continue the previous line.
# .IP "\fIpattern result\fR" # .IP "\fIpattern result\fR"
# When \fIpattern\fR matches the domain, use the corresponding # When \fIpattern\fR matches the domain, use the corresponding
# \fIresult\fR. # \fIresult\fR.

View File

@@ -48,6 +48,8 @@
# tried in the order as listed in this manual page: # tried in the order as listed in this manual page:
# .IP "blanks and comments" # .IP "blanks and comments"
# Blank lines are ignored, as are lines beginning with `#'. # Blank lines are ignored, as are lines beginning with `#'.
# .IP "leading whitespace"
# Lines that begin with whitespace continue the previous line.
# .IP "\fIpattern result\fR" # .IP "\fIpattern result\fR"
# When \fIpattern\fR matches a mail address, replace it by the # When \fIpattern\fR matches a mail address, replace it by the
# corresponding \fIresult\fR. # corresponding \fIresult\fR.

View File

@@ -199,10 +199,10 @@ cleanup_map1n.o: ../../include/mail_addr_map.h
cleanup_map1n.o: ../../include/maps.h cleanup_map1n.o: ../../include/maps.h
cleanup_map1n.o: ../../include/cleanup_user.h cleanup_map1n.o: ../../include/cleanup_user.h
cleanup_map1n.o: ../../include/quote_822_local.h cleanup_map1n.o: ../../include/quote_822_local.h
cleanup_map1n.o: ../../include/been_here.h
cleanup_map1n.o: cleanup.h cleanup_map1n.o: cleanup.h
cleanup_map1n.o: ../../include/tok822.h cleanup_map1n.o: ../../include/tok822.h
cleanup_map1n.o: ../../include/resolve_clnt.h cleanup_map1n.o: ../../include/resolve_clnt.h
cleanup_map1n.o: ../../include/been_here.h
cleanup_map1n.o: ../../include/mail_stream.h cleanup_map1n.o: ../../include/mail_stream.h
cleanup_map1n.o: ../../include/mail_conf.h cleanup_map1n.o: ../../include/mail_conf.h
cleanup_masquerade.o: cleanup_masquerade.c cleanup_masquerade.o: cleanup_masquerade.c

View File

@@ -54,6 +54,7 @@
#include <mail_addr_map.h> #include <mail_addr_map.h>
#include <cleanup_user.h> #include <cleanup_user.h>
#include <quote_822_local.h> #include <quote_822_local.h>
#include <been_here.h>
/* Application-specific. */ /* Application-specific. */
@@ -69,7 +70,7 @@ ARGV *cleanup_map1n_internal(CLEANUP_STATE *state, char *addr,
int count; int count;
int i; int i;
int arg; int arg;
int expand_to_self; BH_TABLE *been_here;
char *saved_lhs; char *saved_lhs;
/* /*
@@ -78,6 +79,7 @@ ARGV *cleanup_map1n_internal(CLEANUP_STATE *state, char *addr,
argv = argv_alloc(1); argv = argv_alloc(1);
argv_add(argv, addr, ARGV_END); argv_add(argv, addr, ARGV_END);
argv_terminate(argv); argv_terminate(argv);
been_here = been_here_init(0, BH_FLAG_FOLD);
/* /*
* Rewrite the address vector in place. With each map lookup result, * Rewrite the address vector in place. With each map lookup result,
@@ -90,14 +92,17 @@ ARGV *cleanup_map1n_internal(CLEANUP_STATE *state, char *addr,
#define MAX_RECURSION 1000 #define MAX_RECURSION 1000
#define MAX_EXPANSION 1000 #define MAX_EXPANSION 1000
#define STR vstring_str #define STR vstring_str
#define RETURN(x) { been_here_free(been_here); return (x); }
for (expand_to_self = 0, arg = 0; arg < argv->argc; arg++) { for (arg = 0; arg < argv->argc; arg++) {
if (argv->argc > MAX_EXPANSION) { if (argv->argc > MAX_EXPANSION) {
msg_warn("%s: unreasonable %s map expansion size for %s", msg_warn("%s: unreasonable %s map expansion size for %s",
state->queue_id, maps->title, addr); state->queue_id, maps->title, addr);
break; break;
} }
for (count = 0; /* void */ ; count++) { for (count = 0; /* void */ ; count++) {
if (been_here_fixed(been_here, argv->argv[arg]) != 0)
break;
if (count >= MAX_RECURSION) { if (count >= MAX_RECURSION) {
msg_warn("%s: unreasonable %s map nesting for %s", msg_warn("%s: unreasonable %s map nesting for %s",
state->queue_id, maps->title, addr); state->queue_id, maps->title, addr);
@@ -107,8 +112,6 @@ ARGV *cleanup_map1n_internal(CLEANUP_STATE *state, char *addr,
saved_lhs = mystrdup(argv->argv[arg]); saved_lhs = mystrdup(argv->argv[arg]);
for (i = 0; i < lookup->argc; i++) { for (i = 0; i < lookup->argc; i++) {
unquote_822_local(state->temp1, lookup->argv[i]); unquote_822_local(state->temp1, lookup->argv[i]);
if (strcasecmp(saved_lhs, STR(state->temp1)) == 0)
expand_to_self = 1;
if (i == 0) { if (i == 0) {
UPDATE(argv->argv[arg], STR(state->temp1)); UPDATE(argv->argv[arg], STR(state->temp1));
} else { } else {
@@ -118,17 +121,15 @@ ARGV *cleanup_map1n_internal(CLEANUP_STATE *state, char *addr,
} }
myfree(saved_lhs); myfree(saved_lhs);
argv_free(lookup); argv_free(lookup);
if (expand_to_self)
return (argv);
} else if (dict_errno != 0) { } else if (dict_errno != 0) {
msg_warn("%s: %s map lookup problem for %s", msg_warn("%s: %s map lookup problem for %s",
state->queue_id, maps->title, addr); state->queue_id, maps->title, addr);
state->errs |= CLEANUP_STAT_WRITE; state->errs |= CLEANUP_STAT_WRITE;
return (argv); RETURN(argv);
} else { } else {
break; break;
} }
} }
} }
return (argv); RETURN(argv);
} }

View File

@@ -21,17 +21,10 @@
/* an email address. /* an email address.
/* /*
/* Per-destination logfiles of deferred mail are maintained only for /* Per-destination logfiles of deferred mail are maintained only for
/* eligible destinations. The policy is specified with the /* eligible destinations. The list of eligible destinations is
/* \fBfast_flush_policy\fR configuration parameter: /* specified with the \fBfast_flush_domains\fR configuration parameter,
/* .IP \fBall\fR /* which defaults to \fB$relay_domains\fR.
/* Maintain per-destination logfiles for all destinations. /*
/* .IP "\fBrelay\fR (default policy)"
/* Maintain per-destination logfiles only for destinations
/* that this system is willing to relay mail to (as controlled
/* by the \fBrelay_domains\fR configuration parameter).
/* .IP \fBnone\fR
/* Do not maintain per-destination logfiles.
/* .PP
/* This server implements the following requests: /* This server implements the following requests:
/* .IP "\fBFLUSH_REQ_ADD\fI sitename queue_id\fR" /* .IP "\fBFLUSH_REQ_ADD\fI sitename queue_id\fR"
/* Inform the fast flush server that the specified message is queued for /* Inform the fast flush server that the specified message is queued for
@@ -103,9 +96,9 @@
/* See the Postfix \fBmain.cf\fR file for syntax details and for /* See the Postfix \fBmain.cf\fR file for syntax details and for
/* default values. Use the \fBpostfix reload\fR command after a /* default values. Use the \fBpostfix reload\fR command after a
/* configuration change. /* configuration change.
/* .IP \fBfast_flush_policy\fR /* .IP \fBfast_flush_domains\fR
/* What destinations can have a "fast flush" logfile: \fBall\fR, /* What destinations can have a "fast flush" logfile. By default,
/* \fBrelay\fR (relay destinations) or \fBnone\fR. /* this is set to \fB$relay_domains\fR.
/* .IP \fBfast_flush_refresh_time\fR /* .IP \fBfast_flush_refresh_time\fR
/* Refresh a non-empty "fast flush" logfile that was not read in /* Refresh a non-empty "fast flush" logfile that was not read in
/* this amount of time (default time unit: hours), by simulating /* this amount of time (default time unit: hours), by simulating
@@ -173,18 +166,11 @@
*/ */
int var_fflush_refresh; int var_fflush_refresh;
int var_fflush_purge; int var_fflush_purge;
char *var_relay_domains;
/* /*
* Flush policy stuff. * Flush policy stuff.
*/ */
#define FLUSH_POLICY_UNKNOWN 0
#define FLUSH_POLICY_ALL 1
#define FLUSH_POLICY_RELAY 2
#define FLUSH_POLICY_NONE 3
static DOMAIN_LIST *flush_domains; static DOMAIN_LIST *flush_domains;
static int flush_policy = FLUSH_POLICY_UNKNOWN;
/* /*
* Some hard-wired policy: how many queue IDs we remember while we're * Some hard-wired policy: how many queue IDs we remember while we're
@@ -199,41 +185,14 @@ static int flush_policy = FLUSH_POLICY_UNKNOWN;
#define STR(x) vstring_str(x) #define STR(x) vstring_str(x)
#define STREQ(x,y) (strcmp(x,y) == 0) #define STREQ(x,y) (strcmp(x,y) == 0)
/* flush_policy_init - initialize fast flush policy stuff */
static int flush_policy_init(void)
{
if (STREQ(var_fflush_policy, FFLUSH_POLICY_ALL)) {
flush_policy = FLUSH_POLICY_ALL;
} else if (STREQ(var_fflush_policy, FFLUSH_POLICY_RELAY)) {
flush_domains = domain_list_init(var_relay_domains);
flush_policy = FLUSH_POLICY_RELAY;
} else if (STREQ(var_fflush_policy, FFLUSH_POLICY_NONE)) {
flush_policy = FLUSH_POLICY_NONE;
} else {
msg_fatal("invalid %s configuration parameter value: %s",
VAR_FFLUSH_POLICY, var_fflush_policy);
}
}
/* flush_policy_ok - check logging policy */ /* flush_policy_ok - check logging policy */
static int flush_policy_ok(const char *site) static int flush_policy_ok(const char *site)
{ {
if (flush_policy == FLUSH_POLICY_UNKNOWN) if (flush_domains == 0)
flush_policy_init(); flush_domains = domain_list_init(var_fflush_domains);
switch (flush_policy) {
case FLUSH_POLICY_ALL:
return (1);
case FLUSH_POLICY_RELAY:
return (domain_list_match(flush_domains, site)); return (domain_list_match(flush_domains, site));
case FLUSH_POLICY_NONE:
return (0);
default:
msg_panic("invalid fast flush policy %d", flush_policy);
}
} }
/* flush_add_service - append queue ID to per-site fast flush log */ /* flush_add_service - append queue ID to per-site fast flush log */
@@ -547,13 +506,8 @@ int main(int argc, char **argv)
VAR_FFLUSH_PURGE, DEF_FFLUSH_PURGE, &var_fflush_purge, 'd', 1, 0, VAR_FFLUSH_PURGE, DEF_FFLUSH_PURGE, &var_fflush_purge, 'd', 1, 0,
0, 0,
}; };
static CONFIG_STR_TABLE str_table[] = {
VAR_RELAY_DOMAINS, DEF_RELAY_DOMAINS, &var_relay_domains, 0, 0,
0,
};
single_server_main(argc, argv, flush_service, single_server_main(argc, argv, flush_service,
MAIL_SERVER_TIME_TABLE, time_table, MAIL_SERVER_TIME_TABLE, time_table,
MAIL_SERVER_STR_TABLE, str_table,
0); 0);
} }

BIN
postfix/src/fsstone/fsstone Executable file

Binary file not shown.

View File

@@ -4,7 +4,8 @@
/* SUMMARY /* SUMMARY
/* measure directory operation overhead /* measure directory operation overhead
/* SYNOPSIS /* SYNOPSIS
/* \fBfsstone\fR [\fB-c\fR] [\fB-r\fR] \fImsg_count files_per_dir\fR /* \fBfsstone\fR [\fB-cr\fR] [\fB-s \fIsize\fR]
/* \fImsg_count files_per_dir\fR
/* DESCRIPTION /* DESCRIPTION
/* The \fBfsstone\fR command measures the cost of creating, renaming /* The \fBfsstone\fR command measures the cost of creating, renaming
/* and deleting queue files versus appending messages to existing /* and deleting queue files versus appending messages to existing
@@ -19,6 +20,8 @@
/* Create and delete files. /* Create and delete files.
/* .IP \fB-r\fR /* .IP \fB-r\fR
/* Rename files twice (requires \fB-c\fR). /* Rename files twice (requires \fB-c\fR).
/* .IP \fB-s \fIsize\fR
/* Specify the file size in kbytes.
/* DIAGNOSTICS /* DIAGNOSTICS
/* Problems are reported to the standard error stream. /* Problems are reported to the standard error stream.
/* BUGS /* BUGS
@@ -66,17 +69,20 @@ static void rename_file(int old, int new)
/* make_file - create a little file and use it */ /* make_file - create a little file and use it */
static void make_file(int seqno) static void make_file(int seqno, int size)
{ {
char path[BUFSIZ]; char path[BUFSIZ];
char buf[1024];
FILE *fp; FILE *fp;
int i; int i;
sprintf(path, "%06d", seqno); sprintf(path, "%06d", seqno);
if ((fp = fopen(path, "w")) == 0) if ((fp = fopen(path, "w")) == 0)
msg_fatal("open %s: %m", path); msg_fatal("open %s: %m", path);
for (i = 0; i < 400; i++) memset(buf, 'x', sizeof(buf));
fprintf(fp, "hello"); for (i = 0; i < size; i++)
if (fwrite(buf, 1, sizeof(buf), fp) != sizeof(buf))
msg_fatal("fwrite: %m");
if (fsync(fileno(fp))) if (fsync(fileno(fp)))
msg_fatal("fsync: %m"); msg_fatal("fsync: %m");
if (fclose(fp)) if (fclose(fp))
@@ -141,7 +147,7 @@ static void remove_silent(int seq)
static void usage(char *myname) static void usage(char *myname)
{ {
msg_fatal("usage: %s [-c [-r]] messages directory_entries", myname); msg_fatal("usage: %s [-cr] [-s size] messages directory_entries", myname);
} }
int main(int argc, char **argv) int main(int argc, char **argv)
@@ -153,9 +159,10 @@ int main(int argc, char **argv)
int do_create = 0; int do_create = 0;
int seq; int seq;
int ch; int ch;
int size = 2;
msg_vstream_init(argv[0], VSTREAM_ERR); msg_vstream_init(argv[0], VSTREAM_ERR);
while ((ch = GETOPT(argc, argv, "cr")) != EOF) { while ((ch = GETOPT(argc, argv, "crs:")) != EOF) {
switch (ch) { switch (ch) {
case 'c': case 'c':
do_create++; do_create++;
@@ -163,6 +170,10 @@ int main(int argc, char **argv)
case 'r': case 'r':
do_rename++; do_rename++;
break; break;
case 's':
if ((size = atoi(optarg)) <= 0)
usage(argv[0]);
break;
default: default:
usage(argv[0]); usage(argv[0]);
} }
@@ -179,7 +190,7 @@ int main(int argc, char **argv)
* Populate the directory with little files. * Populate the directory with little files.
*/ */
for (seq = 0; seq < max_file; seq++) for (seq = 0; seq < max_file; seq++)
make_file(seq); make_file(seq, size);
/* /*
* Simulate arrival and delivery of mail messages. * Simulate arrival and delivery of mail messages.
@@ -189,7 +200,7 @@ int main(int argc, char **argv)
seq %= max_file; seq %= max_file;
if (do_create) { if (do_create) {
remove_file(seq); remove_file(seq);
make_file(seq); make_file(seq, size);
if (do_rename) { if (do_rename) {
rename_file(seq, seq + max_file); rename_file(seq, seq + max_file);
rename_file(seq + max_file, seq); rename_file(seq + max_file, seq);

View File

@@ -6,8 +6,9 @@
/* SYNOPSIS /* SYNOPSIS
/* #include <been_here.h> /* #include <been_here.h>
/* /*
/* BH_TABLE *been_here_init(size) /* BH_TABLE *been_here_init(size, flags)
/* int size; /* int size;
/* int flags;
/* /*
/* int been_here_fixed(dup_filter, string) /* int been_here_fixed(dup_filter, string)
/* BH_TABLE *dup_filter; /* BH_TABLE *dup_filter;

View File

@@ -94,7 +94,7 @@ int flush_purge(void)
/* /*
* Don't bother the server if the service is turned off. * Don't bother the server if the service is turned off.
*/ */
if (strcmp(var_fflush_policy, FFLUSH_POLICY_NONE) == 0) if (*var_fflush_domains == 0)
status = FLUSH_STAT_OK; status = FLUSH_STAT_OK;
else else
status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH, status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH,
@@ -119,7 +119,7 @@ int flush_refresh(void)
/* /*
* Don't bother the server if the service is turned off. * Don't bother the server if the service is turned off.
*/ */
if (strcmp(var_fflush_policy, FFLUSH_POLICY_NONE) == 0) if (*var_fflush_domains == 0)
status = FLUSH_STAT_OK; status = FLUSH_STAT_OK;
else else
status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH, status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH,
@@ -144,7 +144,7 @@ int flush_send(const char *site)
/* /*
* Don't bother the server if the service is turned off. * Don't bother the server if the service is turned off.
*/ */
if (strcmp(var_fflush_policy, FFLUSH_POLICY_NONE) == 0) if (*var_fflush_domains == 0)
status = mail_flush_deferred(); status = mail_flush_deferred();
else else
status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH, status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH,
@@ -169,7 +169,7 @@ int flush_add(const char *site, const char *queue_id)
/* /*
* Don't bother the server if the service is turned off. * Don't bother the server if the service is turned off.
*/ */
if (strcmp(var_fflush_policy, FFLUSH_POLICY_NONE) == 0) if (*var_fflush_domains == 0)
status = FLUSH_STAT_OK; status = FLUSH_STAT_OK;
else else
status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH, status = mail_command_write(MAIL_CLASS_PRIVATE, MAIL_SERVICE_FLUSH,

View File

@@ -58,7 +58,8 @@
/* int var_ownreq_special; /* int var_ownreq_special;
/* int var_daemon_timeout; /* int var_daemon_timeout;
/* char *var_syslog_facility; /* char *var_syslog_facility;
/* char *var_fflush_policy; /* char *var_relay_domains;
/* char *var_fflush_domains;
/* /*
/* void mail_params_init() /* void mail_params_init()
/* DESCRIPTION /* DESCRIPTION
@@ -165,7 +166,8 @@ time_t var_starttime;
int var_ownreq_special; int var_ownreq_special;
int var_daemon_timeout; int var_daemon_timeout;
char *var_syslog_facility; char *var_syslog_facility;
char *var_fflush_policy; char *var_relay_domains;
char *var_fflush_domains;
/* check_myhostname - lookup hostname and validate */ /* check_myhostname - lookup hostname and validate */
@@ -276,7 +278,8 @@ void mail_params_init()
VAR_DB_TYPE, DEF_DB_TYPE, &var_db_type, 1, 0, VAR_DB_TYPE, DEF_DB_TYPE, &var_db_type, 1, 0,
VAR_HASH_QUEUE_NAMES, DEF_HASH_QUEUE_NAMES, &var_hash_queue_names, 1, 0, VAR_HASH_QUEUE_NAMES, DEF_HASH_QUEUE_NAMES, &var_hash_queue_names, 1, 0,
VAR_RCPT_DELIM, DEF_RCPT_DELIM, &var_rcpt_delim, 0, 1, VAR_RCPT_DELIM, DEF_RCPT_DELIM, &var_rcpt_delim, 0, 1,
VAR_FFLUSH_POLICY, DEF_FFLUSH_POLICY, &var_fflush_policy, 1, 0, VAR_RELAY_DOMAINS, DEF_RELAY_DOMAINS, &var_relay_domains, 0, 0,
VAR_FFLUSH_DOMAINS, DEF_FFLUSH_DOMAINS, &var_fflush_domains, 0, 0,
0, 0,
}; };
static CONFIG_STR_FN_TABLE function_str_defaults_2[] = { static CONFIG_STR_FN_TABLE function_str_defaults_2[] = {

View File

@@ -1067,13 +1067,9 @@ extern char *var_filter_xport;
/* /*
* Fast flush service support. * Fast flush service support.
*/ */
#define VAR_FFLUSH_POLICY "fast_flush_policy" #define VAR_FFLUSH_DOMAINS "fast_flush_domains"
#define DEF_FFLUSH_POLICY FFLUSH_POLICY_RELAY #define DEF_FFLUSH_DOMAINS "$relay_domains"
extern char *var_fflush_policy; extern char *var_fflush_domains;
#define FFLUSH_POLICY_ALL "all"
#define FFLUSH_POLICY_RELAY "relay"
#define FFLUSH_POLICY_NONE "none"
#define VAR_FFLUSH_PURGE "fast_flush_purge_time" #define VAR_FFLUSH_PURGE "fast_flush_purge_time"
#define DEF_FFLUSH_PURGE "7d" #define DEF_FFLUSH_PURGE "7d"

View File

@@ -15,7 +15,7 @@
* Version of this program. * Version of this program.
*/ */
#define VAR_MAIL_VERSION "mail_version" #define VAR_MAIL_VERSION "mail_version"
#define DEF_MAIL_VERSION "Snapshot-20001005" #define DEF_MAIL_VERSION "Snapshot-20001027"
extern char *var_mail_version; extern char *var_mail_version;
/* LICENSE /* LICENSE

View File

@@ -33,6 +33,7 @@
/* System library. */ /* System library. */
#include <sys_defs.h> #include <sys_defs.h>
#include <unistd.h>
/* Utility library. */ /* Utility library. */

View File

@@ -67,7 +67,7 @@ static int is_821_dot_string(char *local_part, char *end)
*/ */
if (local_part[0] == 0 || local_part[0] == '.') if (local_part[0] == 0 || local_part[0] == '.')
return (NO); return (NO);
for (cp = local_part; cp < end && (ch = *cp) != 0; cp++) { for (cp = local_part; cp < end && (ch = *(unsigned char *) cp) != 0; cp++) {
if (ch == '.' && cp[1] == '.') if (ch == '.' && cp[1] == '.')
return (NO); return (NO);
if (ch > 127) if (ch > 127)

View File

@@ -80,7 +80,7 @@ static int is_822_dot_string(const char *local_part, const char *end)
*/ */
if (local_part[0] == 0 || local_part[0] == '.') if (local_part[0] == 0 || local_part[0] == '.')
return (NO); return (NO);
for (cp = local_part; cp < end && (ch = *cp) != 0; cp++) { for (cp = local_part; cp < end && (ch = *(unsigned char *) cp) != 0; cp++) {
if (ch == '.' && (cp + 1) < end && cp[1] == '.') if (ch == '.' && (cp + 1) < end && cp[1] == '.')
return (NO); return (NO);
#if 0 #if 0

View File

@@ -172,8 +172,10 @@ int main(int argc, char **argv)
* privileges for selected operations. That's right - it takes privileges * privileges for selected operations. That's right - it takes privileges
* to toss privileges. * to toss privileges.
*/ */
if ((uid = getuid()) != 0) if ((uid = getuid()) != 0) {
msg_fatal("must be run by the superuser, not by userid %d", uid); msg_error("to submit mail, use the Postfix sendmail command");
msg_fatal("the postfix command must be run by the superuser");
}
/* /*
* Parse switches. * Parse switches.

View File

@@ -129,6 +129,7 @@ smtp_connect.o: ../../include/mymalloc.h
smtp_connect.o: ../../include/inet_addr_list.h smtp_connect.o: ../../include/inet_addr_list.h
smtp_connect.o: ../../include/iostuff.h smtp_connect.o: ../../include/iostuff.h
smtp_connect.o: ../../include/timed_connect.h smtp_connect.o: ../../include/timed_connect.h
smtp_connect.o: ../../include/stringops.h
smtp_connect.o: ../../include/mail_params.h smtp_connect.o: ../../include/mail_params.h
smtp_connect.o: ../../include/own_inet_addr.h smtp_connect.o: ../../include/own_inet_addr.h
smtp_connect.o: ../../include/dns.h smtp_connect.o: ../../include/dns.h

View File

@@ -51,6 +51,8 @@
/* The request failed due to a soft error, and should be retried later. /* The request failed due to a soft error, and should be retried later.
/* .IP SMTP_FAIL /* .IP SMTP_FAIL
/* The request attempt failed due to a hard error. /* The request attempt failed due to a hard error.
/* .IP SMTP_OK
/* The local machine is the best mail exchanger.
/* .PP /* .PP
/* In addition, a textual description of the problem is made available /* In addition, a textual description of the problem is made available
/* via the \fIwhy\fR argument. /* via the \fIwhy\fR argument.
@@ -212,83 +214,6 @@ static DNS_RR *smtp_addr_list(DNS_RR *mx_names, VSTRING *why)
return (addr_list); return (addr_list);
} }
/* smtp_addr_fallback - add list of fallback addresses */
static DNS_RR *smtp_addr_fallback(DNS_RR *addr_list)
{
static DNS_RR *fallback_list = 0;
DNS_RR *mx_names;
DNS_RR *mx_addr_list;
DNS_RR *addr;
char *saved_fallback_relay;
char *cp;
char *relay;
int saved_smtp_errno = smtp_errno;
VSTRING *why;
DNS_RR *rr;
unsigned int pref;
/*
* Build a cached list of fall-back host addresses. Issue a warning when
* a fall-back host or domain is not found. This is most likely a local
* configuration problem.
*
* XXX For the sake of admin-friendliness we want to support MX lookups for
* fall-back relays. This comes at a price: the fallback relay lookup
* routine almost entirely duplicates the smtp_domain_addr() routine.
*
* Fall-back hosts are given a preference that is outside the range of valid
* DNS preferences (unsigned 16-bit integer).
*/
#define FB_PREF (0xffff + 1)
if (fallback_list == 0) {
why = vstring_alloc(1);
cp = saved_fallback_relay = mystrdup(var_fallback_relay);
for (pref = FB_PREF; (relay = mystrtok(&cp, " \t\r\n,")) != 0; pref++) {
smtp_errno = 0;
switch (dns_lookup(relay, T_MX, RES_DEFNAMES, &mx_names, (VSTRING *) 0, why)) {
default:
smtp_errno = SMTP_RETRY;
break;
case DNS_FAIL:
smtp_errno = SMTP_FAIL;
break;
case DNS_OK:
mx_addr_list = smtp_addr_list(mx_names, why);
dns_rr_free(mx_names);
for (addr = mx_addr_list; addr; addr = addr->next)
addr->pref = pref;
fallback_list = dns_rr_append(fallback_list, mx_addr_list);
break;
case DNS_NOTFOUND:
fallback_list = smtp_addr_one(fallback_list, relay, pref, why);
break;
}
if (smtp_errno != SMTP_OK)
msg_warn("look up fall-back relay %s: %s",
relay, vstring_str(why));
}
vstring_free(why);
myfree(saved_fallback_relay);
}
/*
* Append a copy of the fall-back address list to the mail exchanger
* address list - which may be an empty list if no mail exchanger was
* found.
*/
for (rr = fallback_list; rr; rr = rr->next)
addr_list = dns_rr_append(addr_list, dns_rr_copy(rr));
/*
* Clean up.
*/
smtp_errno = saved_smtp_errno;
return (addr_list);
}
/* smtp_find_self - spot myself in a crowd of mail exchangers */ /* smtp_find_self - spot myself in a crowd of mail exchangers */
static DNS_RR *smtp_find_self(DNS_RR *addr_list) static DNS_RR *smtp_find_self(DNS_RR *addr_list)
@@ -411,8 +336,6 @@ DNS_RR *smtp_domain_addr(char *name, VSTRING *why)
addr_list = smtp_addr_list(mx_names, why); addr_list = smtp_addr_list(mx_names, why);
dns_rr_free(mx_names); dns_rr_free(mx_names);
best_found = (addr_list ? addr_list->pref : IMPOSSIBLE_PREFERENCE); best_found = (addr_list ? addr_list->pref : IMPOSSIBLE_PREFERENCE);
if (*var_fallback_relay)
addr_list = smtp_addr_fallback(addr_list);
if (msg_verbose) if (msg_verbose)
smtp_print_addr(name, addr_list); smtp_print_addr(name, addr_list);
if ((self = smtp_find_self(addr_list)) != 0) { if ((self = smtp_find_self(addr_list)) != 0) {
@@ -455,8 +378,6 @@ DNS_RR *smtp_host_addr(char *host, VSTRING *why)
*/ */
#define PREF0 0 #define PREF0 0
addr_list = smtp_addr_one((DNS_RR *) 0, host, PREF0, why); addr_list = smtp_addr_one((DNS_RR *) 0, host, PREF0, why);
if (*var_fallback_relay)
addr_list = smtp_addr_fallback(addr_list);
if (msg_verbose) if (msg_verbose)
smtp_print_addr(host, addr_list); smtp_print_addr(host, addr_list);
return (addr_list); return (addr_list);

View File

@@ -25,6 +25,11 @@
/* smtp_connect() attempts to establish an SMTP session with a host /* smtp_connect() attempts to establish an SMTP session with a host
/* that represents the named domain. /* that represents the named domain.
/* /*
/* No session and an smtp_errno of SMTP_OK means that the local
/* machine is the best mail exchanger for the specified destination.
/* It is left up to the caller to decide if this is a mailer loop
/* or if this is a "do what I mean" request.
/*
/* The destination is either a host (or domain) name or a numeric /* The destination is either a host (or domain) name or a numeric
/* address. Symbolic or numeric service port information may be /* address. Symbolic or numeric service port information may be
/* appended, separated by a colon (":"). /* appended, separated by a colon (":").
@@ -105,6 +110,7 @@
#include <inet_addr_list.h> #include <inet_addr_list.h>
#include <iostuff.h> #include <iostuff.h>
#include <timed_connect.h> #include <timed_connect.h>
#include <stringops.h>
/* Global library. */ /* Global library. */
@@ -379,34 +385,77 @@ static char *smtp_parse_destination(char *destination, char *def_service,
SMTP_SESSION *smtp_connect(char *destination, VSTRING *why) SMTP_SESSION *smtp_connect(char *destination, VSTRING *why)
{ {
SMTP_SESSION *session; SMTP_SESSION *session = 0;
char *dest_buf; char *dest_buf = 0;
char *host; char *host;
unsigned port; unsigned port;
char *def_service = "smtp"; /* XXX configurable? */ char *def_service = "smtp"; /* XXX configurable? */
char *save;
char *dest;
char *cp;
/* /*
* Parse the destination specification. Default is to use the SMTP port. * First try to deliver to the indicated destination, then try to deliver
* to the optional fall-back relays. Each can be a list of destinations
* by itself, with domain, host, [], numerical address, and port.
*/ */
dest_buf = smtp_parse_destination(destination, def_service, &host, &port); cp = save = concatenate(destination, " ", var_fallback_relay, (char *) 0);
while ((dest = mystrtok(&cp, " \t\r\n")) != 0) {
/* /*
* Connect to an SMTP server. Skip mail exchanger lookups when a quoted * Parse the destination. Default is to use the SMTP port.
* host is specified, or when DNS lookups are disabled. */
dest_buf = smtp_parse_destination(dest, def_service, &host, &port);
/*
* Connect to an SMTP server. Skip mail exchanger lookups when a
* quoted host is specified, or when DNS lookups are disabled.
*/ */
if (msg_verbose) if (msg_verbose)
msg_info("connecting to %s port %d", host, ntohs(port)); msg_info("connecting to %s port %d", host, ntohs(port));
if (var_disable_dns || *destination == '[') { if (var_disable_dns || *dest == '[') {
session = smtp_connect_host(host, port, why); session = smtp_connect_host(host, port, why);
} else { } else {
session = smtp_connect_domain(host, port, why); session = smtp_connect_domain(host, port, why);
} }
if (session == 0 myfree(dest_buf);
&& smtp_errno == SMTP_FAIL
&& strcmp(host, var_relayhost) == 0) { /*
msg_warn("relayhost configuration problem: %s", var_relayhost); * Done if we have a session, or if we have no session and this host
* is the best MX relay for the destination. Agreed, an errno of OK
* after failure is a weird way to reporting progress.
*/
if (session != 0 || smtp_errno == SMTP_OK)
break;
}
/*
* Sanity check. The destination must not be empty or all blanks.
*/
if (session == 0 && dest_buf == 0)
msg_panic("null destination: \"%s\"", destination);
/*
* Pay attention to what could be configuration problems, and pretend
* that these are recoverable rather than bouncing the mail.
*/
if (session == 0 && smtp_errno == SMTP_FAIL) {
if (strcmp(destination, var_relayhost) == 0) {
msg_warn("%s configuration problem: %s",
VAR_RELAYHOST, var_relayhost);
smtp_errno = SMTP_RETRY; smtp_errno = SMTP_RETRY;
} }
myfree(dest_buf); if (*var_fallback_relay) {
msg_warn("%s configuration problem: %s",
VAR_FALLBACK_RELAY, var_fallback_relay);
smtp_errno = SMTP_RETRY;
}
}
/*
* Cleanup.
*/
myfree(save);
return (session); return (session);
} }

View File

@@ -298,7 +298,6 @@
*/ */
int var_smtpd_rcpt_limit; int var_smtpd_rcpt_limit;
int var_smtpd_tmout; int var_smtpd_tmout;
char *var_relay_domains;
int var_smtpd_soft_erlim; int var_smtpd_soft_erlim;
int var_smtpd_hard_erlim; int var_smtpd_hard_erlim;
int var_queue_minfree; /* XXX use off_t */ int var_queue_minfree; /* XXX use off_t */
@@ -870,6 +869,8 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
first = 0; first = 0;
if (len > 0 && ISSPACE(start[0])) if (len > 0 && ISSPACE(start[0]))
rec_put(state->cleanup, REC_TYPE_NORM, "", 0); rec_put(state->cleanup, REC_TYPE_NORM, "", 0);
else if (strncmp(start + strspn(start, ">"), "From ", 5) == 0)
continue;
} }
if (prev_rec_type != REC_TYPE_CONT if (prev_rec_type != REC_TYPE_CONT
&& *start == '.' && (++start, --len) == 0) && *start == '.' && (++start, --len) == 0)
@@ -1430,7 +1431,6 @@ int main(int argc, char **argv)
0, 0,
}; };
static CONFIG_STR_TABLE str_table[] = { static CONFIG_STR_TABLE str_table[] = {
VAR_RELAY_DOMAINS, DEF_RELAY_DOMAINS, &var_relay_domains, 0, 0,
VAR_SMTPD_BANNER, DEF_SMTPD_BANNER, &var_smtpd_banner, 1, 0, VAR_SMTPD_BANNER, DEF_SMTPD_BANNER, &var_smtpd_banner, 1, 0,
VAR_DEBUG_PEER_LIST, DEF_DEBUG_PEER_LIST, &var_debug_peer_list, 0, 0, VAR_DEBUG_PEER_LIST, DEF_DEBUG_PEER_LIST, &var_debug_peer_list, 0, 0,
VAR_NOTIFY_CLASSES, DEF_NOTIFY_CLASSES, &var_notify_classes, 0, 0, VAR_NOTIFY_CLASSES, DEF_NOTIFY_CLASSES, &var_notify_classes, 0, 0,

View File

@@ -473,6 +473,7 @@ dict_tcp.o: iostuff.h
dict_tcp.o: hex_quote.h dict_tcp.o: hex_quote.h
dict_tcp.o: dict.h dict_tcp.o: dict.h
dict_tcp.o: argv.h dict_tcp.o: argv.h
dict_tcp.o: stringops.h
dict_tcp.o: dict_tcp.h dict_tcp.o: dict_tcp.h
dict_unix.o: dict_unix.c dict_unix.o: dict_unix.c
dict_unix.o: sys_defs.h dict_unix.o: sys_defs.h

View File

@@ -57,6 +57,30 @@
#endif #endif
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h>
#if defined(_DB_185_H_) && defined(USE_FCNTL_LOCK)
#error "Error: this system must not use the db 1.85 compatibility interface"
#endif
#ifndef DB_VERSION_MAJOR
#define DB_VERSION_MAJOR 1
#define DICT_DB_GET(db, key, val, flag) db->get(db, key, val, flag)
#define DICT_DB_PUT(db, key, val, flag) db->put(db, key, val, flag)
#define DICT_DB_DEL(db, key, flag) db->del(db, key, flag)
#define DICT_DB_SYNC(db, flag) db->sync(db, flag)
#define DICT_DB_CLOSE(db) db->close(db)
#define DONT_CLOBBER R_NOOVERWRITE
#endif
#if DB_VERSION_MAJOR > 1
#define DICT_DB_GET(db, key, val, flag) sanitize(db->get(db, 0, key, val, flag))
#define DICT_DB_PUT(db, key, val, flag) sanitize(db->put(db, 0, key, val, flag))
#define DICT_DB_DEL(db, key, flag) sanitize(db->del(db, 0, key, flag))
#define DICT_DB_SYNC(db, flag) ((errno = db->sync(db, flag)) ? -1 : 0)
#define DICT_DB_CLOSE(db) ((errno = db->close(db, 0)) ? -1 : 0)
#define DONT_CLOBBER DB_NOOVERWRITE
#endif
/* Utility library. */ /* Utility library. */
@@ -80,6 +104,37 @@ typedef struct {
#define DICT_DB_CACHE_SIZE (1024 * 1024) #define DICT_DB_CACHE_SIZE (1024 * 1024)
#define DICT_DB_NELM 4096 #define DICT_DB_NELM 4096
#if DB_VERSION_MAJOR > 1
/* sanitize - sanitize db_get/put/del result */
static int sanitize(int status)
{
/*
* XXX This is unclean but avoids a lot of clutter elsewhere. Categorize
* results into non-fatal errors (i.e., errors that we can deal with),
* success, or fatal error (i.e., all other errors).
*/
switch (status) {
case DB_NOTFOUND: /* get, del */
case DB_KEYEXIST: /* put */
return (1); /* non-fatal */
case 0:
return (0); /* success */
case DB_KEYEMPTY: /* get, others? */
status = EINVAL;
default:
errno = status;
return (-1); /* fatal */
}
}
#endif
/* dict_db_lookup - find database entry */ /* dict_db_lookup - find database entry */
static const char *dict_db_lookup(DICT *dict, const char *name) static const char *dict_db_lookup(DICT *dict, const char *name)
@@ -93,6 +148,8 @@ static const char *dict_db_lookup(DICT *dict, const char *name)
const char *result = 0; const char *result = 0;
dict_errno = 0; dict_errno = 0;
memset(&db_key, 0, sizeof(db_key));
memset(&db_value, 0, sizeof(db_value));
/* /*
* Acquire a shared lock. * Acquire a shared lock.
@@ -107,7 +164,7 @@ static const char *dict_db_lookup(DICT *dict, const char *name)
if (dict->flags & DICT_FLAG_TRY1NULL) { if (dict->flags & DICT_FLAG_TRY1NULL) {
db_key.data = (void *) name; db_key.data = (void *) name;
db_key.size = strlen(name) + 1; db_key.size = strlen(name) + 1;
if ((status = db->get(db, &db_key, &db_value, 0)) < 0) if ((status = DICT_DB_GET(db, &db_key, &db_value, 0)) < 0)
msg_fatal("error reading %s: %m", dict_db->path); msg_fatal("error reading %s: %m", dict_db->path);
if (status == 0) { if (status == 0) {
dict->flags &= ~DICT_FLAG_TRY0NULL; dict->flags &= ~DICT_FLAG_TRY0NULL;
@@ -122,7 +179,7 @@ static const char *dict_db_lookup(DICT *dict, const char *name)
if (result == 0 && (dict->flags & DICT_FLAG_TRY0NULL)) { if (result == 0 && (dict->flags & DICT_FLAG_TRY0NULL)) {
db_key.data = (void *) name; db_key.data = (void *) name;
db_key.size = strlen(name); db_key.size = strlen(name);
if ((status = db->get(db, &db_key, &db_value, 0)) < 0) if ((status = DICT_DB_GET(db, &db_key, &db_value, 0)) < 0)
msg_fatal("error reading %s: %m", dict_db->path); msg_fatal("error reading %s: %m", dict_db->path);
if (status == 0) { if (status == 0) {
if (buf == 0) if (buf == 0)
@@ -152,6 +209,8 @@ static void dict_db_update(DICT *dict, const char *name, const char *value)
DBT db_value; DBT db_value;
int status; int status;
memset(&db_key, 0, sizeof(db_key));
memset(&db_value, 0, sizeof(db_value));
db_key.data = (void *) name; db_key.data = (void *) name;
db_value.data = (void *) value; db_value.data = (void *) value;
db_key.size = strlen(name); db_key.size = strlen(name);
@@ -187,8 +246,8 @@ static void dict_db_update(DICT *dict, const char *name, const char *value)
/* /*
* Do the update. * Do the update.
*/ */
if ((status = db->put(db, &db_key, &db_value, if ((status = DICT_DB_PUT(db, &db_key, &db_value,
(dict->flags & DICT_FLAG_DUP_REPLACE) ? 0 : R_NOOVERWRITE)) < 0) (dict->flags & DICT_FLAG_DUP_REPLACE) ? 0 : DONT_CLOBBER)) < 0)
msg_fatal("error writing %s: %m", dict_db->path); msg_fatal("error writing %s: %m", dict_db->path);
if (status) { if (status) {
if (dict->flags & DICT_FLAG_DUP_IGNORE) if (dict->flags & DICT_FLAG_DUP_IGNORE)
@@ -199,7 +258,7 @@ static void dict_db_update(DICT *dict, const char *name, const char *value)
msg_fatal("%s: duplicate entry: \"%s\"", dict_db->path, name); msg_fatal("%s: duplicate entry: \"%s\"", dict_db->path, name);
} }
if (dict->flags & DICT_FLAG_SYNC_UPDATE) if (dict->flags & DICT_FLAG_SYNC_UPDATE)
if (db->sync(db, 0) < 0) if (DICT_DB_SYNC(db, 0) < 0)
msg_fatal("%s: flush dictionary: %m", dict_db->path); msg_fatal("%s: flush dictionary: %m", dict_db->path);
/* /*
@@ -232,7 +291,7 @@ static int dict_db_delete(DICT *dict, const char *name)
if (dict->flags & DICT_FLAG_TRY1NULL) { if (dict->flags & DICT_FLAG_TRY1NULL) {
db_key.data = (void *) name; db_key.data = (void *) name;
db_key.size = strlen(name) + 1; db_key.size = strlen(name) + 1;
if ((status = db->del(db, &db_key, flags)) < 0) if ((status = DICT_DB_DEL(db, &db_key, flags)) < 0)
msg_fatal("error deleting from %s: %m", dict_db->path); msg_fatal("error deleting from %s: %m", dict_db->path);
if (status == 0) if (status == 0)
dict->flags &= ~DICT_FLAG_TRY0NULL; dict->flags &= ~DICT_FLAG_TRY0NULL;
@@ -245,7 +304,7 @@ static int dict_db_delete(DICT *dict, const char *name)
if (status > 0 && (dict->flags & DICT_FLAG_TRY0NULL)) { if (status > 0 && (dict->flags & DICT_FLAG_TRY0NULL)) {
db_key.data = (void *) name; db_key.data = (void *) name;
db_key.size = strlen(name); db_key.size = strlen(name);
if ((status = db->del(db, &db_key, flags)) < 0) if ((status = DICT_DB_DEL(db, &db_key, flags)) < 0)
msg_fatal("error deleting from %s: %m", dict_db->path); msg_fatal("error deleting from %s: %m", dict_db->path);
if (status == 0) if (status == 0)
dict->flags &= ~DICT_FLAG_TRY1NULL; dict->flags &= ~DICT_FLAG_TRY1NULL;
@@ -265,6 +324,9 @@ static int dict_db_delete(DICT *dict, const char *name)
static int dict_db_sequence(DICT *dict, const int function, static int dict_db_sequence(DICT *dict, const int function,
const char **key, const char **value) const char **key, const char **value)
{ {
#if DB_VERSION_MAJOR > 1
msg_fatal("dict_db_sequence - operation is to be implemented");
#else
char *myname = "dict_db_sequence"; char *myname = "dict_db_sequence";
DICT_DB *dict_db = (DICT_DB *) dict; DICT_DB *dict_db = (DICT_DB *) dict;
DB *db = dict_db->db; DB *db = dict_db->db;
@@ -328,6 +390,7 @@ static int dict_db_sequence(DICT *dict, const int function,
} }
} }
return status; return status;
#endif
} }
/* dict_db_close - close data base */ /* dict_db_close - close data base */
@@ -336,7 +399,7 @@ static void dict_db_close(DICT *dict)
{ {
DICT_DB *dict_db = (DICT_DB *) dict; DICT_DB *dict_db = (DICT_DB *) dict;
if (dict_db->db->close(dict_db->db) < 0) if (DICT_DB_CLOSE(dict_db->db) < 0)
msg_fatal("close database %s: %m", dict_db->path); msg_fatal("close database %s: %m", dict_db->path);
myfree(dict_db->path); myfree(dict_db->path);
myfree((char *) dict_db); myfree((char *) dict_db);
@@ -353,30 +416,76 @@ static DICT *dict_db_open(const char *path, int open_flags, int type,
char *db_path; char *db_path;
int lock_fd = -1; int lock_fd = -1;
#if DB_VERSION_MAJOR > 1
int db_flags;
#endif
db_path = concatenate(path, ".db", (char *) 0); db_path = concatenate(path, ".db", (char *) 0);
if (dict_flags & DICT_FLAG_LOCK) { /*
if ((lock_fd = open(db_path, open_flags, 0644)) < 0) * Use the DB 1.x programming interface. This is the default interface
msg_fatal("open database %s: %m", db_path); * with 4.4BSD systems. It is also available via the db_185 compatibility
if (myflock(lock_fd, MYFLOCK_SHARED) < 0) * interface, but that interface does not have the undocumented feature
msg_fatal("shared-lock database %s for open: %m", db_path); * that we need to make file locking safe with POSIX fcntl() locking.
} */
#if DB_VERSION_MAJOR < 2
if ((db = dbopen(db_path, open_flags, 0644, type, tweak)) == 0) if ((db = dbopen(db_path, open_flags, 0644, type, tweak)) == 0)
msg_fatal("open database %s: %m", db_path); msg_fatal("open database %s: %m", db_path);
lock_fd = db->fd(db);
#endif
/*
* Use the DB 2.x programming interface. Jump a couple extra hoops.
*/
#if DB_VERSION_MAJOR == 2
db_flags = DB_FCNTL_LOCKING;
if (open_flags == O_RDONLY)
db_flags |= DB_RDONLY;
if (open_flags & O_CREAT)
db_flags |= DB_CREATE;
if (open_flags & O_TRUNC)
db_flags |= DB_TRUNCATE;
if ((errno = db_open(db_path, type, db_flags, 0644, 0, tweak, &db)) != 0)
msg_fatal("open database %s: %m", db_path);
if (db == 0)
msg_panic("db_open null result");
if ((errno = db->fd(db, &lock_fd)) != 0)
msg_fatal("get database file descriptor: %m");
#endif
/*
* Use the DB 3.x programming interface. Jump even more hoops.
*/
#if DB_VERSION_MAJOR > 2
db_flags = DB_FCNTL_LOCKING;
if (open_flags == O_RDONLY)
db_flags |= DB_RDONLY;
if (open_flags & O_CREAT)
db_flags |= DB_CREATE;
if (open_flags & O_TRUNC)
db_flags |= DB_TRUNCATE;
if ((errno = db_create(&db, 0, 0)) != 0)
msg_fatal("create DB database: %m");
if (db == 0)
msg_panic("db_create null result");
if ((errno = db->set_cachesize(db, 0, DICT_DB_CACHE_SIZE, 0)) != 0)
msg_fatal("set DB cache size %d: %m", DICT_DB_CACHE_SIZE);
if (type == DB_HASH && db->set_h_nelem(db, DICT_DB_NELM) != 0)
msg_fatal("set DB hash element count %d: %m", DICT_DB_NELM);
if ((errno = db->open(db, db_path, 0, type, db_flags, 0644)) != 0)
msg_fatal("open database %s: %m", db_path);
if ((errno = db->fd(db, &lock_fd)) != 0)
msg_fatal("get database file descriptor: %m");
#endif
if (dict_flags & DICT_FLAG_LOCK) {
if (myflock(lock_fd, MYFLOCK_NONE) < 0)
msg_fatal("unlock database %s for open: %m", db_path);
if (close(lock_fd) < 0)
msg_fatal("close database %s: %m", db_path);
}
dict_db = (DICT_DB *) mymalloc(sizeof(*dict_db)); dict_db = (DICT_DB *) mymalloc(sizeof(*dict_db));
dict_db->dict.lookup = dict_db_lookup; dict_db->dict.lookup = dict_db_lookup;
dict_db->dict.update = dict_db_update; dict_db->dict.update = dict_db_update;
dict_db->dict.delete = dict_db_delete; dict_db->dict.delete = dict_db_delete;
dict_db->dict.sequence = dict_db_sequence; dict_db->dict.sequence = dict_db_sequence;
dict_db->dict.close = dict_db_close; dict_db->dict.close = dict_db_close;
dict_db->dict.fd = db->fd(db); dict_db->dict.fd = lock_fd;
if (fstat(dict_db->dict.fd, &st) < 0) if (fstat(dict_db->dict.fd, &st) < 0)
msg_fatal("dict_db_open: fstat: %m"); msg_fatal("dict_db_open: fstat: %m");
dict_db->dict.mtime = st.st_mtime; dict_db->dict.mtime = st.st_mtime;
@@ -393,11 +502,25 @@ static DICT *dict_db_open(const char *path, int open_flags, int type,
DICT *dict_hash_open(const char *path, int open_flags, int dict_flags) DICT *dict_hash_open(const char *path, int open_flags, int dict_flags)
{ {
#if DB_VERSION_MAJOR < 2
HASHINFO tweak; HASHINFO tweak;
memset((char *) &tweak, 0, sizeof(tweak)); memset((char *) &tweak, 0, sizeof(tweak));
tweak.nelem = DICT_DB_NELM; tweak.nelem = DICT_DB_NELM;
tweak.cachesize = DICT_DB_CACHE_SIZE; tweak.cachesize = DICT_DB_CACHE_SIZE;
#endif
#if DB_VERSION_MAJOR == 2
DB_INFO tweak;
memset((char *) &tweak, 0, sizeof(tweak));
tweak.h_nelem = DICT_DB_NELM;
tweak.db_cachesize = DICT_DB_CACHE_SIZE;
#endif
#if DB_VERSION_MAJOR > 2
void *tweak;
tweak = 0;
#endif
return (dict_db_open(path, open_flags, DB_HASH, (void *) &tweak, dict_flags)); return (dict_db_open(path, open_flags, DB_HASH, (void *) &tweak, dict_flags));
} }
@@ -405,10 +528,23 @@ DICT *dict_hash_open(const char *path, int open_flags, int dict_flags)
DICT *dict_btree_open(const char *path, int open_flags, int dict_flags) DICT *dict_btree_open(const char *path, int open_flags, int dict_flags)
{ {
#if DB_VERSION_MAJOR < 2
BTREEINFO tweak; BTREEINFO tweak;
memset((char *) &tweak, 0, sizeof(tweak)); memset((char *) &tweak, 0, sizeof(tweak));
tweak.cachesize = DICT_DB_CACHE_SIZE; tweak.cachesize = DICT_DB_CACHE_SIZE;
#endif
#if DB_VERSION_MAJOR == 2
DB_INFO tweak;
memset((char *) &tweak, 0, sizeof(tweak));
tweak.db_cachesize = DICT_DB_CACHE_SIZE;
#endif
#if DB_VERSION_MAJOR > 2
void *tweak;
tweak = 0;
#endif
return (dict_db_open(path, open_flags, DB_BTREE, (void *) &tweak, dict_flags)); return (dict_db_open(path, open_flags, DB_BTREE, (void *) &tweak, dict_flags));
} }

View File

@@ -42,6 +42,10 @@
#else #else
#include <ndbm.h> #include <ndbm.h>
#endif #endif
#ifdef R_FIRST
#error "Error: you are including the Berkeley DB version of ndbm.h"
#error "To build with Postfix NDBM support, delete the Berkeley DB ndbm.h file"
#endif
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>

View File

@@ -181,7 +181,7 @@ typedef struct {
static DICT_OPEN_INFO dict_open_info[] = { static DICT_OPEN_INFO dict_open_info[] = {
"environ", dict_env_open, "environ", dict_env_open,
"unix", dict_unix_open, "unix", dict_unix_open,
#if 0 #if 1
"tcp", dict_tcp_open, "tcp", dict_tcp_open,
#endif #endif
#ifdef HAS_DBM #ifdef HAS_DBM
@@ -378,6 +378,8 @@ main(int argc, char **argv)
bufp = vstring_str(keybuf); bufp = vstring_str(keybuf);
if ((cmd = mystrtok(&bufp, " ")) == 0) if ((cmd = mystrtok(&bufp, " ")) == 0)
continue; continue;
if (dict_changed())
msg_warn("dictionary has changed");
key = mystrtok(&bufp, " ="); key = mystrtok(&bufp, " =");
value = mystrtok(&bufp, " ="); value = mystrtok(&bufp, " =");
if (strcmp(cmd, "del") == 0 && key && !value) { if (strcmp(cmd, "del") == 0 && key && !value) {

View File

@@ -18,10 +18,33 @@
/* /*
/* Map names have the form host:port. /* Map names have the form host:port.
/* /*
/* The TCP map class implements a very simple protocol: a query is sent /* The TCP map class implements a very simple protocol: the client
/* as one line of text, and a reply is sent back in the same format. /* sends a query, and the server sends one reply. Queries and
/* % and non-printable characters are replaced by %xx, xx being the /* replies are sent as one line of ASCII text, terminated by the
/* corresponding hexadecimal value. /* ASCII newline character. Query and reply parameters (see below)
/* are separated by whitespace.
/*
/* In query and reply parameters, the character % and any non-printable
/* characters (including whitespace) are replaced by %XX, XX being the
/* corresponding ASCII hexadecimal character value. The hexadecimal codes
/* can be specified in any case (upper, lower, mixed).
/*
/* Queries are strings that serve as lookup key in the simulated
/* table.
/* .IP "get SPACE key NEWLINE"
/* Look up data under the specified key.
/* .IP "put SPACE key SPACE value NEWLINE"
/*
/* .PP
/* Replies can have the following form:
/* .IP "500 SPACE text NEWLINE"
/* The requested data does not exist. The text is ignored.
/* .IP "400 SPACE text NEWLINE"
/* This indicates an error condition. The text gives the nature of
/* the problem.
/* .IP "200 SPACE text NEWLINE"
/* The requested data was found. The text contains an encoded version
/* of the requested data.
/* SEE ALSO /* SEE ALSO
/* dict(3) generic dictionary manager /* dict(3) generic dictionary manager
/* hex_quote(3) http-style quoting /* hex_quote(3) http-style quoting
@@ -45,6 +68,7 @@
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <ctype.h>
/* Utility library. */ /* Utility library. */
@@ -56,6 +80,7 @@
#include "connect.h" #include "connect.h"
#include "hex_quote.h" #include "hex_quote.h"
#include "dict.h" #include "dict.h"
#include "stringops.h"
#include "dict_tcp.h" #include "dict_tcp.h"
/* Application-specific. */ /* Application-specific. */
@@ -148,13 +173,23 @@ static const char *dict_tcp_lookup(DICT *dict, const char *key)
* is mostly text. * is mostly text.
*/ */
hex_quote(dict_tcp->hex_buf, key); hex_quote(dict_tcp->hex_buf, key);
vstream_fprintf(dict_tcp->fp, "%s\n", STR(dict_tcp->hex_buf)); vstream_fprintf(dict_tcp->fp, "get %s\n", STR(dict_tcp->hex_buf));
errno = 0; errno = 0;
if (vstring_get_nonl(dict_tcp->hex_buf, dict_tcp->fp) == VSTREAM_EOF) { if (vstring_get_nonl(dict_tcp->hex_buf, dict_tcp->fp) == VSTREAM_EOF) {
msg_warn("read TCP map reply from %s: %m", dict_tcp->map); msg_warn("read TCP map reply from %s: %m", dict_tcp->map);
} else if (!hex_unquote(dict_tcp->raw_buf, STR(dict_tcp->hex_buf))) { } else if (!hex_unquote(dict_tcp->raw_buf, STR(dict_tcp->hex_buf))) {
msg_warn("read TCP map reply from %s: malformed reply %.100s", msg_warn("read TCP map reply from %s: malformed reply %.100s",
dict_tcp->map, STR(dict_tcp->hex_buf)); dict_tcp->map,
printable(STR(dict_tcp->hex_buf), '_'));
dict_errno = DICT_ERR_RETRY;
return (0);
} else if (ISSPACE(*STR(dict_tcp->raw_buf))) {
msg_warn("TCP map reply from %s failed%s%s",
dict_tcp->map,
STR(dict_tcp->raw_buf)[1] ? ":" : "",
printable(STR(dict_tcp->raw_buf), '_'));
dict_errno = DICT_ERR_RETRY;
return (0);
} else { } else {
return (STR(dict_tcp->raw_buf)); return (STR(dict_tcp->raw_buf));
} }

View File

@@ -20,10 +20,11 @@
/* value is the hex argument. /* value is the hex argument.
/* /*
/* hex_unquote() performs the opposite transformation. This function /* hex_unquote() performs the opposite transformation. This function
/* understands lowercase and uppercase %XX sequences. The result /* understands, lowercase, uppercase, and mixed case %XX sequences. The
/* value is the raw argument in case of success, a null pointer otherwise. /* result value is the raw argument in case of success, a null pointer
/* otherwise.
/* BUGS /* BUGS
/* Cannot process null characters. /* hex_quote() cannot process null characters in data.
/* LICENSE /* LICENSE
/* .ad /* .ad
/* .fi /* .fi