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.
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
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().
update: $(LIBEXEC)
libexec/post-install: conf/post-install
- rm -f $@ && ln -sf ../$? $@
+ rm -f $@ && ln -f $? $@
libexec/postfix-files: conf/postfix-files
- rm -f $@ && ln -sf ../$? $@
+ rm -f $@ && ln -f $? $@
libexec/postfix-script: conf/postfix-script
- rm -f $@ && ln -sf ../$? $@
+ rm -f $@ && ln -f $? $@
libexec/postfix-wrapper: conf/postfix-wrapper
- rm -f $@ && ln -sf ../$? $@
+ rm -f $@ && ln -f $? $@
libexec/main.cf: conf/main.cf
- rm -f $@ && ln -sf ../$? $@
+ rm -f $@ && ln -f $? $@
libexec/master.cf: conf/master.cf
- rm -f $@ && ln -sf ../$? $@
+ rm -f $@ && ln -f $? $@
libexec/postmulti-script: conf/postmulti-script
- rm -f $@ && ln -sf ../$? $@
+ rm -f $@ && ln -f $? $@
manpages:
set -e; for i in $(MANDIRS); do \
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
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)
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)
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.
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
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
<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>
<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>
<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>
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
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>.
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>.
<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-
.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.
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"
.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
--- /dev/null
+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=====================
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
<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>
<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>
<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>
# 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
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
#include <msg.h>
#include <mymalloc.h>
+#include <warn_stat.h>
/* Application-specific. */
-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
-spike.porcupine.org -> 2604:8d00:189::2
spike.porcupine.org -> 168.100.189.2
+spike.porcupine.org -> 2604:8d00:189::2
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
#include <scan_dir.h>
#include <stringops.h>
#include <safe_open.h>
+#include <warn_stat.h>
/* Global library. */
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
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
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
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
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
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
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
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
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
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
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
#include <dict_db.h>
#include <dict_dbm.h>
#include <dict_cdb.h>
+#include <warn_stat.h>
/* Global directory. */
#include <stringops.h>
#include <mymalloc.h>
#include <iostuff.h>
+#include <warn_stat.h>
/* Global library. */
#include <msg.h>
#include <vstring.h>
+#include <warn_stat.h>
/* Global library. */
#include <vstring_vstream.h>
#include <stringops.h>
#include <iostuff.h>
+#include <warn_stat.h>
/* Global library. */
/* Utility library. */
#include <msg.h>
+#include <warn_stat.h>
/* Global library. */
#include <stringops.h>
#include <argv.h>
#include <sane_fsops.h>
+#include <warn_stat.h>
/* Global library. */
#include <mymalloc.h>
#include <iostuff.h>
#include <trigger.h>
+#include <warn_stat.h>
/* Global library. */
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20120118"
-#define MAIL_VERSION_NUMBER "2.9-RC1"
+#define MAIL_RELEASE_DATE "20120124"
+#define MAIL_VERSION_NUMBER "2.9-RC2"
#ifdef SNAPSHOT
# define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
#include <safe_open.h>
#include <iostuff.h>
#include <mymalloc.h>
+#include <warn_stat.h>
/* Global library. */
#include <dict.h>
#include <dict_db.h>
#include <myflock.h>
+#include <warn_stat.h>
/* Global library. */
./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
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
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
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include <warn_stat.h>
/* Utility library. */
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
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
#include <mymalloc.h>
#include <stringops.h>
#include <set_eugid.h>
+#include <warn_stat.h>
/* Global library. */
#include <set_eugid.h>
#include <get_hostname.h>
#include <sane_fsops.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <msg.h>
#include <iostuff.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <events.h>
#include <mymalloc.h>
#include <vstream.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <split_at.h>
#include <vstring_vstream.h>
#include <set_eugid.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <msg_vstream.h>
#include <vstring_vstream.h>
#include <stringops.h>
+#include <warn_stat.h>
/* Global library. */
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:
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
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
/* .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. */
#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)
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;
* 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]) {
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);
--- /dev/null
+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
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
#include <signal.h>
#include <syslog.h>
#include <errno.h>
+#include <warn_stat.h>
/* Utility library. */
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
#include <clean_env.h>
#include <argv.h>
#include <safe.h>
+#include <warn_stat.h>
/* Global library. */
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
/* 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
#include <msg_vstream.h>
#include <safe.h>
#include <events.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <vstream.h>
#include <msg_vstream.h>
#include <iostuff.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <msg_output.h>
#include <msg_vstream.h>
#include <msg_syslog.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <split_at.h>
#include <vstring_vstream.h>
#include <set_eugid.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <htable.h>
#include <name_code.h>
#include <ring.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <safe.h>
#include <connect.h>
#include <valid_hostname.h>
+#include <warn_stat.h>
/* Global library. */
}
/*
- * 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);
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,
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
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, '?');
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
#include <vstring_vstream.h>
#include <sane_fsops.h>
#include <myrand.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <events.h>
#include <mymalloc.h>
#include <vstream.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <connect.h>
#include <split_at.h>
#include <name_code.h>
+#include <warn_stat.h>
/* Global library. */
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
#include <attr.h>
#include <set_eugid.h>
#include <htable.h>
+#include <warn_stat.h>
/* Global library. */
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 \
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 \
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
/* 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
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);
+}
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 *);
#include "name_mask.h"
#include "dict.h"
#include "dict_ht.h"
+#include "warn_stat.h"
static HTABLE *dict_table;
#include "stringops.h"
#include "dict.h"
#include "dict_cdb.h"
+#include "warn_stat.h"
#ifdef HAS_CDB
#include <myaddrinfo.h>
#include <cidr_match.h>
#include <dict_cidr.h>
+#include <warn_stat.h>
/* Application-specific. */
#include "myflock.h"
#include "dict.h"
#include "dict_db.h"
+#include "warn_stat.h"
/* Application-specific. */
#include "stringops.h"
#include "dict.h"
#include "dict_dbm.h"
+#include "warn_stat.h"
/* Application-specific. */
#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.
#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.
#include <stringops.h>
#include <dict.h>
#include <dict_sdbm.h>
+#include <warn_stat.h>
#ifdef HAS_SDBM
#include <readlline.h>
#include <dict.h>
#include <dict_thash.h>
+#include <warn_stat.h>
/* Application-specific. */
#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
#include "msg.h"
#include "iostuff.h"
#include "listen.h"
+#include "warn_stat.h"
#define BUF_LEN 100
#include <vstream.h>
#include <iostuff.h>
#include <load_file.h>
+#include <warn_stat.h>
/* load_file - load file with some prejudice */
#include "msg.h"
#include "set_eugid.h"
#include "lstat_as.h"
+#include "warn_stat.h"
/* lstat_as - lstat file as user */
#include "mymalloc.h"
#include "stringops.h"
#include "make_dirs.h"
+#include "warn_stat.h"
/* make_dirs - create directory hierarchy */
./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
#include <vstring.h>
#include <stringops.h>
#include <safe_open.h>
+#include <warn_stat.h>
/* safe_open_exist - open existing file */
#include "msg.h"
#include "sane_fsops.h"
+#include "warn_stat.h"
/* sane_link - sanitize link() error returns */
#include "msg.h"
#include "sane_fsops.h"
+#include "warn_stat.h"
/* sane_rename - sanitize rename() error returns */
#include "msg.h"
#include "set_eugid.h"
#include "stat_as.h"
+#include "warn_stat.h"
/* stat_as - stat file as user */
--- /dev/null
+/*++
+/* 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);
+}
--- /dev/null
+#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
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
#include <set_eugid.h>
#include <get_hostname.h>
#include <sane_fsops.h>
+#include <warn_stat.h>
/* Global library. */