]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.9.0
authorWietse Venema <wietse@porcupine.org>
Tue, 31 Jan 2012 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 15:53:35 +0000 (15:53 +0000)
118 files changed:
postfix/AAAREADME
postfix/HISTORY
postfix/Makefile.in
postfix/README_FILES/ADDRESS_VERIFICATION_README
postfix/README_FILES/DATABASE_README
postfix/README_FILES/MEMCACHE_README
postfix/README_FILES/POSTSCREEN_README
postfix/RELEASE_NOTES
postfix/WISHLIST [deleted file]
postfix/conf/post-install
postfix/html/ADDRESS_VERIFICATION_README.html
postfix/html/DATABASE_README.html
postfix/html/MEMCACHE_README.html
postfix/html/POSTSCREEN_README.html
postfix/html/memcache_table.5.html
postfix/html/postconf.1.html
postfix/html/postkick.1.html
postfix/makedefs
postfix/man/man1/postconf.1
postfix/man/man1/postkick.1
postfix/man/man5/memcache_table.5
postfix/pflogsumm_quickfix.txt [new file with mode: 0644]
postfix/proto/ADDRESS_VERIFICATION_README.html
postfix/proto/DATABASE_README.html
postfix/proto/MEMCACHE_README.html
postfix/proto/POSTSCREEN_README.html
postfix/proto/memcache_table
postfix/src/bounce/bounce_trace_service.c
postfix/src/cleanup/Makefile.in
postfix/src/cleanup/cleanup_region.c
postfix/src/dns/dns_rr_eq_sa.ref
postfix/src/dns/dns_sa_to_rr.ref
postfix/src/flush/Makefile.in
postfix/src/flush/flush.c
postfix/src/global/Makefile.in
postfix/src/global/data_redirect.c
postfix/src/global/dict_ldap.c
postfix/src/global/dict_sqlite.c
postfix/src/global/dot_lockfile.c
postfix/src/global/file_id.c
postfix/src/global/mail_copy.c
postfix/src/global/mail_open_ok.c
postfix/src/global/mail_stream.c
postfix/src/global/mail_trigger.c
postfix/src/global/mail_version.h
postfix/src/global/mbox_open.c
postfix/src/global/mkmap_db.c
postfix/src/global/namadr_list.in
postfix/src/global/namadr_list.ref
postfix/src/global/remove.c
postfix/src/local/Makefile.in
postfix/src/local/mailbox.c
postfix/src/local/maildir.c
postfix/src/master/Makefile.in
postfix/src/master/mail_flow.c
postfix/src/oqmgr/Makefile.in
postfix/src/oqmgr/qmgr_active.c
postfix/src/postalias/Makefile.in
postfix/src/postalias/postalias.c
postfix/src/postcat/Makefile.in
postfix/src/postcat/postcat.c
postfix/src/postconf/Makefile.in
postfix/src/postconf/postconf.c
postfix/src/postconf/postconf_master.c
postfix/src/postconf/postconf_user.c
postfix/src/postconf/test30.ref [new file with mode: 0644]
postfix/src/postdrop/Makefile.in
postfix/src/postdrop/postdrop.c
postfix/src/postfix/Makefile.in
postfix/src/postfix/postfix.c
postfix/src/postkick/Makefile.in
postfix/src/postkick/postkick.c
postfix/src/postlock/Makefile.in
postfix/src/postlock/postlock.c
postfix/src/postlog/Makefile.in
postfix/src/postlog/postlog.c
postfix/src/postmap/Makefile.in
postfix/src/postmap/postmap.c
postfix/src/postmulti/Makefile.in
postfix/src/postmulti/postmulti.c
postfix/src/postqueue/Makefile.in
postfix/src/postqueue/postqueue.c
postfix/src/postscreen/postscreen.c
postfix/src/postscreen/postscreen_smtpd.c
postfix/src/postsuper/Makefile.in
postfix/src/postsuper/postsuper.c
postfix/src/qmgr/Makefile.in
postfix/src/qmgr/qmgr_active.c
postfix/src/sendmail/Makefile.in
postfix/src/sendmail/sendmail.c
postfix/src/tlsmgr/Makefile.in
postfix/src/tlsmgr/tlsmgr.c
postfix/src/util/Makefile.in
postfix/src/util/argv.c
postfix/src/util/argv.h
postfix/src/util/dict.c
postfix/src/util/dict_cdb.c
postfix/src/util/dict_cidr.c
postfix/src/util/dict_db.c
postfix/src/util/dict_dbm.c
postfix/src/util/dict_pcre.c
postfix/src/util/dict_regexp.c
postfix/src/util/dict_sdbm.c
postfix/src/util/dict_thash.c
postfix/src/util/edit_file.c
postfix/src/util/fifo_listen.c
postfix/src/util/load_file.c
postfix/src/util/lstat_as.c
postfix/src/util/make_dirs.c
postfix/src/util/myaddrinfo.ref
postfix/src/util/safe_open.c
postfix/src/util/sane_link.c
postfix/src/util/sane_rename.c
postfix/src/util/stat_as.c
postfix/src/util/warn_stat.c [new file with mode: 0644]
postfix/src/util/warn_stat.h [new file with mode: 0644]
postfix/src/virtual/Makefile.in
postfix/src/virtual/maildir.c

index e78b4d8e17f125edc43b58d2d384c8b59ba5d026..cb11a0ada40af91aa4ff25932faadb59a1ce1567 100644 (file)
@@ -111,7 +111,10 @@ Library routines:
 
     src/dns/           DNS client library
     src/global/                Postfix-specific support routines
+    src/milter/                Postfix Milter (mail filter) client
+    src/tls/           TLS client and server support
     src/util/          General-purpose support routines
+    src/xsasl/         SASL plug-in API
 
 Command-line utilities:
 
@@ -124,6 +127,7 @@ Command-line utilities:
     src/postlock/      Postfix locking for shell scripts
     src/postlog/       Postfix logging for shell scripts
     src/postmap/       Postfix lookup table management
+    src/postmulti/     Postfix multi-instance manager
     src/postqueue/     Postfix queue control program
     src/postsuper/     Postfix house keeping program
     src/sendmail/      Sendmail compatibility interface
@@ -134,19 +138,25 @@ Postfix daemons:
     src/bounce/                Bounce or defer mail
     src/cleanup/       Canonicalize and enqueue mail
     src/discard/       Trivial discard mailer
+    src/dnsblog/       DNS agent for postscreen
     src/error/         Trivial error mailer
+    src/flush/         Support for ETRN, sendmail -qI, sendmail -qR
     src/local/         Local delivery
     src/master/                Postfix resident superserver
     src/oqmgr/         Old queue manager
     src/pickup/                Local pickup
     src/pipe/          Pipe delivery
+    src/postscreen/    Zombie blocker
+    src/proxymap/      Table lookup proxy agent
     src/qmgr/          Queue manager
     src/qmqpd/         QMQPD server
+    src/scache/                Postfix SMTP session cache
     src/showq/         List Postfix queue status
     src/smtp/          SMTP and LMTP client
     src/smtpd/         SMTP server
     src/spawn/         Run non-Postfix server
     src/tlsmgr/                TLS session keys and random pool
+    src/tlsproxy/      TLS proxy for postscreen
     src/trivial-rewrite/ Address rewriting and resolving
     src/verify/                address verification service
     src/virtual/       virtual mailbox-only delivery agent
index daf7b45750d4c77a11f07ea0fb1ff19c2de9ad4f..88c64f22949a825ccc685a6771a7ed44f194827c 100644 (file)
@@ -17545,7 +17545,7 @@ Apologies for any names omitted.
        table is unavailable. Files: global/mail_error.[hc],
        smtpd/smtpd_check.c, smtp/smtp_trouble.c.
 
-20111215
+20120115
 
        Fine tuning: SMTP server error messages. File: smtpd/smtpd.c.
 
@@ -17558,7 +17558,7 @@ Apologies for any names omitted.
        Cleanup: tiny memory leaks after surrogate database opens.
        Files: util/dict_cidr.c, util/dict_db.c.
 
-20111217
+20120117
 
        Cleanup: support for legacy-style database configuration
        where parameter names are generated by appending suffixes
@@ -17567,3 +17567,44 @@ Apologies for any names omitted.
        Other: build without Berkeley DB support (make makefiles
        "CCARGS=$CCARGS -DNO_DB"). Files: makedefs, util/sys_defs.h,
        proto/DB_README.html, proto/INSTALL.html.
+
+20120120
+
+       Compatibility: added file pflogsumm_quickfix.txt with quick
+       patches for pflogsumm that handle the new default master.cf
+       entries for the submission and smtps services.
+
+20120121
+
+       Cleanup: getopt(3) compatibility in the postconf(1) master.cf
+       parser. Process "--" as the end-of-options indicator, and
+       process "-oname=value" as "-o name=value".  Files:
+       util/argv.[hc], postconf/postconf_master.cf,
+       postconf/postconf_user.c.
+
+20120122
+
+       Workaround: log a warning and suggested solution for common
+       stat()/fstat()/lstat() problems caused by 32-bit overflow.
+       This is a real stinker that causes Postfix to fail without
+       any prior warning.  File: util/warn_stat.[hc], and everything
+       that directly calls stat(), fstat() or lstat().
+
+20120127
+
+       Bugfix (introduced: Postfix 2.8): the Postfix client sqlite
+       quoting routine returned the unquoted result instead of the
+       quoted text.  The opportunities for misuse are limited,
+       because Postfix sqlite files are usually owned by root, and
+       Postfix daemons usually run with non-root privileges so
+       they can't corrupt the database. Problem reported by Rob
+       McGee (rob0).  File: global/dict_sqlite.c.
+
+20120130
+
+       Bugfix (introduced: Postfix 2.3): the trace service did not
+       distinguish between notifications for a non-bounce or a
+       bounce message. This code pre-dates DSN support and should
+       have been updated when it was re-purposed to handle DSN
+       SUCCESS notifications. Problem reported by Sabahattin
+       Gucukoglu.  File: bounce/bounce_trace_service.c.
index 8a45ddd6ffe725a8a592aff395dc9e38a15de73c..e45ba73a01f90b4cdbcf47ab23653663442088a7 100644 (file)
@@ -35,25 +35,25 @@ update printfck tests root_tests:
 update: $(LIBEXEC)
 
 libexec/post-install: conf/post-install
-       rm -f $@ && ln -sf ../$? $@
+       rm -f $@ && ln -$? $@
 
 libexec/postfix-files: conf/postfix-files
-       rm -f $@ && ln -sf ../$? $@
+       rm -f $@ && ln -$? $@
 
 libexec/postfix-script: conf/postfix-script
-       rm -f $@ && ln -sf ../$? $@
+       rm -f $@ && ln -$? $@
 
 libexec/postfix-wrapper: conf/postfix-wrapper
-       rm -f $@ && ln -sf ../$? $@
+       rm -f $@ && ln -$? $@
 
 libexec/main.cf: conf/main.cf
-       rm -f $@ && ln -sf ../$? $@
+       rm -f $@ && ln -$? $@
 
 libexec/master.cf: conf/master.cf
-       rm -f $@ && ln -sf ../$? $@
+       rm -f $@ && ln -$? $@
 
 libexec/postmulti-script: conf/postmulti-script
-       rm -f $@ && ln -sf ../$? $@
+       rm -f $@ && ln -$? $@
 
 manpages:
        set -e; for i in $(MANDIRS); do \
index 2866b0b4e427b9212b8492b76ca089ddcf3717a7..8a19731b792f17b7eebc49c051d281efedb6876b 100644 (file)
@@ -294,6 +294,16 @@ results are lost after "postfix reload" or "postfix stop".
         # Note: avoid hash files here. Use btree instead.
         address_verify_map = btree:$data_directory/verify_cache
 
+        # Shared persistent cache (requires Postfix 2.9 or later).
+        address_verify_map = proxy:btree:$data_directory/verify_cache
+        # Disable automatic cache cleanup in all Postfix instances except
+        # for one instance that will be responsible for cache cleanup.
+        # address_verify_cache_cleanup_interval = 0
+
+        # Shared memory cache (requires Postfix 2.9 or later).
+        # See memcache_table(5) for details.
+        address_verify_map = memcache:/etc/postfix/verify-memcache.cf
+
         # Default setting for Postfix 2.6 and earlier.
         # This uses non-persistent storage only.
         address_verify_map =
index 231e426c8cd95b9285394add06db4846236cd23d..18e898250d501a57a294fb473ed52be7014ef3ca 100644 (file)
@@ -198,7 +198,7 @@ To find out what database types your Postfix system supports, use the "p\bpo\bos\bs
     e\ben\bnv\bvi\bir\bro\bon\bn
         The UNIX process environment array. The lookup key is the variable
         name. The lookup table name in "environ:table" is ignored.
-    f\bfa\bai\bil\bl (read-write)
+    f\bfa\bai\bil\bl
         A table that reliably fails all requests. The lookup table name is used
         for logging only. This table exists to simplify Postfix error tests.
     h\bha\bas\bsh\bh
@@ -213,7 +213,7 @@ To find out what database types your Postfix system supports, use the "p\bpo\bos\bs
     l\bld\bda\bap\bp (read-only)
         Perform lookups using the LDAP protocol. Configuration details are
         given in the ldap_table(5).
-    m\bme\bem\bmc\bca\bac\bch\bhe\be (read-write)
+    m\bme\bem\bmc\bca\bac\bch\bhe\be
         Perform memcache database lookups or updates. Configuration details are
         given in memcache_table(5).
     m\bmy\bys\bsq\bql\bl (read-only)
@@ -233,7 +233,7 @@ To find out what database types your Postfix system supports, use the "p\bpo\bos\bs
     p\bpg\bgs\bsq\bql\bl (read-only)
         Perform PostgreSQL database lookups. Configuration details are given in
         pgsql_table(5).
-    p\bpr\bro\box\bxy\by (read-only)
+    p\bpr\bro\box\bxy\by
         Access information via the Postfix proxymap(8) service. The lookup
         table name syntax is "proxy:type:table".
     r\bre\beg\bge\bex\bxp\bp (read-only)
index c668b177cacb035621790943767c31b7f58247fb..f89e148d46dffbae47af507ca81a29c6461471f5 100644 (file)
@@ -44,7 +44,7 @@ C\bCr\bre\bed\bdi\bit\bts\bs
 The first memcache client for Postfix was written by Omar Kilani, and was based
 on the libmemcache library.
 
-Wietse wrote the current memcache client from the ground up. This
-implementation does not use libmemcache, and bears no resemblance to earlier
-work.
+Wietse wrote the current memcache client from the ground up for Postfix version
+2.9. This implementation does not use libmemcache, and bears no resemblance to
+earlier work.
 
index a8189e27e728e8daecec0ea4e4e44aaae6fe6365..fee091a25963b526ae8b979d3c380f303a8b132b 100644 (file)
@@ -162,10 +162,16 @@ whitelist. The temporary whitelist is not used for SMTP client addresses that
 appear on the permanent access list.
 
     NOTE: To share a postscreen(8) cache between multiple postscreen(8)
-    instances, use "postscreen_cache_map = proxy:btree:/path/to/file". This
-    requires Postfix 2.9 or later; earlier proxymap(8) implementations don't
-    support cache cleanup. For an alternative approach see the memcache_table
-    (5) manpage.
+    instances, use "postscreen_cache_map = proxy:btree:$data_directory/
+    postscreen_cache", and disable cache cleanup
+    (postscreen_cache_cleanup_interval = 0) in all postscreen(8) instances
+    except one that is responsible for cache cleanup.
+
+    postscreen(8) cache sharing requires Postfix 2.9 or later; earlier proxymap
+    (8) implementations don't support cache cleanup.
+
+    For an alternative postscreen(8) cache sharing approach see the
+    memcache_table(5) manpage.
 
 When the SMTP client address appears on the temporary whitelist, postscreen(8)
 logs this with the client address and port number as:
index dfb86dc67662d4e8a588d78ce1f0e78853c64b37..e30a34d6ff71d9208f35cdc7f60b320430b1c96e 100644 (file)
@@ -1,10 +1,10 @@
-The stable Postfix release is called postfix-2.8.x where 2=major
-release number, 8=minor release number, x=patchlevel.  The stable
+The stable Postfix release is called postfix-2.9.x where 2=major
+release number, 9=minor release number, x=patchlevel.  The stable
 release never changes except for patches that address bugs or
 emergencies. Patches change the patchlevel and the release date.
 
 New features are developed in snapshot releases. These are called
-postfix-2.9-yyyymmdd where yyyymmdd is the release date (yyyy=year,
+postfix-2.10-yyyymmdd where yyyymmdd is the release date (yyyy=year,
 mm=month, dd=day).  Patches are never issued for snapshot releases;
 instead, a new snapshot is released.
 
@@ -14,357 +14,339 @@ specifies the release date of a stable release or snapshot release.
 If you upgrade from Postfix 2.7 or earlier, read RELEASE_NOTES-2.8
 before proceeding.
 
-Incompatible changes with snapshot 20120114
-===========================================
-
-Instead of terminating immediately with a "fatal" message when a
-database file can't be opened, a Postfix daemon program now logs
-an "error" message, and continues execution with reduced functionality.
-
-Specify "daemon_table_open_error_is_fatal = yes" to get the
-historical behavior (immediate termination with "fatal" message).
-
-Logfile-based alerting systems may need to be updated to look for
-"error" messages in addition to "fatal" messages.  
-
-By default the Postfix SMTP server no longer reports transcripts
-of sessions where a client command is rejected because a table is
-unavailable.  To receive such reports, add the new "data" class to
-the notify_classes parameter value. The reports will be sent to the
-error_notice_recipient address as before. This class is also used
-by the Postfix SMTP client to report about sessions that fail because
-a table is unavailable
-
-Major changes with snapshot 20120114
-====================================
-
-Gradual degradation after database file open error.  Instead of
-terminating immediately with a "fatal" message, a Postfix daemon
-program logs an "error" message, and continues execution with reduced
-functionality.
-
-Features that don't depend on the unavailable table will keep
-working; features that depend on the table will fail, and will be
-logged with a "warning" message. For the sake of sanity, the number
-of "error"s over the life of a process is limited to 13.
-
-Specify "daemon_table_open_error_is_fatal = yes" to get the
-historical behavior (immediate termination with "fatal" message).
-
-When the notify_classes parameter contains the new "data" class,
-the Postfix SMTP client and server will report transcripts of
-sessions with errors because a table is unavailable.
-
-Major changes with snapshot 20120108
-====================================
-
-The LDAP, *SQL and memcache clients now "catch" table lookup errors
-in the "domain" feature, instead of terminating with a fatal error.
-
-Major changes with snapshot 20120102
-====================================
-
-Degrade gradually when some or all network protocols specified
-with inet_protocols are unavailable, instead of terminating with a
-fatal error. This eliminates build errors on non-standard systems
-where opening an IPv4 socket results in an error, and on non-standard
-systems where opening an IPv6 socket results in an error. In the
-worst case, the master daemon will log a message that it disables
-all type "inet" services. This will still allow local submission
-and local delivery.
-
-Major changes with snapshot 20111222
-====================================
-
-The Postfix SMTP server now "catches" errors with database lookups
-in mynetworks, TLS client certificate tables, debug_peer_list,
+Major changes - critical
+------------------------
+
+[Incompat 20110321] You need to "postfix reload" after upgrade from
+snapshot 20110320 or earlier.  The hash_queue_names algorithm was
+changed to provide better performance with long queue IDs.
+
+[Incompat 20110313] Use "postfix reload" after "make upgrade" on a
+running Postfix system. This is needed because the protocol between
+postscreen(8) and dnsblog(8) has changed.
+
+Major changes - library API
+---------------------------
+
+[Incompat 20110130] The VSTREAM error flags are now split into
+separate read and write error flags. As a result of this change,
+all programs that use Postfix VSTREAMs MUST be recompiled.
+
+Major changes - compatibility
+-----------------------------
+
+[Incompat 20111012] For consistency with the SMTP standard, the
+(client-side) smtp_line_length_limit default value was increased
+from 990 characters to 999 (i.e. 1000 characters including <CR><LF>).
+Specify "smtp_line_length_limit = 990" to restore historical Postfix
+behavior.
+
+[Incompat 20111012] To simplify integration with third-party
+applications, the Postfix sendmail command now always transforms
+all input lines ending in <CR><LF> into UNIX format (lines ending
+in <LF>). Specify "sendmail_fix_line_endings = strict" to restore
+historical Postfix behavior (i.e. convert all input lines ending
+in <CR><LF> only if the first line ends in <CR><LF>).
+
+[Incompat 20111106] To work around broken remote SMTP servers, the
+Postfix SMTP client by default no longer appends the "AUTH=<>"
+option to the MAIL FROM command.  Specify "smtp_send_dummy_mail_auth
+= yes" to restore the old behavior.
+
+Major changes - gradual degradation
+-----------------------------------
+
+[Incompat 20120114] Logfile-based alerting systems may need to be
+updated to look for "error" messages in addition to "fatal" messages.
+Specify "daemon_table_open_error_is_fatal = yes" to get the historical
+behavior (immediate termination with "fatal" message).
+
+[Feature 20120114] Instead of terminating immediately with a "fatal"
+message when a database file can't be opened, a Postfix daemon
+program now logs an "error" message, and continues execution with
+reduced functionality.  For the sake of sanity, the number of
+"errors" over the life of a process is limited to 13.
+
+Features that don't depend on the unavailable table will continue
+to work; attempts to use features that depend on the table will
+fail, and will be logged with a "warning" message.
+
+[Feature 20120108] Instead of terminating with a fatal error, the
+LDAP, *SQL and memcache clients now handle table lookup errors in
+the "domain" feature, instead of terminating with a fatal error.
+
+[Feature 20120102] Degrade gradually when some or all network
+protocols specified with inet_protocols are unavailable, instead
+of terminating with a fatal error. This eliminates build errors on
+non-standard systems where opening an IPv4 socket results in an
+error, and on non-standard systems where opening an IPv6 socket
+results in an error. In the worst case, the master daemon will log
+a message that it disables all type "inet" services. This will still
+allow local submission and local delivery.
+
+[Feature 20111222] Instead of terminating with a fatal error, the
+Postfix SMTP server now handles errors with database lookups in
+mynetworks, TLS client certificate tables, debug_peer_list,
 smtpd_client_event_limit_exceptions, permit_mx_backup_networks and
-local_header_rewrite_clients, and reports "server configuration
-error" or "table lookup error" instead of terminating with a fatal
-error.
+local_header_rewrite_clients, and reports "server local data error"
+or "temporary lookup error".
+
+[Feature 20111229] Instead of terminating with a fatal error, the
+trivial-rewrite server now handles errors with database lookups in
+virtual_alias_domains, relay_domains, virtual_mailbox_domains.  This
+means fewer occasions where trivial-rewrite clients (such as the
+SMTP server) will appear to hang.
+
+Major changes - long queue IDs
+------------------------------
+
+Postfix 2.9 introduces support for non-repeating queue IDs (also
+used as queue file names). These names are encoded in a mix of upper
+case, lower case and decimal digit characters.  Long queue IDs are
+disabled by default to avoid breaking tools that parse logfiles and
+that expect queue IDs with the smaller [A-F0-9] character set.
+
+[Incompat 20110320] If you enable support for long queue file names,
+you need to be aware that these file names are not compatible with
+Postfix <= 2.8.  If you must migrate back to Postfix <= 2.8, you
+must first convert all long queue file names into short names,
+otherwise the old Postfix version will complain.
 
-Major changes with snapshot 20111229
-====================================
-
-The trivial-rewrite server now "catches" errors with database lookups
-in virtual_alias_domains, relay_domains, virtual_mailbox_domains,
-instead of terminating with a fatal error.  This means fewer occasions
-where trivial-rewrite clients (such as the SMTP server) will appear
-to hang.
-
-Incompatible changes with snapshot 20111218
-===========================================
+The conversion procedure before migration to Postfix <= 2.8 is:
 
-To support external SASL authentication, the Postfix SMTP server
-now always checks the smtpd_sender_login_maps table, even without
-having "smtpd_sasl_auth_enable = yes" in main.cf.
+    # postfix stop
+    # postconf enable_long_queue_ids=no
+    # postsuper
 
-Major changes with snapshot 20111218
-====================================
+Run the postsuper command repeatedly until it no longer reports
+queue file name changes.
 
-Support for external SASL authentication via the XCLIENT command.
-This is used to accept SASL authentication from an SMTP proxy such
-as NGINX. This support works even without having to specify
-"smtpd_sasl_auth_enable = yes" in main.cf.
+[Feature 20110320] Support for long, non-repeating, queue IDs (queue
+file names).  The benefit of non-repeating names is simpler logfile
+analysis, and easier queue migration (if you don't merge different
+queues, there is no need to run "postsuper" to change queue file
+names that don't match their message file inode number).
 
-Major changes with snapshot 20111213
-====================================
+Specify "enable_long_queue_ids = yes" to enable the feature. This
+does not change the names of existing queue files. See postconf(5)
+or postconf.5.html#enable_long_queue_ids for a detailed description
+of the differences with the old short queue IDs.
 
-Support for a persistent backup database in the memcache client.
-The memcache client updates the memcache whenever it looks up or
-modifies information in the persistent database.
+This changes new Postfix queue IDs from the short form 0FCEE9247A9
+into the longer form 3Ps0FS1Zhtz1PFjb, and changes new Message-ID
+header values from YYMMDDHHMMSS.queueid@myhostname into the shorter
+form queueid@myhostname.
 
-Support for proxymap-over-tcp (proxy:maptype:mapname@host:port) is
-under development.
+Major changes - memcache
+------------------------
 
-Elimination of dependencies on the libmemcache library. Postfix
-memcache support is now compiled in by default.
+[Feature 20111209] memcache lookup and update support. This provides
+a way to share postscreen(8) or verify(8) caches between Postfix
+instances.  See MEMCACHE_README and memcache_table(5) for details
+and limitations.
 
-Major changes with snapshot 20111209
-====================================
+[Feature 20111213] Support for a persistent backup database in the
+memcache client.  The memcache client updates the memcache whenever
+it looks up or modifies information in the persistent database.
 
-memcache lookup and update support. This provides a way to share
-postscreen(8) or verify(8) caches between Postfix instances.  The
-Postfix memcache client can't be used for security-sensitive
-information, and it supports only libmemcache version 1.4.0.  See
-MEMCACHE_README and memcache_table(5) for details and limitations.
+Major changes - postconf
+------------------------
 
-Incompatible changes with snapshot 20111205
-===========================================
+The postconf command was restructured - it now warns about unused
+parameter name=value settings in main.cf or master.cf (likely to
+be mistakes), it now understands "dynamic" parameter names such as
+parameters whose name depends on the name of a master.cf entry, and
+it can display main.cf and master.cf in a more user-friendly format.
 
-Postfix now logs the result of succesful TLS negotiation with TLS
-logging levels of 0. See the smtp_tls_loglevel and smtpd_tls_loglevel
-descriptions in the postconf(5) manpage for other minor differences.
+[Feature 20120117] support for legacy database parameter names
+(main.cf parameter names that are generated by prepending a suffix
+to the database name).
 
-Major changes with snapshot 20111205
-====================================
+[Feature 20111118] The "postconf -M" (display master.cf) command
+now supports filtering.  For example, specify "postconf -M inet"
+to display only services that listen on the network.
 
-Support for TLS public key fingerprint matching in the Postfix SMTP
-client (in smtp_tls_policy_maps) and server (in check_ccert access
-maps).  Public key fingerprints are inherently more specific than
-fingerprints over the entire certificate.
+[Feature 20111113] postconf support to warn about unused "name=value"
+entries in main.cf, and about unused "-o name=value" entries in
+master.cf.  This should help to eliminate common errors with mis-typed
+names.
 
-Revision of Postfix TLS logging. The main difference is that Postfix
-now logs the result of succesful TLS negotiation with TLS logging
-levels of 0.  See the smtp_tls_loglevel and smtpd_tls_loglevel
-descriptions in the postconf(5) manpage for other minor differences.
+[Feature 20111108] postconf support for parameter names that are
+generated automatically from master.cf entries (delivery agents,
+spawn services), and for parameter names that are defined with
+main.cf smtpd_restriction_classes.
 
-Major changes with snapshot 20111203
-====================================
+[Feature 20111106] "postconf -M" support to print master.cf entries,
+and "postconf -f" support to fold long main.cf or master.cf lines
+for human readability.
 
-Support for time-dependent sender addresses of address verification
-probes. The default address, double-bounce, may end up on spammer
-blacklists. Although Postfix discards mail for this address, such
-mail still uses up network bandwidth and server resources. Specify
-an address_verify_sender_ttl value of several hours or more to
-frustrate address harvesting.
+Major changes - trickle defense
+-------------------------------
 
-Major changes with snapshot 20111120
-====================================
+[Feature 20110212] Support for per-record deadlines.  These change
+the behavior of Postfix timeout parameters, from a time limit per
+read or write system call, to a time limit to send or receive a
+complete record (an SMTP command line, SMTP response line, SMTP
+message content line, or TLS protocol message).  This limits the
+impact from hostile peers that trickle data one byte at a time.
 
-Eliminated the postconf limitation documented on 20111113 as "lack
-of support for per-service parameter name spaces in master.cf,
-meaning that "-o user-defined-name=value" always results in an
-"unused parameter" warning". This brings the total cost of the
-postconf upgrade to some 55 person-hours, 600 lines of code, and
-300 lines of comments or documentation.
+The new configuration parameters and their default settings are:
+smtpd_per_record_deadline (normal: no, overload: yes),
+smtp_per_record_deadline (no), and lmtp_per_record_deadline (no).
 
-Major changes with snapshot 20111118
-====================================
+Note: when per-record deadlines are enabled, a short time limit may
+cause problems with TLS over very slow network connections.  The
+reason is that a TLS protocol message can be up to 16 kbytes long
+(with TLSv1), and that an entire TLS protocol message must be sent
+or received within the per-record deadline.
 
-The "postconf -M" (display master.cf) command now supports filtering.
-For example, specify "postconf -M inet" to display only services
-that listen on the network.
+Per-record deadlines were introduced with postscreen(8) in Postfix
+2.8. This program does not receive mail, and therefore it has no
+problems with TLS over slow connections.
 
-Incompatible changes with snapshot 20111113
-===========================================
+Major changes - postscreen
+--------------------------
 
-The postconf command now logs warnings about unused "name=value"
-entries in main.cf, and about unused "-o name=value" entries in
-master.cf. Such entries are the result of feature creep in Postfix,
-and of mis-typed names. Once the configurations are cleaned up,
-Postfix configuration changes will be more robust.
+[Feature 20111211] The proxymap(8) server can now be used to share
+postscreen(8) or verify(8) caches between Postfix instances.  Support
+for proxymap-over-TCP, to share a Postfix database between hosts,
+is expected to be completed in the Postfix 2.10 development cycle.
 
-Major changes with snapshot 20111113
-====================================
+[Feature 20111209] memcache lookup and update support. This provides
+a way to share postscreen(8) or verify(8) caches between Postfix
+instances.  
 
-postconf support to warn about unused "name=value" entries in
-main.cf, and about unused "-o name=value" entries in master.cf.
-This should help to eliminate common errors with mis-typed names.
+[Feature 20110228] postscreen(8) support to force remote SMTP clients
+to implement proper MX lookup policy.  By listening on both primary
+and backup MX addresses, postscreen(8) can deny the temporary
+whitelist status to clients that connect only to backup MX hosts,
+and prevent them from talking to a Postfix SMTP server process.
 
-The only known limitation is lack of support for per-service parameter
-name spaces in master.cf, meaning that "-o user-defined-name=value"
-always results in an "unused parameter" warning.
+Example: when 1.2.3.4 is a local backup IP address, specify
+"postscreen_whitelist_interfaces = !1.2.3.4 static:all".
 
-This completes an effort that expanded postconf.c by 553 lines of
-code that were designed, written, tested and documented (in 250
-lines) at the cost of 35 person-hours, spread out over 7 days.
+Major changes - tls
+-------------------
 
-Major changes with snapshot 20111108
-====================================
+[Incompat 20111205] Postfix now logs the result of successful TLS
+negotiation with TLS logging levels of 0. See the smtp_tls_loglevel
+and smtpd_tls_loglevel descriptions in the postconf(5) manpage for
+other minor differences.
 
-postconf support for parameter names that are generated automatically
-from master.cf entries (delivery agents, spawn services), and for
-parameter names that are defined with main.cf smtpd_restriction_classes.
-This increases the postconf output size with 70 lines or more.
+[Feature 20111205] Support for TLS public key fingerprint matching
+in the Postfix SMTP client (in smtp_tls_policy_maps) and server (in
+check_ccert access maps).  Public key fingerprints are inherently
+more specific than fingerprints over the entire certificate.
 
-Major changes with snapshot 20111106
-====================================
+[Feature 20111205] Revision of Postfix TLS logging. The main
+difference is that Postfix now logs the result of successful TLS
+negotiation with TLS logging levels of 0.  See the smtp_tls_loglevel
+and smtpd_tls_loglevel descriptions in the postconf(5) manpage for
+other minor differences.
 
-"postconf -M" support to print master.cf entries, and "postconf -f"
-support to fold long main.cf or master.cf lines for human readability.
+Major changes - sasl authentication
+-----------------------------------
 
-Incompatible changes with snapshot 20111106
-===========================================
+[Incompat 20111218] To support external SASL authentication, e.g.,
+in an NGINX proxy daemon, the Postfix SMTP server now always checks
+the smtpd_sender_login_maps table, even without having
+"smtpd_sasl_auth_enable = yes" in main.cf.
 
-To work around broken remote SMTP servers, the Postfix SMTP client
-by default no longer appends the "AUTH=<>" option to the MAIL FROM
-command.  Specify "smtp_send_dummy_mail_auth = yes" to restore the
-old behavior.
+[Feature 20111218] Support for external SASL authentication via the
+XCLIENT command.  This is used to accept SASL authentication from
+an SMTP proxy such as NGINX. This support works even without having
+to specify "smtpd_sasl_auth_enable = yes" in main.cf.
 
-Incompatible changes with snapshot 20111012
-===========================================
+[Incompat 20111106] To work around broken remote SMTP servers, the
+Postfix SMTP client by default no longer appends the "AUTH=<>"
+option to the MAIL FROM command.  Specify "smtp_send_dummy_mail_auth
+= yes" to restore the old behavior.
 
-For consistency with the SMTP standard, the smtp_line_length_limit
-default value was increased from 990 characters to 998 (i.e. 1000
-characters including <CR><LF>). Specify "smtp_line_length_limit =
-990" to restore historical Postfix behavior.
+Major changes - large file support
+----------------------------------
 
-To simplify integration with third-party applications, the Postfix
-sendmail command now always transforms all input lines ending in
-<CR><LF> into UNIX format (lines ending in <LF>). Specify
-"sendmail_fix_line_endings = strict" to restore historical Postfix
-behavior (i.e. convert all input lines ending in <CR><LF> only if
-the first line ends in <CR><LF>).
+[Feature 20110219] Postfix now uses long integers for message_size_limit,
+mailbox_size_limit and virtual_mailbox_limit. On LP64 systems (64-bit
+long and pointer, but 32-bit integer), these limits can now exceed
+2GB.
 
-Incompatible changes with snapshot 20110918
-===========================================
+Major changes - ipv6
+--------------------
 
-The following changes were made in default settings, in preparation
-for general availability of IPv6:
+[Incompat 20110918] The following changes were made in default
+settings, in preparation for general availability of IPv6:
 
 - The default inet_protocols value is now "all" instead of "ipv4",
-  meaning use both IPv4 and IPv6.  As a compatibility workaround
-  for sites without global IPv6 connectivity, the commands "make
-  upgrade" and "postfix upgrade-configuration" append "inet_protocols
-  = ipv4" to main.cf when no explicit inet_protocols setting is
-  present.  This workaround will be removed in a future release.
+  meaning use both IPv4 and IPv6.  
+
+  To avoid an unexpected loss of performance for sites without
+  global IPv6 connectivity, the commands "make upgrade" and "postfix
+  upgrade-configuration" now append "inet_protocols = ipv4" to
+  main.cf when no explicit inet_protocols setting is already present.
+  This workaround will be removed in a future release.
 
 - The default smtp_address_preference value is now "any" instead
   of "ipv6", meaning choose randomly between IPv6 and IPv4. With
   this the Postfix SMTP client will have more success delivering
   mail to sites that have problematic IPv6 configurations.
 
-Incompatible changes with snapshot 20110321
-===========================================
-
-You need to "postfix reload" after upgrade from snapshot 20110320.
-The hash_queue_names algorithm was changed for better performance
-with long queue IDs.
-
-Incompatible changes with snapshot 20110320
-===========================================
-
-If you enable support for long queue file names, you need to be
-aware that these file names are not compatible with Postfix <= 2.8.
-If you must migrate to Postfix <= 2.8, you must first convert all
-long queue file names into short names, otherwise the old Postfix
-version will complain.
-
-The conversion procedure before migration to Postfix <= 2.8 is:
-
-    # postfix stop
-    # postconf enable_long_queue_ids=no
-    # postsuper
-
-Run the postsuper command repeatedly until it no longer reports
-queue file name changes.
-
-Major changes with snapshot 20110320
-====================================
-
-Support for long, non-repeating, queue IDs (queue file names).  The
-benefit of non-repeating names is simpler logfile analysis, and
-easier queue migration (there is no need to run "postsuper" to
-change queue file names that don't match their message file inode
-number).
-
-Specify "enable_long_queue_ids = yes" to enable the feature. This
-does not change the names of existing queue files. See postconf(5)
-or postconf.5.html#enable_long_queue_ids for a detailed description
-of the differences with the old short queue IDs.
-
-This changes new Postfix queue IDs from the short form 0FCEE9247A9
-into the longer form 3Ps0FS1Zhtz1PFjb, and changes new Message-ID
-header values from YYMMDDHHMMSS.queueid@myhostname into the shorter
-form queueid@myhostname.
-
-See the note on "Incompatible changes" for a backwards migration
-procedure to convert long queue file names into a form that is
-compatible with Postfix <= 2.8.
-
-Incompatible changes with snapshot 20110313
-===========================================
-
-Use "postfix reload" after "make upgrade" on a running Postfix
-system. This is needed because the protocol between postscreen(8)
-and dnsblog(8) has changed.
-
-Major changes with snapshot 20110228
-====================================
-
-postscreen(8) support to force remote SMTP clients to implement
-proper MX lookup policy.  By listening on both primary and backup
-MX addresses, postscreen(8) can deny the temporary whitelist status
-to clients that connect only to backup MX hosts, and prevent them
-from talking to a Postfix SMTP server process.
-
-Example: when 1.2.3.4 is a local backup IP address, specify
-"postscreen_whitelist_interfaces = !1.2.3.4 static:all".
-
-Incompatible changes with snapshot 20110219
-===========================================
-
-The Postfix SMTP and QMQP servers now log "hostname X does not
-resolve to address Y", when a "reverse hostname" lookup result does
-not resolve to the client IP address. Until now these servers logged
-"Y: hostname X verification failed" or "Y: address not listed for
-hostname X" depending on the details of the error.
-
-Major changes with snapshot 20110219
-====================================
-
-Postfix now uses long integers for message_size_limit, mailbox_size_limit
-and virtual_mailbox_limit. On LP64 systems (64-bit long and pointer,
-but 32-bit integer), these limits can now exceed 2GB.
-
-Major changes with snapshot 20110212
-====================================
-
-Support for per-record deadlines.  These change the behavior of
-Postfix timeout parameters, from a time limit per read or write
-system call, to a time limit to send or receive a complete record
-(an SMTP command line, SMTP response line, SMTP message content
-line, or TLS protocol message).  This limits the impact from hostile
-peers that trickle data one byte at a time.
-
-The new configuration parameters and their default settings are:
-smtpd_per_record_deadline (normal: no, overload: yes),
-smtp_per_record_deadline (no), and lmtp_per_record_deadline (no).
-
-Note: when per-record deadlines are enabled, a short timeout may
-cause problems with TLS over very slow network connections.  The
-reasons are that a TLS protocol message can be up to 16 kbytes long
-(with TLSv1), and that an entire TLS protocol message must be sent
-or received within the per-record deadline.
-
-Per-record deadlines were introduced with postscreen(8). This program
-does not receive mail, and therefore has no problems with TLS over
-slow connections.
-
-Incompatible changes with snapshot 20110130
-===========================================
-
-The VSTREAM error flags are now split into separate read and write
-error flags. As a result of this change, all programs that use
-VSTREAMs MUST be recompiled.
+Major changes - address verification
+------------------------------------
+
+[Feature 20111211] The proxymap(8) server can now be used to share
+postscreen(8) or verify(8) caches between Postfix instances.  Support
+for proxymap-over-TCP, to share a Postfix database between hosts,
+is expected to be completed in the Postfix 2.10 development cycle.
+
+[Feature 20111209] memcache lookup and update support. This provides
+a way to share postscreen(8) or verify(8) caches between Postfix
+instances.  
+
+[Feature 20111203] Support for time-dependent sender addresses
+of address verification probes. The default address, double-bounce,
+may end up on spammer blacklists. Although Postfix discards mail
+for this address, such mail still uses up network bandwidth and
+server resources. Specify an address_verify_sender_ttl value of
+several hours or more to frustrate address harvesting.
+
+Major changes - session transcript notification
+-----------------------------------------------
+
+[Incompat 20120114] By default the Postfix SMTP server no longer
+reports transcripts of sessions where a client command is rejected
+because a lookup table is unavailable. Postfix now implements gradual
+degradation, for example, the SMTP server keeps running instead of
+terminating with a fatal error. This change in error handling would
+result in a very large number of "transcript of session" email
+notifications when an LDAP or *SQL server goes down).
+
+To receive such reports, add the new "data" class to the notify_classes
+parameter value. The reports will be sent to the error_notice_recipient
+address as before.  This class is also used by the Postfix SMTP
+client to report about sessions that fail because a table is
+unavailable.
+
+Major changes - logging
+----------------------------------------
+
+[Incompat 20120114] Logfile-based alerting systems may need to be
+updated to look for "error" messages in addition to "fatal" messages.
+Specify "daemon_table_open_error_is_fatal = yes" to get the historical
+behavior (immediate termination with "fatal" message).
+
+[Incompat 20111214] Logfile-based analysis tools may need to be
+updated. The submission and smtps examples in the sample master.cf
+file were updated to make their logging easier to distinguish.
+
+See the source file pflogsumm_quickfix.txt for a "quick fix".
+
+[Incompat 20111205] Postfix now logs the result of successful TLS
+negotiation with TLS logging levels of 0. See the smtp_tls_loglevel
+and smtpd_tls_loglevel descriptions in the postconf(5) manpage for
+other minor differences.
+
+[Incompat 20110219] The Postfix SMTP and QMQP servers now log
+"hostname X does not resolve to address Y", when a "reverse hostname"
+lookup result does not resolve to the client IP address. Until now
+these servers logged "Y: hostname X verification failed" or "Y:
+address not listed for hostname X" which people found confusing.
diff --git a/postfix/WISHLIST b/postfix/WISHLIST
deleted file mode 100644 (file)
index c201dae..0000000
+++ /dev/null
@@ -1,787 +0,0 @@
-Wish list:
-
-       Things to do before the stable release:
-
-       Remove this file from the stable release.
-
-       Things to do after the stable release:
-
-       Before proxymap can be exposed to the network to share,
-       e.g., postscreen or verify caches, need to enforce limits
-       on attribute string length in IPC protocols.  10-20KB seems
-       OK. The VSTREAM library already supports read/write deadlines.
-
-       move flush_init() etc. from defer service clients to the
-       bounce daemon?
-
-       multi_connect() function that takes a list of inet:host:port
-       and/or unix:pathname specs, with an explicit "inet" prefix
-       argument to handle applications that use host:port only.
-       This will simplify multi-host implementation for memcache
-       client, dovecot client, and other.
-
-       dict_memcache: treat "bad" key as cache miss, i.e.  read/write
-       the backup database as if the cache did not exist. This
-       does not help because most Postfix maps (virtual, canonical,
-       access, transport, ...) also don't support spaces in keys.
-
-       postscreen: keep the cache open after "postfix reload" when
-       it is remote (type memcache: or proxy:). This does not work
-       because memcache can use a non-proxied file as backup).
-
-       What is the feasibility of adding an mta_name (personality)
-       attribute that is propagated via queue files and delivery
-       agent requests? It would default to myhostname.
-
-       Major performance improvement opportunity (that is until
-       everyone runs Postfix queues on SSDs).  Investigate the
-       viability of a daemon that produces incoming and postdrop
-       queue files on request (in reality it would maintain a
-       limited queue of "spare" files). Central queue file allocation
-       reduces the I/O performance disadvantage that qmgr has when
-       100 smtpd processes are receiving mail, or when lots of
-       mail is submitted with the sendmail command line.  When an
-       smtpd process accepts MAIL FROM, a cleanup daemon requests
-       a queue file and receives a queue ID + file handle from the
-       queue file daemon.  If the queue file daemon is down, the
-       cleanup daemon creates the file itself like it does now;
-       this can be hidden in the mail_stream library module.  If
-       the mail transaction is aborted, then the cleanup daemon
-       gives the queue file back to the queue file daemon's "spare"
-       file pool, saving most of the overhead of creating and
-       deleting a queue file (the file would still need to be
-       renamed at the start of the next mail transaction).  If the
-       cleanup daemon is unable to give a file back, then it can
-       delete the file like it does now; this can be hidden in the
-       mail_stream library module.  The whole thing can be
-       transparently added to Postfix by adding calls to a
-       queue-file-service client to the mail_queue_enter() and
-       mail_queue_remove() library routines.  Other advantages:
-       1) negligible performance hit when queue file allocation
-       happens earlier, so that logging and milters have a queue
-       ID for the whole transaction not just the first valid
-       recipient; 2) by not removing every queue files we get most
-       of the performance gain of a queue based on append/truncate
-       instead of the much more expensive create/delete.
-
-       Investigate viability of Sendmail socket maps (the moral
-       equivalent of tcp_table(5)), and dns maps.
-
-       Check if FILTER_README has the "postsuper -r" workaround
-
-       Bounces without <> in the plaintext section. Apparently,
-       some software renders the text as HTML (and therefore 
-       does not render addresses and other text inside <> ).
-
-       Make the rules for how to use close-on-exec more explicit.
-
-       Provide separate timeout control for dict_proxy client,
-       rewrite client, resolve client, cleanup client, and so on.
-       Perhaps a timeout argument to the mail_connect() routines.
-
-       Trick from amavisd: save listen socket/fifo/etc state, clear
-       their close-on-exec flags, exec the same program file to
-       re-initialize (with saved socket state on command line or
-       in environment), then restore the listen socket/fifo/etc
-       close-on-exec flags.  This could be a way to mitigate the
-       impact of memory/file leaks, and to implement "postfix
-       reload" support for master(8) features that currently don't
-       support this. 
-
-       Sub-second time resolution. The first benefit is to make
-       per-destination rate delays more usable. Other applications
-       will come up once the support exists. The straightforward
-       approach is to represent all time intervals in milliseconds,
-       and to update all code that makes system calls with a time
-       argument (as well as the compiled-in upper and lower time
-       parameter bounds, which are currently in seconds).
-       Unfortunately, that limits he maximum time interval to less
-       than 25 days on 32-bit systems, and is likely to break
-       compatibility (for starters, it cannot even deal with the
-       compiled-in 100d upper bound on the queue file lifetime).
-       A second option is to have a "compatibility" time base
-       switch between milliseconds and seconds; this means extra
-       changes to all code that makes system calls with a time
-       argument, and the way that the compiled-in upper and lower
-       bounds are specified.  Some of this can be encapsulated in
-       macros like time_to_sec(t), time_to_msec(t) and sec_to_time(t).
-       Finally, it is relatively easy to replace the events(3)
-       interface to use "double" for the time delay arguments, but
-       it is a major pain to convert all main.cf time parameters
-       into doubles (converting only some leads to a documentation
-       nightmare).
-
-       Address verify cache: allow a negative cache "refresh"
-       result to purge a "positive" cache entry in some safe manner.
-       Currently, the negative cache "refresh" result is discarded,
-       address verify cache lookup returns OK, and each lookup
-       forces a "refresh" probe until the entry expires.
-
-       Some Sendmail configurations trigger sub-optimal behavior
-       when the postscreen_whitelist_interfaces parameter lists
-       primary MX addresses only.  When postscreen's "deep protocol
-       tests" are successful on the primary MX address (i.e. they
-       result in 4XX responses to RCPT TO), some Sendmail
-       configurations keep the primary MX connection open until
-       AFTER they finish talking to the backup MX address.  The
-       problem is that the backup connection runs into a WHITELIST
-       VETO condition because the whitelisting database has not
-       yet been updated with the PASS NEW result for the primary
-       MX connection.  Unfortunately postscreen can't update the
-       whitelisting database before the primary MX connection is
-       closed, because a client may still make a mistake.
-
-       Don't forget Apple's code donation for fetching mail from
-       IMAP server.
-
-       Simplify postscreen logic. Individual "fail" flags help to
-       avoid repeated testing/logging the same mistake.  Individual
-       "pass" flags provide evidence that the client didn't skip
-       tests by hanging up early. The current global "noforward"
-       flag implements the wrong model: instead we need an indicator
-       that a client has passed all tests or that all mistakes
-       were forgiven.
-
-       In the SMTP server, check if the connection is closed before
-       replying to ".", and discard the message if the reply can't
-       be sent. This reduces the time window for RFC 1047 message
-       duplication, and may even prevent the delivery of some spam.
-       http://www.exim.org/lurker/message/20070416.103159.9d5ff0ce.en.html
-       This requires splitting the SMTP server's commit operation
-       into two operations: first, a tentative commit operation
-       that performs most of the I/O and processing in milters and
-       in the cleanup server; second, a final commit operation
-       that is executed only if the remote SMTP client hasn't hung
-       up in the mean time. Unfortunately, SMTP-based before-queue
-       content filters don't support a tentative commit operation.
-
-       Find out how to reproduce Berkeley DB bogus ENOENT errors.
-       postscreen does not log this with Berkeley DB 1 (FreeBSD
-       4..8), 4.7.25 (Ubuntu 9.04) and 4.8.24 (Ubuntu 10.04).
-
-       postconf command-line option to show the compile-time
-       settings (CCARGS, AUXLIBS) in case binary packages
-       don't install the makedefs.out file.
-
-       events.c: cache the side effects of file descriptor event
-       enable/disable operations in user space, and do bulk kernel
-       updates at event_loop() time.  This can eliminate costly
-       system calls with successive event disable/enable operations
-       on the same file descriptor. This can also eliminate the
-       need for tricky code that tries to avoid the expense of
-       successive disable/enable operations. Such code is likely
-       to introduce bugs.
-
-       When does it pay off to send domains in the active queue
-       to a DNS prefetch daemon? Could this generalize to a dynamic
-       transport map that piggy-backs domains with the same MX
-       host into the same mail delivery transaction?
-
-       inline table where the "whitespace replacement" character
-       is specified in-line. Ex: inline:XYname1Xvalue1Yname2Xvalue2
-       would instantiate a table with (name1, value1) and (name2,
-       value2).  I'm afraid this is just too ugly.
-
-       tlsproxy(8) should receive TLS preferences from postscreen(8)
-       and smtpd(8), instead of reading them from main.cf. This
-       means that many tlsproxy_ parameters become postscreen_
-       parameters, and that tls_server_init() parameters move to
-       to tls_server_start(). That is a significant API change.
-       It also means tlsproxy can't open all files before chroot().
-
-       anvil rate limit for sasl_username.
-
-       Encapsulate nbbio buffer access and update by tlsproxy.
-
-       Full-duplex support for tlsproxy(8). This requires updating
-       events(3) and nbbio(3).
-
-       Register automagic destructor for object attached to VSTREAM.
-
-       smtpd xclient option for sasl_username.
-
-       Use different ipc time limits for email message transactions
-       (smtpd, pickup)->cleanup and for quick query/reply transactions
-       such as address rewriting/resolution. Beware of large time
-       limits for local or virtual alias expansion.
-
-       permit_tempfail_action (default: defer_if_reject) to be
-       used as the default value for dnswl_tempfail_action and
-       rhswl_tempfail_action. Steal liberally from the code that
-       implements unverified_recipient_tempfail_action etc.
-
-       Support filtering of messages that are generated by Postfix:
-       This would apply to postmaster notices and bounce messages
-       (DKIM), and address verification (BATV).
-
-       Consistency: in postconf.proto make <dt>..</dt> tags bold.
-
-       postscreen(8): listen on multiple IP addresses and enforce
-       that the client contacts the primary MX address first (i.e.
-       punish hosts that contact the secondary before the primary).
-       The downside with any approach that relies on temporary
-       punishment is that it does not scale to configurations
-       with multiple equal-preference MX hosts. Such hosts would
-       have to share the postscreen cache, causing an unacceptable
-       performance bottleneck and a single point of failure.
-
-       According to a paper by Ted Unangst at BSDCON09, kqueue
-       reports state changes, i.e. kqueue indicates when the socket
-       becomes readable. Specifically, he writes when kqueue reports
-       a socket becomes readable but no data is read from that
-       socket, later kqueue calls won't report the socket as
-       readable. That's not what happens on FreeBSD 8.0, where
-       kqueue will keep reporting the socket as readable when
-       nothing is read.  Also, FreeBSD 8.0 kqueue still reports
-       the socket as readable after a read operation does not empty
-       the kernel buffer.  We need a test program for this that 
-       repeats these tests with OpenBSD and NetBSD (and MacOS X
-       once they fix their kqueue implementation).
-
-       Would it help if there were different cleanup_service
-       parameter names for different message paths? smtpd(8) uses
-       the same cleanup_service value for receiving remote mail
-       and for submitting postmaster problem reports. Do we need
-       separate mumble_cleanup_service_name parameters for "inject",
-       "notify" and "forward" (with backwards compatible defaults)?
-
-       IF/ENDIF support for CIDR tables.
-
-       Make postconf aware of local_, smtp_, etc. parameter names
-       that have prefixes derived from mail delivery transport
-       names, LDAP/SQL table names, spawn(8) services, and so on.
-       Clearly, it is wrong to assume that all "unix" master.cf
-       entries are delivery agents (though it may be OK for postconf
-       to peek in master.cf when given a parameter with an unknown
-       prefix). This requires a new main.cf parameter (delivery_prefixes?)
-       that lists all known mail delivery transport names. postconf
-       can safely ignore names that don't exist in master.cf, and
-       qmgr_transport_create() can safely warn about a name that
-       isn't listed in that new main.cf parameter. A similar
-       parameter would be needed for spawn(8) services (spawn_prefixes?)
-       and for legacy-style database "sources" (database_prefixes?).
-       The spawn(8) daemon could warn if the service name is not
-       listed in main.cf, and the LDAP/SQL/etc.  drivers could
-       warn if a legacy-style database source is not listed in
-       main.cf.
-
-       Need a regular expression table to translate address
-       verification responses into hard/soft/accept reply codes.
-
-       Is there a way to make sendmail -V work after local alias
-       expansion? Majordomo-like mailing lists would benefit from
-       this; the example in VERP_README does not work in the general
-       case.
-
-       When an alias is a member of an :include: list with owner-
-       alias, local(8) needs an option to deliver alias or alias->user
-       indirectly. What happens when an :include: list with owner-
-       alias includes another list?
-
-       Don't allow empty result values in pcre and regexp maps.
-       Postfix doesn't allow them anywhere else (check this).
-
-       Make PCRE_MAX_CAPTURE configurable.
-
-       Add some checks for tokens starting with #. A challenge
-       is to report sensible context from the guts of some low-level
-       parser, without introducing a great deal of clumsiness.
-
-       Add sendmail macros for {verify} and maybe other TLS info.
-
-       Find out if we are doing the correct thing by looking at
-       state->milter_reject_text when expanding {rcpt_addr} or
-       {rcpt_host}.
-
-       Find out why post_mail() etc. block when the qmgr fifo is
-       full (answer: trigger_timeout). How can this cause delays
-       in the queue manager?  When a recipient bounces during
-       (transport, nexthop, address) resolution, it is redirected
-       to the error or retry mailer; and bounce-after-delivery is
-       asynchrounous so it can't block the queue manager, either.
-
-       Add smtpd_sender_login_maps to proxy_read_maps, and make
-       sure that defaults are set before proxy_read_maps is
-       evaluated. What other parameters are worthy of being
-       whitelisted for proxy access?  Is there a way to automate
-       this decision?
-
-       How to ensure that proxy_read_maps is processed after all
-       its dependencies are initialized, or just bite the bullet
-       and rewrite the parameter initialization code.
-
-       The cleanup virtual alias expansion limit does not really
-       deliver on its promises. 1) It promises to truncate the
-       result without aborting delivery, which would be undesirable
-       anyway, but that is not what it does, so that is good.  2)
-       It keeps all the recipients from multi-recipient database
-       lookup, then terminates further recursion when the result
-       exceeds the expansion limit. This behavior achieves the
-       original goal that all things shall have a finite size (even
-       though but we don'really care how large they are) but may
-       result in surprises when recipients are listed in virtual
-       alias domains or need expansion for other reasons.  In a
-       phone call with Victor, a reasonable way out is to set the
-       limit to some large number (100000) and abort delivery when
-       the result exceeds the limit.
-
-       Should the postscreen save permanent white/black list lookup
-       results to the temporary cache, and query the temporary
-       cache first? Skipping white/black list lookups will speed
-       up the handling of "good" clients without a permanent
-       whitelist entry.  Of course, this means that updates to the
-       white/black lists do not immediately take effect. Workarounds:
-       1) use a shorter temporary cache TTL for clients on the
-       permanent black/white lists; 2) ignore cached white/black
-       list lookup results after "postfix reload"; 2) adjust the
-       logging, for example "WHITELISTED address (cached)" and
-       "BLACKLISTED address (cached)" to eliminate surprises.
-       Comparing the cache entry time with the white/blacklist
-       file modification time is not foolproof: for example, pcre
-       or CIDR tables are read only once.
-
-       It would be nice if the generic dict_cache(3) cache manager
-       could postpone process suicide until cache cleanup is
-       completed (but that is not possible when postscreen forks
-       into the background to finish already-accepted connections,
-       and it is not desirable when a host is being shut down).
-
-       When postscreen drops a connection, a 521 "greeting" should
-       be of the form "521 servername..." and not have an enhanced
-       status code. The "521 5.7.1" form can be used after EHLO.
-       Of course no spammer is going to complain about Postfix
-       SMTP compliance.
-
-       Find a place to document all the mail routing mechanisms
-       in one place so people can figure out how Postfix works.
-
-       The access map BCC action is marked "not stable", perhaps
-       because people would also expect BCC actions in header/body_checks.
-       How much would it take to make the queue file editing code
-       generally usable?
-
-       Move smtpd_command_filter into smtpd_chat_query() and update
-       the session transcript (see smtp_chat_reply() for an example).
-
-       SMTP connection caching without storing connections, to
-       improve TLS mail delivery performance.
-
-       postscreen has separate socket budgets for whitelisted
-       clients and for other clients. If we add a dummy SMTP engine
-       then we extend the session length for non-whitelisted clients
-       and need to increase the socket budget (or create a new
-       budget class, which complicates the user interface).
-
-       Should not milter8_mail_event() unset the "hold" default
-       reply? Better, the default reply should not be used for
-       this purpose.
-
-       Unescape the pregreeter's HELO command argument so that
-       <CR><LF> don't show up as ??.
-
-       Make postscreen logging easier. Always log connect, then log
-       why the connection is or is not forwarded.
-
-       Don't send MASTER_STAT_TAKEN/MASTER_STAT_AVAIL when a server
-       runs with process limit of 1. But this means the master
-       never learns that the process is successful and will always
-       pause $service_throttle_time before restarting a failed service.
-
-       Don't bother maintaining a per-service lockfile when a
-       server runs with process limit of 1. The purpose of the
-       lockfile is to avoid thundering herd problems when the kernel
-       wakes up multiple processes for each new client connection.
-
-       Concurrency/speed-matching: invoke a before-queue (smtpd_proxy)
-       filter after the entire message is received, so that fewer
-       filter processes will be running simultaneously.  In some
-       parts of the world, after-queue filtering is problematic.
-
-       This is different than the MailChannels patented solution
-       to multiplex many slow SMTP connections over a few fast
-       SMTP connections. We simply postpone opening the connection
-       to the filter, and rely on the before-filter SMTP server
-       to reject invalid recipients. MailChannels uses one
-       connection-to-MTA to discover invalid recipients, receives
-       the email message with a potentially reduced bitrate, and
-       then uses another connection-to-MTA to deliver the message
-       quickly.
-
-       Implement PREPEND action for milter_header_checks. Save the
-       to-be-prepended text to buffer, then emit it along with the
-       new header.
-
-       Fix the header_body_checks API, so that the name of the map
-       class (e.g. milter_header_checks) is available for logging.
-
-       Fix the mime_state and header_body_checks APIs, so that
-       they use VSTRINGs. This simplifies REPLACE actions.
-
-       Update FILTER_README for multi-instance support, and rename
-       the old document to FILTER_LEGACY_README.
-
-       Need to sign delivery status notifications, to avoid surprises
-       when eventually people start enforcing DKIM etc. signatures.
-
-       Either document or remove the internal_mail_filter_classes
-       feature (it's disabled by default).
-
-       "postconf -N" option to print user-defined parameter names
-       (these have no defaults, since they exist only when 
-       specified in main.cf or with "-o name=value").
-
-       Make the "unknown recipient" test configurable as
-       first|last|never, with "yes"=="last" for backwards
-       compatibility. The "first" setting is good for performance
-       (stress=yes) when all users are defined in local files; but
-       it may perform worse when users are in networked tables.
-
-       Cleanup: make DNSBL query format configurable beyond the
-       client's reversed IP address.
-
-       With 'final delivery' in the LMTP client, need an option
-       to also add delivered-to and other pipe(8) features.  This
-       requires making mail_copy() functionality available in
-       non-mailbox context.
-
-       Cleanup: modernize the "add missing From: header" code, to
-       ``phrase <addr>'' form. Most likely, quote the entire phrase
-       if it contains any text that is special, then rfc822_externalize
-       the whole thing.
-
-       SMTP server: make the server_addr and server_port available
-       to policy server, Dovecot, and perhaps Milters.
-
-       Med: local and remote source port and IP address for smtpd
-       policy hook.
-
-       Maybe change maps_rbl_reject_code default to 521, and
-       update wording in STRESS_README.
-
-       Encapsulate time_t comparisons so that they can be made
-       system dependent (use difftime() where available).
-
-       Encapsulate time_t conversions (e.g. REC_TYPE_TIME) so that
-       they can be made system dependent.
-
-       Plan for time_t larger than long, or wait for LP64 to
-       dominate the world?
-
-       Make "AUTH=<>" appendage to MAIL FROM configurable, enabled
-       by default.
-
-       To support ternary operator without a huge parsing effort,
-       consider ${value?{xxx}:{yyy}} where ${name} is existing
-       syntax, and where ?{text} and :{text} are new syntax that
-       is unlikely to break existing configurations. Or perhaps
-       it's just too ugly.
-
-       Write delivery rate delay example (which _README?) and auth
-       failure cache example (SASL_README). Then include them in
-       SOHO_README.
-
-       Look for alternatives for the use of non_smtpd_milters.
-       This involves some way to force local submissions to go
-       through a local SMTP client and server, without triggering
-       "mail loops back to myself" false alarms. The advantage is
-       that it makes smtpd_mumble_restrictions available for local
-       and remote mail; the disadvantage is that it makes local
-       submissions more dependent on networking.  One possibility
-       is to use "pickup -o content_filter=smtp:127.0.0.1:10025",
-       or a dedicated SMTP client/server on UNIX-domain sockets;
-       we could also decide to always suppress "mail loop" detection
-       for loopback connections.  Another option is to have the
-       pickup or cleanup server drive an SMTP client directly;
-       this would require extension of the mail_stream() interface,
-       plus a way to handle bounced/deferred recipients intelligently,
-       but it would be at odds with Postfix design where delivery
-       agents access queue files directly; exposing delivery agents
-       to raw queue files violates another Postfix design principle.
-
-       Consolidate duplicated code in *_server_accept_{pass,inet}().
-
-       Consolidate duplicated code in {inet,unix,upass}_trigger.c.
-
-       In the SMTP client, handle 421 replies in smtp_loop() by
-       having the input function raise a flag after detecting 421
-       (kill connection caching and be sure to do the right thing
-       with RSET probes), leave the smtp_loop() per-command reply
-       handlers unchanged, and have the smtp_loop() reader loop
-       bail out with smtp_site_fail("server disconnected after
-       %s", where), but only in the case that it isn't already in
-       the final state. But first we need to clean up the handling
-       of do/don't cache, expired, bad and dead sessions.
-
-       Combine smtpd_peer.c and qmqpd_peer.c into a single function
-       that produces a client context object, and provide attribute
-       print/scan routines that pass these client context objects
-       around. With this, we no longer have to update multiple
-       pieces of code when a client attribute is added. Ditto for
-       SASL and TLS context.
-
-       Make TLS_BIO_BUFSIZE run-time adjustable, to future-proof
-       Postfix for remote connections with MSS > 8 kbytes.
-
-       Don't log "warning: XXXXX: undeliverable postmaster
-       notification discarded" for spam from outside.
-
-       Really need a cleanup driver that allows testing against
-       Milter applications instead of synthetic events. This would
-       have to provide stubs for clients that talk to Postfix
-       daemon processes. See if this approach can also be used for
-       other daemons.
-
-       smtpd(8) exempts $address_verify_sender from access controls,
-       but it doesn't know whether cleanup(8) or delivery agents
-       modify the sender. Would it be possible to "calibrate" this
-       exemption, perhaps by having delivery agents pass the probe
-       sender to the verify server, keeping in mind that the probe
-       sender may differ per delivery agent due to output rewriting.
-
-       Update attr_print/scan() so they can send/receive file
-       descriptors. This simplifies kludgy code in many daemons.
-
-       Would there be a problem adding $smtpd_mumble_restrictions
-       and $smtpd_sender_login_maps to the default proxy_read_maps
-       settings?
-
-       Remove defer(8) and trace(8) references and man pages. These
-       are services not program names. On the other hand we have
-       man pages for lmtp(8) and smtp(8), but not for relay(8).
-       Likewise, retry(8) does not have a man page.
-
-       Bind all deliveries to the same local delivery process,
-       making Postfix perform as poorly as monolithic mailers, but
-       giving a possibility to eliminate duplicate deliveries.
-
-       Maybe declare loop when resolve_local(mxhost) is true?
-
-       Update message content length when adding/removing headers.
-
-       Need scache size limit.
-
-       Make postcat header/body aware so people can grep headers.
-       What headers? primary, mime, nested? What body? Does it
-       include the mime and attached headers?
-
-       REDIRECT should override original recipient info, and
-       probably override DSN as well.
-
-       Find out if with Sendmail, a Milter "add recipient" request
-       results in NOTIFY=NONE as Postfix does now.
-
-       Update FILTER_README with mailing list suggestions to tag
-       with a badness indicator and then filter down-stream.
-
-       Make null local-part handling configurable: either expand
-       into mailer-daemon (current bahavior) or disallow (strict
-       behavior, currently implemented only in the SMTP server).
-
-       The type of var_message_limit (and other file size/offset
-       configuration parameters or internal protocol attributes)
-       should be changed from int to off_t.  This also requires
-       checking all expressions in which var_message_limit etc.
-       appears: qmqpd, netstring, deliver_request, ...
-
-       Add M flag (enable multi-recipient delivery) to pipe daemon.
-
-       The usage of TLScontext->cache_type is unclear. It specifies
-       a TLS session cache type (smtpd, smtp, or lmtp), but it is
-       sometimes used as an indicator that TLS session caching is
-       unavailable.  In reality, that decision is made by not
-       registering call-back functions for cache maintenance.
-
-       Postfix TLS library code should copy any strings that it
-       receives from the application, instead of passing them
-       around as pointers. TLScontext->cache_type is a case in
-       point.
-
-       Are transport:nexthop null fields the same as in the case
-       of default_transport etc. parameters?
-
-       Don't lose bits when converting st_dev into maildir file
-       name. It's 64 bits on Linux. Found with the BEAM source
-       code analyzer. Is this really a problem, or are they just
-       using 64 bits for upwards compatibility with LP64 systems?
-
-       Do or don't introduce unknown_reverse_client_reject_code.
-
-       Check that "UINT32 == unsigned int" choice is ok (i.e. LP64
-       UNIX).
-
-       Tempfail when a Milter application tries to negotiate content
-       access, while it is configured in an SMTP server that runs
-       before the smtpd_proxy filter.
-
-       Log DSN original recipient when rejecting mail.
-
-       Keep whitespace between label and ":"?
-
-       Make the map case folding/locking options configurable, if
-       not at run-time then at least at compile time so we get
-       consistent behavior across applications.
-
-       Investigate what it would take to eliminate oqmgr, and to
-       make the old behavior configurable in a unified queue
-       manager.  This would shave another 2.7 KLOC from the source
-       footprint.
-
-       Document the case folding strategy for match_list like
-       features.
-
-       Eliminate the (incoming,deferred)->active rename operation.
-       This requires an in-memory hash of queue file names to avoid 
-       duplicate open() operations.
-
-       Softbounce fallback-to-ISP for SOHO users. This heuristic
-       assumes that when direct-to-MX delivery fails with 5XX,
-       delivery via the ISP may still succeed.  This could be
-       implemented by enabling soft bounces for destinations other
-       than the smtp_fallback_relay. So the only benefit of this
-       over the existing soft_bounce feature is that it has no
-       effect on smtp_fallback_relay deliveries.
-
-       Centralize main.cf parameter input so that defaults work
-       consistently. What about parameter names that are prefixed
-       with mail delivery transport names?
-
-       Fix default time unit handling so that we can have a default
-       bounce lifetime of $maximal_queue_lifetime, without causing
-       panics when a non-default maximal_queue_lifetime setting
-       includes no time unit.
-
-       After the 20051222 ISASCII paranoia, lowercase() lowercases
-       ASCII text only.
-
-       Privacy: remove local command/pathname details from remote
-       delivery status reports, and log them via local msg_warn().
-
-       Is it safe to cache a connection after it has been used for
-       more than some number of address verification probes?
-
-       Try to recognize that Resent- headers appear in blocks,
-       newest block first. But don't break on incorrect header
-       block organization.
-
-       Hard limits on cache sizes (anvil, specifically).
-
-       Laptop friendliness: make the qmgr remember when the next
-       deferred queue scan needs to be done, and have the pickup
-       server stat() the maildrop directory before searching it.
-
-       Low: replace_sender/replace_recipient actions in access
-       maps, so they can be used in policy servers?
-
-       Low: configurable order of local(8) delivery methods.
-
-       Med: smtp_connect_timeout_budget (default: 3x smtp_connect_timeout)
-       to limit the total time spent trying to connect.
-
-       Med: transform IPv4-in-IPv6 address literals to IPv4 form
-       when comparing against local IP addresses?
-
-       Med: transform IPv4-in-IPv6 address literals to IPv4 form
-       when eliminating MX mailer loops?
-
-       Med: Postfix requires [] around IPv6 address information
-       in match lists such as mynetworks, debug_peer_list etc.,
-       but the [] must not be specified in access(5) maps. Other
-       places don't care.  For now, this gotcha is documented in
-       IPV6_README and in postconf(5) with each feature that may
-       use IPv6 address information. The general recommendation
-       is not to use [] unless absolutely necessary.
-
-       Med: the partial address matching of IPv6 addresses in
-       access(5) maps is a bit lame: it repeatedly truncates the
-       last ":octetpair" from the printable address representation
-       until a match is found or until truncation is no longer
-       possible.  Since one or more ":" are usually omitted from
-       the printable IPv6 address representation, this does not
-       really try all the possibilities that one might expect to
-       be tried. For now, this gotcha is documented in access(5).
-
-       Low: reject HELO with any domain name or IP address that
-       this MTA is the final destination for.
-
-       Low: should the Delivered-To: test in local(8) be configurable?
-
-       Low: make mail_addr_find() lookup configurable.
-
-       Low: update events.c so that 1-second timer requests do not
-       suffer from rounding errors. This is needed for 1-second
-       SMTP session caching time limits. A 1-second interval would
-       become arbitrarily short when an event is scheduled just
-       before the current second rolls over.
-
-       Low: configurable internal/system locking method.
-
-       Low: add INSTALL section for pre-existing Postfix systems.
-
-       Low: add INSTALL section for pre-existing RPM Postfixes.
-
-       Low: disallow smtpd_recipient_limit < 100 (the RFC minimum).
-
-       Low: noise filter: allow smtp(8) to retry immediately if
-       all MXes return a quick ECONNRESET or 4xx reply during the
-       initial handshake. Retry once? How many times?
-
-       Low: make post-install a "postfix-only script" so it can
-       take data from the environment instead of main.cf.
-
-       Low: randomize deferred mail backoff.
-
-       Med: separate ulimit for delivery to command?
-
-       Med: postsuper -r should do something with recipients in
-       bounce logfiles, to make sure the sender will be notified.
-       To be perfectly safe, no process other than the queue manager
-       should move a queue file away from the active queue.
-
-       This could involve tagging a queue file, and use up another
-       permission bit (postsuper tags a "hot" file, qmgr requeues it).
-
-       Low: postsuper re-run after renaming files, but only a
-       limited number of times.
-
-       Low: smtp-source may block when sending large test messages.
-
-       Med: find a way to log the sender address when MAIL FROM
-       is rejected due to lack of disk space.
-
-       Low: revise other local delivery agent duplicate filters.
-
-       Low: all table lookups should consistently use internalized
-       (unquoted) or externalized (quoted) forms as lookup keys.
-       smtpd, qmgr, local, etc. use unquoted address forms as keys.
-       cleanup uses quoted forms.
-
-       Low: have a configurable list of errno values for mailbox
-       or maildir delivery that result in deferral rather than
-       bouncing mail. What about "killed by signal" exits?
-
-       Low: after reorganizing configuration parameters, add flags
-       to all parameters whose value can be read from file.
-
-       Medium: need in-process caching for map lookups. LDAP servers
-       seem to need this in particular. Need a way to expire cached
-       results that are too old.
-
-       Low: generic showq protocol, to allow for more intelligent
-       processing than just mailq. Maybe marry this with postsuper.
-
-       Low: default domain for appending to unqualified recipients,
-       so that unqualified names can be delivered locally.
-
-       Low: The $process_id_directory setting is not used anywhere
-       in Postfix. Problem reported by Michael Smith, texas.net.
-       This should be documented, or better, the code should warn
-       about attempts to set read-only parameters.
-
-       Low: postconf -e edits parameters that postconf won't list.
-
-       Low: while converting 8bit text to quoted-printable, perhaps
-       use =46rom to avoid having to produce >From when delivering
-       to mailbox.
-
-       virtual_mailbox_path expression like forward_path, so that
-       people can specify prefix and suffix.
index 15a674d73d7be4588d6374b2bd9994dc28c40743..63ad8a0bd3bbc37cbd67f50d7fb83c00539addc2 100644 (file)
@@ -791,9 +791,12 @@ EOF
     }
 
     # Postfix 2.9.
-    # Safety net for incompatible changes in IPv6 defaults.  This
-    # requires that the default is "inet_protocols = ipv4" when
-    # IPv6 support is not compiled in. See util/sys_defs.h.
+    # Safety net for incompatible changes in IPv6 defaults.
+    # PLEASE DO NOT REMOVE THIS CODE. ITS PURPOSE IS TO AVOID AN
+    # UNEXPECTED DROP IN PERFORMANCE AFTER UPGRADING FROM POSTFIX
+    # BEFORE 2.9.
+    # This code assumes that the default is "inet_protocols = ipv4"
+    # when IPv6 support is not compiled in. See util/sys_defs.h.
 
     test "`$POSTCONF -dh inet_protocols`" = "ipv4" ||
        test -n "`$POSTCONF -c $config_directory -nh inet_protocols`" || {
index 568f1fe1242afe6945921fa561970df3847db400..209459303437dc767bc64826d305752e5869598d 100644 (file)
@@ -456,6 +456,16 @@ results are lost after "postfix reload" or "postfix stop". </p>
     # Note: avoid hash files here. Use btree instead.
     <a href="postconf.5.html#address_verify_map">address_verify_map</a> = btree:$<a href="postconf.5.html#data_directory">data_directory</a>/verify_cache
 
+    # Shared persistent cache (requires Postfix 2.9 or later).  
+    <a href="postconf.5.html#address_verify_map">address_verify_map</a> = <a href="proxymap.8.html">proxy</a>:btree:$<a href="postconf.5.html#data_directory">data_directory</a>/verify_cache
+    # Disable automatic cache cleanup in all Postfix instances except
+    # for one instance that will be responsible for cache cleanup.
+    # <a href="postconf.5.html#address_verify_cache_cleanup_interval">address_verify_cache_cleanup_interval</a> = 0
+
+    # Shared memory cache (requires Postfix 2.9 or later).
+    # See <a href="memcache_table.5.html">memcache_table(5)</a> for details.
+    <a href="postconf.5.html#address_verify_map">address_verify_map</a> = <a href="memcache_table.5.html">memcache</a>:/etc/postfix/verify-memcache.cf
+
     # Default setting for Postfix 2.6 and earlier.
     # This uses non-persistent storage only.
     <a href="postconf.5.html#address_verify_map">address_verify_map</a> =
index 9ce2676b5b54cfb1e361563b289e19ee7b4f1646..20cd53acf155a4e385f2cd5436e59075ba3efc0e 100644 (file)
@@ -292,7 +292,7 @@ the ".dir" or ".pag" suffix.  </dd>
 variable name. The lookup table name in "environ:table" is ignored.
 </dd>
 
-<dt> <b>fail</b> (read-write) </dt>
+<dt> <b>fail</b> </dt>
 
 <dd> A table that reliably fails all requests. The lookup table
 name is used for logging only. This table exists to simplify Postfix
@@ -316,7 +316,7 @@ a process terminates. </dd>
 <dd> Perform lookups using the LDAP protocol. Configuration details
 are given in the <a href="ldap_table.5.html">ldap_table(5)</a>. </dd>
 
-<dt> <b>memcache</b> (read-write) </dt>
+<dt> <b>memcache</b> </dt>
 
 <dd> Perform memcache database lookups or updates. Configuration
 details are given in <a href="memcache_table.5.html">memcache_table(5)</a>. </dd>
@@ -351,7 +351,7 @@ file.  </dd>
 <dd> Perform PostgreSQL database lookups.  Configuration details
 are given in <a href="pgsql_table.5.html">pgsql_table(5)</a>. </dd>
 
-<dt> <b>proxy</b> (read-only) </dt>
+<dt> <b>proxy</b> </dt>
 
 <dd> Access information via the Postfix <a href="proxymap.8.html">proxymap(8)</a> service. The
 lookup table name syntax is "<a href="proxymap.8.html">proxy</a>:<a href="DATABASE_README.html">type:table</a>". </dd>
index 78be1733abfc635907874eac115a1a83ef8a72b8..59b62152e0e00b34db75471f7af56ae84b92d407 100644 (file)
@@ -67,9 +67,9 @@ and is therefore built into Postfix by default. </p>
 <p> The first memcache client for Postfix was written by Omar Kilani,
 and was based on the libmemcache library. </p>
 
-<p> Wietse wrote the current memcache client from the ground up.
-This implementation does not use libmemcache, and bears no resemblance
-to earlier work.  </p>
+<p> Wietse wrote the current memcache client from the ground up for
+Postfix version 2.9.  This implementation does not use libmemcache,
+and bears no resemblance to earlier work.  </p>
 
 </body>
 
index 9e717aa73ad46ce4e5bb624d6592fc22ed853f1b..1718f0e2da5c2774fec897505661be0e77527dfd 100644 (file)
@@ -220,10 +220,13 @@ that appear on the <i>permanent</i> access list. </p>
 
 <blockquote> <p> NOTE: To share a <a href="postscreen.8.html">postscreen(8)</a> cache between
 multiple <a href="postscreen.8.html">postscreen(8)</a> instances, use "<tt><a href="postconf.5.html#postscreen_cache_map">postscreen_cache_map</a> =
-<a href="proxymap.8.html">proxy</a>:btree:/path/to/file</tt>".  This requires Postfix 2.9 or
-later; earlier <a href="proxymap.8.html">proxymap(8)</a> implementations don't support cache
-cleanup.  For an alternative approach see the <a href="memcache_table.5.html">memcache_table(5)</a>
-manpage.  </p> </blockquote>
+<a href="proxymap.8.html">proxy</a>:btree:$<a href="postconf.5.html#data_directory">data_directory</a>/postscreen_cache</tt>", and disable
+cache cleanup (<a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a> = 0) in all
+<a href="postscreen.8.html">postscreen(8)</a> instances except one that is responsible for cache
+cleanup. </p> <p> <a href="postscreen.8.html">postscreen(8)</a> cache sharing requires Postfix 2.9
+or later; earlier <a href="proxymap.8.html">proxymap(8)</a> implementations don't support cache
+cleanup. </p> <p>  For an alternative <a href="postscreen.8.html">postscreen(8)</a> cache sharing
+approach see the <a href="memcache_table.5.html">memcache_table(5)</a> manpage.  </p> </blockquote>
 
 <p> When the SMTP client address appears on the temporary
 whitelist, <a href="postscreen.8.html">postscreen(8)</a> logs this with the client address and port
index c46a4d46c654402b1de63aa8b81ef8adea112088..01da77ed397064e9b80f54ddc1b00878bee76bea 100644 (file)
@@ -222,10 +222,7 @@ MEMCACHE_TABLE(5)                                            MEMCACHE_TABLE(5)
        software.
 
 <b>HISTORY</b>
-       The first memcache client for Postfix was written by  Omar
-       Kilani,  and was based on libmemcache.  The Postfix imple-
-       mentation does not use libmemcache, and  bears  no  resem-
-       blance to earlier work.
+       Memcache support was introduced with Postfix version  2.9.
 
 <b>AUTHOR(S)</b>
        Wietse Venema
index 350cb86a8722a4b6a718ec7729d06ac8d6bf41b0..a07120b6edcf6a99e091984c9ee15870cc12f17e 100644 (file)
@@ -198,7 +198,7 @@ POSTCONF(1)                                                        POSTCONF(1)
                      Perform lookups  using  the  LDAP  protocol.
                      This is described in <a href="ldap_table.5.html"><b>ldap_table</b>(5)</a>.
 
-              <b>memcache</b> (read-write)
+              <b>memcache</b>
                      Perform lookups using the memcache protocol.
                      This is described in <a href="memcache_table.5.html"><b>memcache_table</b>(5)</a>.
 
@@ -215,8 +215,7 @@ POSTCONF(1)                                                        POSTCONF(1)
                      Perform  lookups using the PostgreSQL proto-
                      col. This is described in <a href="pgsql_table.5.html"><b>pgsql_table</b>(5)</a>.
 
-              <b>proxy</b> (read-only)
-                     A lookup table that is implemented  via  the
+              <b>proxy</b>  A lookup table that is implemented  via  the
                      Postfix  <a href="proxymap.8.html"><b>proxymap</b>(8)</a> service. The table name
                      syntax is <i>type</i><b>:</b><i>name</i>.
 
index 42e57958147cd1148f352e47d67c29273118bf24..dd673b0e5ffb454e60da0ebca0031ab50d7a3b0a 100644 (file)
@@ -66,8 +66,8 @@ POSTKICK(1)                                                        POSTKICK(1)
 
        <b><a href="postconf.5.html#application_event_drain_time">application_event_drain_time</a> (100s)</b>
               How  long  the  <a href="postkick.1.html"><b>postkick</b>(1)</a>  command  waits  for  a
-              request to enter the server's input  buffer  before
-              giving up.
+              request to enter the Postfix daemon  process  input
+              buffer before giving up.
 
        <b><a href="postconf.5.html#queue_directory">queue_directory</a> (see 'postconf -d' output)</b>
               The  location of the Postfix top-level queue direc-
index 316d94b483d9ef2cd6f42ab6a9dbefebe0343b1f..ae143d6381224002dd1931e7a364df653f0412d9 100644 (file)
@@ -661,7 +661,7 @@ ${WARN='-Wall -Wno-comment -Wformat -Wimplicit -Wmissing-prototypes \
 export SYSTYPE AR ARFL RANLIB SYSLIBS CC OPT DEBUG AWK OPTS
 
 # Snapshot only.
-CCARGS="$CCARGS -DSNAPSHOT"
+#CCARGS="$CCARGS -DSNAPSHOT"
 
 # Non-production: needs thorough testing, or major changes are still
 # needed before the code stabilizes.
index fefde2869742bab7aa30fd233d751d7d4bab8558..9717c9cf26879403bf1a8d2655e79d24c6257be9 100644 (file)
@@ -185,7 +185,7 @@ when a process terminates.
 .IP "\fBldap\fR (read-only)"
 Perform lookups using the LDAP protocol. This is described
 in \fBldap_table\fR(5).
-.IP "\fBmemcache\fR (read-write)"
+.IP "\fBmemcache\fR"
 Perform lookups using the memcache protocol. This is described
 in \fBmemcache_table\fR(5).
 .IP "\fBmysql\fR (read-only)"
@@ -197,7 +197,7 @@ file format is described in \fBpcre_table\fR(5).
 .IP "\fBpgsql\fR (read-only)"
 Perform lookups using the PostgreSQL protocol. This is described
 in \fBpgsql_table\fR(5).
-.IP "\fBproxy\fR (read-only)"
+.IP "\fBproxy\fR"
 A lookup table that is implemented via the Postfix
 \fBproxymap\fR(8) service. The table name syntax is
 \fItype\fB:\fIname\fR.
index c85314fe7b013ceead33566e52fc63e7cdbfdd48..64bdda7a38794989f2588ae02b9a7483988b2d24 100644 (file)
@@ -64,7 +64,7 @@ The default location of the Postfix main.cf and master.cf
 configuration files.
 .IP "\fBapplication_event_drain_time (100s)\fR"
 How long the \fBpostkick\fR(1) command waits for a request to enter the
-server's input buffer before giving up.
+Postfix daemon process input buffer before giving up.
 .IP "\fBqueue_directory (see 'postconf -d' output)\fR"
 The location of the Postfix top-level queue directory.
 .SH "FILES"
index 2de5980e4fccc685b474423c027b3376522def77..1c33b09fe7ee9424b2b6ca21739d6cc52103e1c0 100644 (file)
@@ -235,10 +235,7 @@ The Secure Mailer license must be distributed with this software.
 .nf
 .ad
 .fi
-The first memcache client for Postfix was written by Omar
-Kilani, and was based on libmemcache.
-The Postfix implementation does not use libmemcache, and
-bears no resemblance to earlier work.
+Memcache support was introduced with Postfix version 2.9.
 .SH "AUTHOR(S)"
 .na
 .nf
diff --git a/postfix/pflogsumm_quickfix.txt b/postfix/pflogsumm_quickfix.txt
new file mode 100644 (file)
index 0000000..85a8719
--- /dev/null
@@ -0,0 +1,53 @@
+These diffs for pflogsumm versions 1.1.1 and 1.1.3 work around a
+change in the Postfix 2.9 default master.cf file.
+
+That change made the logging from submission and smtps services easier
+to distinguish, by changing postfix/smtpd into postfix/submission/smtpd
+and postfix/smtps/smtpd, respectively.
+
+Below are diffs for pflogsumm-1.1.1 and pflogsumm-1.1.3 (beta).
+Choose one that fits your pflogsumm version.
+
+====begin diff=====================
+*** ./pflogsumm-1.1.1/pflogsumm.pl-    Fri Apr  6 10:06:37 2007
+--- ./pflogsumm-1.1.1/pflogsumm.pl     Fri Jan 20 17:05:10 2012
+***************
+*** 542,548 ****
+      my $logRmdr;
+      next unless((($msgMonStr, $msgDay, $msgHr, $msgMin, $msgSec, $logRmdr) =
+       /^(...) +(\d+) (..):(..):(..) \S+ (.+)$/o) == 6);
+!     unless((($cmd, $qid) = $logRmdr =~ m#^(?:postfix|$syslogName)/([^\[:]*).*?: ([^:\s]+)#o) == 2 ||
+             (($cmd, $qid) = $logRmdr =~ m#^((?:postfix)(?:-script)?)(?:\[\d+\])?: ([^:\s]+)#o) == 2)
+      {
+       #print UNPROCD "$_";
+--- 542,548 ----
+      my $logRmdr;
+      next unless((($msgMonStr, $msgDay, $msgHr, $msgMin, $msgSec, $logRmdr) =
+       /^(...) +(\d+) (..):(..):(..) \S+ (.+)$/o) == 6);
+!     unless((($cmd, $qid) = $logRmdr =~ m#^(?:postfix|$syslogName)(?:/(?:smtps|submission))?/([^\[:]*).*?: ([^:\s]+)#o) == 2 ||
+             (($cmd, $qid) = $logRmdr =~ m#^((?:postfix)(?:-script)?)(?:\[\d+\])?: ([^:\s]+)#o) == 2)
+      {
+       #print UNPROCD "$_";
+====end diff=====================
+
+====begin diff=====================
+*** ./pflogsumm-1.1.3/pflogsumm.pl-    Sat Mar 20 16:00:42 2010
+--- ./pflogsumm-1.1.3/pflogsumm.pl     Fri Jan 20 17:02:37 2012
+***************
+*** 636,642 ****
+       --$msgMon;
+      }
+  
+!     unless((($cmd, $qid) = $logRmdr =~ m#^(?:postfix|$syslogName)/([^\[:]*).*?: ([^:\s]+)#o) == 2 ||
+             (($cmd, $qid) = $logRmdr =~ m#^((?:postfix)(?:-script)?)(?:\[\d+\])?: ([^:\s]+)#o) == 2)
+      {
+       #print UNPROCD "$_";
+--- 636,642 ----
+       --$msgMon;
+      }
+  
+!     unless((($cmd, $qid) = $logRmdr =~ m#^(?:postfix|$syslogName)(?:/(?:smtps|submission))?/([^\[:]*).*?: ([^:\s]+)#o) == 2 ||
+             (($cmd, $qid) = $logRmdr =~ m#^((?:postfix)(?:-script)?)(?:\[\d+\])?: ([^:\s]+)#o) == 2)
+      {
+       #print UNPROCD "$_";
+====end diff=====================
index 3a32e675fa748f612284b015d98cb2cf166d645e..d39e887ab4fbaa2d79ace4ca62da5213c3172498 100644 (file)
@@ -456,6 +456,16 @@ results are lost after "postfix reload" or "postfix stop". </p>
     # Note: avoid hash files here. Use btree instead.
     address_verify_map = btree:$data_directory/verify_cache
 
+    # Shared persistent cache (requires Postfix 2.9 or later).  
+    address_verify_map = proxy:btree:$data_directory/verify_cache
+    # Disable automatic cache cleanup in all Postfix instances except
+    # for one instance that will be responsible for cache cleanup.
+    # address_verify_cache_cleanup_interval = 0
+
+    # Shared memory cache (requires Postfix 2.9 or later).
+    # See memcache_table(5) for details.
+    address_verify_map = memcache:/etc/postfix/verify-memcache.cf
+
     # Default setting for Postfix 2.6 and earlier.
     # This uses non-persistent storage only.
     address_verify_map =
index 284f0278689404f349b66bef67861cf991e4b26a..8cbaa75625098fc45335863f2d76ad7bd2f2a010 100644 (file)
@@ -292,7 +292,7 @@ the ".dir" or ".pag" suffix.  </dd>
 variable name. The lookup table name in "environ:table" is ignored.
 </dd>
 
-<dt> <b>fail</b> (read-write) </dt>
+<dt> <b>fail</b> </dt>
 
 <dd> A table that reliably fails all requests. The lookup table
 name is used for logging only. This table exists to simplify Postfix
@@ -316,7 +316,7 @@ a process terminates. </dd>
 <dd> Perform lookups using the LDAP protocol. Configuration details
 are given in the ldap_table(5). </dd>
 
-<dt> <b>memcache</b> (read-write) </dt>
+<dt> <b>memcache</b> </dt>
 
 <dd> Perform memcache database lookups or updates. Configuration
 details are given in memcache_table(5). </dd>
@@ -351,7 +351,7 @@ file.  </dd>
 <dd> Perform PostgreSQL database lookups.  Configuration details
 are given in pgsql_table(5). </dd>
 
-<dt> <b>proxy</b> (read-only) </dt>
+<dt> <b>proxy</b> </dt>
 
 <dd> Access information via the Postfix proxymap(8) service. The
 lookup table name syntax is "proxy:type:table". </dd>
index ad445892f89e872a31e6346fbd6a2b4067272378..a48f9a82544b7d8b5167cbd15a7ce65046cb5cab 100644 (file)
@@ -67,9 +67,9 @@ and is therefore built into Postfix by default. </p>
 <p> The first memcache client for Postfix was written by Omar Kilani,
 and was based on the libmemcache library. </p>
 
-<p> Wietse wrote the current memcache client from the ground up.
-This implementation does not use libmemcache, and bears no resemblance
-to earlier work.  </p>
+<p> Wietse wrote the current memcache client from the ground up for
+Postfix version 2.9.  This implementation does not use libmemcache,
+and bears no resemblance to earlier work.  </p>
 
 </body>
 
index 44a8b785b4a724a6a4a7816a0ce002a9ebfc7ec0..2deaeafd63646efe67db23c26c301f2c835ec454 100644 (file)
@@ -220,10 +220,13 @@ that appear on the <i>permanent</i> access list. </p>
 
 <blockquote> <p> NOTE: To share a postscreen(8) cache between
 multiple postscreen(8) instances, use "<tt>postscreen_cache_map =
-proxy:btree:/path/to/file</tt>".  This requires Postfix 2.9 or
-later; earlier proxymap(8) implementations don't support cache
-cleanup.  For an alternative approach see the memcache_table(5)
-manpage.  </p> </blockquote>
+proxy:btree:$data_directory/postscreen_cache</tt>", and disable
+cache cleanup (postscreen_cache_cleanup_interval = 0) in all
+postscreen(8) instances except one that is responsible for cache
+cleanup. </p> <p> postscreen(8) cache sharing requires Postfix 2.9
+or later; earlier proxymap(8) implementations don't support cache
+cleanup. </p> <p>  For an alternative postscreen(8) cache sharing
+approach see the memcache_table(5) manpage.  </p> </blockquote>
 
 <p> When the SMTP client address appears on the temporary
 whitelist, postscreen(8) logs this with the client address and port
index f64839fc19c9d1e19a42ad5f597eb157fad8c20b..3dc4678b7e038583453ff41407825ed9ff2505fc 100644 (file)
 # HISTORY
 # .ad
 # .fi
-#      The first memcache client for Postfix was written by Omar
-#      Kilani, and was based on libmemcache.  
-#      The Postfix implementation does not use libmemcache, and
-#      bears no resemblance to earlier work.
+#      Memcache support was introduced with Postfix version 2.9.
 # AUTHOR(S)
 #      Wietse Venema
 #      IBM T.J. Watson Research
index 850515902a78f7269f960af9b174f346c7e19356..824931d60becfe192e70f144b97f432ffc140cae 100644 (file)
@@ -83,8 +83,39 @@ int     bounce_trace_service(int flags, char *service, char *queue_name,
     BOUNCE_INFO *bounce_info;
     int     bounce_status = 1;
     VSTREAM *bounce;
-    VSTRING *new_id = vstring_alloc(10);
+    int     notify_mask = name_mask(VAR_NOTIFY_CLASSES, mail_error_masks,
+                                   var_notify_classes);
+    VSTRING *new_id;
     int     count;
+    const char *sender;
+
+    /*
+     * For consistency with fail/delay notifications, send notification for a
+     * non-bounce message as a single-bounce message, send notification for a
+     * single-bounce message as a double-bounce message, and drop requests to
+     * send notification for a double-bounce message.
+     */
+#define NULL_SENDER            MAIL_ADDR_EMPTY /* special address */
+
+    if (strcasecmp(recipient, mail_addr_double_bounce()) == 0) {
+       msg_info("%s: not sending trace/success notification for "
+                "double-bounce message", queue_id);
+       return (0);
+    } else if (*recipient == 0) {
+       if ((notify_mask & MAIL_ERROR_2BOUNCE) != 0) {
+           recipient = var_2bounce_rcpt;
+           sender = mail_addr_double_bounce();
+       } else {
+           msg_info("%s: not sending trace/success notification "
+                    "for single-bounce message", queue_id);
+           if (mail_queue_remove(service, queue_id) && errno != ENOENT)
+               msg_fatal("remove %s %s: %m", service, queue_id);
+           return (0);
+       }
+    } else {
+       /* Always send notification for non-bounce message. */
+       sender = NULL_SENDER;
+    }
 
     /*
      * Initialize. Open queue file, bounce log, etc.
@@ -126,7 +157,6 @@ int     bounce_trace_service(int flags, char *service, char *queue_name,
        bounce_mail_free(bounce_info);
        return (0);
     }
-#define NULL_SENDER            MAIL_ADDR_EMPTY /* special address */
 #define NULL_TRACE_FLAGS       0
 
     /*
@@ -139,7 +169,8 @@ int     bounce_trace_service(int flags, char *service, char *queue_name,
      * there are fewer potential left-over files to remove up when we create
      * a new queue file.
      */
-    if ((bounce = post_mail_fopen_nowait(NULL_SENDER, recipient,
+    new_id = vstring_alloc(10);
+    if ((bounce = post_mail_fopen_nowait(sender, recipient,
                                         INT_FILT_MASK_BOUNCE,
                                         NULL_TRACE_FLAGS,
                                         new_id)) != 0) {
index c447f198bca9482bcad447d7cd744c2bf58a1d6a..8afd162096a3a2e449e5b00cc0428c8ae7e05537 100644 (file)
@@ -1098,6 +1098,7 @@ cleanup_region.o: ../../include/tok822.h
 cleanup_region.o: ../../include/vbuf.h
 cleanup_region.o: ../../include/vstream.h
 cleanup_region.o: ../../include/vstring.h
+cleanup_region.o: ../../include/warn_stat.h
 cleanup_region.o: cleanup.h
 cleanup_region.o: cleanup_region.c
 cleanup_rewrite.o: ../../include/argv.h
index 78479d47bb7d83e676d8ba2bf4ae18e2eb7b1c2a..dee28a06534db0496ab5f2d5e3c9a21c1a5b8ca5 100644 (file)
@@ -83,6 +83,7 @@
 
 #include <msg.h>
 #include <mymalloc.h>
+#include <warn_stat.h>
 
 /* Application-specific. */
 
index e633274a3d8dd2777dc6c1dfcb42ce3ec5c0e0d9..d85216492a59889dc22404b96f0eecaac5d2ba71 100644 (file)
@@ -1,24 +1,24 @@
-2604:8d00:189::2 =?= 168.100.189.2
-tested by function: no
-tested by macro:    no
 168.100.189.2 =?= 168.100.189.2
 tested by function: yes
 tested by macro:    yes
-2604:8d00:189::2 =?= 168.100.189.3
+2604:8d00:189::2 =?= 168.100.189.2
 tested by function: no
 tested by macro:    no
 168.100.189.2 =?= 168.100.189.3
 tested by function: no
 tested by macro:    no
-2604:8d00:189::2 =?= 2001:240:587:0:2d0:b7ff:fe88:2ca7
+2604:8d00:189::2 =?= 168.100.189.3
 tested by function: no
 tested by macro:    no
 168.100.189.2 =?= 2001:240:587:0:2d0:b7ff:fe88:2ca7
 tested by function: no
 tested by macro:    no
-2604:8d00:189::2 =?= 2001:240:587:0:2d0:b7ff:febe:ca9f
+2604:8d00:189::2 =?= 2001:240:587:0:2d0:b7ff:fe88:2ca7
 tested by function: no
 tested by macro:    no
 168.100.189.2 =?= 2001:240:587:0:2d0:b7ff:febe:ca9f
 tested by function: no
 tested by macro:    no
+2604:8d00:189::2 =?= 2001:240:587:0:2d0:b7ff:febe:ca9f
+tested by function: no
+tested by macro:    no
index 0b67b74e23388b89459aa4ebbf8c23749267483e..86c022d56a6aecc8832bf4ef2761f113d1e9948a 100644 (file)
@@ -1,2 +1,2 @@
-spike.porcupine.org -> 2604:8d00:189::2
 spike.porcupine.org -> 168.100.189.2
+spike.porcupine.org -> 2604:8d00:189::2
index ea0b6df796f0712581f559c071aca11faa86ebd6..b3533bd507cd3053d3b90684852642e14e2f8410 100644 (file)
@@ -86,4 +86,5 @@ flush.o: ../../include/vbuf.h
 flush.o: ../../include/vstream.h
 flush.o: ../../include/vstring.h
 flush.o: ../../include/vstring_vstream.h
+flush.o: ../../include/warn_stat.h
 flush.o: flush.c
index 22c1a83654c0d114eefe2a054015e6197d496b39..2a9a7d565b52c216fc750063d74380e5833ee017 100644 (file)
 #include <scan_dir.h>
 #include <stringops.h>
 #include <safe_open.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index a1644a32acb11fa572973a83dfa37388fea26206..d8fb3dbd5a3a9aa937484f55a1c90209423f73fb 100644 (file)
@@ -746,6 +746,7 @@ data_redirect.o: ../../include/sys_defs.h
 data_redirect.o: ../../include/vbuf.h
 data_redirect.o: ../../include/vstream.h
 data_redirect.o: ../../include/vstring.h
+data_redirect.o: ../../include/warn_stat.h
 data_redirect.o: data_redirect.c
 data_redirect.o: data_redirect.h
 data_redirect.o: dict_proxy.h
@@ -914,10 +915,44 @@ dict_memcache.o: dict_memcache.c
 dict_memcache.o: dict_memcache.h
 dict_memcache.o: memcache_proto.h
 dict_memcache.o: string_list.h
+dict_mysql.o: ../../include/argv.h
+dict_mysql.o: ../../include/dict.h
+dict_mysql.o: ../../include/events.h
+dict_mysql.o: ../../include/find_inet.h
+dict_mysql.o: ../../include/match_list.h
+dict_mysql.o: ../../include/msg.h
+dict_mysql.o: ../../include/mymalloc.h
+dict_mysql.o: ../../include/myrand.h
+dict_mysql.o: ../../include/split_at.h
+dict_mysql.o: ../../include/stringops.h
 dict_mysql.o: ../../include/sys_defs.h
+dict_mysql.o: ../../include/vbuf.h
+dict_mysql.o: ../../include/vstream.h
+dict_mysql.o: ../../include/vstring.h
+dict_mysql.o: cfg_parser.h
+dict_mysql.o: db_common.h
 dict_mysql.o: dict_mysql.c
+dict_mysql.o: dict_mysql.h
+dict_mysql.o: string_list.h
+dict_pgsql.o: ../../include/argv.h
+dict_pgsql.o: ../../include/dict.h
+dict_pgsql.o: ../../include/events.h
+dict_pgsql.o: ../../include/find_inet.h
+dict_pgsql.o: ../../include/match_list.h
+dict_pgsql.o: ../../include/msg.h
+dict_pgsql.o: ../../include/mymalloc.h
+dict_pgsql.o: ../../include/myrand.h
+dict_pgsql.o: ../../include/split_at.h
+dict_pgsql.o: ../../include/stringops.h
 dict_pgsql.o: ../../include/sys_defs.h
+dict_pgsql.o: ../../include/vbuf.h
+dict_pgsql.o: ../../include/vstream.h
+dict_pgsql.o: ../../include/vstring.h
+dict_pgsql.o: cfg_parser.h
+dict_pgsql.o: db_common.h
 dict_pgsql.o: dict_pgsql.c
+dict_pgsql.o: dict_pgsql.h
+dict_pgsql.o: string_list.h
 dict_proxy.o: ../../include/argv.h
 dict_proxy.o: ../../include/attr.h
 dict_proxy.o: ../../include/dict.h
@@ -960,6 +995,7 @@ dot_lockfile.o: ../../include/stringops.h
 dot_lockfile.o: ../../include/sys_defs.h
 dot_lockfile.o: ../../include/vbuf.h
 dot_lockfile.o: ../../include/vstring.h
+dot_lockfile.o: ../../include/warn_stat.h
 dot_lockfile.o: dot_lockfile.c
 dot_lockfile.o: dot_lockfile.h
 dot_lockfile.o: mail_params.h
@@ -1038,6 +1074,7 @@ file_id.o: ../../include/sys_defs.h
 file_id.o: ../../include/vbuf.h
 file_id.o: ../../include/vstream.h
 file_id.o: ../../include/vstring.h
+file_id.o: ../../include/warn_stat.h
 file_id.o: file_id.c
 file_id.o: file_id.h
 file_id.o: mail_queue.h
@@ -1301,6 +1338,7 @@ mail_copy.o: ../../include/vbuf.h
 mail_copy.o: ../../include/vstream.h
 mail_copy.o: ../../include/vstring.h
 mail_copy.o: ../../include/vstring_vstream.h
+mail_copy.o: ../../include/warn_stat.h
 mail_copy.o: dsn.h
 mail_copy.o: dsn_buf.h
 mail_copy.o: mail_addr.h
@@ -1356,6 +1394,7 @@ mail_open_ok.o: ../../include/sys_defs.h
 mail_open_ok.o: ../../include/vbuf.h
 mail_open_ok.o: ../../include/vstream.h
 mail_open_ok.o: ../../include/vstring.h
+mail_open_ok.o: ../../include/warn_stat.h
 mail_open_ok.o: mail_open_ok.c
 mail_open_ok.o: mail_open_ok.h
 mail_open_ok.o: mail_queue.h
@@ -1439,6 +1478,7 @@ mail_stream.o: ../../include/sys_defs.h
 mail_stream.o: ../../include/vbuf.h
 mail_stream.o: ../../include/vstream.h
 mail_stream.o: ../../include/vstring.h
+mail_stream.o: ../../include/warn_stat.h
 mail_stream.o: cleanup_user.h
 mail_stream.o: mail_params.h
 mail_stream.o: mail_proto.h
@@ -1462,6 +1502,7 @@ mail_trigger.o: ../../include/sys_defs.h
 mail_trigger.o: ../../include/trigger.h
 mail_trigger.o: ../../include/vbuf.h
 mail_trigger.o: ../../include/vstream.h
+mail_trigger.o: ../../include/warn_stat.h
 mail_trigger.o: mail_params.h
 mail_trigger.o: mail_proto.h
 mail_trigger.o: mail_trigger.c
@@ -1536,6 +1577,7 @@ mbox_open.o: ../../include/sys_defs.h
 mbox_open.o: ../../include/vbuf.h
 mbox_open.o: ../../include/vstream.h
 mbox_open.o: ../../include/vstring.h
+mbox_open.o: ../../include/warn_stat.h
 mbox_open.o: deliver_flock.h
 mbox_open.o: dot_lockfile.h
 mbox_open.o: dsn.h
@@ -1585,6 +1627,7 @@ mkmap_db.o: ../../include/sys_defs.h
 mkmap_db.o: ../../include/vbuf.h
 mkmap_db.o: ../../include/vstream.h
 mkmap_db.o: ../../include/vstring.h
+mkmap_db.o: ../../include/warn_stat.h
 mkmap_db.o: mail_params.h
 mkmap_db.o: mkmap.h
 mkmap_db.o: mkmap_db.c
@@ -1852,6 +1895,7 @@ record.o: record.h
 remove.o: ../../include/sys_defs.h
 remove.o: ../../include/vbuf.h
 remove.o: ../../include/vstring.h
+remove.o: ../../include/warn_stat.h
 remove.o: mail_params.h
 remove.o: remove.c
 resolve_clnt.o: ../../include/attr.h
index 77a28e209fe8253cb1728d9fefdc711d6ed1f5c9..096e58c14ca1eb3fa693dd72dc57d88d5e636e4e 100644 (file)
@@ -72,6 +72,7 @@
 #include <dict_db.h>
 #include <dict_dbm.h>
 #include <dict_cdb.h>
+#include <warn_stat.h>
 
 /* Global directory. */
 
index 3d6ddeaaab2082d0792dc2b62f487e98a3c5ce41..7038e050a750bcee09475e0ff35382ff158354b0 100644 (file)
@@ -461,7 +461,7 @@ typedef struct bind_props {
     char   *passwd;
     char   *realm;
     char   *authzid;
-}       bind_props;
+} bind_props;
 
 static int ldap_b2_interact(LDAP *ld, unsigned flags, void *props, void *inter)
 {
index 7f56cdf30cf9d5d3856764e51012dc5bc841c5fb..8eb0da2f78c6c7ccde0a9aff39dc64ffbf276183 100644 (file)
 /* AUTHOR(S)
 /*     Axel Steiner
 /*     ast@treibsand.com
+/*
+/*     Adopted and updated by:
+/*     Wietse Venema
+/*     IBM T.J. Watson Research
+/*     P.O. Box 704
+/*     Yorktown Heights, NY 10598, USA
 /*--*/
 
 /* System library. */
@@ -109,7 +115,7 @@ static void dict_sqlite_quote(DICT *dict, const char *raw_text, VSTRING *result)
     /* Fix 20100616 */
     if (quoted_text == 0)
        msg_fatal("dict_sqlite_quote: out of memory");
-    vstring_strcat(result, raw_text);
+    vstring_strcat(result, quoted_text);
     sqlite3_free(quoted_text);
 }
 
index 94681bf00b7d67d9258ed05b5dee88659eb7296e..89a977af92c1b4e3bbc4b5d94a8119be914b2a2a 100644 (file)
@@ -64,6 +64,7 @@
 #include <stringops.h>
 #include <mymalloc.h>
 #include <iostuff.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index c482017ae7266d9da98ee2bb6184ef1ec9a98e91..b373056fe542d47ac3daeb99b6040ebd6633c839 100644 (file)
@@ -60,6 +60,7 @@
 
 #include <msg.h>
 #include <vstring.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index b8157e71b1236f0b80e31257e09aee8aa499c9f2..7b841df84fde5abf083f46042e02e9369ac5efc2 100644 (file)
 #include <vstring_vstream.h>
 #include <stringops.h>
 #include <iostuff.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 31504c58d1d98ac280dd4297379a14ec126d1897..a1bacad8694f8f2c5d83c6b06c0b42e4ce088706 100644 (file)
@@ -65,6 +65,7 @@
 /* Utility library. */
 
 #include <msg.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 88602a30fc1be3573b2bd6f71f0baf350537fab9..401262a5897f7ca2b30c63baf5c4dcd71c65bec9 100644 (file)
 #include <stringops.h>
 #include <argv.h>
 #include <sane_fsops.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 5f9ac580ae58c90f04553e5c95f58ddd881470c0..188f10bc446d746e902023d8633df4881f17bdb4 100644 (file)
@@ -58,6 +58,7 @@
 #include <mymalloc.h>
 #include <iostuff.h>
 #include <trigger.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 5ea54423bdea2903996928a8cd6da9687c4f3835..addabbd432b7ab4e37bfea3ae80125f227002608 100644 (file)
@@ -20,8 +20,8 @@
   * Patches change both the patchlevel and the release date. Snapshots have no
   * patchlevel; they change the release date only.
   */
-#define MAIL_RELEASE_DATE      "20120117"
-#define MAIL_VERSION_NUMBER    "2.9"
+#define MAIL_RELEASE_DATE      "20120131"
+#define MAIL_VERSION_NUMBER    "2.9.0"
 
 #ifdef SNAPSHOT
 # define MAIL_VERSION_DATE     "-" MAIL_RELEASE_DATE
index ea96d8a4b87d810f8b1fb4b0033636e0c41ed618..7ccd08a5ad226f74fc437e516826dc87e709656b 100644 (file)
@@ -91,6 +91,7 @@
 #include <safe_open.h>
 #include <iostuff.h>
 #include <mymalloc.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 704fa342af72d6e1791a43b4dbed325c7d2ea984..3f69eca52cca0ba00dd2d16ca23077f422255db0 100644 (file)
@@ -47,6 +47,7 @@
 #include <dict.h>
 #include <dict_db.h>
 #include <myflock.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index dfe6ed20c15ea10e363d9229f5fbf0994d15d281..4ee6121b6803b418a79576dbd483459989893724 100644 (file)
 ./namadr_list 168.100.189.2 dummy 168.100.189.3
 ./namadr_list '[168.100.189.2]' dummy 168.100.189.2
 ./namadr_list '[168.100.189.2]' dummy 168.100.189.3
-echo foo !bar baz >junk
-./namadr_list !`pwd`/junk dummy 168.100.189.3
-./namadr_list !`pwd`/junk foo 168.100.189.3
-./namadr_list !`pwd`/junk bar 168.100.189.3
-./namadr_list !`pwd`/junk baz 168.100.189.3
-./namadr_list `pwd`/junk dummy 168.100.189.3
-./namadr_list `pwd`/junk foo 168.100.189.3
-./namadr_list `pwd`/junk bar 168.100.189.3
-./namadr_list `pwd`/junk baz 168.100.189.3
+echo foo !bar baz >junk; mv junk /tmp
+./namadr_list !/tmp/junk dummy 168.100.189.3
+./namadr_list !/tmp/junk foo 168.100.189.3
+./namadr_list !/tmp/junk bar 168.100.189.3
+./namadr_list !/tmp/junk baz 168.100.189.3
+./namadr_list /tmp/junk dummy 168.100.189.3
+./namadr_list /tmp/junk foo 168.100.189.3
+./namadr_list /tmp/junk bar 168.100.189.3
+./namadr_list /tmp/junk baz 168.100.189.3
 rm -f junk
 ./namadr_list 'be.be' x.x.x 127.0.0.1
 ./namadr_list 'be/be' x.x.x 127.0.0.1
@@ -39,4 +39,4 @@ env foo=x ./namadr_list !!environ:junk foo 168.100.189.3
 env foo=x ./namadr_list !!environ:junk bar 168.100.189.3
 ./namadr_list fail:1 bar 168.100.189.3
 ./namadr_list !fail:1 bar 168.100.189.3
-./namadr_list `pwd`/nosuchfile bar 168.100.189.3
+./namadr_list /tmp/nosuchfile bar 168.100.189.3
index 1aa895a6c2608008b50204301a531243f1aa4ee6..b21fe54eaa7f1a891cbf68c759fb94468d5a7ae5 100644 (file)
@@ -47,7 +47,7 @@ bar/168.100.189.3: NO
 bar/168.100.189.3: ERROR
 ./namadr_list: warning: fail:1: table lookup problem
 bar/168.100.189.3: ERROR
-./namadr_list: error: open file /home/wietse/postfix-2.9-20120114/src/global/nosuchfile: No such file or directory
-./namadr_list: warning: non-existent:/home/wietse/postfix-2.9-20120114/src/global/nosuchfile is unavailable. open file /home/wietse/postfix-2.9-20120114/src/global/nosuchfile: No such file or directory
-./namadr_list: warning: non-existent:/home/wietse/postfix-2.9-20120114/src/global/nosuchfile: table lookup problem
+./namadr_list: error: open file /tmp/nosuchfile: No such file or directory
+./namadr_list: warning: non-existent:/tmp/nosuchfile is unavailable. open file /tmp/nosuchfile: No such file or directory
+./namadr_list: warning: non-existent:/tmp/nosuchfile: table lookup problem
 bar/168.100.189.3: ERROR
index 620e182c5c0eb1eea41a3c65e07721c84c1b74d0..5f764b29ceb689bd5d21764b8a690544321c4983 100644 (file)
@@ -37,6 +37,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <warn_stat.h>
 
 /* Utility library. */
 
index 42ce2dc501c3d7381265a85ec92f1969206bbc17..92868a373120b0ea5aad02aa6e45006bc2b33eae 100644 (file)
@@ -453,6 +453,7 @@ mailbox.o: ../../include/tok822.h
 mailbox.o: ../../include/vbuf.h
 mailbox.o: ../../include/vstream.h
 mailbox.o: ../../include/vstring.h
+mailbox.o: ../../include/warn_stat.h
 mailbox.o: biff_notify.h
 mailbox.o: local.h
 mailbox.o: mailbox.c
@@ -491,6 +492,7 @@ maildir.o: ../../include/tok822.h
 maildir.o: ../../include/vbuf.h
 maildir.o: ../../include/vstream.h
 maildir.o: ../../include/vstring.h
+maildir.o: ../../include/warn_stat.h
 maildir.o: local.h
 maildir.o: maildir.c
 recipient.o: ../../include/argv.h
index ca107724196861af4d9243e2646c1dbaebc0f7a3..b46018e9ee15c3b1113b46adb71cec10014a1fbb 100644 (file)
@@ -61,6 +61,7 @@
 #include <mymalloc.h>
 #include <stringops.h>
 #include <set_eugid.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index a1ef4932ad3dd31511938d17cb7ccaec0d1bf9cb..46b86413ba64359c91359c714de47459521ba0d3 100644 (file)
@@ -57,6 +57,7 @@
 #include <set_eugid.h>
 #include <get_hostname.h>
 #include <sane_fsops.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 43f9db57e3b43c92c5986c0f354c3eea06591426..f1a59f61506adfa058aca34e50297a6719f7c4df 100644 (file)
@@ -118,6 +118,7 @@ event_server.o: master_proto.h
 mail_flow.o: ../../include/iostuff.h
 mail_flow.o: ../../include/msg.h
 mail_flow.o: ../../include/sys_defs.h
+mail_flow.o: ../../include/warn_stat.h
 mail_flow.o: mail_flow.c
 mail_flow.o: mail_flow.h
 mail_flow.o: master_proto.h
index 15cab0d1a410a75739885f393aa93c20230f3c3f..2958500852c398bddf6518ca7d67bdb199c7e71b 100644 (file)
@@ -53,6 +53,7 @@
 
 #include <msg.h>
 #include <iostuff.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 979c3caee79e18204f11dc80e7a5e0c7e23d20d1..1be25c873c9026f7d027a090e4d0b716aa3ef4d7 100644 (file)
@@ -112,6 +112,7 @@ qmgr_active.o: ../../include/trace.h
 qmgr_active.o: ../../include/vbuf.h
 qmgr_active.o: ../../include/vstream.h
 qmgr_active.o: ../../include/vstring.h
+qmgr_active.o: ../../include/warn_stat.h
 qmgr_active.o: qmgr.h
 qmgr_active.o: qmgr_active.c
 qmgr_bounce.o: ../../include/attr.h
index eea9d71d0c6c3e1604736ef2fcd1a2320d745583..d93a2cd105ba1765be73507ddc83b8930c6ca750 100644 (file)
@@ -93,6 +93,7 @@
 #include <events.h>
 #include <mymalloc.h>
 #include <vstream.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index c6161b8574df878b71c2580afee22230c654c03f..699c3d3fcbf16621fe80703780e826f06b45eeb3 100644 (file)
@@ -110,4 +110,5 @@ postalias.o: ../../include/vbuf.h
 postalias.o: ../../include/vstream.h
 postalias.o: ../../include/vstring.h
 postalias.o: ../../include/vstring_vstream.h
+postalias.o: ../../include/warn_stat.h
 postalias.o: postalias.c
index cc190b4165623fa9fcabaa0fe7bf1957c0b4b039..b11d8fa4b3de51ca1ea18b8d7bd26cd851c16b51 100644 (file)
 #include <split_at.h>
 #include <vstring_vstream.h>
 #include <set_eugid.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 1b08ad60be3b3f5032591b2564f0b0fba2d0ae3c..1760824c609d8b6dc795c15d014a62943041fea0 100644 (file)
@@ -116,4 +116,5 @@ postcat.o: ../../include/vbuf.h
 postcat.o: ../../include/vstream.h
 postcat.o: ../../include/vstring.h
 postcat.o: ../../include/vstring_vstream.h
+postcat.o: ../../include/warn_stat.h
 postcat.o: postcat.c
index 7c687bfe4f9f28daf96b7f1d1fc1d1826c99fc18..3d9b5158b136f8910373ff15694deb1cc2d0df27 100644 (file)
 #include <msg_vstream.h>
 #include <vstring_vstream.h>
 #include <stringops.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index e6a720abc4791fd188ab73e105fbc70aedbd639f..b757205db8da6000e09f4a54cf500230d920a0f9 100644 (file)
@@ -42,7 +42,7 @@ test: $(TESTPROG)
 
 tests: test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 \
        test12 test13 test14 test15 test16 test17 test18 test19 test20 test21 \
-       test22 test23 test24 test25 test26 test27 test28 test29
+       test22 test23 test24 test25 test26 test27 test28 test29 test30
 
 root_tests:
 
@@ -398,6 +398,22 @@ test29:    $(PROG) test29.ref
        diff test29.ref test29.tmp
        rm -f main.cf master.cf test29.tmp
 
+test30:        $(PROG) test30.ref
+       rm -f main.cf master.cf
+       touch main.cf master.cf
+       echo p1=xx >> main.cf
+       echo p2=xx >> main.cf
+       echo p3=xx >> main.cf
+       echo p4=xx >> main.cf
+       echo whatevershebrings unix - n n - 0 other >> master.cf
+       echo ' -o body_checks=$$p1' >> master.cf
+       echo ' -o bodyx_checks=$$p2' >> master.cf
+       echo ' -oheader_checks=$$p3' >> master.cf
+       echo ' -oheaderx_checks=$$p4' >> master.cf
+       ./$(PROG) -nc . >test30.tmp 2>&1
+       diff test30.ref test30.tmp
+       rm -f main.cf master.cf test30.tmp
+
 printfck: $(OBJS) $(PROG)
        rm -rf printfck
        mkdir printfck
@@ -442,6 +458,7 @@ postconf.o: ../../include/sys_defs.h
 postconf.o: ../../include/vbuf.h
 postconf.o: ../../include/vstream.h
 postconf.o: ../../include/vstring.h
+postconf.o: ../../include/warn_stat.h
 postconf.o: postconf.c
 postconf.o: postconf.h
 postconf_builtin.o: ../../include/argv.h
index 6672b694d773b49f93344d364f2265c936b44acb..becede83455c0300a1a12f41d9cd422881bf787c 100644 (file)
 /* .IP "\fBldap\fR (read-only)"
 /*     Perform lookups using the LDAP protocol. This is described
 /*     in \fBldap_table\fR(5).
-/* .IP "\fBmemcache\fR (read-write)"
+/* .IP "\fBmemcache\fR"
 /*     Perform lookups using the memcache protocol. This is described
 /*     in \fBmemcache_table\fR(5).
 /* .IP "\fBmysql\fR (read-only)"
 /* .IP "\fBpgsql\fR (read-only)"
 /*     Perform lookups using the PostgreSQL protocol. This is described
 /*     in \fBpgsql_table\fR(5).
-/* .IP "\fBproxy\fR (read-only)"
+/* .IP "\fBproxy\fR"
 /*     A lookup table that is implemented via the Postfix
 /*     \fBproxymap\fR(8) service. The table name syntax is
 /*     \fItype\fB:\fIname\fR.
 #include <vstream.h>
 #include <stringops.h>
 #include <name_mask.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index ab20cc6593e4a4cdadba061f2500f8f262b9a0f5..0aa6c3a9247e98565c45b043b7965a9370d6351c 100644 (file)
 
 #define STR(x) vstring_str(x)
 
+/* normalize_options - bring options into canonical form */
+
+static void normalize_options(ARGV *argv)
+{
+    int     field;
+    char   *arg;
+
+    /*
+     * Normalize options to simplify later processing.
+     */
+    for (field = PC_MASTER_MIN_FIELDS; argv->argv[field] != 0; field++) {
+       arg = argv->argv[field];
+       if (arg[0] != '-' || strcmp(arg, "--") == 0)
+           break;
+       if (strncmp(arg, "-o", 2) == 0) {
+           if (arg[2] != 0) {
+               /* Split "-oname=value" into "-o" "name=value". */
+               argv_insert_one(argv, field + 1, arg + 2);
+               argv_replace_one(argv, field, "-o");
+               /* arg is now a dangling pointer. */
+               field += 1;
+           } else if (argv->argv[field + 1] != 0) {
+               /* Already in "-o" "name=value" form. */
+               field += 1;
+           }
+       }
+    }
+}
+
 /* read_master - read and digest the master.cf file */
 
 void    read_master(int fail_on_open_error)
@@ -126,6 +155,7 @@ void    read_master(int fail_on_open_error)
            if (argv->argc < PC_MASTER_MIN_FIELDS)
                msg_fatal("file %s: line %d: bad field count",
                          path, line_count);
+           normalize_options(argv);
            master_table[entry_count].name_space =
                concatenate(argv->argv[0], ".", argv->argv[1], (char *) 0);
            master_table[entry_count].argv = argv;
@@ -197,7 +227,7 @@ static void print_master_line(int mode, ARGV *argv)
             * Try to show the generic options (-v -D) on the first line, and
             * non-options on a later line.
             */
-           if (arg[0] != '-') {
+           if (arg[0] != '-' || strcmp(arg, "--") == 0) {
                in_daemon_options = 0;
                if ((mode & FOLD_LINE)
                    && line_len > column_goal[PC_MASTER_MIN_FIELDS - 1]) {
index 989b7ef3781e6732a91cce1d0f0cddcba512307a..d3ff7e3184faac97f818673c66d863a44ab1f258 100644 (file)
@@ -296,7 +296,7 @@ void    register_user_parameters(void)
     for (masterp = master_table; (argv = masterp->argv) != 0; masterp++) {
        for (field = PC_MASTER_MIN_FIELDS; argv->argv[field] != 0; field++) {
            arg = argv->argv[field];
-           if (arg[0] != '-')
+           if (arg[0] != '-' || strcmp(arg, "--") == 0)
                break;
            if (strcmp(arg, "-o") == 0 && (arg = argv->argv[field + 1]) != 0) {
                saved_arg = mystrdup(arg);
diff --git a/postfix/src/postconf/test30.ref b/postfix/src/postconf/test30.ref
new file mode 100644 (file)
index 0000000..706a429
--- /dev/null
@@ -0,0 +1,7 @@
+config_directory = .
+p1 = xx
+p2 = xx
+p3 = xx
+p4 = xx
+./postconf: warning: ./master.cf: unused parameter: bodyx_checks=$p2
+./postconf: warning: ./master.cf: unused parameter: headerx_checks=$p4
index 06afb8492529940ab100d95bb8320ab7fbc59354..cfdc692c8c06a284ee50648849164b73882f2da4 100644 (file)
@@ -82,4 +82,5 @@ postdrop.o: ../../include/user_acl.h
 postdrop.o: ../../include/vbuf.h
 postdrop.o: ../../include/vstream.h
 postdrop.o: ../../include/vstring.h
+postdrop.o: ../../include/warn_stat.h
 postdrop.o: postdrop.c
index 84f8e69e0d47a0a8d1e378ee7a7232f4a91d4390..232217d85a9936ac8d5a7a36f6fea8ae754de3e2 100644 (file)
 #include <signal.h>
 #include <syslog.h>
 #include <errno.h>
+#include <warn_stat.h>
 
 /* Utility library. */
 
index ef7c63cacd7a814ef0836a64adfee7563b43bd83..71e1224e1bec2912c9c7d3df3342be864cb5d30d 100644 (file)
@@ -75,4 +75,5 @@ postfix.o: ../../include/sys_defs.h
 postfix.o: ../../include/vbuf.h
 postfix.o: ../../include/vstream.h
 postfix.o: ../../include/vstring.h
+postfix.o: ../../include/warn_stat.h
 postfix.o: postfix.c
index 60343668eb526fafaf84315901ab50d70db931f3..077b91e4eb81b3a03a37f1537c2b55204425827c 100644 (file)
 #include <clean_env.h>
 #include <argv.h>
 #include <safe.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 7271ed1d09c97b2415e6c76d3091b3d65affa524..72fde2102fdff086429745958af8c5136c697324 100644 (file)
@@ -71,4 +71,5 @@ postkick.o: ../../include/safe.h
 postkick.o: ../../include/sys_defs.h
 postkick.o: ../../include/vbuf.h
 postkick.o: ../../include/vstream.h
+postkick.o: ../../include/warn_stat.h
 postkick.o: postkick.c
index 93df8d0e32da172503786568cfb4453bc4f70ace..700467c10249cf3e02f6e8404db2b0e7d472b1da 100644 (file)
@@ -52,7 +52,7 @@
 /*     configuration files.
 /* .IP "\fBapplication_event_drain_time (100s)\fR"
 /*     How long the \fBpostkick\fR(1) command waits for a request to enter the
-/*     server's input buffer before giving up.
+/*     Postfix daemon process input buffer before giving up.
 /* .IP "\fBqueue_directory (see 'postconf -d' output)\fR"
 /*     The location of the Postfix top-level queue directory.
 /* FILES
@@ -91,6 +91,7 @@
 #include <msg_vstream.h>
 #include <safe.h>
 #include <events.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 7024d7139dffa66faa1c7d5215eef125c7a993fd..de6546bd39cef631bace3ede9a9fdf979b9acecb 100644 (file)
@@ -78,4 +78,5 @@ postlock.o: ../../include/sys_exits.h
 postlock.o: ../../include/vbuf.h
 postlock.o: ../../include/vstream.h
 postlock.o: ../../include/vstring.h
+postlock.o: ../../include/warn_stat.h
 postlock.o: postlock.c
index e2814bce3bad4b8fdc43bb314dd02908f64e8896..01f3cad5b197989d7305299edf92997d839368ec 100644 (file)
 #include <vstream.h>
 #include <msg_vstream.h>
 #include <iostuff.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 5882fd33fa4f3cd16725121b06785c895c1f32f1..effad6c4e8520c7e5162378d7e39f11d0656c641 100644 (file)
@@ -74,4 +74,5 @@ postlog.o: ../../include/vbuf.h
 postlog.o: ../../include/vstream.h
 postlog.o: ../../include/vstring.h
 postlog.o: ../../include/vstring_vstream.h
+postlog.o: ../../include/warn_stat.h
 postlog.o: postlog.c
index 67715ae9e71445b4ba79c3a055b09bf3fc8a4ea2..90f0f2b4cbd4818c751c555c91f3378a54712673 100644 (file)
@@ -94,6 +94,7 @@
 #include <msg_output.h>
 #include <msg_vstream.h>
 #include <msg_syslog.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 2684a5d77a2e2b8bcbf2e06662bd13802db1e6a4..9ffc591b6286810541b64650aa8d7022a97d8f48 100644 (file)
@@ -111,4 +111,5 @@ postmap.o: ../../include/vbuf.h
 postmap.o: ../../include/vstream.h
 postmap.o: ../../include/vstring.h
 postmap.o: ../../include/vstring_vstream.h
+postmap.o: ../../include/warn_stat.h
 postmap.o: postmap.c
index 4781d52115efd0ca3dfa81a833fd1b61f099c332..8249d79d57f1d819b327222d636584eccb4a1e3d 100644 (file)
 #include <split_at.h>
 #include <vstring_vstream.h>
 #include <set_eugid.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index b071ec942b8e4643f71a6d41492cb30485dc428b..2c8f4137f095692b283df4c060c04ed74baf286a 100644 (file)
@@ -80,4 +80,5 @@ postmulti.o: ../../include/vbuf.h
 postmulti.o: ../../include/vstream.h
 postmulti.o: ../../include/vstring.h
 postmulti.o: ../../include/vstring_vstream.h
+postmulti.o: ../../include/warn_stat.h
 postmulti.o: postmulti.c
index c0ff9df36fa4575dc5c0a50e4fb278ac2b5589e9..fcf66008cba1329424683b5d6c288a5acb5f0b34 100644 (file)
 #include <htable.h>
 #include <name_code.h>
 #include <ring.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 4e80a3c811f70a8f82032cb48cefce178e64ef02..c7ebd3c74a85ee1b97ea3d8237b17304f754127a 100644 (file)
@@ -85,4 +85,5 @@ postqueue.o: ../../include/valid_mailhost_addr.h
 postqueue.o: ../../include/vbuf.h
 postqueue.o: ../../include/vstream.h
 postqueue.o: ../../include/vstring.h
+postqueue.o: ../../include/warn_stat.h
 postqueue.o: postqueue.c
index d6ed5ccc416fb1b32d8f05c3b9964aacce63014d..6ea91f90be262e5e83ea598bc38169f1f92e8220 100644 (file)
 #include <safe.h>
 #include <connect.h>
 #include <valid_hostname.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 36a665bf17917ad0f1eb1195c490513b7fb791b4..b529ed392784e2bc3448a46f2450533161ea66ab 100644 (file)
@@ -796,7 +796,8 @@ static void psc_service(VSTREAM *smtp_client_stream,
     }
 
     /*
-     * Don't whitelist clients that connect to backup MX addresses.
+     * Don't whitelist clients that connect to backup MX addresses. Fail
+     * "closed" on error.
      */
     if (addr_match_list_match(psc_wlist_if, smtp_server_addr.buf) == 0) {
        state->flags |= (PSC_STATE_FLAG_WLIST_FAIL | PSC_STATE_FLAG_NOFORWARD);
@@ -862,8 +863,9 @@ static void pre_jail_init(char *unused_name, char **unused_argv)
     psc_acl_pre_jail_init(var_mynetworks, VAR_PSC_ACL);
     if (*var_psc_acl)
        psc_acl = psc_acl_parse(var_psc_acl, VAR_PSC_ACL);
+    /* Ignore smtpd_forbid_cmds lookup errors. Non-critical feature. */
     if (*var_psc_forbid_cmds)
-       psc_forbid_cmds = string_list_init(MATCH_FLAG_NONE,
+       psc_forbid_cmds = string_list_init(MATCH_FLAG_RETURN,
                                           var_psc_forbid_cmds);
     if (*var_psc_dnsbl_reply)
        psc_dnsbl_reply = dict_open(var_psc_dnsbl_reply, O_RDONLY,
@@ -1008,7 +1010,8 @@ static void post_jail_init(char *unused_name, char **unused_argv)
                                      var_psc_barlf_action)) < 0)
        msg_fatal("bad %s value: %s", VAR_PSC_BARLF_ACTION,
                  var_psc_barlf_action);
-    psc_wlist_if = addr_match_list_init(MATCH_FLAG_NONE, var_psc_wlist_if);
+    /* Fail "closed" on error. */
+    psc_wlist_if = addr_match_list_init(MATCH_FLAG_RETURN, var_psc_wlist_if);
 
     /*
      * Start the cache maintenance pseudo thread last. Early cleanup makes
index 406438b5569084f509bd207e4143f9bad631c1aa..7e319f7131ba86fa528cb0ccf2c045eb56e03d5e 100644 (file)
@@ -928,6 +928,7 @@ static void psc_smtpd_read_event(int event, char *context)
        if ((state->flags & PSC_STATE_MASK_NSMTP_TODO_SKIP)
            == PSC_STATE_FLAG_NSMTP_TODO && cmdp->name == 0
            && (is_header(command)
+       /* Ignore forbid_cmds lookup errors. Non-critical feature. */
                || (*var_psc_forbid_cmds
                    && string_list_match(psc_forbid_cmds, command)))) {
            printable(command, '?');
index 7367d601f1b4a716030a92a20aa784d9f773c43e..fe86fda947f027e804234b267c2c482a250be49c 100644 (file)
@@ -80,4 +80,5 @@ postsuper.o: ../../include/vbuf.h
 postsuper.o: ../../include/vstream.h
 postsuper.o: ../../include/vstring.h
 postsuper.o: ../../include/vstring_vstream.h
+postsuper.o: ../../include/warn_stat.h
 postsuper.o: postsuper.c
index 7e3b2b98c97c68a9837438fd3d0cf7a24181aa18..9dabb5dc4c92b36308bbd76a24bd7e73a7730da0 100644 (file)
 #include <vstring_vstream.h>
 #include <sane_fsops.h>
 #include <myrand.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index c1a7f20519e5f39f48c90e4174d032ef692cff82..e9e2a3ba607ba3bb29d10a54e878acf5b8c0c1fa 100644 (file)
@@ -114,6 +114,7 @@ qmgr_active.o: ../../include/trace.h
 qmgr_active.o: ../../include/vbuf.h
 qmgr_active.o: ../../include/vstream.h
 qmgr_active.o: ../../include/vstring.h
+qmgr_active.o: ../../include/warn_stat.h
 qmgr_active.o: qmgr.h
 qmgr_active.o: qmgr_active.c
 qmgr_bounce.o: ../../include/attr.h
index eea9d71d0c6c3e1604736ef2fcd1a2320d745583..d93a2cd105ba1765be73507ddc83b8930c6ca750 100644 (file)
@@ -93,6 +93,7 @@
 #include <events.h>
 #include <mymalloc.h>
 #include <vstream.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 805a3f4c8696972c7d3338101446485bfcf075c8..02111628fad1899dd951da5209a87a7b7b8f0042 100644 (file)
@@ -102,4 +102,5 @@ sendmail.o: ../../include/verp_sender.h
 sendmail.o: ../../include/vstream.h
 sendmail.o: ../../include/vstring.h
 sendmail.o: ../../include/vstring_vstream.h
+sendmail.o: ../../include/warn_stat.h
 sendmail.o: sendmail.c
index 9560f4840ff599965dd277623e8fd1703e8484eb..5e205a57c240a84095666a3b5c06a7c17c57041f 100644 (file)
 #include <connect.h>
 #include <split_at.h>
 #include <name_code.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index 3d2f27447c4d5a12a3f9d04bff316a8a54416689..5ad0645b58f4c106a6a36840653ec8e0c341a012 100644 (file)
@@ -87,4 +87,5 @@ tlsmgr.o: ../../include/vbuf.h
 tlsmgr.o: ../../include/vstream.h
 tlsmgr.o: ../../include/vstring.h
 tlsmgr.o: ../../include/vstring_vstream.h
+tlsmgr.o: ../../include/warn_stat.h
 tlsmgr.o: tlsmgr.c
index efddb5c3706c3ea9e393cff0bdbe965c12b283e9..cab6caff200504bed54654d74d04d96c50409f16 100644 (file)
 #include <attr.h>
 #include <set_eugid.h>
 #include <htable.h>
+#include <warn_stat.h>
 
 /* Global library. */
 
index c73642c98b8403416dd40c1805111b140e6fd7ce..dc7a4bb437425c66e531a5acd76569f7503f3aec 100644 (file)
@@ -34,7 +34,7 @@ SRCS  = alldig.c allprint.c argv.c argv_split.c attr_clnt.c attr_print0.c \
        unix_pass_listen.c unix_pass_trigger.c edit_file.c inet_windowsize.c \
        unix_pass_fd_fix.c dict_cache.c valid_utf_8.c dict_thash.c \
        ip_match.c nbbio.c stream_pass_connect.c base32_code.c dict_test.c \
-       dict_fail.c msg_rate_delay.c dict_surrogate.c
+       dict_fail.c msg_rate_delay.c dict_surrogate.c warn_stat.c
 OBJS   = alldig.o allprint.o argv.o argv_split.o attr_clnt.o attr_print0.o \
        attr_print64.o attr_print_plain.o attr_scan0.o attr_scan64.o \
        attr_scan_plain.o auto_clnt.o base64_code.o basename.o binhash.o \
@@ -70,7 +70,7 @@ OBJS  = alldig.o allprint.o argv.o argv_split.o attr_clnt.o attr_print0.o \
        unix_pass_listen.o unix_pass_trigger.o edit_file.o inet_windowsize.o \
        unix_pass_fd_fix.o dict_cache.o valid_utf_8.o dict_thash.o \
        ip_match.o nbbio.o stream_pass_connect.o base32_code.o dict_test.o \
-       dict_fail.o msg_rate_delay.o dict_surrogate.o
+       dict_fail.o msg_rate_delay.o dict_surrogate.o warn_stat.o
 HDRS   = argv.h attr.h attr_clnt.h auto_clnt.h base64_code.h binhash.h \
        chroot_uid.h cidr_match.h clean_env.h connect.h ctable.h dict.h \
        dict_cdb.h dict_cidr.h dict_db.h dict_dbm.h dict_env.h dict_ht.h \
@@ -91,7 +91,7 @@ HDRS  = argv.h attr.h attr_clnt.h auto_clnt.h base64_code.h binhash.h \
        username.h valid_hostname.h vbuf.h vbuf_print.h vstream.h vstring.h \
        vstring_vstream.h watchdog.h format_tv.h load_file.h killme_after.h \
        edit_file.h dict_cache.h dict_thash.h ip_match.h nbbio.h base32_code.h \
-       dict_fail.h
+       dict_fail.h warn_stat.h
 TESTSRC        = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
        stream_test.c dup2_pass_on_exec.c
 DEFS   = -I. -D$(SYSTYPE)
@@ -853,6 +853,7 @@ dict.o: sys_defs.h
 dict.o: vbuf.h
 dict.o: vstream.h
 dict.o: vstring.h
+dict.o: warn_stat.h
 dict_alloc.o: argv.h
 dict_alloc.o: dict.h
 dict_alloc.o: dict_alloc.c
@@ -886,6 +887,7 @@ dict_cdb.o: sys_defs.h
 dict_cdb.o: vbuf.h
 dict_cdb.o: vstream.h
 dict_cdb.o: vstring.h
+dict_cdb.o: warn_stat.h
 dict_cidr.o: argv.h
 dict_cidr.o: cidr_match.h
 dict_cidr.o: dict.h
@@ -900,6 +902,7 @@ dict_cidr.o: sys_defs.h
 dict_cidr.o: vbuf.h
 dict_cidr.o: vstream.h
 dict_cidr.o: vstring.h
+dict_cidr.o: warn_stat.h
 dict_db.o: argv.h
 dict_db.o: dict.h
 dict_db.o: dict_db.c
@@ -913,6 +916,7 @@ dict_db.o: sys_defs.h
 dict_db.o: vbuf.h
 dict_db.o: vstream.h
 dict_db.o: vstring.h
+dict_db.o: warn_stat.h
 dict_dbm.o: dict_dbm.c
 dict_dbm.o: sys_defs.h
 dict_debug.o: argv.h
@@ -1025,6 +1029,7 @@ dict_pcre.o: sys_defs.h
 dict_pcre.o: vbuf.h
 dict_pcre.o: vstream.h
 dict_pcre.o: vstring.h
+dict_pcre.o: warn_stat.h
 dict_regexp.o: argv.h
 dict_regexp.o: dict.h
 dict_regexp.o: dict_regexp.c
@@ -1039,6 +1044,7 @@ dict_regexp.o: sys_defs.h
 dict_regexp.o: vbuf.h
 dict_regexp.o: vstream.h
 dict_regexp.o: vstring.h
+dict_regexp.o: warn_stat.h
 dict_sdbm.o: argv.h
 dict_sdbm.o: dict.h
 dict_sdbm.o: dict_sdbm.c
@@ -1053,6 +1059,7 @@ dict_sdbm.o: sys_defs.h
 dict_sdbm.o: vbuf.h
 dict_sdbm.o: vstream.h
 dict_sdbm.o: vstring.h
+dict_sdbm.o: warn_stat.h
 dict_static.o: argv.h
 dict_static.o: dict.h
 dict_static.o: dict_static.c
@@ -1112,6 +1119,7 @@ dict_thash.o: sys_defs.h
 dict_thash.o: vbuf.h
 dict_thash.o: vstream.h
 dict_thash.o: vstring.h
+dict_thash.o: warn_stat.h
 dict_unix.o: argv.h
 dict_unix.o: dict.h
 dict_unix.o: dict_unix.c
@@ -1156,6 +1164,7 @@ edit_file.o: sys_defs.h
 edit_file.o: vbuf.h
 edit_file.o: vstream.h
 edit_file.o: vstring.h
+edit_file.o: warn_stat.h
 environ.o: environ.c
 environ.o: sys_defs.h
 events.o: events.c
@@ -1175,6 +1184,7 @@ fifo_listen.o: iostuff.h
 fifo_listen.o: listen.h
 fifo_listen.o: msg.h
 fifo_listen.o: sys_defs.h
+fifo_listen.o: warn_stat.h
 fifo_open.o: fifo_open.c
 fifo_rdonly_bug.o: fifo_rdonly_bug.c
 fifo_rdonly_bug.o: sys_defs.h
@@ -1347,6 +1357,7 @@ load_file.o: msg.h
 load_file.o: sys_defs.h
 load_file.o: vbuf.h
 load_file.o: vstream.h
+load_file.o: warn_stat.h
 lowercase.o: lowercase.c
 lowercase.o: stringops.h
 lowercase.o: sys_defs.h
@@ -1357,6 +1368,7 @@ lstat_as.o: lstat_as.h
 lstat_as.o: msg.h
 lstat_as.o: set_eugid.h
 lstat_as.o: sys_defs.h
+lstat_as.o: warn_stat.h
 mac_expand.o: mac_expand.c
 mac_expand.o: mac_expand.h
 mac_expand.o: mac_parse.h
@@ -1379,6 +1391,7 @@ make_dirs.o: stringops.h
 make_dirs.o: sys_defs.h
 make_dirs.o: vbuf.h
 make_dirs.o: vstring.h
+make_dirs.o: warn_stat.h
 mask_addr.o: mask_addr.c
 mask_addr.o: mask_addr.h
 mask_addr.o: msg.h
@@ -1580,6 +1593,7 @@ safe_open.o: sys_defs.h
 safe_open.o: vbuf.h
 safe_open.o: vstream.h
 safe_open.o: vstring.h
+safe_open.o: warn_stat.h
 sane_accept.o: msg.h
 sane_accept.o: sane_accept.c
 sane_accept.o: sane_accept.h
@@ -1597,10 +1611,12 @@ sane_link.o: msg.h
 sane_link.o: sane_fsops.h
 sane_link.o: sane_link.c
 sane_link.o: sys_defs.h
+sane_link.o: warn_stat.h
 sane_rename.o: msg.h
 sane_rename.o: sane_fsops.h
 sane_rename.o: sane_rename.c
 sane_rename.o: sys_defs.h
+sane_rename.o: warn_stat.h
 sane_socketpair.o: msg.h
 sane_socketpair.o: sane_socketpair.c
 sane_socketpair.o: sane_socketpair.h
@@ -1668,6 +1684,7 @@ stat_as.o: set_eugid.h
 stat_as.o: stat_as.c
 stat_as.o: stat_as.h
 stat_as.o: sys_defs.h
+stat_as.o: warn_stat.h
 strcasecmp.o: strcasecmp.c
 strcasecmp.o: sys_defs.h
 stream_connect.o: connect.h
@@ -1866,6 +1883,10 @@ vstring_vstream.o: vstream.h
 vstring_vstream.o: vstring.h
 vstring_vstream.o: vstring_vstream.c
 vstring_vstream.o: vstring_vstream.h
+warn_stat.o: msg.h
+warn_stat.o: sys_defs.h
+warn_stat.o: warn_stat.c
+warn_stat.o: warn_stat.h
 watchdog.o: events.h
 watchdog.o: iostuff.h
 watchdog.o: killme_after.h
index 4613bc2df7a1cdfa1060b002f96876e755277424..de2d4b3291a4b400bb2968e7e5848e1198d3346f 100644 (file)
 /*     ARGV    *argvp;
 /*     ssize_t len;
 /*
+/*     void    argv_insert_one(argvp, pos, arg)
+/*     ARGV    *argvp;
+/*     ssize_t pos;
+/*     const char *arg;
+/*
+/*     void    argv_replace_one(argvp, pos, arg)
+/*     ARGV    *argvp;
+/*     ssize_t pos;
+/*     const char *arg;
+/*
 /*     void    ARGV_FAKE_BEGIN(argv, arg)
 /*     const char *arg;
 /*
 /*     number of entries, but does not reallocate memory. The
 /*     result is null-terminated.
 /*
+/*     argv_insert_one() inserts one string at the specified array
+/*     position.
+/*
+/*     argv_replace_one() replaces one string at the specified
+/*     position.
+/*
 /*     ARGV_FAKE_BEGIN/END are an optimization for the case where
 /*     a single string needs to be passed into an ARGV-based
 /*     interface.  ARGV_FAKE_BEGIN() opens a statement block and
@@ -219,3 +235,38 @@ void    argv_truncate(ARGV *argvp, ssize_t len)
        argvp->argv[argvp->argc] = 0;
     }
 }
+
+/* argv_insert_one - insert one string into array */
+
+void    argv_insert_one(ARGV *argvp, ssize_t where, const char *arg)
+{
+    ssize_t pos;
+
+    /*
+     * Sanity check.
+     */
+    if (where < 0 || where > argvp->argc)
+       msg_panic("argv_insert_one bad position: %ld", (long) where);
+
+    if (ARGV_SPACE_LEFT(argvp) <= 0)
+       argv_extend(argvp);
+    for (pos = argvp->argc; pos >= where; pos--)
+       argvp->argv[pos + 1] = argvp->argv[pos];
+    argvp->argv[where] = mystrdup(arg);
+    argvp->argc += 1;
+}
+
+/* argv_replace_one - insert one string into array */
+
+void    argv_replace_one(ARGV *argvp, ssize_t where, const char *arg)
+{
+
+    /*
+     * Sanity check.
+     */
+    if (where < 0 || where >= argvp->argc)
+       msg_panic("argv_replace_one bad position: %ld", (long) where);
+
+    myfree(argvp->argv[where]);
+    argvp->argv[where] = mystrdup(arg);
+}
index 17f006a39427700967ff1f510673cd8ff484a84c..7c56f581a04e6e787b37d2274e6231fe91ba40bb 100644 (file)
@@ -25,6 +25,8 @@ extern void argv_add(ARGV *,...);
 extern void argv_addn(ARGV *,...);
 extern void argv_terminate(ARGV *);
 extern void argv_truncate(ARGV *, ssize_t);
+extern void argv_insert_one(ARGV *, ssize_t, const char *);
+extern void argv_replace_one(ARGV *, ssize_t, const char *);
 extern ARGV *argv_free(ARGV *);
 
 extern ARGV *argv_split(const char *, const char *);
index 875c5c513ec902bd77628594684204647517b8df..3ef835b8987366281ce32008e0599c5152246c7d 100644 (file)
 #include "name_mask.h"
 #include "dict.h"
 #include "dict_ht.h"
+#include "warn_stat.h"
 
 static HTABLE *dict_table;
 
index 9de10fdf0fdeea7ebd7c34aaba83560ea005349e..f79c1353df8f9a0ce0a63f799275287746c5c1e2 100644 (file)
@@ -60,6 +60,7 @@
 #include "stringops.h"
 #include "dict.h"
 #include "dict_cdb.h"
+#include "warn_stat.h"
 
 #ifdef HAS_CDB
 
index 2ea7ab1fdb528fc6ec76e70c585442a128a8017f..7aecb2f250fdab7870965e9159a74a3fb0396961 100644 (file)
@@ -53,6 +53,7 @@
 #include <myaddrinfo.h>
 #include <cidr_match.h>
 #include <dict_cidr.h>
+#include <warn_stat.h>
 
 /* Application-specific. */
 
index 5a4287c86fff6d7e02baf2f1b0cf85f56ef0c402..93ee48098fa4025db936a167abee13eb35d5a306 100644 (file)
 #include "myflock.h"
 #include "dict.h"
 #include "dict_db.h"
+#include "warn_stat.h"
 
 /* Application-specific. */
 
index c0627d87b3d968b4dc5f1d064344b200a3d82bdc..37e14639f49ed963cfd0d4143469050c5baf7f6e 100644 (file)
@@ -60,6 +60,7 @@
 #include "stringops.h"
 #include "dict.h"
 #include "dict_dbm.h"
+#include "warn_stat.h"
 
 /* Application-specific. */
 
index d53d4b6c830737f427759c8837570bf0d4cc89c2..060019ec5c937f0d24b9553abee5df30ca41f7ce 100644 (file)
@@ -59,6 +59,7 @@
 #include "dict_pcre.h"
 #include "mac_parse.h"
 #include "pcre.h"
+#include "warn_stat.h"
 
  /*
   * Support for IF/ENDIF based on an idea by Bert Driehuis.
index 2cab3b4e0264f9501f1b0f324f6792274d05540b..14275089b792bc90b3018e71050c71f820c7ef69 100644 (file)
@@ -61,6 +61,7 @@
 #include "dict.h"
 #include "dict_regexp.h"
 #include "mac_parse.h"
+#include "warn_stat.h"
 
  /*
   * Support for IF/ENDIF based on an idea by Bert Driehuis.
index 3a30d9c65fbbd01ac8a5f4c6b1a62b6e8464a513..23371dc7c72efd46df8d0da70d6eafa981af7e9b 100644 (file)
@@ -52,6 +52,7 @@
 #include <stringops.h>
 #include <dict.h>
 #include <dict_sdbm.h>
+#include <warn_stat.h>
 
 #ifdef HAS_SDBM
 
index 0f09d4b933cde4659778bfecf191057947924854..6eac13ff66d6c411451b34a93b3eb0da2d70800d 100644 (file)
@@ -49,6 +49,7 @@
 #include <readlline.h>
 #include <dict.h>
 #include <dict_thash.h>
+#include <warn_stat.h>
 
 /* Application-specific. */
 
index 9b5388ab0f84fec72b0266a7ff1b29b663b935ed..868128806c90625d2ec996344d9e26c9d23df0d2 100644 (file)
 #include <stringops.h>
 #include <myflock.h>
 #include <edit_file.h>
+#include <warn_stat.h>
 
  /*
   * Do we reuse and truncate an output file that persists after a crash, or
index 62915c14c6cd51de1c19263b472c257c7201bfa5..9ad3440de08fc38eaf3c23f9c6461dab3c4dfd0f 100644 (file)
@@ -43,6 +43,7 @@
 #include "msg.h"
 #include "iostuff.h"
 #include "listen.h"
+#include "warn_stat.h"
 
 #define BUF_LEN        100
 
index 59af3453c110083f14d1ac9e1796550aaaa86a0a..4e575d1392a218e8d3f1e38f6d8b6468800f2e85 100644 (file)
@@ -46,6 +46,7 @@
 #include <vstream.h>
 #include <iostuff.h>
 #include <load_file.h>
+#include <warn_stat.h>
 
 /* load_file - load file with some prejudice */
 
index ffb796e8ce91acfe39ca2b889ea4aeecf771dd8a..18e0f9fbfa16b4e9733d7c9513575a5e2711648c 100644 (file)
@@ -44,6 +44,7 @@
 #include "msg.h"
 #include "set_eugid.h"
 #include "lstat_as.h"
+#include "warn_stat.h"
 
 /* lstat_as - lstat file as user */
 
index fef1c6fcc7d6f9c0ad41b995fd41d5a13044ea39..2e37f8fe6267a2d96d1711782d829243f23c04d2 100644 (file)
@@ -45,6 +45,7 @@
 #include "mymalloc.h"
 #include "stringops.h"
 #include "make_dirs.h"
+#include "warn_stat.h"
 
 /* make_dirs - create directory hierarchy */
 
index f0da580cbddc601145e20493a2fffff225bbed96..360228a10b637e7d732e33f55bff70e39575b105 100644 (file)
@@ -1,8 +1,8 @@
 ./myaddrinfo: === hostname belly.porcupine.org ===
-./myaddrinfo: belly.porcupine.org -> family=28 sock=1 proto=6 2604:8d00:189::6
-./myaddrinfo: 2604:8d00:189::6 -> belly.porcupine.org
 ./myaddrinfo: belly.porcupine.org -> family=2 sock=1 proto=6 168.100.189.6
 ./myaddrinfo: 168.100.189.6 -> belly.porcupine.org
+./myaddrinfo: belly.porcupine.org -> family=28 sock=1 proto=6 2604:8d00:189::6
+./myaddrinfo: 2604:8d00:189::6 -> belly.porcupine.org
 ./myaddrinfo: === host address 168.100.189.2 ===
 ./myaddrinfo: 168.100.189.2 -> family=2 sock=1 proto=6 168.100.189.2
 ./myaddrinfo: 168.100.189.2 -> spike.porcupine.org
index 9cf5d0263033e17f28a30f36965d9186b49d0461..c7a80cfa8f572693728054d756d76862dae18056 100644 (file)
@@ -85,6 +85,7 @@
 #include <vstring.h>
 #include <stringops.h>
 #include <safe_open.h>
+#include <warn_stat.h>
 
 /* safe_open_exist - open existing file */
 
index a094377ee32296f216fef38d25ae3e0f08552ba4..de83564cde4d72e32dc3026b2319aa36d6565eee 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "msg.h"
 #include "sane_fsops.h"
+#include "warn_stat.h"
 
 /* sane_link - sanitize link() error returns */
 
index 7a458c3f263ef6023c4cfa52f11fc238dc2f5803..4c551605ab0ff4e4984f1731431f0da2d4c58e03 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "msg.h"
 #include "sane_fsops.h"
+#include "warn_stat.h"
 
 /* sane_rename - sanitize rename() error returns */
 
index 0f578a541c3a29f5d3c85a924255216d29ecbefb..3e05ff749ba4889ca379e824724e243707fa3a5a 100644 (file)
@@ -44,6 +44,7 @@
 #include "msg.h"
 #include "set_eugid.h"
 #include "stat_as.h"
+#include "warn_stat.h"
 
 /* stat_as - stat file as user */
 
diff --git a/postfix/src/util/warn_stat.c b/postfix/src/util/warn_stat.c
new file mode 100644 (file)
index 0000000..fd885d9
--- /dev/null
@@ -0,0 +1,101 @@
+/*++
+/* NAME
+/*     warn_stat 3
+/* SUMMARY
+/*     baby-sit stat() error returns
+/* SYNOPSIS
+/*     #include <warn_stat.h>
+/*
+/*     int     warn_stat(path, st)
+/*     const char *path;
+/*     struct stat *st;
+/*
+/*     int     warn_lstat(path, st)
+/*     const char *path;
+/*     struct stat *st;
+/*
+/*     int     warn_fstat(fd, st)
+/*     int     fd;
+/*     struct stat *st;
+/* DESCRIPTION
+/*     warn_stat(), warn_fstat() and warn_lstat() wrap the stat(),
+/*     fstat() and lstat() system calls with code that logs a
+/*     diagnosis for common error cases.
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     IBM T.J. Watson Research
+/*     P.O. Box 704
+/*     Yorktown Heights, NY 10598, USA
+/*--*/
+
+/* System library. */
+
+#include <sys_defs.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+/* Utility library. */
+
+#include <msg.h>
+#define WARN_STAT_INTERNAL
+#include <warn_stat.h>
+
+/* diagnose_stat - log stat warning */
+
+static void diagnose_stat(void)
+{
+    struct stat st;
+
+    /*
+     * When *stat() fails with EOVERFLOW, and the interface uses 32-bit data
+     * types, suggest that the program be recompiled with larger data types.
+     */
+#ifdef EOVERFLOW
+    if (errno == EOVERFLOW && sizeof(st.st_size) == 4) {
+       msg_warn("this program was built for 32-bit file handles, "
+                "but some number does not fit in 32 bits");
+       msg_warn("possible solution: recompile in 64-bit mode, or "
+                "recompile in 32-bit mode with 'large file' support");
+    }
+#endif
+}
+
+/* warn_stat - stat with warning */
+
+int     warn_stat(const char *path, struct stat * st)
+{
+    int     ret;
+
+    ret = stat(path, st);
+    if (ret < 0)
+       diagnose_stat();
+    return (ret);
+}
+
+/* warn_lstat - lstat with warning */
+
+int     warn_lstat(const char *path, struct stat * st)
+{
+    int     ret;
+
+    ret = lstat(path, st);
+    if (ret < 0)
+       diagnose_stat();
+    return (ret);
+}
+
+/* warn_fstat - fstat with warning */
+
+int     warn_fstat(int fd, struct stat * st)
+{
+    int     ret;
+
+    ret = fstat(fd, st);
+    if (ret < 0)
+       diagnose_stat();
+    return (ret);
+}
diff --git a/postfix/src/util/warn_stat.h b/postfix/src/util/warn_stat.h
new file mode 100644 (file)
index 0000000..92ddce0
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _WARN_STAT_H_
+#define _WARN_STAT_H_
+
+/*++
+/* NAME
+/*     warn_stat 3h
+/* SUMMARY
+/*     baby-sit stat() error returns
+/* SYNOPSIS
+/*     #include <warn_stat.h>
+/* DESCRIPTION
+/* .nf
+
+ /*
+  * External interface.
+  */
+#ifndef WARN_STAT_INTERNAL
+#define stat(p, s) warn_stat((p), (s))
+#define lstat(p, s) warn_lstat((p), (s))
+#define fstat(f, s) warn_fstat((f), (s))
+#endif
+
+extern int warn_stat(const char *path, struct stat *);
+extern int warn_lstat(const char *path, struct stat *);
+extern int warn_fstat(int, struct stat *);
+
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     IBM T.J. Watson Research
+/*     P.O. Box 704
+/*     Yorktown Heights, NY 10598, USA
+/*--*/
+
+#endif
index 9aed39f412a8061188c3edc1cc4b0cdea2dcdebd..954c544a4451d8139039d698a57e1c0fa1a014c2 100644 (file)
@@ -133,6 +133,7 @@ maildir.o: ../../include/sys_defs.h
 maildir.o: ../../include/vbuf.h
 maildir.o: ../../include/vstream.h
 maildir.o: ../../include/vstring.h
+maildir.o: ../../include/warn_stat.h
 maildir.o: maildir.c
 maildir.o: virtual.h
 recipient.o: ../../include/argv.h
index a44d09953826816f46272ca79a284eb35ebdcdc2..a6770610e59906ea349d7c56a2d7c1a03a665e75 100644 (file)
@@ -52,6 +52,7 @@
 #include <set_eugid.h>
 #include <get_hostname.h>
 #include <sane_fsops.h>
+#include <warn_stat.h>
 
 /* Global library. */