From fdb6c3fdb70f0f13d53600ae7801090ab433e1a7 Mon Sep 17 00:00:00 2001
From: Natanael Copa <ncopa@alpinelinux.org>
Date: Mon, 1 Jun 2009 13:35:52 +0000
Subject: [PATCH] testing/postfix: test a 2.6.1 release with cyrus-sasl support

Needed to fix the dynamic maps patch
---
 testing/postfix/APKBUILD                      |  145 +
 testing/postfix/dynamicmaps.cf                |   15 +
 .../postfix/postfix-2.6.1-dynamicmaps.patch   | 5273 +++++++++++++++++
 testing/postfix/postfix-ldap.post-install     |   19 +
 testing/postfix/postfix-mysql.post-install    |   19 +
 testing/postfix/postfix-pcre.post-install     |   19 +
 testing/postfix/postfix-pgsql.post-install    |   19 +
 testing/postfix/postfix.initd                 |   48 +
 testing/postfix/postfix.post-install          |    6 +
 testing/postfix/postfix.pre-install           |    7 +
 10 files changed, 5570 insertions(+)
 create mode 100644 testing/postfix/APKBUILD
 create mode 100644 testing/postfix/dynamicmaps.cf
 create mode 100644 testing/postfix/postfix-2.6.1-dynamicmaps.patch
 create mode 100644 testing/postfix/postfix-ldap.post-install
 create mode 100644 testing/postfix/postfix-mysql.post-install
 create mode 100644 testing/postfix/postfix-pcre.post-install
 create mode 100644 testing/postfix/postfix-pgsql.post-install
 create mode 100644 testing/postfix/postfix.initd
 create mode 100644 testing/postfix/postfix.post-install
 create mode 100644 testing/postfix/postfix.pre-install

diff --git a/testing/postfix/APKBUILD b/testing/postfix/APKBUILD
new file mode 100644
index 000000000000..a0a83f46f778
--- /dev/null
+++ b/testing/postfix/APKBUILD
@@ -0,0 +1,145 @@
+# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
+pkgname=postfix
+pkgver=2.6.1
+pkgrel=0
+pkgdesc="Secure and fast drop-in replacement for Sendmail (MTA)"
+url="http://www.postfix.org/"
+license="IPL-1"
+depends="db pcre openssl libsasl"
+makedepends="db-dev pcre-dev openssl-dev postgresql-dev mysql-dev openldap-dev cyrus-sasl-dev"
+install="$pkgname.pre-install $pkgname.post-install"
+subpackages="$pkgname-doc $pkgname-ldap $pkgname-mysql $pkgname-pcre
+	$pkgname-pgsql"
+source="ftp://ftp.porcupine.org/mirrors/$pkgname-release/official/$pkgname-$pkgver.tar.gz
+	$pkgname.initd
+	$install
+	postfix-2.6.1-dynamicmaps.patch
+	dynamicmaps.cf
+	postfix-ldap.post-install
+	postfix-mysql.post-install
+	postfix-pcre.post-install
+	postfix-pgsql.post-install
+	"
+
+# the dynamic maps patch is taken from mandriva
+# http://svn.mandriva.com/cgi-bin/viewvc.cgi/packages/cooker/postfix/current/SOURCES
+
+build () { 
+	cd "$srcdir/$pkgname-$pkgver"
+	for i in ../*.patch; do
+		msg "Applying $i..."
+		patch -p1 < $i || return 1
+	done
+	cp ../dynamicmaps.cf conf/
+
+	sed -i -e "s|#define HAS_NIS|//#define HAS_NIS|g" \
+		-e "/^#define ALIAS_DB_MAP/s|:/etc/aliases|:/etc/postfix/aliases|" \
+		src/util/sys_defs.h || return 1
+	sed -i -e "s:/usr/local/:/usr/:g" conf/master.cf || return 1
+
+	# needed for dynamic maps.
+	local ccargs="-DHAS_DLOPEN -DHAS_SHL_LOAD"
+	local auxlibs="$LDFLAGS -lpthread -lcrypt"
+
+	ccargs="$ccargs -DDEF_DAEMON_DIR=\\\"/usr/lib/postfix\\\""
+
+	# pcre
+	ccargs="$ccargs -DHAS_PCRE"
+	#auxlibs="$auxlibs -lpcre"
+
+	# ssl
+	ccargs="$ccargs -DUSE_TLS"
+	auxlibs="$auxlibs -lssl -lcrypto" 
+
+	## dovecot-sasl
+	#ccargs="$ccargs -DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\\\"dovecot\\\""
+
+	# cyrus sasl
+	ccargs="$ccargs	-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl"
+	auxlibs="$auxlibs -lsasl2"
+
+	# postgresql
+	ccargs="$ccargs -DHAS_PGSQL -I$(pg_config --includedir)"
+	#auxlibs="$auxlibs -lpq -L$(pg_config --libdir)"
+
+	# mysql
+	ccargs="$ccargs -DHAS_MYSQL $(mysql_config --include)"
+	#auxlibs="$auxlibs -lmysqlclient -lm -lz"
+
+	# compile
+	make DEBUG="" \
+		OPT="$CFLAGS" \
+		CCARGS="$ccargs" \
+		AUXLIBS="$auxlibs" \
+		makefiles || return 1
+	
+	make OPT="$CFLAGS" || return 1
+
+	for i in lib/*.a; do
+		j=${i#lib/lib}
+		ln -s ${i#lib/} lib/libpostfix-${j%.a}.so.1
+	done
+
+	# install to pkgdir
+	LD_LIBRARY_PATH=$PWD/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} make \
+		non-interactive-package \
+		install_root="$pkgdir" \
+		config_directory=/usr/share/doc/$pkgname/defaults \
+		readme_directory=/usr/share/doc/$pkgname/readme \
+		manpage_directory=/usr/share/man \
+		|| return 1
+
+	install -d "$pkgdir"/usr/lib
+	for i in lib/*.a; do
+		j=${i#lib/lib}
+		install $i "$pkgdir"/usr/lib/libpostfix-${j%.a}.so.1 || return 1
+	done
+
+	# fix permissions
+	for i in postdrop postqueue; do
+		chgrp postdrop "$pkgdir"/usr/sbin/$i
+		chmod g+s "$pkgdir"/usr/sbin/$i
+	done
+
+	mkdir -p "$pkgdir"/etc/postfix
+	mv "$pkgdir"/usr/share/doc/$pkgname/defaults/*.cf \
+		"$pkgdir"/usr/share/doc/$pkgname/defaults/aliases \
+		"$pkgdir"/usr/share/doc/$pkgname/defaults/canonical \
+		"$pkgdir"/usr/share/doc/$pkgname/defaults/generic \
+		"$pkgdir"/usr/share/doc/$pkgname/defaults/header_checks \
+		"$pkgdir"/usr/share/doc/$pkgname/defaults/relocated \
+		"$pkgdir"/usr/share/doc/$pkgname/defaults/transport \
+		"$pkgdir"/usr/share/doc/$pkgname/defaults/virtual \
+		"$pkgdir"/etc/postfix/ || return 1
+
+	install -d -o postfix -g postfix "$pkgdir"/var/spool/postfix
+	install -Dm755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname
+	install -Dm644 LICENSE "$pkgdir"/usr/share/licenses/${pkgname}/LICENSE
+}
+
+_mv_dict() {
+	local m=$1
+	shift
+	pkgdesc="$m map support for postfix"
+	depends="postfix uclibc $@"
+	install="postfix-${m}.post-install"
+	mkdir -p "$subpkgdir"/usr/lib/postfix
+	mv "$pkgdir"/usr/lib/postfix/dict_${m}.so \
+		"$subpkgdir"/usr/lib/postfix/
+}
+
+ldap()  { _mv_dict ldap  libldap; }
+mysql() { _mv_dict mysql libmysqlclient;}
+pcre()  { _mv_dict pcre  pcre; }
+pgsql() { _mv_dict pgsql libpq; }
+
+md5sums="737bbc245da9c72c174893397f70ae86  postfix-2.6.1.tar.gz
+8416354d402f3be288fa98b60af86240  postfix.initd
+2bfc3864183694e5484ac073bb0cb7ef  postfix.pre-install
+0064d45c2c8a46c374b55c4abc46cfb2  postfix.post-install
+b8812dbf2d076c79cf948ee017e81b39  postfix-2.6.1-dynamicmaps.patch
+0efff9b4bb493ad2ff0b9915cb244d14  dynamicmaps.cf
+2ebe51a882eb9d6d7866583eb6af3969  postfix-ldap.post-install
+2ebe51a882eb9d6d7866583eb6af3969  postfix-mysql.post-install
+2ebe51a882eb9d6d7866583eb6af3969  postfix-pcre.post-install
+2ebe51a882eb9d6d7866583eb6af3969  postfix-pgsql.post-install"
diff --git a/testing/postfix/dynamicmaps.cf b/testing/postfix/dynamicmaps.cf
new file mode 100644
index 000000000000..49d25480c0e9
--- /dev/null
+++ b/testing/postfix/dynamicmaps.cf
@@ -0,0 +1,15 @@
+# Postfix dynamic maps configuration file.
+#
+# The first match found is the one that is used.  Wildcards are not
+# supported.
+#
+#type	location of .so file         	name of open function
+#====	=============================	=====================
+#ldap	/usr/lib/postfix/dict_ldap.so	dict_ldap_open 
+#mysql	/usr/lib/postfix/dict_mysql.so	dict_mysql_open
+#pcre	/usr/lib/postfix/dict_pcre.so	dict_pcre_open
+#pgsq	/usr/lib/postfix/dict_pgsql.so	dict_pgsql_open
+
+# apk tools will manage the lines below
+## AUTO BEGIN ##
+## AUTO END ##
diff --git a/testing/postfix/postfix-2.6.1-dynamicmaps.patch b/testing/postfix/postfix-2.6.1-dynamicmaps.patch
new file mode 100644
index 000000000000..6000caaf082e
--- /dev/null
+++ b/testing/postfix/postfix-2.6.1-dynamicmaps.patch
@@ -0,0 +1,5273 @@
+diff -ruN a/conf/postfix-files b/conf/postfix-files
+--- a/conf/postfix-files	2009-06-01 12:27:42.000000000 +0000
++++ b/conf/postfix-files	2009-06-01 13:08:26.000000000 +0000
+@@ -65,6 +65,10 @@
+ $queue_directory/trace:d:$mail_owner:-:700:ucr
+ $daemon_directory/anvil:f:root:-:755
+ $daemon_directory/bounce:f:root:-:755
++$daemon_directory/dict_ldap.so:f:root:-:755
++$daemon_directory/dict_pcre.so:f:root:-:755
++$daemon_directory/dict_mysql.so:f:root:-:755
++$daemon_directory/dict_pgsql.so:f:root:-:755
+ $daemon_directory/cleanup:f:root:-:755
+ $daemon_directory/discard:f:root:-:755
+ $daemon_directory/error:f:root:-:755
+@@ -94,6 +98,11 @@
+ $daemon_directory/trivial-rewrite:f:root:-:755
+ $daemon_directory/verify:f:root:-:755
+ $daemon_directory/virtual:f:root:-:755
++/usr/lib/libpostfix-dns.so.1:f:root:-:755
++/usr/lib/libpostfix-global.so.1:f:root:-:755
++/usr/lib/libpostfix-tls.so.1:f:root:-:755
++/usr/lib/libpostfix-master.so.1:f:root:-:755
++/usr/lib/libpostfix-util.so.1:f:root:-:755
+ $daemon_directory/nqmgr:h:$daemon_directory/qmgr
+ $daemon_directory/lmtp:h:$daemon_directory/smtp
+ $command_directory/postalias:f:root:-:755
+@@ -117,6 +126,7 @@
+ $config_directory/aliases:f:root:-:644:p1
+ $config_directory/bounce.cf.default:f:root:-:644:1
+ $config_directory/canonical:f:root:-:644:p1
++$config_directory/dynamicmaps.cf:f:root:-:644:p
+ $config_directory/cidr_table:f:root:-:644:o
+ $config_directory/generic:f:root:-:644:p1
+ $config_directory/generics:f:root:-:644:o
+diff -ruN a/src/dns/Makefile.in b/src/dns/Makefile.in
+--- a/src/dns/Makefile.in	2009-06-01 12:27:43.000000000 +0000
++++ b/src/dns/Makefile.in	2009-06-01 13:08:26.000000000 +0000
+@@ -14,7 +14,7 @@
+ LIB_DIR	= ../../lib
+ INC_DIR	= ../../include
+ 
+-.c.o:;	$(CC) $(CFLAGS) -c $*.c
++.c.o:;	$(CC) -fPIC $(CFLAGS) -c $*.c
+ 
+ all: $(LIB)
+ 
+@@ -31,12 +31,10 @@
+ root_tests:
+ 
+ $(LIB):	$(OBJS)
+-	$(AR) $(ARFL) $(LIB) $?
+-	$(RANLIB) $(LIB)
++	gcc -shared -Wl,-soname,libpostfix-dns.so.1 -o $(LIB) $(OBJS) $(LIBS) $(SYSLIBS)
+ 
+ $(LIB_DIR)/$(LIB): $(LIB)
+ 	cp $(LIB) $(LIB_DIR)
+-	$(RANLIB) $(LIB_DIR)/$(LIB)
+ 
+ update: $(LIB_DIR)/$(LIB) $(HDRS)
+ 	-for i in $(HDRS); \
+diff -ruN a/src/global/Makefile.in b/src/global/Makefile.in
+--- a/src/global/Makefile.in	2009-06-01 12:27:43.000000000 +0000
++++ b/src/global/Makefile.in	2009-06-01 13:08:26.000000000 +0000
+@@ -34,7 +34,7 @@
+ 	canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
+ 	clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \
+ 	defer.o deliver_completed.o deliver_flock.o deliver_pass.o \
+-	deliver_request.o dict_ldap.o dict_mysql.o dict_pgsql.o \
++	deliver_request.o \
+ 	dict_proxy.o domain_list.o dot_lockfile.o dot_lockfile_as.o \
+ 	dsb_scan.o dsn.o dsn_buf.o dsn_mask.o dsn_print.o dsn_util.o \
+ 	ehlo_mask.o ext_prop.o file_id.o flush_clnt.o header_opts.o \
+@@ -103,10 +103,13 @@
+ LIB_DIR	= ../../lib
+ INC_DIR	= ../../include
+ MAKES	=
++LDAPSO  = dict_ldap.so
++MYSQLSO = dict_mysql.so
++PGSQLSO = dict_pgsql.so
+ 
+-.c.o:;	$(CC) $(CFLAGS) -c $*.c
++.c.o:;	$(CC) -fPIC $(CFLAGS) -c $*.c
+ 
+-all: $(LIB)
++all: $(LIB) $(LDAPSO) $(MYSQLSO) $(PGSQLSO) 
+ 
+ $(OBJS): ../../conf/makedefs.out
+ 
+@@ -116,14 +119,30 @@
+ test:	$(TESTPROG)
+ 
+ $(LIB):	$(OBJS)
+-	$(AR) $(ARFL) $(LIB) $?
+-	$(RANLIB) $(LIB)
++	gcc -shared -Wl,-soname,libpostfix-global.so.1 -o $(LIB) $(OBJS) $(LIBS) $(SYSLIBS)
++
++$(LDAPSO): dict_ldap.o $(LIB)
++	gcc -shared -Wl,-soname,dict_ldap.so -o $@ $? -lldap -llber -L../../lib -lutil -L. -lglobal
++
++$(MYSQLSO): dict_mysql.o $(LIB)
++	gcc -shared -Wl,-soname,dict_mysql.so -o $@ $? -lmysqlclient -L. -lutil -lglobal
++
++$(PGSQLSO): dict_pgsql.o $(LIB)
++	gcc -shared -Wl,-soname,dict_pgsql.so -o $@ $? -lpq -L. -lutil -lglobal
+ 
+ $(LIB_DIR)/$(LIB): $(LIB)
+ 	cp $(LIB) $(LIB_DIR)
+-	$(RANLIB) $(LIB_DIR)/$(LIB)
+ 
+-update: $(LIB_DIR)/$(LIB) $(HDRS)
++../../libexec/$(LDAPSO): $(LDAPSO)
++	cp $(LDAPSO) ../../libexec
++
++../../libexec/$(MYSQLSO): $(MYSQLSO)
++	cp $(MYSQLSO) ../../libexec
++
++../../libexec/$(PGSQLSO): $(PGSQLSO)
++	cp $(PGSQLSO) ../../libexec
++
++update: $(LIB_DIR)/$(LIB) ../../libexec/$(LDAPSO) ../../libexec/$(MYSQLSO) ../../libexec/$(PGSQLSO) $(HDRS)
+ 	-for i in $(HDRS); \
+ 	do \
+ 	  cmp -s $$i $(INC_DIR)/$$i 2>/dev/null || cp $$i $(INC_DIR); \
+@@ -491,7 +510,7 @@
+ 	lint $(DEFS) $(SRCS) $(LINTFIX)
+ 
+ clean:
+-	rm -f *.o $(LIB) *core $(TESTPROG) junk
++	rm -f *.o $(LIB) $(LDAPSO) $(MYSQLSO) $(PGSQLSO) *core $(TESTPROG) junk
+ 	rm -rf printfck
+ 
+ tidy:	clean
+diff -ruN a/src/global/Makefile.in.orig b/src/global/Makefile.in.orig
+--- a/src/global/Makefile.in.orig	1970-01-01 00:00:00.000000000 +0000
++++ b/src/global/Makefile.in.orig	2009-06-01 13:07:56.000000000 +0000
+@@ -0,0 +1,2018 @@
++SHELL	= /bin/sh
++SRCS	= abounce.c anvil_clnt.c been_here.c bounce.c bounce_log.c \
++	canon_addr.c cfg_parser.c cleanup_strerror.c cleanup_strflags.c \
++	clnt_stream.c conv_time.c db_common.c debug_peer.c debug_process.c \
++	defer.c deliver_completed.c deliver_flock.c deliver_pass.c \
++	deliver_request.c dict_ldap.c dict_mysql.c dict_pgsql.c \
++	dict_proxy.c domain_list.c dot_lockfile.c dot_lockfile_as.c \
++	dsb_scan.c dsn.c dsn_buf.c dsn_mask.c dsn_print.c dsn_util.c \
++	ehlo_mask.c ext_prop.c file_id.c flush_clnt.c header_opts.c \
++	header_token.c input_transp.c int_filt.c is_header.c log_adhoc.c \
++	mail_addr.c mail_addr_crunch.c mail_addr_find.c mail_addr_map.c \
++	mail_command_client.c mail_command_server.c mail_conf.c \
++	mail_conf_bool.c mail_conf_int.c mail_conf_long.c mail_conf_raw.c \
++	mail_conf_str.c mail_conf_time.c mail_connect.c mail_copy.c \
++	mail_date.c mail_dict.c mail_error.c mail_flush.c mail_open_ok.c \
++	mail_params.c mail_pathname.c mail_queue.c mail_run.c \
++	mail_scan_dir.c mail_stream.c mail_task.c mail_trigger.c maps.c \
++	mark_corrupt.c match_parent_style.c mbox_conf.c mbox_open.c \
++	mime_state.c mkmap_cdb.c mkmap_db.c mkmap_dbm.c mkmap_open.c \
++	mkmap_sdbm.c msg_stats_print.c msg_stats_scan.c mynetworks.c \
++	mypwd.c namadr_list.c off_cvt.c opened.c own_inet_addr.c \
++	pipe_command.c post_mail.c quote_821_local.c quote_822_local.c \
++	rcpt_buf.c rcpt_print.c rec_attr_map.c rec_streamlf.c rec_type.c \
++	recipient_list.c record.c remove.c resolve_clnt.c resolve_local.c \
++	rewrite_clnt.c scache_clnt.c scache_multi.c scache_single.c \
++	sent.c smtp_stream.c split_addr.c string_list.c strip_addr.c \
++	sys_exits.c timed_ipc.c tok822_find.c tok822_node.c tok822_parse.c \
++	tok822_resolve.c tok822_rewrite.c tok822_tree.c trace.c \
++	user_acl.c valid_mailhost_addr.c verify.c verify_clnt.c \
++	verp_sender.c wildcard_inet_addr.c xtext.c delivered_hdr.c \
++	fold_addr.c header_body_checks.c mkmap_proxy.c data_redirect.c \
++	match_service.c mail_conf_nint.c
++OBJS	= abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
++	canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
++	clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \
++	defer.o deliver_completed.o deliver_flock.o deliver_pass.o \
++	deliver_request.o dict_ldap.o dict_mysql.o dict_pgsql.o \
++	dict_proxy.o domain_list.o dot_lockfile.o dot_lockfile_as.o \
++	dsb_scan.o dsn.o dsn_buf.o dsn_mask.o dsn_print.o dsn_util.o \
++	ehlo_mask.o ext_prop.o file_id.o flush_clnt.o header_opts.o \
++	header_token.o input_transp.o int_filt.o is_header.o log_adhoc.o \
++	mail_addr.o mail_addr_crunch.o mail_addr_find.o mail_addr_map.o \
++	mail_command_client.o mail_command_server.o mail_conf.o \
++	mail_conf_bool.o mail_conf_int.o mail_conf_long.o mail_conf_raw.o \
++	mail_conf_str.o mail_conf_time.o mail_connect.o mail_copy.o \
++	mail_date.o mail_dict.o mail_error.o mail_flush.o mail_open_ok.o \
++	mail_params.o mail_pathname.o mail_queue.o mail_run.o \
++	mail_scan_dir.o mail_stream.o mail_task.o mail_trigger.o maps.o \
++	mark_corrupt.o match_parent_style.o mbox_conf.o mbox_open.o \
++	mime_state.o mkmap_cdb.o mkmap_db.o mkmap_dbm.o mkmap_open.o \
++	mkmap_sdbm.o msg_stats_print.o msg_stats_scan.o mynetworks.o \
++	mypwd.o namadr_list.o off_cvt.o opened.o own_inet_addr.o \
++	pipe_command.o post_mail.o quote_821_local.o quote_822_local.o \
++	rcpt_buf.o rcpt_print.o rec_attr_map.o rec_streamlf.o rec_type.o \
++	recipient_list.o record.o remove.o resolve_clnt.o resolve_local.o \
++	rewrite_clnt.o scache_clnt.o scache_multi.o scache_single.o \
++	sent.o smtp_stream.o split_addr.o string_list.o strip_addr.o \
++	sys_exits.o timed_ipc.o tok822_find.o tok822_node.o tok822_parse.o \
++	tok822_resolve.o tok822_rewrite.o tok822_tree.o trace.o \
++	user_acl.o valid_mailhost_addr.o verify.o verify_clnt.o \
++	verp_sender.o wildcard_inet_addr.o xtext.o delivered_hdr.o \
++	fold_addr.o header_body_checks.o mkmap_proxy.o data_redirect.o \
++	match_service.o mail_conf_nint.o
++HDRS	= abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
++	canon_addr.h cfg_parser.h cleanup_user.h clnt_stream.h config.h \
++	conv_time.h db_common.h debug_peer.h debug_process.h defer.h \
++	deliver_completed.h deliver_flock.h deliver_pass.h deliver_request.h \
++	dict_ldap.h dict_mysql.h dict_pgsql.h dict_proxy.h domain_list.h \
++	dot_lockfile.h dot_lockfile_as.h dsb_scan.h dsn.h dsn_buf.h \
++	dsn_mask.h dsn_print.h dsn_util.h ehlo_mask.h ext_prop.h \
++	file_id.h flush_clnt.h header_opts.h header_token.h input_transp.h \
++	int_filt.h is_header.h lex_822.h log_adhoc.h mail_addr.h \
++	mail_addr_crunch.h mail_addr_find.h mail_addr_map.h mail_conf.h \
++	mail_copy.h mail_date.h mail_dict.h mail_error.h mail_flush.h \
++	mail_open_ok.h mail_params.h mail_proto.h mail_queue.h mail_run.h \
++	mail_scan_dir.h mail_stream.h mail_task.h mail_version.h maps.h \
++	mark_corrupt.h match_parent_style.h mbox_conf.h mbox_open.h \
++	mime_state.h mkmap.h msg_stats.h mynetworks.h mypwd.h namadr_list.h \
++	off_cvt.h opened.h own_inet_addr.h pipe_command.h post_mail.h \
++	qmgr_user.h qmqp_proto.h quote_821_local.h quote_822_local.h \
++	quote_flags.h rcpt_buf.h rcpt_print.h rec_attr_map.h rec_streamlf.h \
++	rec_type.h recipient_list.h record.h resolve_clnt.h resolve_local.h \
++	rewrite_clnt.h scache.h sent.h smtp_stream.h split_addr.h \
++	string_list.h strip_addr.h sys_exits.h timed_ipc.h tok822.h \
++	trace.h user_acl.h valid_mailhost_addr.h verify.h verify_clnt.h \
++	verp_sender.h wildcard_inet_addr.h xtext.h delivered_hdr.h \
++	fold_addr.h header_body_checks.h data_redirect.h match_service.h
++TESTSRC	= rec2stream.c stream2rec.c recdump.c
++DEFS	= -I. -I$(INC_DIR) -D$(SYSTYPE)
++CFLAGS	= $(DEBUG) $(OPT) $(DEFS)
++INCL	=
++LIB	= libglobal.a
++TESTPROG= domain_list dot_lockfile mail_addr_crunch mail_addr_find \
++	mail_addr_map mail_date maps mynetworks mypwd namadr_list \
++	off_cvt quote_822_local rec2stream recdump resolve_clnt \
++	resolve_local rewrite_clnt stream2rec string_list tok822_parse \
++	quote_821_local mail_conf_time mime_state strip_addr \
++	verify_clnt xtext anvil_clnt scache ehlo_mask \
++	valid_mailhost_addr own_inet_addr header_body_checks \
++	data_redirect
++
++LIBS	= ../../lib/libutil.a
++LIB_DIR	= ../../lib
++INC_DIR	= ../../include
++MAKES	=
++
++.c.o:;	$(CC) $(CFLAGS) -c $*.c
++
++all: $(LIB)
++
++$(OBJS): ../../conf/makedefs.out
++
++Makefile: Makefile.in
++	cat ../../conf/makedefs.out $? >$@
++
++test:	$(TESTPROG)
++
++$(LIB):	$(OBJS)
++	$(AR) $(ARFL) $(LIB) $?
++	$(RANLIB) $(LIB)
++
++$(LIB_DIR)/$(LIB): $(LIB)
++	cp $(LIB) $(LIB_DIR)
++	$(RANLIB) $(LIB_DIR)/$(LIB)
++
++update: $(LIB_DIR)/$(LIB) $(HDRS)
++	-for i in $(HDRS); \
++	do \
++	  cmp -s $$i $(INC_DIR)/$$i 2>/dev/null || cp $$i $(INC_DIR); \
++	done
++	cd $(INC_DIR); chmod 644 $(HDRS)
++
++dot_lockfile: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) -DTEST $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++tok822_parse: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) -DTEST $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++rec2stream: rec2stream.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++stream2rec: stream2rec.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++recdump: recdump.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++namadr_list: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++domain_list: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++mynetworks: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++resolve_clnt: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++rewrite_clnt: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++quote_822_local: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++off_cvt: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++mail_addr_map: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++mail_addr_find: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++maps: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++mypwd: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++mail_date: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++resolve_local: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++mail_addr_crunch: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++string_list: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++local_transport: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++quote_821_local: quote_821_local.c $(LIBS)
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIBS) $(SYSLIBS)
++
++mail_conf_time: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) -DTEST $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++mime_state: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) -DTEST $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++strip_addr: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) -DTEST $(CFLAGS) -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++verify_clnt: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++xtext: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++anvil_clnt: $(LIB) $(LIBS)
++	mv $@.o junk
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++	mv junk $@.o
++
++scache: scache.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++ehlo_mask: ehlo_mask.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++valid_mailhost_addr: valid_mailhost_addr.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++own_inet_addr: own_inet_addr.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++header_body_checks: header_body_checks.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++data_redirect: data_redirect.c $(LIB) $(LIBS)
++	$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
++
++tests: tok822_test mime_tests strip_addr_test tok822_limit_test \
++	xtext_test scache_multi_test ehlo_mask_test \
++	namadr_list_test mail_conf_time_test header_body_checks_tests
++
++mime_tests: mime_test mime_nest mime_8bit mime_dom mime_trunc mime_cvt \
++	mime_cvt2 mime_cvt3 mime_garb1 mime_garb2 mime_garb3 mime_garb4
++
++header_body_checks_tests: header_body_checks_null_test \
++	header_body_checks_warn_test header_body_checks_prepend_test \
++	header_body_checks_ignore_test header_body_checks_replace_test
++
++root_tests: rewrite_clnt_test resolve_clnt_test
++
++tok822_test: tok822_parse tok822_parse.in tok822_parse.ref
++	./tok822_parse <tok822_parse.in >tok822_parse.tmp 2>&1
++	diff tok822_parse.ref tok822_parse.tmp
++	rm -f tok822_parse.tmp
++
++mime_test: mime_state mime_test.in mime_test.ref
++	./mime_state <mime_test.in >mime_test.tmp
++	diff  mime_test.ref mime_test.tmp
++	rm -f mime_test.tmp
++
++mime_nest: mime_state mime_nest.in mime_nest.ref
++	./mime_state <mime_nest.in >mime_nest.tmp
++	diff  mime_nest.ref mime_nest.tmp
++	rm -f mime_nest.tmp
++
++mime_8bit: mime_state mime_8bit.in mime_8bit.ref
++	./mime_state <mime_8bit.in >mime_8bit.tmp
++	diff  mime_8bit.ref mime_8bit.tmp
++	rm -f mime_8bit.tmp
++
++mime_dom: mime_state mime_dom.in mime_dom.ref
++	./mime_state <mime_dom.in >mime_dom.tmp
++	diff  mime_dom.ref mime_dom.tmp
++	rm -f mime_dom.tmp
++
++mime_trunc: mime_state mime_trunc.in mime_trunc.ref
++	./mime_state <mime_trunc.in >mime_trunc.tmp
++	diff  mime_trunc.ref mime_trunc.tmp
++	rm -f mime_trunc.tmp
++
++mime_cvt: mime_state mime_cvt.in mime_cvt.ref
++	./mime_state <mime_cvt.in >mime_cvt.tmp
++	diff  mime_cvt.ref mime_cvt.tmp
++	rm -f mime_cvt.tmp
++
++mime_cvt2: mime_state mime_cvt.in2 mime_cvt.ref2
++	./mime_state <mime_cvt.in2 >mime_cvt.tmp
++	diff  mime_cvt.ref2 mime_cvt.tmp
++	rm -f mime_cvt.tmp
++
++mime_cvt3: mime_state mime_cvt.in3 mime_cvt.ref3
++	./mime_state <mime_cvt.in3 >mime_cvt.tmp
++	diff  mime_cvt.ref3 mime_cvt.tmp
++	rm -f mime_cvt.tmp
++
++mime_garb1: mime_state mime_garb1.in mime_garb1.ref
++	./mime_state <mime_garb1.in >mime_cvt.tmp
++	diff  mime_garb1.ref mime_cvt.tmp
++	rm -f mime_cvt.tmp
++
++mime_garb2: mime_state mime_garb2.in mime_garb2.ref
++	./mime_state <mime_garb2.in >mime_cvt.tmp
++	diff  mime_garb2.ref mime_cvt.tmp
++	rm -f mime_cvt.tmp
++
++mime_garb3: mime_state mime_garb3.in mime_garb3.ref
++	./mime_state <mime_garb3.in >mime_cvt.tmp
++	diff  mime_garb3.ref mime_cvt.tmp
++	rm -f mime_cvt.tmp
++
++mime_garb4: mime_state mime_garb4.in mime_garb4.ref
++	./mime_state <mime_garb4.in >mime_cvt.tmp
++	diff  mime_garb4.ref mime_cvt.tmp
++	rm -f mime_cvt.tmp
++
++tok822_limit_test: tok822_parse tok822_limit.in tok822_limit.ref
++	./tok822_parse <tok822_limit.in >tok822_limit.tmp
++	diff tok822_limit.ref tok822_limit.tmp
++	rm -f tok822_limit.tmp
++
++strip_addr_test: strip_addr strip_addr.ref
++	./strip_addr 2>strip_addr.tmp
++	diff strip_addr.ref strip_addr.tmp
++	rm -f strip_addr.tmp
++
++xtext_test: xtext
++	./xtext <xtext.c | od -cb >xtext.tmp
++	od -cb <xtext.c >xtext.ref
++	cmp xtext.ref xtext.tmp
++	rm -f xtext.ref xtext.tmp
++
++# Requires: Postfix running, root privileges
++
++rewrite_clnt_test: rewrite_clnt rewrite_clnt.in rewrite_clnt.ref
++	@set -- `id`; case "$$1" in \
++	    *"(root)") ;; \
++	    *) echo 'This test requires root privilege'; exit 1;; \
++	esac
++	@test -n "`postconf -h remote_header_rewrite_domain`" || { \
++	    echo 'This test requires non-empty remote_header_rewrite_domain'; exit 1; }
++	./rewrite_clnt <rewrite_clnt.in >rewrite_clnt.tmp
++	sed -e "s/MYDOMAIN/`postconf -h mydomain`/" \
++	    -e "s/INVALID_DOMAIN/`postconf -h remote_header_rewrite_domain`/" \
++		rewrite_clnt.ref | diff - rewrite_clnt.tmp
++	rm -f rewrite_clnt.tmp
++
++# Requires: Postfix, root, relayhost=$mydomain, no transport map
++
++resolve_clnt_test: resolve_clnt resolve_clnt.in resolve_clnt.ref
++	@set -- `id`; case "$$1" in \
++	    *"(root)") ;; \
++	    *) echo 'This test requires root privilege'; exit 1;; \
++	esac
++	@test "`postconf -h relayhost`" = '$$mydomain' || { \
++	    echo 'This test requires relayhost=$$mydomain'; exit 1; }
++	@test "`postconf -h transport_maps`" = "" || { \
++	    echo 'This test requires no transport map'; exit 1; }
++	sed -e "s/MYDOMAIN/`postconf -h mydomain`/g" \
++	    -e "s/MYHOSTNAME/`postconf -h myhostname`/g" \
++	    resolve_clnt.in | ./resolve_clnt >resolve_clnt.tmp
++	sed -e "s/MYDOMAIN/`postconf -h mydomain`/g" \
++	    -e "s/MYHOSTNAME/`postconf -h myhostname`/g" \
++	    -e "s/RELAYHOST/`postconf -h mydomain`/g" \
++	    resolve_clnt.ref | diff - resolve_clnt.tmp
++	rm -f resolve_clnt.tmp
++
++scache_multi_test: scache scache_multi.in scache_multi.ref
++	./scache <scache_multi.in >scache_multi.tmp
++	diff scache_multi.ref scache_multi.tmp
++	rm -f scache_multi.tmp
++
++ehlo_mask_test: ehlo_mask ehlo_mask.in ehlo_mask.ref
++	./ehlo_mask <ehlo_mask.in >ehlo_mask.tmp
++	diff ehlo_mask.ref ehlo_mask.tmp
++	rm -f ehlo_mask.tmp
++
++namadr_list_test: namadr_list namadr_list.in namadr_list.ref
++	-sh namadr_list.in >namadr_list.tmp 2>&1
++	diff namadr_list.ref namadr_list.tmp
++	rm -f namadr_list.tmp
++
++mail_conf_time_test: mail_conf_time mail_conf_time.ref
++	./mail_conf_time >mail_conf_time.tmp
++	diff mail_conf_time.ref mail_conf_time.tmp
++	rm -f mail_conf_time.tmp
++
++header_body_checks_null_test: header_body_checks header_body_checks_null.ref
++	./header_body_checks "" "" "" "" \
++		<mime_test.in >header_body_checks_null.tmp 2>&1
++	cmp header_body_checks_null.ref header_body_checks_null.tmp
++	./header_body_checks static:dunno static:dunno static:dunno static:dunno \
++		<mime_test.in >header_body_checks_null.tmp 2>&1
++	cmp header_body_checks_null.ref header_body_checks_null.tmp
++	./header_body_checks static:ok static:ok static:ok static:ok \
++		<mime_test.in >header_body_checks_null.tmp 2>&1
++	cmp header_body_checks_null.ref header_body_checks_null.tmp
++	rm -f header_body_checks_null.tmp
++
++header_body_checks_warn_test: header_body_checks header_body_checks_warn.ref
++	./header_body_checks static:warn static:warn static:warn static:warn \
++		<mime_test.in >header_body_checks_warn.tmp 2>&1
++	cmp header_body_checks_warn.ref header_body_checks_warn.tmp
++	rm -f header_body_checks_warn.tmp
++
++header_body_checks_prepend_test: header_body_checks header_body_checks_prepend.ref
++	echo /./ prepend header: head >header_body_checks_head
++	echo /./ prepend header: mime >header_body_checks_mime
++	echo /./ prepend header: nest >header_body_checks_nest
++	echo /./ prepend body >header_body_checks_body
++	./header_body_checks regexp:header_body_checks_head regexp:header_body_checks_mime \
++		regexp:header_body_checks_nest regexp:header_body_checks_body \
++		<mime_test.in >header_body_checks_prepend.tmp 2>&1
++	cmp header_body_checks_prepend.ref header_body_checks_prepend.tmp
++	rm -f header_body_checks_prepend.tmp header_body_checks_head header_body_checks_mime header_body_checks_nest header_body_checks_body
++
++# Note: the IGNORE action will not strip empty lines. Postfix maps
++# currently never see null query strings because some map types raise
++# errors. We can eliminate this restriction by allowing individual
++# map types to advertise whether they can handle null queries.
++header_body_checks_ignore_test: header_body_checks header_body_checks_ignore.ref
++	./header_body_checks static:ignore static:ignore static:ignore static:ignore \
++		<mime_test.in >header_body_checks_ignore.tmp 2>&1
++	cmp header_body_checks_ignore.ref header_body_checks_ignore.tmp
++	rm -f header_body_checks_ignore.tmp header_body_checks_head header_body_checks_mime header_body_checks_nest header_body_checks_body
++
++header_body_checks_replace_test: header_body_checks header_body_checks_replace.ref
++	echo /./ replace header: head >header_body_checks_head
++	echo /./ replace header: mime >header_body_checks_mime
++	echo /./ replace header: nest >header_body_checks_nest
++	echo /./ replace body >header_body_checks_body
++	./header_body_checks regexp:header_body_checks_head regexp:header_body_checks_mime \
++		regexp:header_body_checks_nest regexp:header_body_checks_body \
++		<mime_test.in >header_body_checks_replace.tmp 2>&1
++	cmp header_body_checks_replace.ref header_body_checks_replace.tmp
++	rm -f header_body_checks_replace.tmp header_body_checks_head header_body_checks_mime header_body_checks_nest header_body_checks_body
++
++printfck: $(OBJS) $(PROG)
++	rm -rf printfck
++	mkdir printfck
++	cp *.h printfck
++	sed '1,/^# do not edit/!d' Makefile >printfck/Makefile
++	set -e; for i in *.c; do printfck -f .printfck $$i >printfck/$$i; done
++	cd printfck; make "INC_DIR=../../../include" `cd ..; ls *.o`
++
++lint:
++	lint $(DEFS) $(SRCS) $(LINTFIX)
++
++clean:
++	rm -f *.o $(LIB) *core $(TESTPROG) junk
++	rm -rf printfck
++
++tidy:	clean
++
++depend: $(MAKES)
++	(sed '1,/^# do not edit/!d' Makefile.in; \
++	set -e; for i in [a-z][a-z0-9]*.c; do \
++	    $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
++	    -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
++	    -e 's/o: \.\//o: /' -e p -e '}' ; \
++	done | sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
++	@$(EXPORT) make -f Makefile.in Makefile 1>&2
++
++# do not edit below this line - it is generated by 'make depend'
++abounce.o: ../../include/attr.h
++abounce.o: ../../include/events.h
++abounce.o: ../../include/iostuff.h
++abounce.o: ../../include/msg.h
++abounce.o: ../../include/mymalloc.h
++abounce.o: ../../include/sys_defs.h
++abounce.o: ../../include/vbuf.h
++abounce.o: ../../include/vstream.h
++abounce.o: ../../include/vstring.h
++abounce.o: abounce.c
++abounce.o: abounce.h
++abounce.o: bounce.h
++abounce.o: deliver_request.h
++abounce.o: dsn.h
++abounce.o: dsn_buf.h
++abounce.o: mail_params.h
++abounce.o: mail_proto.h
++abounce.o: msg_stats.h
++abounce.o: recipient_list.h
++anvil_clnt.o: ../../include/attr.h
++anvil_clnt.o: ../../include/attr_clnt.h
++anvil_clnt.o: ../../include/iostuff.h
++anvil_clnt.o: ../../include/msg.h
++anvil_clnt.o: ../../include/mymalloc.h
++anvil_clnt.o: ../../include/stringops.h
++anvil_clnt.o: ../../include/sys_defs.h
++anvil_clnt.o: ../../include/vbuf.h
++anvil_clnt.o: ../../include/vstream.h
++anvil_clnt.o: ../../include/vstring.h
++anvil_clnt.o: anvil_clnt.c
++anvil_clnt.o: anvil_clnt.h
++anvil_clnt.o: mail_params.h
++anvil_clnt.o: mail_proto.h
++been_here.o: ../../include/htable.h
++been_here.o: ../../include/msg.h
++been_here.o: ../../include/mymalloc.h
++been_here.o: ../../include/stringops.h
++been_here.o: ../../include/sys_defs.h
++been_here.o: ../../include/vbuf.h
++been_here.o: ../../include/vstring.h
++been_here.o: been_here.c
++been_here.o: been_here.h
++bounce.o: ../../include/attr.h
++bounce.o: ../../include/iostuff.h
++bounce.o: ../../include/msg.h
++bounce.o: ../../include/mymalloc.h
++bounce.o: ../../include/sys_defs.h
++bounce.o: ../../include/vbuf.h
++bounce.o: ../../include/vstream.h
++bounce.o: ../../include/vstring.h
++bounce.o: bounce.c
++bounce.o: bounce.h
++bounce.o: defer.h
++bounce.o: deliver_request.h
++bounce.o: dsn.h
++bounce.o: dsn_buf.h
++bounce.o: dsn_print.h
++bounce.o: dsn_util.h
++bounce.o: log_adhoc.h
++bounce.o: mail_params.h
++bounce.o: mail_proto.h
++bounce.o: msg_stats.h
++bounce.o: rcpt_print.h
++bounce.o: recipient_list.h
++bounce.o: trace.h
++bounce.o: verify.h
++bounce_log.o: ../../include/attr.h
++bounce_log.o: ../../include/iostuff.h
++bounce_log.o: ../../include/msg.h
++bounce_log.o: ../../include/mymalloc.h
++bounce_log.o: ../../include/stringops.h
++bounce_log.o: ../../include/sys_defs.h
++bounce_log.o: ../../include/vbuf.h
++bounce_log.o: ../../include/vstream.h
++bounce_log.o: ../../include/vstring.h
++bounce_log.o: ../../include/vstring_vstream.h
++bounce_log.o: bounce_log.c
++bounce_log.o: bounce_log.h
++bounce_log.o: dsn.h
++bounce_log.o: dsn_buf.h
++bounce_log.o: dsn_mask.h
++bounce_log.o: mail_params.h
++bounce_log.o: mail_proto.h
++bounce_log.o: mail_queue.h
++bounce_log.o: rcpt_buf.h
++bounce_log.o: recipient_list.h
++canon_addr.o: ../../include/attr.h
++canon_addr.o: ../../include/iostuff.h
++canon_addr.o: ../../include/mymalloc.h
++canon_addr.o: ../../include/sys_defs.h
++canon_addr.o: ../../include/vbuf.h
++canon_addr.o: ../../include/vstream.h
++canon_addr.o: ../../include/vstring.h
++canon_addr.o: canon_addr.c
++canon_addr.o: canon_addr.h
++canon_addr.o: mail_proto.h
++canon_addr.o: rewrite_clnt.h
++cfg_parser.o: ../../include/argv.h
++cfg_parser.o: ../../include/dict.h
++cfg_parser.o: ../../include/msg.h
++cfg_parser.o: ../../include/mymalloc.h
++cfg_parser.o: ../../include/sys_defs.h
++cfg_parser.o: ../../include/vbuf.h
++cfg_parser.o: ../../include/vstream.h
++cfg_parser.o: ../../include/vstring.h
++cfg_parser.o: cfg_parser.c
++cfg_parser.o: cfg_parser.h
++cfg_parser.o: mail_conf.h
++cleanup_strerror.o: ../../include/msg.h
++cleanup_strerror.o: ../../include/sys_defs.h
++cleanup_strerror.o: ../../include/vbuf.h
++cleanup_strerror.o: ../../include/vstring.h
++cleanup_strerror.o: cleanup_strerror.c
++cleanup_strerror.o: cleanup_user.h
++cleanup_strflags.o: ../../include/msg.h
++cleanup_strflags.o: ../../include/sys_defs.h
++cleanup_strflags.o: ../../include/vbuf.h
++cleanup_strflags.o: ../../include/vstring.h
++cleanup_strflags.o: cleanup_strflags.c
++cleanup_strflags.o: cleanup_user.h
++clnt_stream.o: ../../include/attr.h
++clnt_stream.o: ../../include/events.h
++clnt_stream.o: ../../include/iostuff.h
++clnt_stream.o: ../../include/msg.h
++clnt_stream.o: ../../include/mymalloc.h
++clnt_stream.o: ../../include/sys_defs.h
++clnt_stream.o: ../../include/vbuf.h
++clnt_stream.o: ../../include/vstream.h
++clnt_stream.o: clnt_stream.c
++clnt_stream.o: clnt_stream.h
++clnt_stream.o: mail_params.h
++clnt_stream.o: mail_proto.h
++conv_time.o: ../../include/msg.h
++conv_time.o: ../../include/sys_defs.h
++conv_time.o: conv_time.c
++conv_time.o: conv_time.h
++data_redirect.o: ../../include/argv.h
++data_redirect.o: ../../include/dict.h
++data_redirect.o: ../../include/dict_cdb.h
++data_redirect.o: ../../include/dict_db.h
++data_redirect.o: ../../include/dict_dbm.h
++data_redirect.o: ../../include/msg.h
++data_redirect.o: ../../include/name_code.h
++data_redirect.o: ../../include/split_at.h
++data_redirect.o: ../../include/stringops.h
++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: data_redirect.c
++data_redirect.o: data_redirect.h
++data_redirect.o: dict_proxy.h
++data_redirect.o: mail_params.h
++db_common.o: ../../include/argv.h
++db_common.o: ../../include/dict.h
++db_common.o: ../../include/match_list.h
++db_common.o: ../../include/match_ops.h
++db_common.o: ../../include/msg.h
++db_common.o: ../../include/mymalloc.h
++db_common.o: ../../include/sys_defs.h
++db_common.o: ../../include/vbuf.h
++db_common.o: ../../include/vstream.h
++db_common.o: ../../include/vstring.h
++db_common.o: cfg_parser.h
++db_common.o: db_common.c
++db_common.o: db_common.h
++db_common.o: string_list.h
++debug_peer.o: ../../include/match_list.h
++debug_peer.o: ../../include/match_ops.h
++debug_peer.o: ../../include/msg.h
++debug_peer.o: ../../include/sys_defs.h
++debug_peer.o: debug_peer.c
++debug_peer.o: debug_peer.h
++debug_peer.o: mail_params.h
++debug_peer.o: match_parent_style.h
++debug_peer.o: namadr_list.h
++debug_process.o: ../../include/msg.h
++debug_process.o: ../../include/sys_defs.h
++debug_process.o: debug_process.c
++debug_process.o: debug_process.h
++debug_process.o: mail_conf.h
++debug_process.o: mail_params.h
++defer.o: ../../include/attr.h
++defer.o: ../../include/iostuff.h
++defer.o: ../../include/msg.h
++defer.o: ../../include/sys_defs.h
++defer.o: ../../include/vbuf.h
++defer.o: ../../include/vstream.h
++defer.o: ../../include/vstring.h
++defer.o: bounce.h
++defer.o: defer.c
++defer.o: defer.h
++defer.o: deliver_request.h
++defer.o: dsn.h
++defer.o: dsn_buf.h
++defer.o: dsn_print.h
++defer.o: dsn_util.h
++defer.o: flush_clnt.h
++defer.o: log_adhoc.h
++defer.o: mail_params.h
++defer.o: mail_proto.h
++defer.o: mail_queue.h
++defer.o: msg_stats.h
++defer.o: rcpt_print.h
++defer.o: recipient_list.h
++defer.o: trace.h
++defer.o: verify.h
++deliver_completed.o: ../../include/msg.h
++deliver_completed.o: ../../include/sys_defs.h
++deliver_completed.o: ../../include/vbuf.h
++deliver_completed.o: ../../include/vstream.h
++deliver_completed.o: ../../include/vstring.h
++deliver_completed.o: deliver_completed.c
++deliver_completed.o: deliver_completed.h
++deliver_completed.o: rec_type.h
++deliver_completed.o: record.h
++deliver_flock.o: ../../include/iostuff.h
++deliver_flock.o: ../../include/myflock.h
++deliver_flock.o: ../../include/sys_defs.h
++deliver_flock.o: ../../include/vbuf.h
++deliver_flock.o: ../../include/vstring.h
++deliver_flock.o: deliver_flock.c
++deliver_flock.o: deliver_flock.h
++deliver_flock.o: mail_params.h
++deliver_pass.o: ../../include/attr.h
++deliver_pass.o: ../../include/iostuff.h
++deliver_pass.o: ../../include/msg.h
++deliver_pass.o: ../../include/mymalloc.h
++deliver_pass.o: ../../include/split_at.h
++deliver_pass.o: ../../include/sys_defs.h
++deliver_pass.o: ../../include/vbuf.h
++deliver_pass.o: ../../include/vstream.h
++deliver_pass.o: ../../include/vstring.h
++deliver_pass.o: bounce.h
++deliver_pass.o: defer.h
++deliver_pass.o: deliver_pass.c
++deliver_pass.o: deliver_pass.h
++deliver_pass.o: deliver_request.h
++deliver_pass.o: dsb_scan.h
++deliver_pass.o: dsn.h
++deliver_pass.o: dsn_buf.h
++deliver_pass.o: mail_params.h
++deliver_pass.o: mail_proto.h
++deliver_pass.o: msg_stats.h
++deliver_pass.o: rcpt_print.h
++deliver_pass.o: recipient_list.h
++deliver_request.o: ../../include/attr.h
++deliver_request.o: ../../include/iostuff.h
++deliver_request.o: ../../include/msg.h
++deliver_request.o: ../../include/myflock.h
++deliver_request.o: ../../include/mymalloc.h
++deliver_request.o: ../../include/sys_defs.h
++deliver_request.o: ../../include/vbuf.h
++deliver_request.o: ../../include/vstream.h
++deliver_request.o: ../../include/vstring.h
++deliver_request.o: deliver_request.c
++deliver_request.o: deliver_request.h
++deliver_request.o: dsn.h
++deliver_request.o: dsn_print.h
++deliver_request.o: mail_open_ok.h
++deliver_request.o: mail_proto.h
++deliver_request.o: mail_queue.h
++deliver_request.o: msg_stats.h
++deliver_request.o: rcpt_buf.h
++deliver_request.o: recipient_list.h
++delivered_hdr.o: ../../include/htable.h
++delivered_hdr.o: ../../include/msg.h
++delivered_hdr.o: ../../include/mymalloc.h
++delivered_hdr.o: ../../include/stringops.h
++delivered_hdr.o: ../../include/sys_defs.h
++delivered_hdr.o: ../../include/vbuf.h
++delivered_hdr.o: ../../include/vstream.h
++delivered_hdr.o: ../../include/vstring.h
++delivered_hdr.o: ../../include/vstring_vstream.h
++delivered_hdr.o: delivered_hdr.c
++delivered_hdr.o: delivered_hdr.h
++delivered_hdr.o: fold_addr.h
++delivered_hdr.o: header_opts.h
++delivered_hdr.o: is_header.h
++delivered_hdr.o: quote_822_local.h
++delivered_hdr.o: quote_flags.h
++delivered_hdr.o: rec_type.h
++delivered_hdr.o: record.h
++dict_ldap.o: ../../include/argv.h
++dict_ldap.o: ../../include/binhash.h
++dict_ldap.o: ../../include/dict.h
++dict_ldap.o: ../../include/match_list.h
++dict_ldap.o: ../../include/match_ops.h
++dict_ldap.o: ../../include/msg.h
++dict_ldap.o: ../../include/mymalloc.h
++dict_ldap.o: ../../include/stringops.h
++dict_ldap.o: ../../include/sys_defs.h
++dict_ldap.o: ../../include/vbuf.h
++dict_ldap.o: ../../include/vstream.h
++dict_ldap.o: ../../include/vstring.h
++dict_ldap.o: cfg_parser.h
++dict_ldap.o: db_common.h
++dict_ldap.o: dict_ldap.c
++dict_ldap.o: dict_ldap.h
++dict_ldap.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/match_ops.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/match_ops.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
++dict_proxy.o: ../../include/iostuff.h
++dict_proxy.o: ../../include/msg.h
++dict_proxy.o: ../../include/mymalloc.h
++dict_proxy.o: ../../include/stringops.h
++dict_proxy.o: ../../include/sys_defs.h
++dict_proxy.o: ../../include/vbuf.h
++dict_proxy.o: ../../include/vstream.h
++dict_proxy.o: ../../include/vstring.h
++dict_proxy.o: clnt_stream.h
++dict_proxy.o: dict_proxy.c
++dict_proxy.o: dict_proxy.h
++dict_proxy.o: mail_params.h
++dict_proxy.o: mail_proto.h
++domain_list.o: ../../include/match_list.h
++domain_list.o: ../../include/match_ops.h
++domain_list.o: ../../include/sys_defs.h
++domain_list.o: domain_list.c
++domain_list.o: domain_list.h
++dot_lockfile.o: ../../include/iostuff.h
++dot_lockfile.o: ../../include/mymalloc.h
++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: dot_lockfile.c
++dot_lockfile.o: dot_lockfile.h
++dot_lockfile.o: mail_params.h
++dot_lockfile_as.o: ../../include/msg.h
++dot_lockfile_as.o: ../../include/set_eugid.h
++dot_lockfile_as.o: ../../include/sys_defs.h
++dot_lockfile_as.o: ../../include/vbuf.h
++dot_lockfile_as.o: ../../include/vstring.h
++dot_lockfile_as.o: dot_lockfile.h
++dot_lockfile_as.o: dot_lockfile_as.c
++dot_lockfile_as.o: dot_lockfile_as.h
++dsb_scan.o: ../../include/attr.h
++dsb_scan.o: ../../include/iostuff.h
++dsb_scan.o: ../../include/sys_defs.h
++dsb_scan.o: ../../include/vbuf.h
++dsb_scan.o: ../../include/vstream.h
++dsb_scan.o: ../../include/vstring.h
++dsb_scan.o: dsb_scan.c
++dsb_scan.o: dsb_scan.h
++dsb_scan.o: dsn.h
++dsb_scan.o: dsn_buf.h
++dsb_scan.o: mail_proto.h
++dsn.o: ../../include/msg.h
++dsn.o: ../../include/mymalloc.h
++dsn.o: ../../include/sys_defs.h
++dsn.o: dsn.c
++dsn.o: dsn.h
++dsn_buf.o: ../../include/msg.h
++dsn_buf.o: ../../include/mymalloc.h
++dsn_buf.o: ../../include/sys_defs.h
++dsn_buf.o: ../../include/vbuf.h
++dsn_buf.o: ../../include/vstring.h
++dsn_buf.o: dsn.h
++dsn_buf.o: dsn_buf.c
++dsn_buf.o: dsn_buf.h
++dsn_mask.o: ../../include/msg.h
++dsn_mask.o: ../../include/name_code.h
++dsn_mask.o: ../../include/name_mask.h
++dsn_mask.o: ../../include/sys_defs.h
++dsn_mask.o: ../../include/vbuf.h
++dsn_mask.o: ../../include/vstring.h
++dsn_mask.o: dsn_mask.c
++dsn_mask.o: dsn_mask.h
++dsn_print.o: ../../include/attr.h
++dsn_print.o: ../../include/iostuff.h
++dsn_print.o: ../../include/sys_defs.h
++dsn_print.o: ../../include/vbuf.h
++dsn_print.o: ../../include/vstream.h
++dsn_print.o: dsn.h
++dsn_print.o: dsn_print.c
++dsn_print.o: dsn_print.h
++dsn_print.o: mail_proto.h
++dsn_util.o: ../../include/msg.h
++dsn_util.o: ../../include/mymalloc.h
++dsn_util.o: ../../include/stringops.h
++dsn_util.o: ../../include/sys_defs.h
++dsn_util.o: ../../include/vbuf.h
++dsn_util.o: ../../include/vstring.h
++dsn_util.o: dsn_util.c
++dsn_util.o: dsn_util.h
++ehlo_mask.o: ../../include/name_mask.h
++ehlo_mask.o: ../../include/sys_defs.h
++ehlo_mask.o: ../../include/vbuf.h
++ehlo_mask.o: ../../include/vstring.h
++ehlo_mask.o: ehlo_mask.c
++ehlo_mask.o: ehlo_mask.h
++ext_prop.o: ../../include/name_mask.h
++ext_prop.o: ../../include/sys_defs.h
++ext_prop.o: ../../include/vbuf.h
++ext_prop.o: ../../include/vstring.h
++ext_prop.o: ext_prop.c
++ext_prop.o: ext_prop.h
++ext_prop.o: mail_params.h
++file_id.o: ../../include/msg.h
++file_id.o: ../../include/sys_defs.h
++file_id.o: ../../include/vbuf.h
++file_id.o: ../../include/vstring.h
++file_id.o: file_id.c
++file_id.o: file_id.h
++flush_clnt.o: ../../include/attr.h
++flush_clnt.o: ../../include/iostuff.h
++flush_clnt.o: ../../include/match_list.h
++flush_clnt.o: ../../include/match_ops.h
++flush_clnt.o: ../../include/msg.h
++flush_clnt.o: ../../include/sys_defs.h
++flush_clnt.o: ../../include/vbuf.h
++flush_clnt.o: ../../include/vstream.h
++flush_clnt.o: domain_list.h
++flush_clnt.o: flush_clnt.c
++flush_clnt.o: flush_clnt.h
++flush_clnt.o: mail_flush.h
++flush_clnt.o: mail_params.h
++flush_clnt.o: mail_proto.h
++flush_clnt.o: match_parent_style.h
++fold_addr.o: ../../include/stringops.h
++fold_addr.o: ../../include/sys_defs.h
++fold_addr.o: ../../include/vbuf.h
++fold_addr.o: ../../include/vstring.h
++fold_addr.o: fold_addr.c
++fold_addr.o: fold_addr.h
++header_body_checks.o: ../../include/argv.h
++header_body_checks.o: ../../include/dict.h
++header_body_checks.o: ../../include/msg.h
++header_body_checks.o: ../../include/mymalloc.h
++header_body_checks.o: ../../include/sys_defs.h
++header_body_checks.o: ../../include/vbuf.h
++header_body_checks.o: ../../include/vstream.h
++header_body_checks.o: ../../include/vstring.h
++header_body_checks.o: cleanup_user.h
++header_body_checks.o: dsn_util.h
++header_body_checks.o: header_body_checks.c
++header_body_checks.o: header_body_checks.h
++header_body_checks.o: header_opts.h
++header_body_checks.o: is_header.h
++header_body_checks.o: maps.h
++header_body_checks.o: mime_state.h
++header_body_checks.o: rec_type.h
++header_opts.o: ../../include/htable.h
++header_opts.o: ../../include/msg.h
++header_opts.o: ../../include/stringops.h
++header_opts.o: ../../include/sys_defs.h
++header_opts.o: ../../include/vbuf.h
++header_opts.o: ../../include/vstring.h
++header_opts.o: header_opts.c
++header_opts.o: header_opts.h
++header_token.o: ../../include/msg.h
++header_token.o: ../../include/sys_defs.h
++header_token.o: ../../include/vbuf.h
++header_token.o: ../../include/vstring.h
++header_token.o: header_token.c
++header_token.o: header_token.h
++header_token.o: lex_822.h
++input_transp.o: ../../include/msg.h
++input_transp.o: ../../include/name_mask.h
++input_transp.o: ../../include/sys_defs.h
++input_transp.o: ../../include/vbuf.h
++input_transp.o: ../../include/vstring.h
++input_transp.o: cleanup_user.h
++input_transp.o: input_transp.c
++input_transp.o: input_transp.h
++input_transp.o: mail_params.h
++int_filt.o: ../../include/msg.h
++int_filt.o: ../../include/name_mask.h
++int_filt.o: ../../include/sys_defs.h
++int_filt.o: ../../include/vbuf.h
++int_filt.o: ../../include/vstring.h
++int_filt.o: cleanup_user.h
++int_filt.o: int_filt.c
++int_filt.o: int_filt.h
++int_filt.o: mail_params.h
++is_header.o: ../../include/sys_defs.h
++is_header.o: is_header.c
++is_header.o: is_header.h
++log_adhoc.o: ../../include/attr.h
++log_adhoc.o: ../../include/format_tv.h
++log_adhoc.o: ../../include/msg.h
++log_adhoc.o: ../../include/sys_defs.h
++log_adhoc.o: ../../include/vbuf.h
++log_adhoc.o: ../../include/vstream.h
++log_adhoc.o: ../../include/vstring.h
++log_adhoc.o: dsn.h
++log_adhoc.o: log_adhoc.c
++log_adhoc.o: log_adhoc.h
++log_adhoc.o: mail_params.h
++log_adhoc.o: msg_stats.h
++log_adhoc.o: recipient_list.h
++mail_addr.o: ../../include/stringops.h
++mail_addr.o: ../../include/sys_defs.h
++mail_addr.o: ../../include/vbuf.h
++mail_addr.o: ../../include/vstring.h
++mail_addr.o: mail_addr.c
++mail_addr.o: mail_addr.h
++mail_addr.o: mail_params.h
++mail_addr_crunch.o: ../../include/argv.h
++mail_addr_crunch.o: ../../include/mymalloc.h
++mail_addr_crunch.o: ../../include/sys_defs.h
++mail_addr_crunch.o: ../../include/vbuf.h
++mail_addr_crunch.o: ../../include/vstring.h
++mail_addr_crunch.o: canon_addr.h
++mail_addr_crunch.o: mail_addr_crunch.c
++mail_addr_crunch.o: mail_addr_crunch.h
++mail_addr_crunch.o: resolve_clnt.h
++mail_addr_crunch.o: tok822.h
++mail_addr_find.o: ../../include/argv.h
++mail_addr_find.o: ../../include/dict.h
++mail_addr_find.o: ../../include/msg.h
++mail_addr_find.o: ../../include/mymalloc.h
++mail_addr_find.o: ../../include/stringops.h
++mail_addr_find.o: ../../include/sys_defs.h
++mail_addr_find.o: ../../include/vbuf.h
++mail_addr_find.o: ../../include/vstream.h
++mail_addr_find.o: ../../include/vstring.h
++mail_addr_find.o: mail_addr_find.c
++mail_addr_find.o: mail_addr_find.h
++mail_addr_find.o: mail_params.h
++mail_addr_find.o: maps.h
++mail_addr_find.o: resolve_local.h
++mail_addr_find.o: strip_addr.h
++mail_addr_map.o: ../../include/argv.h
++mail_addr_map.o: ../../include/dict.h
++mail_addr_map.o: ../../include/msg.h
++mail_addr_map.o: ../../include/mymalloc.h
++mail_addr_map.o: ../../include/sys_defs.h
++mail_addr_map.o: ../../include/vbuf.h
++mail_addr_map.o: ../../include/vstream.h
++mail_addr_map.o: ../../include/vstring.h
++mail_addr_map.o: mail_addr_crunch.h
++mail_addr_map.o: mail_addr_find.h
++mail_addr_map.o: mail_addr_map.c
++mail_addr_map.o: mail_addr_map.h
++mail_addr_map.o: maps.h
++mail_command_client.o: ../../include/attr.h
++mail_command_client.o: ../../include/iostuff.h
++mail_command_client.o: ../../include/sys_defs.h
++mail_command_client.o: ../../include/vbuf.h
++mail_command_client.o: ../../include/vstream.h
++mail_command_client.o: mail_command_client.c
++mail_command_client.o: mail_proto.h
++mail_command_server.o: ../../include/attr.h
++mail_command_server.o: ../../include/iostuff.h
++mail_command_server.o: ../../include/sys_defs.h
++mail_command_server.o: ../../include/vbuf.h
++mail_command_server.o: ../../include/vstream.h
++mail_command_server.o: mail_command_server.c
++mail_command_server.o: mail_proto.h
++mail_conf.o: ../../include/argv.h
++mail_conf.o: ../../include/dict.h
++mail_conf.o: ../../include/msg.h
++mail_conf.o: ../../include/mymalloc.h
++mail_conf.o: ../../include/readlline.h
++mail_conf.o: ../../include/safe.h
++mail_conf.o: ../../include/stringops.h
++mail_conf.o: ../../include/sys_defs.h
++mail_conf.o: ../../include/vbuf.h
++mail_conf.o: ../../include/vstream.h
++mail_conf.o: ../../include/vstring.h
++mail_conf.o: mail_conf.c
++mail_conf.o: mail_conf.h
++mail_conf.o: mail_params.h
++mail_conf_bool.o: ../../include/argv.h
++mail_conf_bool.o: ../../include/dict.h
++mail_conf_bool.o: ../../include/msg.h
++mail_conf_bool.o: ../../include/sys_defs.h
++mail_conf_bool.o: ../../include/vbuf.h
++mail_conf_bool.o: ../../include/vstream.h
++mail_conf_bool.o: ../../include/vstring.h
++mail_conf_bool.o: mail_conf.h
++mail_conf_bool.o: mail_conf_bool.c
++mail_conf_int.o: ../../include/argv.h
++mail_conf_int.o: ../../include/dict.h
++mail_conf_int.o: ../../include/msg.h
++mail_conf_int.o: ../../include/mymalloc.h
++mail_conf_int.o: ../../include/stringops.h
++mail_conf_int.o: ../../include/sys_defs.h
++mail_conf_int.o: ../../include/vbuf.h
++mail_conf_int.o: ../../include/vstream.h
++mail_conf_int.o: ../../include/vstring.h
++mail_conf_int.o: mail_conf.h
++mail_conf_int.o: mail_conf_int.c
++mail_conf_long.o: ../../include/argv.h
++mail_conf_long.o: ../../include/dict.h
++mail_conf_long.o: ../../include/msg.h
++mail_conf_long.o: ../../include/mymalloc.h
++mail_conf_long.o: ../../include/stringops.h
++mail_conf_long.o: ../../include/sys_defs.h
++mail_conf_long.o: ../../include/vbuf.h
++mail_conf_long.o: ../../include/vstream.h
++mail_conf_long.o: ../../include/vstring.h
++mail_conf_long.o: mail_conf.h
++mail_conf_long.o: mail_conf_long.c
++mail_conf_nint.o: ../../include/argv.h
++mail_conf_nint.o: ../../include/dict.h
++mail_conf_nint.o: ../../include/msg.h
++mail_conf_nint.o: ../../include/mymalloc.h
++mail_conf_nint.o: ../../include/stringops.h
++mail_conf_nint.o: ../../include/sys_defs.h
++mail_conf_nint.o: ../../include/vbuf.h
++mail_conf_nint.o: ../../include/vstream.h
++mail_conf_nint.o: ../../include/vstring.h
++mail_conf_nint.o: mail_conf.h
++mail_conf_nint.o: mail_conf_nint.c
++mail_conf_raw.o: ../../include/msg.h
++mail_conf_raw.o: ../../include/mymalloc.h
++mail_conf_raw.o: ../../include/sys_defs.h
++mail_conf_raw.o: mail_conf.h
++mail_conf_raw.o: mail_conf_raw.c
++mail_conf_str.o: ../../include/msg.h
++mail_conf_str.o: ../../include/mymalloc.h
++mail_conf_str.o: ../../include/stringops.h
++mail_conf_str.o: ../../include/sys_defs.h
++mail_conf_str.o: ../../include/vbuf.h
++mail_conf_str.o: ../../include/vstring.h
++mail_conf_str.o: mail_conf.h
++mail_conf_str.o: mail_conf_str.c
++mail_conf_time.o: ../../include/argv.h
++mail_conf_time.o: ../../include/dict.h
++mail_conf_time.o: ../../include/msg.h
++mail_conf_time.o: ../../include/mymalloc.h
++mail_conf_time.o: ../../include/stringops.h
++mail_conf_time.o: ../../include/sys_defs.h
++mail_conf_time.o: ../../include/vbuf.h
++mail_conf_time.o: ../../include/vstream.h
++mail_conf_time.o: ../../include/vstring.h
++mail_conf_time.o: conv_time.h
++mail_conf_time.o: mail_conf.h
++mail_conf_time.o: mail_conf_time.c
++mail_connect.o: ../../include/attr.h
++mail_connect.o: ../../include/connect.h
++mail_connect.o: ../../include/iostuff.h
++mail_connect.o: ../../include/msg.h
++mail_connect.o: ../../include/mymalloc.h
++mail_connect.o: ../../include/stringops.h
++mail_connect.o: ../../include/sys_defs.h
++mail_connect.o: ../../include/vbuf.h
++mail_connect.o: ../../include/vstream.h
++mail_connect.o: ../../include/vstring.h
++mail_connect.o: mail_connect.c
++mail_connect.o: mail_proto.h
++mail_connect.o: timed_ipc.h
++mail_copy.o: ../../include/htable.h
++mail_copy.o: ../../include/iostuff.h
++mail_copy.o: ../../include/msg.h
++mail_copy.o: ../../include/safe_open.h
++mail_copy.o: ../../include/stringops.h
++mail_copy.o: ../../include/sys_defs.h
++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: dsn.h
++mail_copy.o: dsn_buf.h
++mail_copy.o: mail_addr.h
++mail_copy.o: mail_copy.c
++mail_copy.o: mail_copy.h
++mail_copy.o: mail_params.h
++mail_copy.o: mail_queue.h
++mail_copy.o: mark_corrupt.h
++mail_copy.o: mbox_open.h
++mail_copy.o: quote_822_local.h
++mail_copy.o: quote_flags.h
++mail_copy.o: rec_type.h
++mail_copy.o: record.h
++mail_copy.o: sys_exits.h
++mail_date.o: ../../include/msg.h
++mail_date.o: ../../include/sys_defs.h
++mail_date.o: ../../include/vbuf.h
++mail_date.o: ../../include/vstring.h
++mail_date.o: mail_date.c
++mail_date.o: mail_date.h
++mail_dict.o: ../../include/argv.h
++mail_dict.o: ../../include/dict.h
++mail_dict.o: ../../include/msg.h
++mail_dict.o: ../../include/sys_defs.h
++mail_dict.o: ../../include/vbuf.h
++mail_dict.o: ../../include/vstream.h
++mail_dict.o: ../../include/vstring.h
++mail_dict.o: dict_ldap.h
++mail_dict.o: dict_mysql.h
++mail_dict.o: dict_pgsql.h
++mail_dict.o: dict_proxy.h
++mail_dict.o: mail_dict.c
++mail_dict.o: mail_dict.h
++mail_error.o: ../../include/name_mask.h
++mail_error.o: ../../include/sys_defs.h
++mail_error.o: ../../include/vbuf.h
++mail_error.o: ../../include/vstring.h
++mail_error.o: mail_error.c
++mail_error.o: mail_error.h
++mail_flush.o: ../../include/attr.h
++mail_flush.o: ../../include/iostuff.h
++mail_flush.o: ../../include/sys_defs.h
++mail_flush.o: ../../include/vbuf.h
++mail_flush.o: ../../include/vstream.h
++mail_flush.o: mail_flush.c
++mail_flush.o: mail_flush.h
++mail_flush.o: mail_params.h
++mail_flush.o: mail_proto.h
++mail_open_ok.o: ../../include/msg.h
++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: mail_open_ok.c
++mail_open_ok.o: mail_open_ok.h
++mail_open_ok.o: mail_queue.h
++mail_params.o: ../../include/argv.h
++mail_params.o: ../../include/attr.h
++mail_params.o: ../../include/dict.h
++mail_params.o: ../../include/dict_db.h
++mail_params.o: ../../include/get_hostname.h
++mail_params.o: ../../include/inet_addr_list.h
++mail_params.o: ../../include/inet_proto.h
++mail_params.o: ../../include/iostuff.h
++mail_params.o: ../../include/msg.h
++mail_params.o: ../../include/msg_syslog.h
++mail_params.o: ../../include/myaddrinfo.h
++mail_params.o: ../../include/mymalloc.h
++mail_params.o: ../../include/safe.h
++mail_params.o: ../../include/safe_open.h
++mail_params.o: ../../include/stringops.h
++mail_params.o: ../../include/sys_defs.h
++mail_params.o: ../../include/valid_hostname.h
++mail_params.o: ../../include/vbuf.h
++mail_params.o: ../../include/vstream.h
++mail_params.o: ../../include/vstring.h
++mail_params.o: ../../include/vstring_vstream.h
++mail_params.o: mail_conf.h
++mail_params.o: mail_params.c
++mail_params.o: mail_params.h
++mail_params.o: mail_proto.h
++mail_params.o: mail_version.h
++mail_params.o: mynetworks.h
++mail_params.o: own_inet_addr.h
++mail_params.o: recipient_list.h
++mail_params.o: verp_sender.h
++mail_pathname.o: ../../include/attr.h
++mail_pathname.o: ../../include/iostuff.h
++mail_pathname.o: ../../include/stringops.h
++mail_pathname.o: ../../include/sys_defs.h
++mail_pathname.o: ../../include/vbuf.h
++mail_pathname.o: ../../include/vstream.h
++mail_pathname.o: ../../include/vstring.h
++mail_pathname.o: mail_pathname.c
++mail_pathname.o: mail_proto.h
++mail_queue.o: ../../include/argv.h
++mail_queue.o: ../../include/dir_forest.h
++mail_queue.o: ../../include/make_dirs.h
++mail_queue.o: ../../include/msg.h
++mail_queue.o: ../../include/mymalloc.h
++mail_queue.o: ../../include/sane_fsops.h
++mail_queue.o: ../../include/split_at.h
++mail_queue.o: ../../include/sys_defs.h
++mail_queue.o: ../../include/valid_hostname.h
++mail_queue.o: ../../include/vbuf.h
++mail_queue.o: ../../include/vstream.h
++mail_queue.o: ../../include/vstring.h
++mail_queue.o: file_id.h
++mail_queue.o: mail_params.h
++mail_queue.o: mail_queue.c
++mail_queue.o: mail_queue.h
++mail_run.o: ../../include/msg.h
++mail_run.o: ../../include/mymalloc.h
++mail_run.o: ../../include/stringops.h
++mail_run.o: ../../include/sys_defs.h
++mail_run.o: ../../include/vbuf.h
++mail_run.o: ../../include/vstring.h
++mail_run.o: mail_params.h
++mail_run.o: mail_run.c
++mail_run.o: mail_run.h
++mail_scan_dir.o: ../../include/scan_dir.h
++mail_scan_dir.o: ../../include/sys_defs.h
++mail_scan_dir.o: mail_scan_dir.c
++mail_scan_dir.o: mail_scan_dir.h
++mail_stream.o: ../../include/argv.h
++mail_stream.o: ../../include/attr.h
++mail_stream.o: ../../include/iostuff.h
++mail_stream.o: ../../include/msg.h
++mail_stream.o: ../../include/mymalloc.h
++mail_stream.o: ../../include/sane_fsops.h
++mail_stream.o: ../../include/stringops.h
++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: cleanup_user.h
++mail_stream.o: mail_params.h
++mail_stream.o: mail_proto.h
++mail_stream.o: mail_queue.h
++mail_stream.o: mail_stream.c
++mail_stream.o: mail_stream.h
++mail_stream.o: opened.h
++mail_task.o: ../../include/safe.h
++mail_task.o: ../../include/sys_defs.h
++mail_task.o: ../../include/vbuf.h
++mail_task.o: ../../include/vstring.h
++mail_task.o: mail_conf.h
++mail_task.o: mail_params.h
++mail_task.o: mail_task.c
++mail_task.o: mail_task.h
++mail_trigger.o: ../../include/attr.h
++mail_trigger.o: ../../include/iostuff.h
++mail_trigger.o: ../../include/msg.h
++mail_trigger.o: ../../include/mymalloc.h
++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: mail_params.h
++mail_trigger.o: mail_proto.h
++mail_trigger.o: mail_trigger.c
++mail_version.o: mail_version.c
++maps.o: ../../include/argv.h
++maps.o: ../../include/dict.h
++maps.o: ../../include/msg.h
++maps.o: ../../include/mymalloc.h
++maps.o: ../../include/split_at.h
++maps.o: ../../include/stringops.h
++maps.o: ../../include/sys_defs.h
++maps.o: ../../include/vbuf.h
++maps.o: ../../include/vstream.h
++maps.o: ../../include/vstring.h
++maps.o: mail_conf.h
++maps.o: maps.c
++maps.o: maps.h
++mark_corrupt.o: ../../include/attr.h
++mark_corrupt.o: ../../include/msg.h
++mark_corrupt.o: ../../include/set_eugid.h
++mark_corrupt.o: ../../include/sys_defs.h
++mark_corrupt.o: ../../include/vbuf.h
++mark_corrupt.o: ../../include/vstream.h
++mark_corrupt.o: ../../include/vstring.h
++mark_corrupt.o: deliver_request.h
++mark_corrupt.o: dsn.h
++mark_corrupt.o: mail_params.h
++mark_corrupt.o: mail_queue.h
++mark_corrupt.o: mark_corrupt.c
++mark_corrupt.o: mark_corrupt.h
++mark_corrupt.o: msg_stats.h
++mark_corrupt.o: recipient_list.h
++match_parent_style.o: ../../include/match_list.h
++match_parent_style.o: ../../include/match_ops.h
++match_parent_style.o: ../../include/sys_defs.h
++match_parent_style.o: mail_params.h
++match_parent_style.o: match_parent_style.c
++match_parent_style.o: match_parent_style.h
++match_parent_style.o: string_list.h
++match_service.o: ../../include/argv.h
++match_service.o: ../../include/msg.h
++match_service.o: ../../include/mymalloc.h
++match_service.o: ../../include/stringops.h
++match_service.o: ../../include/sys_defs.h
++match_service.o: ../../include/vbuf.h
++match_service.o: ../../include/vstring.h
++match_service.o: match_service.c
++match_service.o: match_service.h
++mbox_conf.o: ../../include/argv.h
++mbox_conf.o: ../../include/name_mask.h
++mbox_conf.o: ../../include/sys_defs.h
++mbox_conf.o: ../../include/vbuf.h
++mbox_conf.o: ../../include/vstring.h
++mbox_conf.o: mail_params.h
++mbox_conf.o: mbox_conf.c
++mbox_conf.o: mbox_conf.h
++mbox_open.o: ../../include/argv.h
++mbox_open.o: ../../include/iostuff.h
++mbox_open.o: ../../include/msg.h
++mbox_open.o: ../../include/myflock.h
++mbox_open.o: ../../include/mymalloc.h
++mbox_open.o: ../../include/safe_open.h
++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: deliver_flock.h
++mbox_open.o: dot_lockfile.h
++mbox_open.o: dsn.h
++mbox_open.o: dsn_buf.h
++mbox_open.o: mbox_conf.h
++mbox_open.o: mbox_open.c
++mbox_open.o: mbox_open.h
++mime_state.o: ../../include/msg.h
++mime_state.o: ../../include/mymalloc.h
++mime_state.o: ../../include/sys_defs.h
++mime_state.o: ../../include/vbuf.h
++mime_state.o: ../../include/vstring.h
++mime_state.o: header_opts.h
++mime_state.o: header_token.h
++mime_state.o: is_header.h
++mime_state.o: lex_822.h
++mime_state.o: mail_params.h
++mime_state.o: mime_state.c
++mime_state.o: mime_state.h
++mime_state.o: rec_type.h
++mkmap_cdb.o: ../../include/argv.h
++mkmap_cdb.o: ../../include/dict.h
++mkmap_cdb.o: ../../include/dict_cdb.h
++mkmap_cdb.o: ../../include/mymalloc.h
++mkmap_cdb.o: ../../include/sys_defs.h
++mkmap_cdb.o: ../../include/vbuf.h
++mkmap_cdb.o: ../../include/vstream.h
++mkmap_cdb.o: ../../include/vstring.h
++mkmap_cdb.o: mkmap.h
++mkmap_cdb.o: mkmap_cdb.c
++mkmap_db.o: ../../include/argv.h
++mkmap_db.o: ../../include/dict.h
++mkmap_db.o: ../../include/dict_db.h
++mkmap_db.o: ../../include/msg.h
++mkmap_db.o: ../../include/myflock.h
++mkmap_db.o: ../../include/mymalloc.h
++mkmap_db.o: ../../include/stringops.h
++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: mail_params.h
++mkmap_db.o: mkmap.h
++mkmap_db.o: mkmap_db.c
++mkmap_dbm.o: ../../include/argv.h
++mkmap_dbm.o: ../../include/dict.h
++mkmap_dbm.o: ../../include/dict_dbm.h
++mkmap_dbm.o: ../../include/msg.h
++mkmap_dbm.o: ../../include/myflock.h
++mkmap_dbm.o: ../../include/mymalloc.h
++mkmap_dbm.o: ../../include/stringops.h
++mkmap_dbm.o: ../../include/sys_defs.h
++mkmap_dbm.o: ../../include/vbuf.h
++mkmap_dbm.o: ../../include/vstream.h
++mkmap_dbm.o: ../../include/vstring.h
++mkmap_dbm.o: mkmap.h
++mkmap_dbm.o: mkmap_dbm.c
++mkmap_open.o: ../../include/argv.h
++mkmap_open.o: ../../include/dict.h
++mkmap_open.o: ../../include/dict_cdb.h
++mkmap_open.o: ../../include/dict_db.h
++mkmap_open.o: ../../include/dict_dbm.h
++mkmap_open.o: ../../include/dict_sdbm.h
++mkmap_open.o: ../../include/msg.h
++mkmap_open.o: ../../include/mymalloc.h
++mkmap_open.o: ../../include/sigdelay.h
++mkmap_open.o: ../../include/sys_defs.h
++mkmap_open.o: ../../include/vbuf.h
++mkmap_open.o: ../../include/vstream.h
++mkmap_open.o: ../../include/vstring.h
++mkmap_open.o: dict_proxy.h
++mkmap_open.o: mkmap.h
++mkmap_open.o: mkmap_open.c
++mkmap_proxy.o: ../../include/argv.h
++mkmap_proxy.o: ../../include/dict.h
++mkmap_proxy.o: ../../include/mymalloc.h
++mkmap_proxy.o: ../../include/sys_defs.h
++mkmap_proxy.o: ../../include/vbuf.h
++mkmap_proxy.o: ../../include/vstream.h
++mkmap_proxy.o: ../../include/vstring.h
++mkmap_proxy.o: dict_proxy.h
++mkmap_proxy.o: mkmap.h
++mkmap_proxy.o: mkmap_proxy.c
++mkmap_sdbm.o: ../../include/argv.h
++mkmap_sdbm.o: ../../include/dict.h
++mkmap_sdbm.o: ../../include/dict_sdbm.h
++mkmap_sdbm.o: ../../include/msg.h
++mkmap_sdbm.o: ../../include/myflock.h
++mkmap_sdbm.o: ../../include/mymalloc.h
++mkmap_sdbm.o: ../../include/stringops.h
++mkmap_sdbm.o: ../../include/sys_defs.h
++mkmap_sdbm.o: ../../include/vbuf.h
++mkmap_sdbm.o: ../../include/vstream.h
++mkmap_sdbm.o: ../../include/vstring.h
++mkmap_sdbm.o: mkmap.h
++mkmap_sdbm.o: mkmap_sdbm.c
++msg_stats_print.o: ../../include/attr.h
++msg_stats_print.o: ../../include/iostuff.h
++msg_stats_print.o: ../../include/sys_defs.h
++msg_stats_print.o: ../../include/vbuf.h
++msg_stats_print.o: ../../include/vstream.h
++msg_stats_print.o: mail_proto.h
++msg_stats_print.o: msg_stats.h
++msg_stats_print.o: msg_stats_print.c
++msg_stats_scan.o: ../../include/attr.h
++msg_stats_scan.o: ../../include/iostuff.h
++msg_stats_scan.o: ../../include/msg.h
++msg_stats_scan.o: ../../include/sys_defs.h
++msg_stats_scan.o: ../../include/vbuf.h
++msg_stats_scan.o: ../../include/vstream.h
++msg_stats_scan.o: ../../include/vstring.h
++msg_stats_scan.o: mail_proto.h
++msg_stats_scan.o: msg_stats.h
++msg_stats_scan.o: msg_stats_scan.c
++mynetworks.o: ../../include/argv.h
++mynetworks.o: ../../include/inet_addr_list.h
++mynetworks.o: ../../include/mask_addr.h
++mynetworks.o: ../../include/msg.h
++mynetworks.o: ../../include/myaddrinfo.h
++mynetworks.o: ../../include/name_mask.h
++mynetworks.o: ../../include/sock_addr.h
++mynetworks.o: ../../include/sys_defs.h
++mynetworks.o: ../../include/vbuf.h
++mynetworks.o: ../../include/vstring.h
++mynetworks.o: been_here.h
++mynetworks.o: mail_params.h
++mynetworks.o: mynetworks.c
++mynetworks.o: mynetworks.h
++mynetworks.o: own_inet_addr.h
++mypwd.o: ../../include/binhash.h
++mypwd.o: ../../include/htable.h
++mypwd.o: ../../include/msg.h
++mypwd.o: ../../include/mymalloc.h
++mypwd.o: ../../include/sys_defs.h
++mypwd.o: mypwd.c
++mypwd.o: mypwd.h
++namadr_list.o: ../../include/match_list.h
++namadr_list.o: ../../include/match_ops.h
++namadr_list.o: ../../include/sys_defs.h
++namadr_list.o: namadr_list.c
++namadr_list.o: namadr_list.h
++off_cvt.o: ../../include/msg.h
++off_cvt.o: ../../include/sys_defs.h
++off_cvt.o: ../../include/vbuf.h
++off_cvt.o: ../../include/vstring.h
++off_cvt.o: off_cvt.c
++off_cvt.o: off_cvt.h
++opened.o: ../../include/msg.h
++opened.o: ../../include/sys_defs.h
++opened.o: ../../include/vbuf.h
++opened.o: ../../include/vstring.h
++opened.o: opened.c
++opened.o: opened.h
++own_inet_addr.o: ../../include/inet_addr_host.h
++own_inet_addr.o: ../../include/inet_addr_list.h
++own_inet_addr.o: ../../include/inet_addr_local.h
++own_inet_addr.o: ../../include/inet_proto.h
++own_inet_addr.o: ../../include/msg.h
++own_inet_addr.o: ../../include/myaddrinfo.h
++own_inet_addr.o: ../../include/mymalloc.h
++own_inet_addr.o: ../../include/sock_addr.h
++own_inet_addr.o: ../../include/stringops.h
++own_inet_addr.o: ../../include/sys_defs.h
++own_inet_addr.o: ../../include/vbuf.h
++own_inet_addr.o: ../../include/vstring.h
++own_inet_addr.o: mail_params.h
++own_inet_addr.o: own_inet_addr.c
++own_inet_addr.o: own_inet_addr.h
++pipe_command.o: ../../include/argv.h
++pipe_command.o: ../../include/chroot_uid.h
++pipe_command.o: ../../include/clean_env.h
++pipe_command.o: ../../include/exec_command.h
++pipe_command.o: ../../include/iostuff.h
++pipe_command.o: ../../include/msg.h
++pipe_command.o: ../../include/msg_vstream.h
++pipe_command.o: ../../include/set_eugid.h
++pipe_command.o: ../../include/set_ugid.h
++pipe_command.o: ../../include/stringops.h
++pipe_command.o: ../../include/sys_defs.h
++pipe_command.o: ../../include/timed_wait.h
++pipe_command.o: ../../include/vbuf.h
++pipe_command.o: ../../include/vstream.h
++pipe_command.o: ../../include/vstring.h
++pipe_command.o: dsn.h
++pipe_command.o: dsn_buf.h
++pipe_command.o: dsn_util.h
++pipe_command.o: mail_copy.h
++pipe_command.o: mail_params.h
++pipe_command.o: pipe_command.c
++pipe_command.o: pipe_command.h
++pipe_command.o: sys_exits.h
++post_mail.o: ../../include/attr.h
++post_mail.o: ../../include/events.h
++post_mail.o: ../../include/iostuff.h
++post_mail.o: ../../include/msg.h
++post_mail.o: ../../include/mymalloc.h
++post_mail.o: ../../include/sys_defs.h
++post_mail.o: ../../include/vbuf.h
++post_mail.o: ../../include/vstream.h
++post_mail.o: ../../include/vstring.h
++post_mail.o: cleanup_user.h
++post_mail.o: int_filt.h
++post_mail.o: mail_date.h
++post_mail.o: mail_params.h
++post_mail.o: mail_proto.h
++post_mail.o: post_mail.c
++post_mail.o: post_mail.h
++post_mail.o: rec_type.h
++post_mail.o: record.h
++quote_821_local.o: ../../include/sys_defs.h
++quote_821_local.o: ../../include/vbuf.h
++quote_821_local.o: ../../include/vstring.h
++quote_821_local.o: quote_821_local.c
++quote_821_local.o: quote_821_local.h
++quote_821_local.o: quote_flags.h
++quote_822_local.o: ../../include/sys_defs.h
++quote_822_local.o: ../../include/vbuf.h
++quote_822_local.o: ../../include/vstring.h
++quote_822_local.o: quote_822_local.c
++quote_822_local.o: quote_822_local.h
++quote_822_local.o: quote_flags.h
++rcpt_buf.o: ../../include/attr.h
++rcpt_buf.o: ../../include/iostuff.h
++rcpt_buf.o: ../../include/mymalloc.h
++rcpt_buf.o: ../../include/sys_defs.h
++rcpt_buf.o: ../../include/vbuf.h
++rcpt_buf.o: ../../include/vstream.h
++rcpt_buf.o: ../../include/vstring.h
++rcpt_buf.o: mail_proto.h
++rcpt_buf.o: rcpt_buf.c
++rcpt_buf.o: rcpt_buf.h
++rcpt_buf.o: recipient_list.h
++rcpt_print.o: ../../include/attr.h
++rcpt_print.o: ../../include/iostuff.h
++rcpt_print.o: ../../include/sys_defs.h
++rcpt_print.o: ../../include/vbuf.h
++rcpt_print.o: ../../include/vstream.h
++rcpt_print.o: mail_proto.h
++rcpt_print.o: rcpt_print.c
++rcpt_print.o: rcpt_print.h
++rcpt_print.o: recipient_list.h
++rec2stream.o: ../../include/sys_defs.h
++rec2stream.o: ../../include/vbuf.h
++rec2stream.o: ../../include/vstream.h
++rec2stream.o: ../../include/vstring.h
++rec2stream.o: rec2stream.c
++rec2stream.o: rec_streamlf.h
++rec2stream.o: rec_type.h
++rec2stream.o: record.h
++rec_attr_map.o: ../../include/attr.h
++rec_attr_map.o: ../../include/iostuff.h
++rec_attr_map.o: ../../include/sys_defs.h
++rec_attr_map.o: ../../include/vbuf.h
++rec_attr_map.o: ../../include/vstream.h
++rec_attr_map.o: mail_proto.h
++rec_attr_map.o: rec_attr_map.c
++rec_attr_map.o: rec_attr_map.h
++rec_attr_map.o: rec_type.h
++rec_streamlf.o: ../../include/sys_defs.h
++rec_streamlf.o: ../../include/vbuf.h
++rec_streamlf.o: ../../include/vstream.h
++rec_streamlf.o: ../../include/vstring.h
++rec_streamlf.o: rec_streamlf.c
++rec_streamlf.o: rec_streamlf.h
++rec_streamlf.o: rec_type.h
++rec_streamlf.o: record.h
++rec_type.o: rec_type.c
++rec_type.o: rec_type.h
++recdump.o: ../../include/msg_vstream.h
++recdump.o: ../../include/sys_defs.h
++recdump.o: ../../include/vbuf.h
++recdump.o: ../../include/vstream.h
++recdump.o: ../../include/vstring.h
++recdump.o: rec_streamlf.h
++recdump.o: rec_type.h
++recdump.o: recdump.c
++recdump.o: record.h
++recipient_list.o: ../../include/msg.h
++recipient_list.o: ../../include/mymalloc.h
++recipient_list.o: ../../include/sys_defs.h
++recipient_list.o: recipient_list.c
++recipient_list.o: recipient_list.h
++record.o: ../../include/msg.h
++record.o: ../../include/mymalloc.h
++record.o: ../../include/stringops.h
++record.o: ../../include/sys_defs.h
++record.o: ../../include/vbuf.h
++record.o: ../../include/vstream.h
++record.o: ../../include/vstring.h
++record.o: off_cvt.h
++record.o: rec_type.h
++record.o: record.c
++record.o: record.h
++remove.o: ../../include/sys_defs.h
++remove.o: ../../include/vbuf.h
++remove.o: ../../include/vstring.h
++remove.o: mail_params.h
++remove.o: remove.c
++resolve_clnt.o: ../../include/attr.h
++resolve_clnt.o: ../../include/events.h
++resolve_clnt.o: ../../include/iostuff.h
++resolve_clnt.o: ../../include/msg.h
++resolve_clnt.o: ../../include/sys_defs.h
++resolve_clnt.o: ../../include/vbuf.h
++resolve_clnt.o: ../../include/vstream.h
++resolve_clnt.o: ../../include/vstring.h
++resolve_clnt.o: ../../include/vstring_vstream.h
++resolve_clnt.o: clnt_stream.h
++resolve_clnt.o: mail_params.h
++resolve_clnt.o: mail_proto.h
++resolve_clnt.o: resolve_clnt.c
++resolve_clnt.o: resolve_clnt.h
++resolve_local.o: ../../include/inet_addr_list.h
++resolve_local.o: ../../include/match_list.h
++resolve_local.o: ../../include/match_ops.h
++resolve_local.o: ../../include/msg.h
++resolve_local.o: ../../include/myaddrinfo.h
++resolve_local.o: ../../include/mymalloc.h
++resolve_local.o: ../../include/sys_defs.h
++resolve_local.o: ../../include/valid_hostname.h
++resolve_local.o: mail_params.h
++resolve_local.o: own_inet_addr.h
++resolve_local.o: resolve_local.c
++resolve_local.o: resolve_local.h
++resolve_local.o: string_list.h
++resolve_local.o: valid_mailhost_addr.h
++rewrite_clnt.o: ../../include/attr.h
++rewrite_clnt.o: ../../include/events.h
++rewrite_clnt.o: ../../include/iostuff.h
++rewrite_clnt.o: ../../include/msg.h
++rewrite_clnt.o: ../../include/sys_defs.h
++rewrite_clnt.o: ../../include/vbuf.h
++rewrite_clnt.o: ../../include/vstream.h
++rewrite_clnt.o: ../../include/vstring.h
++rewrite_clnt.o: ../../include/vstring_vstream.h
++rewrite_clnt.o: clnt_stream.h
++rewrite_clnt.o: mail_params.h
++rewrite_clnt.o: mail_proto.h
++rewrite_clnt.o: quote_822_local.h
++rewrite_clnt.o: quote_flags.h
++rewrite_clnt.o: rewrite_clnt.c
++rewrite_clnt.o: rewrite_clnt.h
++scache.o: ../../include/argv.h
++scache.o: ../../include/events.h
++scache.o: ../../include/msg.h
++scache.o: ../../include/sys_defs.h
++scache.o: ../../include/vbuf.h
++scache.o: ../../include/vstream.h
++scache.o: ../../include/vstring.h
++scache.o: ../../include/vstring_vstream.h
++scache.o: scache.c
++scache.o: scache.h
++scache_clnt.o: ../../include/attr.h
++scache_clnt.o: ../../include/auto_clnt.h
++scache_clnt.o: ../../include/iostuff.h
++scache_clnt.o: ../../include/msg.h
++scache_clnt.o: ../../include/mymalloc.h
++scache_clnt.o: ../../include/stringops.h
++scache_clnt.o: ../../include/sys_defs.h
++scache_clnt.o: ../../include/vbuf.h
++scache_clnt.o: ../../include/vstream.h
++scache_clnt.o: ../../include/vstring.h
++scache_clnt.o: mail_params.h
++scache_clnt.o: mail_proto.h
++scache_clnt.o: scache.h
++scache_clnt.o: scache_clnt.c
++scache_multi.o: ../../include/events.h
++scache_multi.o: ../../include/htable.h
++scache_multi.o: ../../include/msg.h
++scache_multi.o: ../../include/mymalloc.h
++scache_multi.o: ../../include/ring.h
++scache_multi.o: ../../include/sys_defs.h
++scache_multi.o: ../../include/vbuf.h
++scache_multi.o: ../../include/vstring.h
++scache_multi.o: scache.h
++scache_multi.o: scache_multi.c
++scache_single.o: ../../include/events.h
++scache_single.o: ../../include/msg.h
++scache_single.o: ../../include/mymalloc.h
++scache_single.o: ../../include/sys_defs.h
++scache_single.o: ../../include/vbuf.h
++scache_single.o: ../../include/vstring.h
++scache_single.o: scache.h
++scache_single.o: scache_single.c
++sent.o: ../../include/attr.h
++sent.o: ../../include/msg.h
++sent.o: ../../include/sys_defs.h
++sent.o: ../../include/vbuf.h
++sent.o: ../../include/vstream.h
++sent.o: ../../include/vstring.h
++sent.o: bounce.h
++sent.o: defer.h
++sent.o: deliver_request.h
++sent.o: dsn.h
++sent.o: dsn_buf.h
++sent.o: dsn_mask.h
++sent.o: dsn_util.h
++sent.o: log_adhoc.h
++sent.o: mail_params.h
++sent.o: msg_stats.h
++sent.o: recipient_list.h
++sent.o: sent.c
++sent.o: sent.h
++sent.o: trace.h
++sent.o: verify.h
++smtp_stream.o: ../../include/iostuff.h
++smtp_stream.o: ../../include/msg.h
++smtp_stream.o: ../../include/sys_defs.h
++smtp_stream.o: ../../include/vbuf.h
++smtp_stream.o: ../../include/vstream.h
++smtp_stream.o: ../../include/vstring.h
++smtp_stream.o: ../../include/vstring_vstream.h
++smtp_stream.o: smtp_stream.c
++smtp_stream.o: smtp_stream.h
++split_addr.o: ../../include/split_at.h
++split_addr.o: ../../include/sys_defs.h
++split_addr.o: mail_addr.h
++split_addr.o: mail_params.h
++split_addr.o: split_addr.c
++split_addr.o: split_addr.h
++stream2rec.o: ../../include/sys_defs.h
++stream2rec.o: ../../include/vbuf.h
++stream2rec.o: ../../include/vstream.h
++stream2rec.o: ../../include/vstring.h
++stream2rec.o: rec_streamlf.h
++stream2rec.o: rec_type.h
++stream2rec.o: record.h
++stream2rec.o: stream2rec.c
++string_list.o: ../../include/match_list.h
++string_list.o: ../../include/match_ops.h
++string_list.o: ../../include/sys_defs.h
++string_list.o: string_list.c
++string_list.o: string_list.h
++strip_addr.o: ../../include/mymalloc.h
++strip_addr.o: ../../include/sys_defs.h
++strip_addr.o: split_addr.h
++strip_addr.o: strip_addr.c
++strip_addr.o: strip_addr.h
++sys_exits.o: ../../include/msg.h
++sys_exits.o: ../../include/sys_defs.h
++sys_exits.o: ../../include/vbuf.h
++sys_exits.o: ../../include/vstring.h
++sys_exits.o: sys_exits.c
++sys_exits.o: sys_exits.h
++timed_ipc.o: ../../include/msg.h
++timed_ipc.o: ../../include/sys_defs.h
++timed_ipc.o: ../../include/vbuf.h
++timed_ipc.o: ../../include/vstream.h
++timed_ipc.o: mail_params.h
++timed_ipc.o: timed_ipc.c
++timed_ipc.o: timed_ipc.h
++tok822_find.o: ../../include/sys_defs.h
++tok822_find.o: ../../include/vbuf.h
++tok822_find.o: ../../include/vstring.h
++tok822_find.o: resolve_clnt.h
++tok822_find.o: tok822.h
++tok822_find.o: tok822_find.c
++tok822_node.o: ../../include/mymalloc.h
++tok822_node.o: ../../include/sys_defs.h
++tok822_node.o: ../../include/vbuf.h
++tok822_node.o: ../../include/vstring.h
++tok822_node.o: resolve_clnt.h
++tok822_node.o: tok822.h
++tok822_node.o: tok822_node.c
++tok822_parse.o: ../../include/msg.h
++tok822_parse.o: ../../include/stringops.h
++tok822_parse.o: ../../include/sys_defs.h
++tok822_parse.o: ../../include/vbuf.h
++tok822_parse.o: ../../include/vstring.h
++tok822_parse.o: lex_822.h
++tok822_parse.o: quote_822_local.h
++tok822_parse.o: quote_flags.h
++tok822_parse.o: resolve_clnt.h
++tok822_parse.o: tok822.h
++tok822_parse.o: tok822_parse.c
++tok822_resolve.o: ../../include/msg.h
++tok822_resolve.o: ../../include/sys_defs.h
++tok822_resolve.o: ../../include/vbuf.h
++tok822_resolve.o: ../../include/vstring.h
++tok822_resolve.o: resolve_clnt.h
++tok822_resolve.o: tok822.h
++tok822_resolve.o: tok822_resolve.c
++tok822_rewrite.o: ../../include/attr.h
++tok822_rewrite.o: ../../include/iostuff.h
++tok822_rewrite.o: ../../include/msg.h
++tok822_rewrite.o: ../../include/sys_defs.h
++tok822_rewrite.o: ../../include/vbuf.h
++tok822_rewrite.o: ../../include/vstream.h
++tok822_rewrite.o: ../../include/vstring.h
++tok822_rewrite.o: mail_proto.h
++tok822_rewrite.o: resolve_clnt.h
++tok822_rewrite.o: rewrite_clnt.h
++tok822_rewrite.o: tok822.h
++tok822_rewrite.o: tok822_rewrite.c
++tok822_tree.o: ../../include/mymalloc.h
++tok822_tree.o: ../../include/sys_defs.h
++tok822_tree.o: ../../include/vbuf.h
++tok822_tree.o: ../../include/vstring.h
++tok822_tree.o: resolve_clnt.h
++tok822_tree.o: tok822.h
++tok822_tree.o: tok822_tree.c
++trace.o: ../../include/attr.h
++trace.o: ../../include/iostuff.h
++trace.o: ../../include/msg.h
++trace.o: ../../include/sys_defs.h
++trace.o: ../../include/vbuf.h
++trace.o: ../../include/vstream.h
++trace.o: ../../include/vstring.h
++trace.o: bounce.h
++trace.o: deliver_request.h
++trace.o: dsn.h
++trace.o: dsn_buf.h
++trace.o: dsn_print.h
++trace.o: log_adhoc.h
++trace.o: mail_params.h
++trace.o: mail_proto.h
++trace.o: msg_stats.h
++trace.o: rcpt_print.h
++trace.o: recipient_list.h
++trace.o: trace.c
++trace.o: trace.h
++user_acl.o: ../../include/match_list.h
++user_acl.o: ../../include/match_ops.h
++user_acl.o: ../../include/sys_defs.h
++user_acl.o: ../../include/vbuf.h
++user_acl.o: ../../include/vstring.h
++user_acl.o: mail_params.h
++user_acl.o: mypwd.h
++user_acl.o: string_list.h
++user_acl.o: user_acl.c
++user_acl.o: user_acl.h
++valid_mailhost_addr.o: ../../include/msg.h
++valid_mailhost_addr.o: ../../include/myaddrinfo.h
++valid_mailhost_addr.o: ../../include/sys_defs.h
++valid_mailhost_addr.o: ../../include/valid_hostname.h
++valid_mailhost_addr.o: valid_mailhost_addr.c
++valid_mailhost_addr.o: valid_mailhost_addr.h
++verify.o: ../../include/attr.h
++verify.o: ../../include/iostuff.h
++verify.o: ../../include/msg.h
++verify.o: ../../include/sys_defs.h
++verify.o: ../../include/vbuf.h
++verify.o: ../../include/vstream.h
++verify.o: ../../include/vstring.h
++verify.o: deliver_request.h
++verify.o: dsn.h
++verify.o: log_adhoc.h
++verify.o: mail_params.h
++verify.o: mail_proto.h
++verify.o: msg_stats.h
++verify.o: recipient_list.h
++verify.o: verify.c
++verify.o: verify.h
++verify.o: verify_clnt.h
++verify_clnt.o: ../../include/attr.h
++verify_clnt.o: ../../include/iostuff.h
++verify_clnt.o: ../../include/msg.h
++verify_clnt.o: ../../include/sys_defs.h
++verify_clnt.o: ../../include/vbuf.h
++verify_clnt.o: ../../include/vstream.h
++verify_clnt.o: ../../include/vstring.h
++verify_clnt.o: clnt_stream.h
++verify_clnt.o: deliver_request.h
++verify_clnt.o: dsn.h
++verify_clnt.o: mail_params.h
++verify_clnt.o: mail_proto.h
++verify_clnt.o: msg_stats.h
++verify_clnt.o: recipient_list.h
++verify_clnt.o: verify_clnt.c
++verify_clnt.o: verify_clnt.h
++verp_sender.o: ../../include/sys_defs.h
++verp_sender.o: ../../include/vbuf.h
++verp_sender.o: ../../include/vstring.h
++verp_sender.o: mail_params.h
++verp_sender.o: recipient_list.h
++verp_sender.o: verp_sender.c
++verp_sender.o: verp_sender.h
++wildcard_inet_addr.o: ../../include/inet_addr_host.h
++wildcard_inet_addr.o: ../../include/inet_addr_list.h
++wildcard_inet_addr.o: ../../include/msg.h
++wildcard_inet_addr.o: ../../include/myaddrinfo.h
++wildcard_inet_addr.o: ../../include/sys_defs.h
++wildcard_inet_addr.o: wildcard_inet_addr.c
++wildcard_inet_addr.o: wildcard_inet_addr.h
++xtext.o: ../../include/msg.h
++xtext.o: ../../include/sys_defs.h
++xtext.o: ../../include/vbuf.h
++xtext.o: ../../include/vstring.h
++xtext.o: xtext.c
++xtext.o: xtext.h
+diff -ruN a/src/global/mail_conf.c b/src/global/mail_conf.c
+--- a/src/global/mail_conf.c	2009-06-01 12:27:43.000000000 +0000
++++ b/src/global/mail_conf.c	2009-06-01 13:08:26.000000000 +0000
+@@ -182,6 +182,13 @@
+     path = concatenate(var_config_dir, "/", "main.cf", (char *) 0);
+     dict_load_file(CONFIG_DICT, path);
+     myfree(path);
++
++#ifndef NO_DYNAMIC_MAPS
++    path = concatenate(var_config_dir, "/", "dynamicmaps.cf", (char *) 0);
++    dict_open_dlinfo(path);
++    myfree(path);
++#endif
++
+ }
+ 
+ /* mail_conf_flush - discard configuration dictionary */
+diff -ruN a/src/global/mail_conf.c.orig b/src/global/mail_conf.c.orig
+--- a/src/global/mail_conf.c.orig	1970-01-01 00:00:00.000000000 +0000
++++ b/src/global/mail_conf.c.orig	2009-06-01 13:07:56.000000000 +0000
+@@ -0,0 +1,229 @@
++/*++
++/* NAME
++/*	mail_conf 3
++/* SUMMARY
++/*	global configuration parameter management
++/* SYNOPSIS
++/*	#include <mail_conf.h>
++/*
++/*	void	mail_conf_read()
++/*
++/*	void	mail_conf_suck()
++/*
++/*	void	mail_conf_flush()
++/*
++/*	void	mail_conf_update(name, value)
++/*	const char *name;
++/*	const char *value;
++/*
++/*	const char *mail_conf_lookup(name)
++/*	const char *name;
++/*
++/*	const char *mail_conf_eval(string)
++/*	const char *string;
++/*
++/*	const char *mail_conf_lookup_eval(name)
++/*	const char *name;
++/* DESCRIPTION
++/*	mail_conf_suck() reads the global Postfix configuration file, and
++/*	stores its values into a global configuration dictionary.
++/*
++/*	mail_conf_read() invokes mail_conf_suck() and assigns the values
++/*	to global variables by calling mail_params_init().
++/*
++/*	mail_conf_flush() discards the global configuration dictionary.
++/*	This is needed in programs that read main.cf multiple times, to
++/*	ensure that deleted parameter settings are handled properly.
++/*
++/*	The following routines are wrappers around the generic dictionary
++/*	access routines.
++/*
++/*	mail_conf_update() updates the named global parameter. This has
++/*	no effect on parameters whose value has already been looked up.
++/*	The update succeeds or the program terminates with fatal error.
++/*
++/*	mail_conf_lookup() looks up the value of the named parameter.
++/*	A null pointer result means the parameter was not found.
++/*	The result is volatile and should be copied if it is to be
++/*	used for any appreciable amount of time.
++/*
++/*	mail_conf_eval() recursively expands any $parameters in the
++/*	string argument. The result is volatile and should be copied
++/*	if it is to be used for any appreciable amount of time.
++/*
++/*	mail_conf_lookup_eval() looks up the named parameter, and expands any
++/*	$parameters in the result. The result is volatile and should be
++/*	copied if it is to be used for any appreciable amount of time.
++/* DIAGNOSTICS
++/*	Fatal errors: malformed numerical value.
++/* ENVIRONMENT
++/*	MAIL_CONFIG, non-default configuration database
++/*	MAIL_VERBOSE, enable verbose mode
++/* FILES
++/*	/etc/postfix: default Postfix configuration directory.
++/* SEE ALSO
++/*	dict(3) generic dictionary manager
++/*	mail_conf_int(3) integer-valued parameters
++/*	mail_conf_str(3) string-valued parameters
++/* 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 <unistd.h>
++#include <stdlib.h>
++#include <string.h>
++
++/* Utility library. */
++
++#include <msg.h>
++#include <mymalloc.h>
++#include <vstream.h>
++#include <vstring.h>
++#include <dict.h>
++#include <safe.h>
++#include <stringops.h>
++#include <readlline.h>
++
++/* Global library. */
++
++#include "mail_params.h"
++#include "mail_conf.h"
++
++/* mail_conf_checkdir - authorize non-default directory */
++
++static void mail_conf_checkdir(const char *config_dir)
++{
++    VSTRING *buf;
++    VSTREAM *fp;
++    char   *path;
++    char   *name;
++    char   *value;
++    char   *cp;
++    int     found = 0;
++
++    /*
++     * If running set-[ug]id, require that a non-default configuration
++     * directory name is blessed as a bona fide configuration directory in
++     * the default main.cf file.
++     */
++    path = concatenate(DEF_CONFIG_DIR, "/", "main.cf", (char *) 0);
++    if ((fp = vstream_fopen(path, O_RDONLY, 0)) == 0)
++	msg_fatal("open file %s: %m", path);
++
++    buf = vstring_alloc(1);
++    while (found == 0 && readlline(buf, fp, (int *) 0)) {
++	if (split_nameval(vstring_str(buf), &name, &value) == 0
++	    && (strcmp(name, VAR_CONFIG_DIRS) == 0
++		|| strcmp(name, VAR_MULTI_CONF_DIRS) == 0)) {
++	    while (found == 0 && (cp = mystrtok(&value, ", \t\r\n")) != 0)
++		if (strcmp(cp, config_dir) == 0)
++		    found = 1;
++	}
++    }
++    if (vstream_fclose(fp))
++	msg_fatal("read file %s: %m", path);
++    vstring_free(buf);
++
++    if (found == 0) {
++	msg_error("untrusted configuration directory name: %s", config_dir);
++	msg_fatal("specify \"%s = %s\" in %s",
++		  VAR_CONFIG_DIRS, config_dir, path);
++    }
++    myfree(path);
++}
++
++/* mail_conf_read - read global configuration file */
++
++void    mail_conf_read(void)
++{
++    mail_conf_suck();
++    mail_params_init();
++}
++
++/* mail_conf_suck - suck in the global configuration file */
++
++void    mail_conf_suck(void)
++{
++    char   *config_dir;
++    char   *path;
++
++    /*
++     * Permit references to unknown configuration variable names. We rely on
++     * a separate configuration checking tool to spot misspelled names and
++     * other kinds of trouble. Enter the configuration directory into the
++     * default dictionary.
++     */
++    dict_unknown_allowed = 1;
++    if (var_config_dir)
++	myfree(var_config_dir);
++    if ((config_dir = getenv(CONF_ENV_PATH)) == 0)
++	config_dir = DEF_CONFIG_DIR;
++    var_config_dir = mystrdup(config_dir);
++    set_mail_conf_str(VAR_CONFIG_DIR, var_config_dir);
++
++    /*
++     * If the configuration directory name comes from a different trust
++     * domain, require that it is listed in the default main.cf file.
++     */
++    if (strcmp(var_config_dir, DEF_CONFIG_DIR) != 0	/* non-default */
++	&& safe_getenv(CONF_ENV_PATH) == 0	/* non-default */
++	&& geteuid() != 0)			/* untrusted */
++	mail_conf_checkdir(var_config_dir);
++    path = concatenate(var_config_dir, "/", "main.cf", (char *) 0);
++    dict_load_file(CONFIG_DICT, path);
++    myfree(path);
++}
++
++/* mail_conf_flush - discard configuration dictionary */
++
++void mail_conf_flush(void)
++{
++    if (dict_handle(CONFIG_DICT) != 0)
++        dict_unregister(CONFIG_DICT);
++}
++
++/* mail_conf_eval - expand macros in string */
++
++const char *mail_conf_eval(const char *string)
++{
++#define RECURSIVE	1
++
++    return (dict_eval(CONFIG_DICT, string, RECURSIVE));
++}
++
++/* mail_conf_lookup - lookup named variable */
++
++const char *mail_conf_lookup(const char *name)
++{
++    return (dict_lookup(CONFIG_DICT, name));
++}
++
++/* mail_conf_lookup_eval - expand named variable */
++
++const char *mail_conf_lookup_eval(const char *name)
++{
++    const char *value;
++
++#define RECURSIVE	1
++
++    if ((value = dict_lookup(CONFIG_DICT, name)) != 0)
++	value = dict_eval(CONFIG_DICT, value, RECURSIVE);
++    return (value);
++}
++
++/* mail_conf_update - update parameter */
++
++void    mail_conf_update(const char *key, const char *value)
++{
++    dict_update(CONFIG_DICT, key, value);
++}
+diff -ruN a/src/global/mail_dict.c b/src/global/mail_dict.c
+--- a/src/global/mail_dict.c	2009-06-01 12:27:43.000000000 +0000
++++ b/src/global/mail_dict.c	2009-06-01 13:08:26.000000000 +0000
+@@ -45,6 +45,7 @@
+ 
+ static const DICT_OPEN_INFO dict_open_info[] = {
+     DICT_TYPE_PROXY, dict_proxy_open,
++#ifdef NO_DYNAMIC_MAPS
+ #ifdef HAS_LDAP
+     DICT_TYPE_LDAP, dict_ldap_open,
+ #endif
+@@ -54,6 +55,7 @@
+ #ifdef HAS_PGSQL
+     DICT_TYPE_PGSQL, dict_pgsql_open,
+ #endif
++#endif /* NO_DYNAMIC_MAPS */
+     0,
+ };
+ 
+diff -ruN a/src/global/mail_params.c b/src/global/mail_params.c
+--- a/src/global/mail_params.c	2009-06-01 12:27:43.000000000 +0000
++++ b/src/global/mail_params.c	2009-06-01 13:08:26.000000000 +0000
+@@ -79,6 +79,7 @@
+ /*	char	*var_export_environ;
+ /*	char	*var_debug_peer_list;
+ /*	int	var_debug_peer_level;
++/*	int	var_command_maxtime;
+ /*	int	var_in_flow_delay;
+ /*	int	var_fault_inj_code;
+ /*	char   *var_bounce_service;
+@@ -265,6 +266,7 @@
+ char   *var_export_environ;
+ char   *var_debug_peer_list;
+ int     var_debug_peer_level;
++int	var_command_maxtime;
+ int     var_fault_inj_code;
+ char   *var_bounce_service;
+ char   *var_cleanup_service;
+@@ -276,6 +278,7 @@
+ char   *var_error_service;
+ char   *var_flush_service;
+ char   *var_verify_service;
++char   *var_scache_service;
+ char   *var_trace_service;
+ char   *var_proxymap_service;
+ char   *var_proxywrite_service;
+diff -ruN a/src/global/mail_params.c.orig b/src/global/mail_params.c.orig
+--- a/src/global/mail_params.c.orig	1970-01-01 00:00:00.000000000 +0000
++++ b/src/global/mail_params.c.orig	2009-06-01 13:07:56.000000000 +0000
+@@ -0,0 +1,752 @@
++/*++
++/* NAME
++/*	mail_params 3
++/* SUMMARY
++/*	global mail configuration parameters
++/* SYNOPSIS
++/*	#include <mail_params.h>
++/*
++/*	char	*var_myhostname;
++/*	char	*var_mydomain;
++/*	char	*var_myorigin;
++/*	char	*var_mydest;
++/*	char	*var_relayhost;
++/*	char	*var_transit_origin;
++/*	char	*var_transit_dest;
++/*	char	*var_mail_name;
++/*	int	var_helpful_warnings;
++/*	char	*var_syslog_name;
++/*	char	*var_mail_owner;
++/*	uid_t	var_owner_uid;
++/*	gid_t	var_owner_gid;
++/*	char	*var_sgid_group;
++/*	gid_t	var_sgid_gid;
++/*	char	*var_default_privs;
++/*	uid_t	var_default_uid;
++/*	gid_t	var_default_gid;
++/*	char	*var_config_dir;
++/*	char	*var_daemon_dir;
++/*	char	*var_data_dir;
++/*	char	*var_command_dir;
++/*	char	*var_queue_dir;
++/*	int	var_use_limit;
++/*	int	var_idle_limit;
++/*	int	var_event_drain;
++/*	int	var_bundle_rcpt;
++/*	char	*var_procname;
++/*	int	var_pid;
++/*	int	var_ipc_timeout;
++/*	char	*var_pid_dir;
++/*	int	var_dont_remove;
++/*	char	*var_inet_interfaces;
++/*	char	*var_proxy_interfaces;
++/*	char	*var_inet_protocols;
++/*	char	*var_mynetworks;
++/*	char	*var_double_bounce_sender;
++/*	int	var_line_limit;
++/*	char	*var_alias_db_map;
++/*	int	var_message_limit;
++/*	char	*var_mail_release;
++/*	char	*var_mail_version;
++/*	int	var_ipc_idle_limit;
++/*	int	var_ipc_ttl_limit;
++/*	char	*var_db_type;
++/*	char	*var_hash_queue_names;
++/*	int	var_hash_queue_depth;
++/*	int	var_trigger_timeout;
++/*	char	*var_rcpt_delim;
++/*	int	var_fork_tries;
++/*	int	var_fork_delay;
++/*	int	var_flock_tries;
++/*	int	var_flock_delay;
++/*	int	var_flock_stale;
++/*	int	var_disable_dns;
++/*	int	var_soft_bounce;
++/*	time_t	var_starttime;
++/*	int	var_ownreq_special;
++/*	int	var_daemon_timeout;
++/*	char	*var_syslog_facility;
++/*	char	*var_relay_domains;
++/*	char	*var_fflush_domains;
++/*	char	*var_mynetworks_style;
++/*	char	*var_verp_delims;
++/*	char	*var_verp_filter;
++/*	char	*var_par_dom_match;
++/*	char	*var_config_dirs;
++/*
++/*	int	var_inet_windowsize;
++/*	char	*var_import_environ;
++/*	char	*var_export_environ;
++/*	char	*var_debug_peer_list;
++/*	int	var_debug_peer_level;
++/*	int	var_in_flow_delay;
++/*	int	var_fault_inj_code;
++/*	char   *var_bounce_service;
++/*	char   *var_cleanup_service;
++/*	char   *var_defer_service;
++/*	char   *var_pickup_service;
++/*	char   *var_queue_service;
++/*	char   *var_rewrite_service;
++/*	char   *var_showq_service;
++/*	char   *var_error_service;
++/*	char   *var_flush_service;
++/*	char   *var_verify_service;
++/*	char   *var_trace_service;
++/*	char   *var_proxymap_service;
++/*	char   *var_proxywrite_service;
++/*	int	var_db_create_buf;
++/*	int	var_db_read_buf;
++/*	int	var_mime_maxdepth;
++/*	int	var_mime_bound_len;
++/*	int	var_header_limit;
++/*	int	var_token_limit;
++/*	int	var_disable_mime_input;
++/*	int	var_disable_mime_oconv;
++/*	int     var_strict_8bitmime;
++/*	int     var_strict_7bit_hdrs;
++/*	int     var_strict_8bit_body;
++/*	int     var_strict_encoding;
++/*	int     var_verify_neg_cache;
++/*	int	var_oldlog_compat;
++/*	int	var_delay_max_res;
++/*	char	*var_int_filt_classes;
++/*	int	var_cyrus_sasl_authzid;
++/*
++/*	char	*var_multi_conf_dirs;
++/*	char	*var_multi_wrapper;
++/*	char	*var_multi_group;
++/*	char	*var_multi_name;
++/*	bool	var_multi_enable;
++/*
++/*	void	mail_params_init()
++/*
++/*	const	char null_format_string[1];
++/* DESCRIPTION
++/*	This module (actually the associated include file) define the names
++/*	and defaults of all mail configuration parameters.
++/*
++/*	mail_params_init() initializes the built-in parameters listed above.
++/*	These parameters are relied upon by library routines, so they are
++/*	initialized globally so as to avoid hard-to-find errors due to
++/*	missing initialization. This routine must be called early, at
++/*	least before entering a chroot jail.
++/*
++/*	null_format_string is a workaround for gcc compilers that complain
++/*	about empty or null format strings.
++/* DIAGNOSTICS
++/*	Fatal errors: out of memory; null system or domain name.
++/* 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 <unistd.h>
++#include <stdlib.h>
++#include <string.h>
++#include <pwd.h>
++#include <grp.h>
++#include <time.h>
++#include <ctype.h>
++
++#ifdef STRCASECMP_IN_STRINGS_H
++#include <strings.h>
++#endif
++
++/* Utility library. */
++
++#include <msg.h>
++#include <msg_syslog.h>
++#include <get_hostname.h>
++#include <valid_hostname.h>
++#include <stringops.h>
++#include <safe.h>
++#include <safe_open.h>
++#include <mymalloc.h>
++#ifdef HAS_DB
++#include <dict_db.h>
++#endif
++#include <inet_proto.h>
++#include <vstring_vstream.h>
++#include <iostuff.h>
++
++/* Global library. */
++
++#include <mynetworks.h>
++#include <mail_conf.h>
++#include <mail_version.h>
++#include <mail_proto.h>
++#include <verp_sender.h>
++#include <own_inet_addr.h>
++#include <mail_params.h>
++
++ /*
++  * Special configuration variables.
++  */
++char   *var_myhostname;
++char   *var_mydomain;
++char   *var_myorigin;
++char   *var_mydest;
++char   *var_relayhost;
++char   *var_transit_origin;
++char   *var_transit_dest;
++char   *var_mail_name;
++int     var_helpful_warnings;
++char   *var_syslog_name;
++char   *var_mail_owner;
++uid_t   var_owner_uid;
++gid_t   var_owner_gid;
++char   *var_sgid_group;
++gid_t   var_sgid_gid;
++char   *var_default_privs;
++uid_t   var_default_uid;
++gid_t   var_default_gid;
++char   *var_config_dir;
++char   *var_daemon_dir;
++char   *var_data_dir;
++char   *var_command_dir;
++char   *var_queue_dir;
++int     var_use_limit;
++int     var_event_drain;
++int     var_idle_limit;
++int     var_bundle_rcpt;
++char   *var_procname;
++int     var_pid;
++int     var_ipc_timeout;
++char   *var_pid_dir;
++int     var_dont_remove;
++char   *var_inet_interfaces;
++char   *var_proxy_interfaces;
++char   *var_inet_protocols;
++char   *var_mynetworks;
++char   *var_double_bounce_sender;
++int     var_line_limit;
++char   *var_alias_db_map;
++int     var_message_limit;
++char   *var_mail_release;
++char   *var_mail_version;
++int     var_ipc_idle_limit;
++int     var_ipc_ttl_limit;
++char   *var_db_type;
++char   *var_hash_queue_names;
++int     var_hash_queue_depth;
++int     var_trigger_timeout;
++char   *var_rcpt_delim;
++int     var_fork_tries;
++int     var_fork_delay;
++int     var_flock_tries;
++int     var_flock_delay;
++int     var_flock_stale;
++int     var_disable_dns;
++int     var_soft_bounce;
++time_t  var_starttime;
++int     var_ownreq_special;
++int     var_daemon_timeout;
++char   *var_syslog_facility;
++char   *var_relay_domains;
++char   *var_fflush_domains;
++char   *var_mynetworks_style;
++char   *var_verp_delims;
++char   *var_verp_filter;
++int     var_in_flow_delay;
++char   *var_par_dom_match;
++char   *var_config_dirs;
++
++int     var_inet_windowsize;
++char   *var_import_environ;
++char   *var_export_environ;
++char   *var_debug_peer_list;
++int     var_debug_peer_level;
++int     var_fault_inj_code;
++char   *var_bounce_service;
++char   *var_cleanup_service;
++char   *var_defer_service;
++char   *var_pickup_service;
++char   *var_queue_service;
++char   *var_rewrite_service;
++char   *var_showq_service;
++char   *var_error_service;
++char   *var_flush_service;
++char   *var_verify_service;
++char   *var_trace_service;
++char   *var_proxymap_service;
++char   *var_proxywrite_service;
++int     var_db_create_buf;
++int     var_db_read_buf;
++int     var_mime_maxdepth;
++int     var_mime_bound_len;
++int     var_header_limit;
++int     var_token_limit;
++int     var_disable_mime_input;
++int     var_disable_mime_oconv;
++int     var_strict_8bitmime;
++int     var_strict_7bit_hdrs;
++int     var_strict_8bit_body;
++int     var_strict_encoding;
++int     var_verify_neg_cache;
++int     var_oldlog_compat;
++int     var_delay_max_res;
++char   *var_int_filt_classes;
++int     var_cyrus_sasl_authzid;
++
++char   *var_multi_conf_dirs;
++char   *var_multi_wrapper;
++char   *var_multi_group;
++char   *var_multi_name;
++bool    var_multi_enable;
++
++const char null_format_string[1] = "";
++
++/* check_myhostname - lookup hostname and validate */
++
++static const char *check_myhostname(void)
++{
++    static const char *name;
++    const char *dot;
++    const char *domain;
++
++    /*
++     * Use cached result.
++     */
++    if (name)
++	return (name);
++
++    /*
++     * If the local machine name is not in FQDN form, try to append the
++     * contents of $mydomain. Use a default domain as a final workaround.
++     */
++    name = get_hostname();
++    if ((dot = strchr(name, '.')) == 0) {
++	if ((domain = mail_conf_lookup_eval(VAR_MYDOMAIN)) == 0)
++	    domain = DEF_MYDOMAIN;
++	name = concatenate(name, ".", domain, (char *) 0);
++    }
++    return (name);
++}
++
++/* check_mydomainname - lookup domain name and validate */
++
++static const char *check_mydomainname(void)
++{
++    char   *dot;
++
++    /*
++     * Use a default domain when the hostname is not a FQDN ("foo").
++     */
++    if ((dot = strchr(var_myhostname, '.')) == 0)
++	return (DEF_MYDOMAIN);
++    return (dot + 1);
++}
++
++/* check_default_privs - lookup default user attributes and validate */
++
++static void check_default_privs(void)
++{
++    struct passwd *pwd;
++
++    if ((pwd = getpwnam(var_default_privs)) == 0)
++	msg_fatal("file %s/%s: parameter %s: unknown user name value: %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_DEFAULT_PRIVS, var_default_privs);
++    if ((var_default_uid = pwd->pw_uid) == 0)
++	msg_fatal("file %s/%s: parameter %s: user %s has privileged user ID",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_DEFAULT_PRIVS, var_default_privs);
++    if ((var_default_gid = pwd->pw_gid) == 0)
++	msg_fatal("file %s/%s: parameter %s: user %s has privileged group ID",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_DEFAULT_PRIVS, var_default_privs);
++}
++
++/* check_mail_owner - lookup owner user attributes and validate */
++
++static void check_mail_owner(void)
++{
++    struct passwd *pwd;
++
++    if ((pwd = getpwnam(var_mail_owner)) == 0)
++	msg_fatal("file %s/%s: parameter %s: unknown user name value: %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_MAIL_OWNER, var_mail_owner);
++    if ((var_owner_uid = pwd->pw_uid) == 0)
++	msg_fatal("file %s/%s: parameter %s: user %s has privileged user ID",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_MAIL_OWNER, var_mail_owner);
++    if ((var_owner_gid = pwd->pw_gid) == 0)
++	msg_fatal("file %s/%s: parameter %s: user %s has privileged group ID",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_MAIL_OWNER, var_mail_owner);
++
++    /*
++     * This detects only some forms of sharing. Enumerating the entire
++     * password file name space could be expensive. The purpose of this code
++     * is to discourage user ID sharing by developers and package
++     * maintainers.
++     */
++    if ((pwd = getpwuid(var_owner_uid)) != 0
++	&& strcmp(pwd->pw_name, var_mail_owner) != 0)
++	msg_fatal("file %s/%s: parameter %s: user %s has same user ID as %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_MAIL_OWNER, var_mail_owner, pwd->pw_name);
++}
++
++/* check_sgid_group - lookup setgid group attributes and validate */
++
++static void check_sgid_group(void)
++{
++    struct group *grp;
++
++    if ((grp = getgrnam(var_sgid_group)) == 0)
++	msg_fatal("file %s/%s: parameter %s: unknown group name: %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_SGID_GROUP, var_sgid_group);
++    if ((var_sgid_gid = grp->gr_gid) == 0)
++	msg_fatal("file %s/%s: parameter %s: group %s has privileged group ID",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_SGID_GROUP, var_sgid_group);
++
++    /*
++     * This detects only some forms of sharing. Enumerating the entire group
++     * file name space could be expensive. The purpose of this code is to
++     * discourage group ID sharing by developers and package maintainers.
++     */
++    if ((grp = getgrgid(var_sgid_gid)) != 0
++	&& strcmp(grp->gr_name, var_sgid_group) != 0)
++	msg_fatal("file %s/%s: parameter %s: group %s has same group ID as %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_SGID_GROUP, var_sgid_group, grp->gr_name);
++}
++
++/* check_overlap - disallow UID or GID sharing */
++
++static void check_overlap(void)
++{
++    if (strcmp(var_default_privs, var_mail_owner) == 0)
++	msg_fatal("file %s/%s: parameters %s and %s specify the same user %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
++		  var_default_privs);
++    if (var_default_uid == var_owner_uid)
++	msg_fatal("file %s/%s: parameters %s and %s: users %s and %s have the same user ID: %ld",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
++		  var_default_privs, var_mail_owner,
++		  (long) var_owner_uid);
++    if (var_default_gid == var_owner_gid)
++	msg_fatal("file %s/%s: parameters %s and %s: users %s and %s have the same group ID: %ld",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
++		  var_default_privs, var_mail_owner,
++		  (long) var_owner_gid);
++    if (var_default_gid == var_sgid_gid)
++	msg_fatal("file %s/%s: parameters %s and %s: user %s and group %s have the same group ID: %ld",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_DEFAULT_PRIVS, VAR_SGID_GROUP,
++		  var_default_privs, var_sgid_group,
++		  (long) var_sgid_gid);
++    if (var_owner_gid == var_sgid_gid)
++	msg_fatal("file %s/%s: parameters %s and %s: user %s and group %s have the same group ID: %ld",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_MAIL_OWNER, VAR_SGID_GROUP,
++		  var_mail_owner, var_sgid_group,
++		  (long) var_sgid_gid);
++}
++
++#ifdef MYORIGIN_FROM_FILE
++
++/* read_param_from_file - read parameter value from file */
++
++static char *read_param_from_file(const char *path)
++{
++    VSTRING *why = vstring_alloc(100);
++    VSTRING *buf = vstring_alloc(100);
++    VSTREAM *fp;
++    char   *bp;
++    char   *result;
++
++    /*
++     * Ugly macros to make complex expressions less unreadable.
++     */
++#define SKIP(start, var, cond) \
++	for (var = start; *var && (cond); var++);
++
++#define TRIM(s) { \
++	char *p; \
++	for (p = (s) + strlen(s); p > (s) && ISSPACE(p[-1]); p--); \
++	*p = 0; \
++    }
++
++    fp = safe_open(path, O_RDONLY, 0, (struct stat *) 0, -1, -1, why);
++    if (fp == 0)
++	msg_fatal("%s: %s", path, vstring_str(why));
++    vstring_get_nonl(buf, fp);
++    if (vstream_ferror(fp))			/* FIX 20070501 */
++	msg_fatal("%s: read error: %m", path);
++    vstream_fclose(fp);
++    SKIP(vstring_str(buf), bp, ISSPACE(*bp));
++    TRIM(bp);
++    result = mystrdup(bp);
++
++    vstring_free(why);
++    vstring_free(buf);
++    return (result);
++}
++
++#endif
++
++/* mail_params_init - configure built-in parameters */
++
++void    mail_params_init()
++{
++    static const CONFIG_STR_TABLE first_str_defaults[] = {
++	VAR_SYSLOG_FACILITY, DEF_SYSLOG_FACILITY, &var_syslog_facility, 1, 0,
++	VAR_INET_PROTOCOLS, DEF_INET_PROTOCOLS, &var_inet_protocols, 1, 0,
++	VAR_MULTI_CONF_DIRS, DEF_MULTI_CONF_DIRS, &var_multi_conf_dirs, 0, 0,
++	VAR_MULTI_WRAPPER, DEF_MULTI_WRAPPER, &var_multi_wrapper, 0, 0,
++	VAR_MULTI_GROUP, DEF_MULTI_GROUP, &var_multi_group, 0, 0,
++	VAR_MULTI_NAME, DEF_MULTI_NAME, &var_multi_name, 0, 0,
++	0,
++    };
++    static const CONFIG_STR_FN_TABLE function_str_defaults[] = {
++	VAR_MYHOSTNAME, check_myhostname, &var_myhostname, 1, 0,
++	VAR_MYDOMAIN, check_mydomainname, &var_mydomain, 1, 0,
++	0,
++    };
++    static const CONFIG_STR_TABLE other_str_defaults[] = {
++	VAR_MAIL_NAME, DEF_MAIL_NAME, &var_mail_name, 1, 0,
++	VAR_SYSLOG_NAME, DEF_SYSLOG_NAME, &var_syslog_name, 1, 0,
++	VAR_MAIL_OWNER, DEF_MAIL_OWNER, &var_mail_owner, 1, 0,
++	VAR_SGID_GROUP, DEF_SGID_GROUP, &var_sgid_group, 1, 0,
++	VAR_MYDEST, DEF_MYDEST, &var_mydest, 0, 0,
++	VAR_MYORIGIN, DEF_MYORIGIN, &var_myorigin, 1, 0,
++	VAR_RELAYHOST, DEF_RELAYHOST, &var_relayhost, 0, 0,
++	VAR_DAEMON_DIR, DEF_DAEMON_DIR, &var_daemon_dir, 1, 0,
++	VAR_DATA_DIR, DEF_DATA_DIR, &var_data_dir, 1, 0,
++	VAR_COMMAND_DIR, DEF_COMMAND_DIR, &var_command_dir, 1, 0,
++	VAR_QUEUE_DIR, DEF_QUEUE_DIR, &var_queue_dir, 1, 0,
++	VAR_PID_DIR, DEF_PID_DIR, &var_pid_dir, 1, 0,
++	VAR_INET_INTERFACES, DEF_INET_INTERFACES, &var_inet_interfaces, 1, 0,
++	VAR_PROXY_INTERFACES, DEF_PROXY_INTERFACES, &var_proxy_interfaces, 0, 0,
++	VAR_DOUBLE_BOUNCE, DEF_DOUBLE_BOUNCE, &var_double_bounce_sender, 1, 0,
++	VAR_DEFAULT_PRIVS, DEF_DEFAULT_PRIVS, &var_default_privs, 1, 0,
++	VAR_ALIAS_DB_MAP, DEF_ALIAS_DB_MAP, &var_alias_db_map, 0, 0,
++	VAR_MAIL_RELEASE, DEF_MAIL_RELEASE, &var_mail_release, 1, 0,
++	VAR_MAIL_VERSION, DEF_MAIL_VERSION, &var_mail_version, 1, 0,
++	VAR_DB_TYPE, DEF_DB_TYPE, &var_db_type, 1, 0,
++	VAR_HASH_QUEUE_NAMES, DEF_HASH_QUEUE_NAMES, &var_hash_queue_names, 1, 0,
++	VAR_RCPT_DELIM, DEF_RCPT_DELIM, &var_rcpt_delim, 0, 1,
++	VAR_RELAY_DOMAINS, DEF_RELAY_DOMAINS, &var_relay_domains, 0, 0,
++	VAR_FFLUSH_DOMAINS, DEF_FFLUSH_DOMAINS, &var_fflush_domains, 0, 0,
++	VAR_EXPORT_ENVIRON, DEF_EXPORT_ENVIRON, &var_export_environ, 0, 0,
++	VAR_IMPORT_ENVIRON, DEF_IMPORT_ENVIRON, &var_import_environ, 0, 0,
++	VAR_MYNETWORKS_STYLE, DEF_MYNETWORKS_STYLE, &var_mynetworks_style, 1, 0,
++	VAR_DEBUG_PEER_LIST, DEF_DEBUG_PEER_LIST, &var_debug_peer_list, 0, 0,
++	VAR_VERP_DELIMS, DEF_VERP_DELIMS, &var_verp_delims, 2, 2,
++	VAR_VERP_FILTER, DEF_VERP_FILTER, &var_verp_filter, 1, 0,
++	VAR_PAR_DOM_MATCH, DEF_PAR_DOM_MATCH, &var_par_dom_match, 0, 0,
++	VAR_CONFIG_DIRS, DEF_CONFIG_DIRS, &var_config_dirs, 0, 0,
++	VAR_BOUNCE_SERVICE, DEF_BOUNCE_SERVICE, &var_bounce_service, 1, 0,
++	VAR_CLEANUP_SERVICE, DEF_CLEANUP_SERVICE, &var_cleanup_service, 1, 0,
++	VAR_DEFER_SERVICE, DEF_DEFER_SERVICE, &var_defer_service, 1, 0,
++	VAR_PICKUP_SERVICE, DEF_PICKUP_SERVICE, &var_pickup_service, 1, 0,
++	VAR_QUEUE_SERVICE, DEF_QUEUE_SERVICE, &var_queue_service, 1, 0,
++	VAR_REWRITE_SERVICE, DEF_REWRITE_SERVICE, &var_rewrite_service, 1, 0,
++	VAR_SHOWQ_SERVICE, DEF_SHOWQ_SERVICE, &var_showq_service, 1, 0,
++	VAR_ERROR_SERVICE, DEF_ERROR_SERVICE, &var_error_service, 1, 0,
++	VAR_FLUSH_SERVICE, DEF_FLUSH_SERVICE, &var_flush_service, 1, 0,
++	VAR_VERIFY_SERVICE, DEF_VERIFY_SERVICE, &var_verify_service, 1, 0,
++	VAR_TRACE_SERVICE, DEF_TRACE_SERVICE, &var_trace_service, 1, 0,
++	VAR_PROXYMAP_SERVICE, DEF_PROXYMAP_SERVICE, &var_proxymap_service, 1, 0,
++	VAR_PROXYWRITE_SERVICE, DEF_PROXYWRITE_SERVICE, &var_proxywrite_service, 1, 0,
++	VAR_INT_FILT_CLASSES, DEF_INT_FILT_CLASSES, &var_int_filt_classes, 0, 0,
++	0,
++    };
++    static const CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
++	VAR_MYNETWORKS, mynetworks, &var_mynetworks, 0, 0,
++	0,
++    };
++    static const CONFIG_INT_TABLE other_int_defaults[] = {
++	VAR_MAX_USE, DEF_MAX_USE, &var_use_limit, 1, 0,
++	VAR_DONT_REMOVE, DEF_DONT_REMOVE, &var_dont_remove, 0, 0,
++	VAR_LINE_LIMIT, DEF_LINE_LIMIT, &var_line_limit, 512, 0,
++	VAR_MESSAGE_LIMIT, DEF_MESSAGE_LIMIT, &var_message_limit, 0, 0,
++	VAR_HASH_QUEUE_DEPTH, DEF_HASH_QUEUE_DEPTH, &var_hash_queue_depth, 1, 0,
++	VAR_FORK_TRIES, DEF_FORK_TRIES, &var_fork_tries, 1, 0,
++	VAR_FLOCK_TRIES, DEF_FLOCK_TRIES, &var_flock_tries, 1, 0,
++	VAR_DEBUG_PEER_LEVEL, DEF_DEBUG_PEER_LEVEL, &var_debug_peer_level, 1, 0,
++	VAR_FAULT_INJ_CODE, DEF_FAULT_INJ_CODE, &var_fault_inj_code, 0, 0,
++	VAR_DB_CREATE_BUF, DEF_DB_CREATE_BUF, &var_db_create_buf, 1, 0,
++	VAR_DB_READ_BUF, DEF_DB_READ_BUF, &var_db_read_buf, 1, 0,
++	VAR_HEADER_LIMIT, DEF_HEADER_LIMIT, &var_header_limit, 1, 0,
++	VAR_TOKEN_LIMIT, DEF_TOKEN_LIMIT, &var_token_limit, 1, 0,
++	VAR_MIME_MAXDEPTH, DEF_MIME_MAXDEPTH, &var_mime_maxdepth, 1, 0,
++	VAR_MIME_BOUND_LEN, DEF_MIME_BOUND_LEN, &var_mime_bound_len, 1, 0,
++	VAR_DELAY_MAX_RES, DEF_DELAY_MAX_RES, &var_delay_max_res, MIN_DELAY_MAX_RES, MAX_DELAY_MAX_RES,
++	VAR_INET_WINDOW, DEF_INET_WINDOW, &var_inet_windowsize, 0, 0,
++	0,
++    };
++    static const CONFIG_TIME_TABLE time_defaults[] = {
++	VAR_EVENT_DRAIN, DEF_EVENT_DRAIN, &var_event_drain, 1, 0,
++	VAR_MAX_IDLE, DEF_MAX_IDLE, &var_idle_limit, 1, 0,
++	VAR_IPC_TIMEOUT, DEF_IPC_TIMEOUT, &var_ipc_timeout, 1, 0,
++	VAR_IPC_IDLE, DEF_IPC_IDLE, &var_ipc_idle_limit, 1, 0,
++	VAR_IPC_TTL, DEF_IPC_TTL, &var_ipc_ttl_limit, 1, 0,
++	VAR_TRIGGER_TIMEOUT, DEF_TRIGGER_TIMEOUT, &var_trigger_timeout, 1, 0,
++	VAR_FORK_DELAY, DEF_FORK_DELAY, &var_fork_delay, 1, 0,
++	VAR_FLOCK_DELAY, DEF_FLOCK_DELAY, &var_flock_delay, 1, 0,
++	VAR_FLOCK_STALE, DEF_FLOCK_STALE, &var_flock_stale, 1, 0,
++	VAR_DAEMON_TIMEOUT, DEF_DAEMON_TIMEOUT, &var_daemon_timeout, 1, 0,
++	VAR_IN_FLOW_DELAY, DEF_IN_FLOW_DELAY, &var_in_flow_delay, 0, 10,
++	0,
++    };
++    static const CONFIG_BOOL_TABLE bool_defaults[] = {
++	VAR_DISABLE_DNS, DEF_DISABLE_DNS, &var_disable_dns,
++	VAR_SOFT_BOUNCE, DEF_SOFT_BOUNCE, &var_soft_bounce,
++	VAR_OWNREQ_SPECIAL, DEF_OWNREQ_SPECIAL, &var_ownreq_special,
++	VAR_STRICT_8BITMIME, DEF_STRICT_8BITMIME, &var_strict_8bitmime,
++	VAR_STRICT_7BIT_HDRS, DEF_STRICT_7BIT_HDRS, &var_strict_7bit_hdrs,
++	VAR_STRICT_8BIT_BODY, DEF_STRICT_8BIT_BODY, &var_strict_8bit_body,
++	VAR_STRICT_ENCODING, DEF_STRICT_ENCODING, &var_strict_encoding,
++	VAR_DISABLE_MIME_INPUT, DEF_DISABLE_MIME_INPUT, &var_disable_mime_input,
++	VAR_DISABLE_MIME_OCONV, DEF_DISABLE_MIME_OCONV, &var_disable_mime_oconv,
++	VAR_VERIFY_NEG_CACHE, DEF_VERIFY_NEG_CACHE, &var_verify_neg_cache,
++	VAR_OLDLOG_COMPAT, DEF_OLDLOG_COMPAT, &var_oldlog_compat,
++	VAR_HELPFUL_WARNINGS, DEF_HELPFUL_WARNINGS, &var_helpful_warnings,
++	VAR_CYRUS_SASL_AUTHZID, DEF_CYRUS_SASL_AUTHZID, &var_cyrus_sasl_authzid,
++	VAR_MULTI_ENABLE, DEF_MULTI_ENABLE, &var_multi_enable,
++	0,
++    };
++    const char *cp;
++    INET_PROTO_INFO *proto_info;
++
++    /*
++     * Extract syslog_facility early, so that from here on all errors are
++     * logged with the proper facility.
++     */
++    get_mail_conf_str_table(first_str_defaults);
++
++    if (!msg_syslog_facility(var_syslog_facility))
++	msg_fatal("file %s/%s: parameter %s: unrecognized value: %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_SYSLOG_FACILITY, var_syslog_facility);
++
++    /*
++     * What protocols should we attempt to support? The result is stored in
++     * the global inet_proto_table variable.
++     */
++    proto_info = inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
++
++    /*
++     * Variables whose defaults are determined at runtime. Some sites use
++     * short hostnames in the host table; some sites name their system after
++     * the domain.
++     */
++    get_mail_conf_str_fn_table(function_str_defaults);
++    if (!valid_hostname(var_myhostname, DO_GRIPE))
++	msg_fatal("file %s/%s: parameter %s: bad parameter value: %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_MYHOSTNAME, var_myhostname);
++    if (!valid_hostname(var_mydomain, DO_GRIPE))
++	msg_fatal("file %s/%s: parameter %s: bad parameter value: %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_MYDOMAIN, var_mydomain);
++
++    /*
++     * Variables that are needed by almost every program.
++     * 
++     * XXX Reading the myorigin value from file is originally a Debian Linux
++     * feature. This code is not enabled by default because of problems: 1)
++     * it re-implements its own parameter syntax checks, and 2) it does not
++     * implement $name expansions.
++     */
++    get_mail_conf_str_table(other_str_defaults);
++#ifdef MYORIGIN_FROM_FILE
++    if (*var_myorigin == '/') {
++	char   *origin = read_param_from_file(var_myorigin);
++
++	if (*origin == 0)
++	    msg_fatal("%s file %s is empty", VAR_MYORIGIN, var_myorigin);
++	myfree(var_myorigin);			/* FIX 20070501 */
++	var_myorigin = origin;
++    }
++#endif
++    get_mail_conf_int_table(other_int_defaults);
++    get_mail_conf_bool_table(bool_defaults);
++    get_mail_conf_time_table(time_defaults);
++    check_default_privs();
++    check_mail_owner();
++    check_sgid_group();
++    check_overlap();
++#ifdef HAS_DB
++    dict_db_cache_size = var_db_read_buf;
++#endif
++    inet_windowsize = var_inet_windowsize;
++
++    /*
++     * Variables whose defaults are determined at runtime, after other
++     * variables have been set. This dependency is admittedly a bit tricky.
++     * XXX Perhaps we should just register variables, and let the evaluator
++     * figure out in what order to evaluate things.
++     */
++    get_mail_conf_str_fn_table(function_str_defaults_2);
++
++    /*
++     * FIX 200412 The IPv6 patch did not call own_inet_addr_list() before
++     * entering the chroot jail on Linux IPv6 systems. Linux has the IPv6
++     * interface list in /proc, which is not available after chrooting.
++     */
++    (void) own_inet_addr_list();
++
++    /*
++     * The PID variable cannot be set from the configuration file!!
++     */
++    set_mail_conf_int(VAR_PID, var_pid = getpid());
++
++    /*
++     * Neither can the start time variable. It isn't even visible.
++     */
++    time(&var_starttime);
++
++    /*
++     * Export the syslog name so children can inherit and use it before they
++     * have initialized.
++     */
++    if ((cp = safe_getenv(CONF_ENV_LOGTAG)) == 0
++	|| strcmp(cp, var_syslog_name) != 0)
++	if (setenv(CONF_ENV_LOGTAG, var_syslog_name, 1) < 0)
++	    msg_fatal("setenv %s %s: %m", CONF_ENV_LOGTAG, var_syslog_name);
++
++    /*
++     * I have seen this happen just too often.
++     */
++    if (strcasecmp(var_myhostname, var_relayhost) == 0)
++	msg_fatal("%s and %s parameter settings must not be identical: %s",
++		  VAR_MYHOSTNAME, VAR_RELAYHOST, var_myhostname);
++
++    /*
++     * XXX These should be caught by a proper parameter parsing algorithm.
++     */
++    if (var_myorigin[strcspn(var_myorigin, ", \t\r\n")])
++	msg_fatal("%s parameter setting must not contain multiple values: %s",
++		  VAR_MYORIGIN, var_myorigin);
++
++    if (var_relayhost[strcspn(var_relayhost, ", \t\r\n")])
++	msg_fatal("%s parameter setting must not contain multiple values: %s",
++		  VAR_RELAYHOST, var_relayhost);
++
++    /*
++     * One more sanity check.
++     */
++    if ((cp = verp_delims_verify(var_verp_delims)) != 0)
++	msg_fatal("file %s/%s: parameters %s and %s: %s",
++		  var_config_dir, MAIN_CONF_FILE,
++		  VAR_VERP_DELIMS, VAR_VERP_FILTER, cp);
++}
+diff -ruN a/src/global/mkmap_open.c b/src/global/mkmap_open.c
+--- a/src/global/mkmap_open.c	2009-06-01 12:27:44.000000000 +0000
++++ b/src/global/mkmap_open.c	2009-06-01 13:08:26.000000000 +0000
+@@ -81,7 +81,7 @@
+   * We use a different table (in dict_open.c) when querying maps.
+   */
+ typedef struct {
+-    char   *type;
++    const char   *type;
+     MKMAP  *(*before_open) (const char *);
+ } MKMAP_OPEN_INFO;
+ 
+@@ -156,7 +156,16 @@
+      */
+     for (mp = mkmap_types; /* void */ ; mp++) {
+ 	if (mp->type == 0)
++#ifndef NO_DYNAMIC_MAPS
++	{
++	    static MKMAP_OPEN_INFO oi;
++	    oi.before_open=(MKMAP*(*)(const char*))dict_mkmap_func(type);
++	    oi.type=type;
++	    mp=&oi;
++	}
++#else
+ 	    msg_fatal("unsupported map type: %s", type);
++#endif
+ 	if (strcmp(type, mp->type) == 0)
+ 	    break;
+     }
+diff -ruN a/src/master/Makefile.in b/src/master/Makefile.in
+--- a/src/master/Makefile.in	2009-06-01 12:27:44.000000000 +0000
++++ b/src/master/Makefile.in	2009-06-01 13:08:26.000000000 +0000
+@@ -20,7 +20,7 @@
+ INC_DIR	= ../../include
+ BIN_DIR	= ../../libexec
+ 
+-.c.o:;	$(CC) $(CFLAGS) -c $*.c
++.c.o:;	$(CC) `for i in $(LIB_OBJ); do [ $$i = $@ ] && echo -fPIC; done` $(CFLAGS) -c $*.c
+ 
+ all:	$(PROG) $(LIB)
+ 
+@@ -39,12 +39,10 @@
+ root_tests:
+ 
+ $(LIB):	$(LIB_OBJ)
+-	$(AR) $(ARFL) $(LIB) $?
+-	$(RANLIB) $(LIB)
++	gcc -shared -Wl,-soname,libpostfix-master.so.1 -o $(LIB) $(LIB_OBJ) $(LIBS) $(SYSLIBS)
+ 
+ $(LIB_DIR)/$(LIB): $(LIB)
+ 	cp $(LIB) $(LIB_DIR)/$(LIB)
+-	$(RANLIB) $(LIB_DIR)/$(LIB)
+ 
+ $(BIN_DIR)/$(PROG): $(PROG)
+ 	 cp $(PROG) $(BIN_DIR)
+diff -ruN a/src/milter/Makefile.in b/src/milter/Makefile.in
+--- a/src/milter/Makefile.in	2009-06-01 12:27:45.000000000 +0000
++++ b/src/milter/Makefile.in	2009-06-01 13:08:26.000000000 +0000
+@@ -14,7 +14,7 @@
+ INC_DIR	= ../../include
+ MAKES	=
+ 
+-.c.o:;	$(CC) $(CFLAGS) -c $*.c
++.c.o:;	$(CC) -fPIC $(CFLAGS) -c $*.c
+ 
+ all: $(LIB)
+ 
+@@ -30,12 +30,10 @@
+ root_tests:
+ 
+ $(LIB):	$(OBJS)
+-	$(AR) $(ARFL) $(LIB) $?
+-	$(RANLIB) $(LIB)
++	 gcc -shared -Wl,-soname,libpostfix-milter.so.1 -o $(LIB) $(OBJS) $(LIBS) $(SYSLIBS)
+ 
+ $(LIB_DIR)/$(LIB): $(LIB)
+ 	cp $(LIB) $(LIB_DIR)
+-	$(RANLIB) $(LIB_DIR)/$(LIB)
+ 
+ update: $(LIB_DIR)/$(LIB) $(HDRS)
+ 	-for i in $(HDRS); \
+diff -ruN a/src/postconf/postconf.c b/src/postconf/postconf.c
+--- a/src/postconf/postconf.c	2009-06-01 12:27:45.000000000 +0000
++++ b/src/postconf/postconf.c	2009-06-01 13:08:26.000000000 +0000
+@@ -962,6 +962,16 @@
+ {
+     ARGV   *maps_argv;
+     int     i;
++#ifndef NO_DYNAMIC_MAPS
++    char   *path;
++    char   *config_dir;
++
++    var_config_dir = mystrdup((config_dir = safe_getenv(CONF_ENV_PATH)) != 0 ?
++			      config_dir : DEF_CONFIG_DIR);	/* XXX */
++    path = concatenate(var_config_dir, "/", "dynamicmaps.cf", (char *) 0);
++    dict_open_dlinfo(path);
++    myfree(path);
++#endif
+ 
+     maps_argv = dict_mapnames();
+     for (i = 0; i < maps_argv->argc; i++)
+diff -ruN a/src/postconf/postconf.c.orig b/src/postconf/postconf.c.orig
+--- a/src/postconf/postconf.c.orig	1970-01-01 00:00:00.000000000 +0000
++++ b/src/postconf/postconf.c.orig	2009-06-01 13:07:57.000000000 +0000
+@@ -0,0 +1,1218 @@
++/*++
++/* NAME
++/*	postconf 1
++/* SUMMARY
++/*	Postfix configuration utility
++/* SYNOPSIS
++/* .fi
++/*	\fBpostconf\fR [\fB-dhnv\fR] [\fB-c \fIconfig_dir\fR]
++/*	[\fIparameter ...\fR]
++/*
++/*	\fBpostconf\fR [\fB-aAmlv\fR] [\fB-c \fIconfig_dir\fR]
++/*
++/*	\fBpostconf\fR [\fB-ev\fR] [\fB-c \fIconfig_dir\fR]
++/*	[\fIparameter=value ...\fR]
++/*
++/*	\fBpostconf\fR [\fB-#v\fR] [\fB-c \fIconfig_dir\fR]
++/*	[\fIparameter ...\fR]
++/*
++/*	\fBpostconf\fR [\fB-btv\fR] [\fB-c \fIconfig_dir\fR] [\fItemplate_file\fR]
++/* DESCRIPTION
++/*	The \fBpostconf\fR(1) command displays the actual values
++/*	of configuration parameters, changes configuration parameter
++/*	values, or displays other configuration information about
++/*	the Postfix mail system.
++/*
++/*	Options:
++/* .IP \fB-a\fR
++/*	List the available SASL server plug-in types.  The SASL
++/*	plug-in type is selected with the \fBsmtpd_sasl_type\fR
++/*	configuration parameter by specifying one of the names
++/*	listed below.
++/* .RS
++/* .IP \fBcyrus\fR
++/*	This server plug-in is available when Postfix is built with
++/*	Cyrus SASL support.
++/* .IP \fBdovecot\fR
++/*	This server plug-in uses the Dovecot authentication server,
++/*	and is available when Postfix is built with any form of SASL
++/*	support.
++/* .RE
++/* .IP
++/*	This feature is available with Postfix 2.3 and later.
++/* .IP \fB-A\fR
++/*	List the available SASL client plug-in types.  The SASL
++/*	plug-in type is selected with the \fBsmtp_sasl_type\fR or
++/*	\fBlmtp_sasl_type\fR configuration parameters by specifying
++/*	one of the names listed below.
++/* .RS
++/* .IP \fBcyrus\fR
++/*	This client plug-in is available when Postfix is built with
++/*	Cyrus SASL support.
++/* .RE
++/* .IP
++/*	This feature is available with Postfix 2.3 and later.
++/* .IP "\fB-b\fR [\fItemplate_file\fR]"
++/*	Display the message text that appears at the beginning of
++/*	delivery status notification (DSN) messages, with $\fBname\fR
++/*	expressions replaced by actual values.  To override the
++/*	built-in message text, specify a template file at the end
++/*	of the command line, or specify a template file in main.cf
++/*	with the \fBbounce_template_file\fR parameter.
++/*	To force selection of the built-in message text templates,
++/*	specify an empty template file name (in shell language: "").
++/*
++/*	This feature is available with Postfix 2.3 and later.
++/* .IP "\fB-c \fIconfig_dir\fR"
++/*	The \fBmain.cf\fR configuration file is in the named directory
++/*	instead of the default configuration directory.
++/* .IP \fB-d\fR
++/*	Print default parameter settings instead of actual settings.
++/* .IP \fB-e\fR
++/*	Edit the \fBmain.cf\fR configuration file. The file is copied
++/*	to a temporary file then renamed into place. Parameters and
++/*	values are specified on the command line. Use quotes in order
++/*	to protect shell metacharacters and whitespace.
++/* .IP \fB-h\fR
++/*	Show parameter values only, not the ``name = '' label
++/*	that normally precedes the value.
++/* .IP \fB-l\fR
++/*	List the names of all supported mailbox locking methods.
++/*	Postfix supports the following methods:
++/* .RS
++/* .IP \fBflock\fR
++/*	A kernel-based advisory locking method for local files only.
++/*	This locking method is available on systems with a BSD
++/*	compatible library.
++/* .IP \fBfcntl\fR
++/*	A kernel-based advisory locking method for local and remote files.
++/* .IP \fBdotlock\fR
++/*	An application-level locking method. An application locks a file
++/*	named \fIfilename\fR by creating a file named \fIfilename\fB.lock\fR.
++/*	The application is expected to remove its own lock file, as well as
++/*	stale lock files that were left behind after abnormal termination.
++/* .RE
++/* .IP \fB-m\fR
++/*	List the names of all supported lookup table types. In Postfix
++/*	configuration files,
++/*	lookup tables are specified as \fItype\fB:\fIname\fR, where
++/*	\fItype\fR is one of the types listed below. The table \fIname\fR
++/*	syntax depends on the lookup table type as described in the
++/*	DATABASE_README document.
++/* .RS
++/* .IP \fBbtree\fR
++/*	A sorted, balanced tree structure.
++/*	This is available on systems with support for Berkeley DB
++/*	databases.
++/* .IP \fBcdb\fR
++/*	A read-optimized structure with no support for incremental updates.
++/*	This is available on systems with support for CDB databases.
++/* .IP \fBcidr\fR
++/*	A table that associates values with Classless Inter-Domain Routing
++/*	(CIDR) patterns. This is described in \fBcidr_table\fR(5).
++/* .IP \fBdbm\fR
++/*	An indexed file type based on hashing.
++/*	This is available on systems with support for DBM databases.
++/* .IP \fBenviron\fR
++/*	The UNIX process environment array. The lookup key is the variable
++/*	name. Originally implemented for testing, someone may find this
++/*	useful someday.
++/* .IP \fBhash\fR
++/*	An indexed file type based on hashing.
++/*	This is available on systems with support for Berkeley DB
++/*	databases.
++/* .IP "\fBldap\fR (read-only)"
++/*	Perform lookups using the LDAP protocol. This is described
++/*	in \fBldap_table\fR(5).
++/* .IP "\fBmysql\fR (read-only)"
++/*	Perform lookups using the MYSQL protocol. This is described
++/*	in \fBmysql_table\fR(5).
++/* .IP "\fBpcre\fR (read-only)"
++/*	A lookup table based on Perl Compatible Regular Expressions. The
++/*	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)"
++/*	A lookup table that is implemented via the Postfix
++/*	\fBproxymap\fR(8) service. The table name syntax is
++/*	\fItype\fB:\fIname\fR.
++/* .IP "\fBregexp\fR (read-only)"
++/*	A lookup table based on regular expressions. The file format is
++/*	described in \fBregexp_table\fR(5).
++/* .IP \fBsdbm\fR
++/*	An indexed file type based on hashing.
++/*	This is available on systems with support for SDBM databases.
++/* .IP "\fBstatic\fR (read-only)"
++/*	A table that always returns its name as lookup result. For example,
++/*	\fBstatic:foobar\fR always returns the string \fBfoobar\fR as lookup
++/*	result.
++/* .IP "\fBtcp\fR (read-only)"
++/*	Perform lookups using a simple request-reply protocol that is
++/*	described in \fBtcp_table\fR(5).
++/*	This feature is not included with the stable Postfix release.
++/* .IP "\fBunix\fR (read-only)"
++/*	A limited way to query the UNIX authentication database. The
++/*	following tables are implemented:
++/* .RS
++/*. IP \fBunix:passwd.byname\fR
++/*	The table is the UNIX password database. The key is a login name.
++/*	The result is a password file entry in \fBpasswd\fR(5) format.
++/* .IP \fBunix:group.byname\fR
++/*	The table is the UNIX group database. The key is a group name.
++/*	The result is a group file entry in \fBgroup\fR(5) format.
++/* .RE
++/* .RE
++/* .IP
++/*	Other table types may exist depending on how Postfix was built.
++/* .IP \fB-n\fR
++/*	Print parameter settings that are not left at their built-in
++/*	default value, because they are explicitly specified in main.cf.
++/* .IP "\fB-t\fR [\fItemplate_file\fR]"
++/*	Display the templates for delivery status notification (DSN)
++/*	messages. To override the built-in templates, specify a
++/*	template file at the end of the command line, or specify a
++/*	template file in main.cf with the \fBbounce_template_file\fR
++/*	parameter.  To force selection of the built-in templates,
++/*	specify an empty template file name (in shell language:
++/*	"").
++/*
++/*	This feature is available with Postfix 2.3 and later.
++/* .IP \fB-v\fR
++/*	Enable verbose logging for debugging purposes. Multiple \fB-v\fR
++/*	options make the software increasingly verbose.
++/* .IP \fB-#\fR
++/*	Edit the \fBmain.cf\fR configuration file. The file is copied
++/*	to a temporary file then renamed into place. The parameters
++/*	specified on the command line are commented-out, so that they
++/*	revert to their default values. Specify a list of parameter
++/*	names, not name=value pairs.  There is no \fBpostconf\fR command
++/*	to perform the reverse operation.
++/*
++/*	This feature is available with Postfix 2.6 and later.
++/* DIAGNOSTICS
++/*	Problems are reported to the standard error stream.
++/* ENVIRONMENT
++/* .ad
++/* .fi
++/* .IP \fBMAIL_CONFIG\fR
++/*	Directory with Postfix configuration files.
++/* CONFIGURATION PARAMETERS
++/* .ad
++/* .fi
++/*	The following \fBmain.cf\fR parameters are especially relevant to
++/*	this program.
++/*
++/*	The text below provides only a parameter summary. See
++/*	\fBpostconf\fR(5) for more details including examples.
++/* .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
++/*	The default location of the Postfix main.cf and master.cf
++/*	configuration files.
++/* .IP "\fBbounce_template_file (empty)\fR"
++/*	Pathname of a configuration file with bounce message templates.
++/* FILES
++/*	/etc/postfix/main.cf, Postfix configuration parameters
++/* SEE ALSO
++/*	bounce(5), bounce template file format
++/*	postconf(5), configuration parameters
++/* README FILES
++/* .ad
++/* .fi
++/*	Use "\fBpostconf readme_directory\fR" or
++/*	"\fBpostconf html_directory\fR" to locate this information.
++/* .na
++/* .nf
++/*	DATABASE_README, Postfix lookup table overview
++/* 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 <stdio.h>			/* rename() */
++#include <pwd.h>
++#include <string.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <ctype.h>
++
++#ifdef USE_PATHS_H
++#include <paths.h>
++#endif
++
++/* Utility library. */
++
++#include <msg.h>
++#include <vstream.h>
++#include <msg_vstream.h>
++#include <get_hostname.h>
++#include <stringops.h>
++#include <htable.h>
++#include <dict.h>
++#include <safe.h>
++#include <mymalloc.h>
++#include <argv.h>
++#include <split_at.h>
++#include <vstring_vstream.h>
++#include <myflock.h>
++#include <inet_proto.h>
++#include <argv.h>
++#include <edit_file.h>
++
++/* Global library. */
++
++#include <mynetworks.h>
++#include <mail_conf.h>
++#include <mail_dict.h>
++#include <mail_proto.h>
++#include <mail_version.h>
++#include <mail_params.h>
++#include <mail_addr.h>
++#include <mbox_conf.h>
++#include <mail_run.h>
++
++/* XSASL library. */
++
++#include <xsasl.h>
++
++ /*
++  * What we're supposed to be doing.
++  */
++#define SHOW_NONDEF	(1<<0)		/* show non-default settings */
++#define SHOW_DEFS	(1<<1)		/* show default setting */
++#define SHOW_NAME	(1<<2)		/* show parameter name */
++#define SHOW_MAPS	(1<<3)		/* show map types */
++#define EDIT_MAIN	(1<<4)		/* edit main.cf */
++#define SHOW_LOCKS	(1<<5)		/* show mailbox lock methods */
++#define SHOW_EVAL	(1<<6)		/* expand right-hand sides */
++#define SHOW_SASL_SERV	(1<<7)		/* show server auth plugin types */
++#define SHOW_SASL_CLNT	(1<<8)		/* show client auth plugin types */
++#define COMMENT_OUT	(1<<9)		/* #-out selected main.cf entries */
++
++ /*
++  * Lookup table for in-core parameter info.
++  */
++HTABLE *param_table;
++
++ /*
++  * Lookup table for external parameter info.
++  */
++DICT   *text_table;
++
++ /*
++  * Declarations generated by scanning actual C source files.
++  */
++#include "time_vars.h"
++#include "bool_vars.h"
++#include "int_vars.h"
++#include "str_vars.h"
++#include "raw_vars.h"
++#include "nint_vars.h"
++
++ /*
++  * Manually extracted.
++  */
++#include "auto_vars.h"
++#include "install_vars.h"
++
++ /*
++  * Lookup tables generated by scanning actual C source files.
++  */
++static const CONFIG_TIME_TABLE time_table[] = {
++#include "time_table.h"
++    0,
++};
++
++static const CONFIG_BOOL_TABLE bool_table[] = {
++#include "bool_table.h"
++    0,
++};
++
++static const CONFIG_INT_TABLE int_table[] = {
++#include "int_table.h"
++    0,
++};
++
++static const CONFIG_STR_TABLE str_table[] = {
++#include "str_table.h"
++#include "auto_table.h"			/* XXX */
++#include "install_table.h"
++    0,
++};
++
++static const CONFIG_RAW_TABLE raw_table[] = {
++#include "raw_table.h"
++    0,
++};
++
++static const CONFIG_NINT_TABLE nint_table[] = {
++#include "nint_table.h"
++    0,
++};
++
++ /*
++  * Parameters with default values obtained via function calls.
++  */
++char   *var_myhostname;
++char   *var_mydomain;
++char   *var_mynetworks;
++
++static const char *check_myhostname(void);
++static const char *check_mydomainname(void);
++static const char *check_mynetworks(void);
++
++static const CONFIG_STR_FN_TABLE str_fn_table[] = {
++    VAR_MYHOSTNAME, check_myhostname, &var_myhostname, 1, 0,
++    VAR_MYDOMAIN, check_mydomainname, &var_mydomain, 1, 0,
++    0,
++};
++static const CONFIG_STR_FN_TABLE str_fn_table_2[] = {
++    VAR_MYNETWORKS, check_mynetworks, &var_mynetworks, 1, 0,
++    0,
++};
++
++ /*
++  * XXX Global so that call-backs can see it.
++  */
++static int cmd_mode = SHOW_NAME;
++
++/* check_myhostname - lookup hostname and validate */
++
++static const char *check_myhostname(void)
++{
++    static const char *name;
++    const char *dot;
++    const char *domain;
++
++    /*
++     * Use cached result.
++     */
++    if (name)
++	return (name);
++
++    /*
++     * If the local machine name is not in FQDN form, try to append the
++     * contents of $mydomain.
++     */
++    name = get_hostname();
++    if ((dot = strchr(name, '.')) == 0) {
++	if ((domain = mail_conf_lookup_eval(VAR_MYDOMAIN)) == 0)
++	    domain = DEF_MYDOMAIN;
++	name = concatenate(name, ".", domain, (char *) 0);
++    }
++    return (name);
++}
++
++/* get_myhostname - look up and store my hostname */
++
++static void get_myhostname(void)
++{
++    const char *name;
++
++    if ((name = mail_conf_lookup_eval(VAR_MYHOSTNAME)) == 0)
++	name = check_myhostname();
++    var_myhostname = mystrdup(name);
++}
++
++/* check_mydomainname - lookup domain name and validate */
++
++static const char *check_mydomainname(void)
++{
++    char   *dot;
++
++    /*
++     * Use the hostname when it is not a FQDN ("foo"), or when the hostname
++     * actually is a domain name ("foo.com").
++     */
++    if (var_myhostname == 0)
++	get_myhostname();
++    if ((dot = strchr(var_myhostname, '.')) == 0 || strchr(dot + 1, '.') == 0)
++	return (DEF_MYDOMAIN);
++    return (dot + 1);
++}
++
++/* check_mynetworks - lookup network address list */
++
++static const char *check_mynetworks(void)
++{
++    INET_PROTO_INFO *proto_info;
++    const char *junk;
++
++    if (var_inet_interfaces == 0) {
++	if ((cmd_mode & SHOW_DEFS)
++	    || (junk = mail_conf_lookup_eval(VAR_INET_INTERFACES)) == 0)
++	    junk = DEF_INET_INTERFACES;
++	var_inet_interfaces = mystrdup(junk);
++    }
++    if (var_mynetworks_style == 0) {
++	if ((cmd_mode & SHOW_DEFS)
++	    || (junk = mail_conf_lookup_eval(VAR_MYNETWORKS_STYLE)) == 0)
++	    junk = DEF_MYNETWORKS_STYLE;
++	var_mynetworks_style = mystrdup(junk);
++    }
++    if (var_inet_protocols == 0) {
++	if ((cmd_mode & SHOW_DEFS)
++	    || (junk = mail_conf_lookup_eval(VAR_INET_PROTOCOLS)) == 0)
++	    junk = DEF_INET_PROTOCOLS;
++	var_inet_protocols = mystrdup(junk);
++	proto_info = inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
++    }
++    return (mynetworks());
++}
++
++/* edit_parameters - edit parameter file */
++
++static void edit_parameters(int cmd_mode, int argc, char **argv)
++{
++    char   *config_dir;
++    char   *path;
++    EDIT_FILE *ep;
++    VSTREAM *src;
++    VSTREAM *dst;
++    VSTRING *buf = vstring_alloc(100);
++    VSTRING *key = vstring_alloc(10);
++    char   *cp;
++    char   *edit_key;
++    char   *edit_val;
++    HTABLE *table;
++    struct cvalue {
++	char   *value;
++	int     found;
++    };
++    struct cvalue *cvalue;
++    HTABLE_INFO **ht_info;
++    HTABLE_INFO **ht;
++    int     interesting;
++    const char *err;
++
++    /*
++     * Store command-line parameters for quick lookup.
++     */
++    table = htable_create(argc);
++    while ((cp = *argv++) != 0) {
++	if (strchr(cp, '\n') != 0)
++	    msg_fatal("-e or -# accepts no multi-line input");
++	while (ISSPACE(*cp))
++	    cp++;
++	if (*cp == '#')
++	    msg_fatal("-e or -# accepts no comment input");
++	if (cmd_mode & EDIT_MAIN) {
++	    if ((err = split_nameval(cp, &edit_key, &edit_val)) != 0)
++		msg_fatal("%s: \"%s\"", err, cp);
++	} else if (cmd_mode & COMMENT_OUT) {
++	    if (*cp == 0)
++		msg_fatal("-# requires non-blank parameter names");
++	    if (strchr(cp, '=') != 0)
++		msg_fatal("-# requires parameter names only");
++	    edit_key = mystrdup(cp);
++	    trimblanks(edit_key, 0);
++	    edit_val = 0;
++	} else {
++	    msg_panic("edit_parameters: unknown mode %d", cmd_mode);
++	}
++	cvalue = (struct cvalue *) mymalloc(sizeof(*cvalue));
++	cvalue->value = edit_val;
++	cvalue->found = 0;
++	htable_enter(table, edit_key, (char *) cvalue);
++    }
++
++    /*
++     * XXX Avoid code duplication by better code decomposition.
++     */
++    if (var_config_dir)
++	myfree(var_config_dir);
++    var_config_dir = mystrdup((config_dir = safe_getenv(CONF_ENV_PATH)) != 0 ?
++			      config_dir : DEF_CONFIG_DIR);	/* XXX */
++    set_mail_conf_str(VAR_CONFIG_DIR, var_config_dir);
++
++    /*
++     * Open a temp file for the result. This uses a deterministic name so we
++     * don't leave behind thrash with random names.
++     */
++    path = concatenate(var_config_dir, "/", "main.cf", (char *) 0);
++    if ((ep = edit_file_open(path, O_CREAT | O_WRONLY, 0644)) == 0)
++	msg_fatal("open %s%s: %m", path, EDIT_FILE_SUFFIX);
++    dst = ep->tmp_fp;
++
++    /*
++     * Open the original file for input.
++     */
++    if ((src = vstream_fopen(path, O_RDONLY, 0)) == 0) {
++	/* OK to delete, since we control the temp file name exclusively. */
++	(void) unlink(ep->tmp_path);
++	msg_fatal("open %s for reading: %m", path);
++    }
++
++    /*
++     * Copy original file to temp file, while replacing parameters on the
++     * fly. Issue warnings for names found multiple times.
++     */
++#define STR(x) vstring_str(x)
++
++    interesting = 0;
++    while (vstring_get(buf, src) != VSTREAM_EOF) {
++	for (cp = STR(buf); ISSPACE(*cp) /* including newline */ ; cp++)
++	     /* void */ ;
++	/* Copy comment, all-whitespace, or empty line. */
++	if (*cp == '#' || *cp == 0) {
++	    vstream_fputs(STR(buf), dst);
++	}
++	/* Copy, skip or replace continued text. */
++	else if (cp > STR(buf)) {
++	    if (interesting == 0)
++		vstream_fputs(STR(buf), dst);
++	    else if (cmd_mode & COMMENT_OUT)
++		vstream_fprintf(dst, "#%s", STR(buf));
++	}
++	/* Copy or replace start of logical line. */
++	else {
++	    vstring_strncpy(key, cp, strcspn(cp, " \t\r\n="));
++	    cvalue = (struct cvalue *) htable_find(table, STR(key));
++	    if ((interesting = !!cvalue) != 0) {
++		if (cvalue->found++ == 1)
++		    msg_warn("%s: multiple entries for \"%s\"", path, STR(key));
++		if (cmd_mode & EDIT_MAIN)
++		    vstream_fprintf(dst, "%s = %s\n", STR(key), cvalue->value);
++		else if (cmd_mode & COMMENT_OUT)
++		    vstream_fprintf(dst, "#%s", cp);
++		else
++		    msg_panic("edit_parameters: unknown mode %d", cmd_mode);
++	    } else {
++		vstream_fputs(STR(buf), dst);
++	    }
++	}
++    }
++
++    /*
++     * Generate new entries for parameters that were not found.
++     */
++    if (cmd_mode & EDIT_MAIN) {
++	for (ht_info = ht = htable_list(table); *ht; ht++) {
++	    cvalue = (struct cvalue *) ht[0]->value;
++	    if (cvalue->found == 0)
++		vstream_fprintf(dst, "%s = %s\n", ht[0]->key, cvalue->value);
++	}
++	myfree((char *) ht_info);
++    }
++
++    /*
++     * When all is well, rename the temp file to the original one.
++     */
++    if (vstream_fclose(src))
++	msg_fatal("read %s: %m", path);
++    if (edit_file_close(ep) != 0)
++	msg_fatal("close %s%s: %m", path, EDIT_FILE_SUFFIX);
++
++    /*
++     * Cleanup.
++     */
++    myfree(path);
++    vstring_free(buf);
++    vstring_free(key);
++    htable_free(table, myfree);
++}
++
++/* read_parameters - read parameter info from file */
++
++static void read_parameters(void)
++{
++    char   *config_dir;
++    char   *path;
++
++    /*
++     * A direct rip-off of mail_conf_read(). XXX Avoid code duplication by
++     * better code decomposition.
++     */
++    dict_unknown_allowed = 1;
++    if (var_config_dir)
++	myfree(var_config_dir);
++    var_config_dir = mystrdup((config_dir = safe_getenv(CONF_ENV_PATH)) != 0 ?
++			      config_dir : DEF_CONFIG_DIR);	/* XXX */
++    set_mail_conf_str(VAR_CONFIG_DIR, var_config_dir);
++    path = concatenate(var_config_dir, "/", "main.cf", (char *) 0);
++    dict_load_file(CONFIG_DICT, path);
++    myfree(path);
++}
++
++/* set_parameters - set parameter values from default or explicit setting */
++
++static void set_parameters(void)
++{
++
++    /*
++     * Populate the configuration parameter dictionary with default settings
++     * or with actual settings.
++     * 
++     * Iterate over each entry in str_fn_table, str_fn_table_2, time_table,
++     * bool_table, int_table, str_table, and raw_table. Look up each
++     * parameter name in the configuration parameter dictionary. If the
++     * parameter is not set, take the default value, or take the value from
++     * main.cf, without doing $name expansions. This includes converting
++     * default values from numeric/boolean internal forms to external string
++     * form.
++     * 
++     * Once the configuration parameter dictionary is populated, printing a
++     * parameter setting is a matter of querying the configuration parameter
++     * dictionary, optionally expanding of $name values, and printing the
++     * result.
++     */
++}
++
++/* hash_parameters - hash all parameter names so we can find and sort them */
++
++static void hash_parameters(void)
++{
++    const CONFIG_TIME_TABLE *ctt;
++    const CONFIG_BOOL_TABLE *cbt;
++    const CONFIG_INT_TABLE *cit;
++    const CONFIG_STR_TABLE *cst;
++    const CONFIG_STR_FN_TABLE *csft;
++    const CONFIG_RAW_TABLE *rst;
++    const CONFIG_NINT_TABLE *nst;
++
++    param_table = htable_create(100);
++
++    for (ctt = time_table; ctt->name; ctt++)
++	htable_enter(param_table, ctt->name, (char *) ctt);
++    for (cbt = bool_table; cbt->name; cbt++)
++	htable_enter(param_table, cbt->name, (char *) cbt);
++    for (cit = int_table; cit->name; cit++)
++	htable_enter(param_table, cit->name, (char *) cit);
++    for (cst = str_table; cst->name; cst++)
++	htable_enter(param_table, cst->name, (char *) cst);
++    for (csft = str_fn_table; csft->name; csft++)
++	htable_enter(param_table, csft->name, (char *) csft);
++    for (csft = str_fn_table_2; csft->name; csft++)
++	htable_enter(param_table, csft->name, (char *) csft);
++    for (rst = raw_table; rst->name; rst++)
++	htable_enter(param_table, rst->name, (char *) rst);
++    for (nst = nint_table; nst->name; nst++)
++	htable_enter(param_table, nst->name, (char *) nst);
++}
++
++/* show_strval - show string-valued parameter */
++
++static void show_strval(int mode, const char *name, const char *value)
++{
++    if (mode & SHOW_EVAL)
++	value = mail_conf_eval(value);
++
++    if (mode & SHOW_NAME) {
++	vstream_printf("%s = %s\n", name, value);
++    } else {
++	vstream_printf("%s\n", value);
++    }
++}
++
++/* show_intval - show integer-valued parameter */
++
++static void show_intval(int mode, const char *name, int value)
++{
++    if (mode & SHOW_NAME) {
++	vstream_printf("%s = %d\n", name, value);
++    } else {
++	vstream_printf("%d\n", value);
++    }
++}
++
++/* print_bool - print boolean parameter */
++
++static void print_bool(int mode, CONFIG_BOOL_TABLE *cbt)
++{
++    const char *value;
++
++    if (mode & SHOW_DEFS) {
++	show_strval(mode, cbt->name, cbt->defval ? "yes" : "no");
++    } else {
++	value = dict_lookup(CONFIG_DICT, cbt->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_strval(mode, cbt->name, cbt->defval ? "yes" : "no");
++	    } else {
++		show_strval(mode, cbt->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, cbt->name, value);
++	}
++    }
++}
++
++/* print_time - print relative time parameter */
++
++static void print_time(int mode, CONFIG_TIME_TABLE *ctt)
++{
++    const char *value;
++
++    if (mode & SHOW_DEFS) {
++	show_strval(mode, ctt->name, ctt->defval);
++    } else {
++	value = dict_lookup(CONFIG_DICT, ctt->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_strval(mode, ctt->name, ctt->defval);
++	    } else {
++		show_strval(mode, ctt->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, ctt->name, value);
++	}
++    }
++}
++
++/* print_int - print integer parameter */
++
++static void print_int(int mode, CONFIG_INT_TABLE *cit)
++{
++    const char *value;
++
++    if (mode & SHOW_DEFS) {
++	show_intval(mode, cit->name, cit->defval);
++    } else {
++	value = dict_lookup(CONFIG_DICT, cit->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_intval(mode, cit->name, cit->defval);
++	    } else {
++		show_strval(mode, cit->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, cit->name, value);
++	}
++    }
++}
++
++/* print_str - print string parameter */
++
++static void print_str(int mode, CONFIG_STR_TABLE *cst)
++{
++    const char *value;
++
++    if (mode & SHOW_DEFS) {
++	show_strval(mode, cst->name, cst->defval);
++    } else {
++	value = dict_lookup(CONFIG_DICT, cst->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_strval(mode, cst->name, cst->defval);
++	    } else {
++		show_strval(mode, cst->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, cst->name, value);
++	}
++    }
++}
++
++/* print_str_fn - print string-function parameter */
++
++static void print_str_fn(int mode, CONFIG_STR_FN_TABLE *csft)
++{
++    const char *value;
++
++    if (mode & SHOW_DEFS) {
++	show_strval(mode, csft->name, csft->defval());
++    } else {
++	value = dict_lookup(CONFIG_DICT, csft->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_strval(mode, csft->name, csft->defval());
++	    } else {
++		show_strval(mode, csft->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, csft->name, value);
++	}
++    }
++}
++
++/* print_str_fn_2 - print string-function parameter */
++
++static void print_str_fn_2(int mode, CONFIG_STR_FN_TABLE *csft)
++{
++    const char *value;
++
++    if (mode & SHOW_DEFS) {
++	show_strval(mode, csft->name, csft->defval());
++    } else {
++	value = dict_lookup(CONFIG_DICT, csft->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_strval(mode, csft->name, csft->defval());
++	    } else {
++		show_strval(mode, csft->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, csft->name, value);
++	}
++    }
++}
++
++/* print_raw - print raw string parameter */
++
++static void print_raw(int mode, CONFIG_RAW_TABLE * rst)
++{
++    const char *value;
++
++    if (mode & SHOW_EVAL)
++	msg_warn("parameter %s expands at run-time", rst->name);
++    mode &= ~SHOW_EVAL;
++
++    if (mode & SHOW_DEFS) {
++	show_strval(mode, rst->name, rst->defval);
++    } else {
++	value = dict_lookup(CONFIG_DICT, rst->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_strval(mode, rst->name, rst->defval);
++	    } else {
++		show_strval(mode, rst->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, rst->name, value);
++	}
++    }
++}
++
++/* print_nint - print new integer parameter */
++
++static void print_nint(int mode, CONFIG_NINT_TABLE * rst)
++{
++    const char *value;
++
++    if (mode & SHOW_EVAL)
++	msg_warn("parameter %s expands at run-time", rst->name);
++    mode &= ~SHOW_EVAL;
++
++    if (mode & SHOW_DEFS) {
++	show_strval(mode, rst->name, rst->defval);
++    } else {
++	value = dict_lookup(CONFIG_DICT, rst->name);
++	if ((mode & SHOW_NONDEF) == 0) {
++	    if (value == 0) {
++		show_strval(mode, rst->name, rst->defval);
++	    } else {
++		show_strval(mode, rst->name, value);
++	    }
++	} else {
++	    if (value != 0)
++		show_strval(mode, rst->name, value);
++	}
++    }
++}
++
++/* print_parameter - show specific parameter */
++
++static void print_parameter(int mode, char *ptr)
++{
++
++#define INSIDE(p,t) (ptr >= (char *) t && ptr < ((char *) t) + sizeof(t))
++
++    /*
++     * This is gross, but the best we can do on short notice.
++     */
++    if (INSIDE(ptr, time_table))
++	print_time(mode, (CONFIG_TIME_TABLE *) ptr);
++    if (INSIDE(ptr, bool_table))
++	print_bool(mode, (CONFIG_BOOL_TABLE *) ptr);
++    if (INSIDE(ptr, int_table))
++	print_int(mode, (CONFIG_INT_TABLE *) ptr);
++    if (INSIDE(ptr, str_table))
++	print_str(mode, (CONFIG_STR_TABLE *) ptr);
++    if (INSIDE(ptr, str_fn_table))
++	print_str_fn(mode, (CONFIG_STR_FN_TABLE *) ptr);
++    if (INSIDE(ptr, str_fn_table_2))
++	print_str_fn_2(mode, (CONFIG_STR_FN_TABLE *) ptr);
++    if (INSIDE(ptr, raw_table))
++	print_raw(mode, (CONFIG_RAW_TABLE *) ptr);
++    if (INSIDE(ptr, nint_table))
++	print_nint(mode, (CONFIG_NINT_TABLE *) ptr);
++    if (msg_verbose)
++	vstream_fflush(VSTREAM_OUT);
++}
++
++/* comp_names - qsort helper */
++
++static int comp_names(const void *a, const void *b)
++{
++    HTABLE_INFO **ap = (HTABLE_INFO **) a;
++    HTABLE_INFO **bp = (HTABLE_INFO **) b;
++
++    return (strcmp(ap[0]->key, bp[0]->key));
++}
++
++/* show_maps - show available maps */
++
++static void show_maps(void)
++{
++    ARGV   *maps_argv;
++    int     i;
++
++    maps_argv = dict_mapnames();
++    for (i = 0; i < maps_argv->argc; i++)
++	vstream_printf("%s\n", maps_argv->argv[i]);
++    argv_free(maps_argv);
++}
++
++/* show_locks - show available mailbox locking methods */
++
++static void show_locks(void)
++{
++    ARGV   *locks_argv;
++    int     i;
++
++    locks_argv = mbox_lock_names();
++    for (i = 0; i < locks_argv->argc; i++)
++	vstream_printf("%s\n", locks_argv->argv[i]);
++    argv_free(locks_argv);
++}
++
++/* show_sasl - show SASL plug-in types */
++
++static void show_sasl(int what)
++{
++    ARGV   *sasl_argv;
++    int     i;
++
++    sasl_argv = (what & SHOW_SASL_SERV) ? xsasl_server_types() :
++	xsasl_client_types();
++    for (i = 0; i < sasl_argv->argc; i++)
++	vstream_printf("%s\n", sasl_argv->argv[i]);
++    argv_free(sasl_argv);
++}
++
++/* show_parameters - show parameter info */
++
++static void show_parameters(int mode, char **names)
++{
++    HTABLE_INFO **list;
++    HTABLE_INFO **ht;
++    char  **namep;
++    char   *value;
++
++    /*
++     * Show all parameters.
++     */
++    if (*names == 0) {
++	list = htable_list(param_table);
++	qsort((char *) list, param_table->used, sizeof(*list), comp_names);
++	for (ht = list; *ht; ht++)
++	    print_parameter(mode, ht[0]->value);
++	myfree((char *) list);
++	return;
++    }
++
++    /*
++     * Show named parameters.
++     */
++    for (namep = names; *namep; namep++) {
++	if ((value = htable_find(param_table, *namep)) == 0) {
++	    msg_warn("%s: unknown parameter", *namep);
++	} else {
++	    print_parameter(mode, value);
++	}
++    }
++}
++
++MAIL_VERSION_STAMP_DECLARE;
++
++/* main */
++
++int     main(int argc, char **argv)
++{
++    int     ch;
++    int     fd;
++    struct stat st;
++    int     junk;
++    ARGV   *ext_argv = 0;
++
++    /*
++     * Fingerprint executables and core dumps.
++     */
++    MAIL_VERSION_STAMP_ALLOCATE;
++
++    /*
++     * Be consistent with file permissions.
++     */
++    umask(022);
++
++    /*
++     * To minimize confusion, make sure that the standard file descriptors
++     * are open before opening anything else. XXX Work around for 44BSD where
++     * fstat can return EBADF on an open file descriptor.
++     */
++    for (fd = 0; fd < 3; fd++)
++	if (fstat(fd, &st) == -1
++	    && (close(fd), open("/dev/null", O_RDWR, 0)) != fd)
++	    msg_fatal("open /dev/null: %m");
++
++    /*
++     * Set up logging.
++     */
++    msg_vstream_init(argv[0], VSTREAM_ERR);
++
++    /*
++     * Parse JCL.
++     */
++    while ((ch = GETOPT(argc, argv, "aAbc:deE#hmlntv")) > 0) {
++	switch (ch) {
++	case 'a':
++	    cmd_mode |= SHOW_SASL_SERV;
++	    break;
++	case 'A':
++	    cmd_mode |= SHOW_SASL_CLNT;
++	    break;
++	case 'b':
++	    if (ext_argv)
++		msg_fatal("specify one of -b and -t");
++	    ext_argv = argv_alloc(2);
++	    argv_add(ext_argv, "bounce", "-SVnexpand_templates", (char *) 0);
++	    break;
++	case 'c':
++	    if (setenv(CONF_ENV_PATH, optarg, 1) < 0)
++		msg_fatal("out of memory");
++	    break;
++	case 'd':
++	    cmd_mode |= SHOW_DEFS;
++	    break;
++	case 'e':
++	    cmd_mode |= EDIT_MAIN;
++	    break;
++
++	    /*
++	     * People, this does not work unless you properly handle default
++	     * settings. For example, fast_flush_domains = $relay_domains
++	     * must not evaluate to the empty string when relay_domains is
++	     * left at its default setting of $mydestination.
++	     */
++#if 0
++	case 'E':
++	    cmd_mode |= SHOW_EVAL;
++	    break;
++#endif
++	case '#':
++	    cmd_mode = COMMENT_OUT;
++	    break;
++
++	case 'h':
++	    cmd_mode &= ~SHOW_NAME;
++	    break;
++	case 'l':
++	    cmd_mode |= SHOW_LOCKS;
++	    break;
++	case 'm':
++	    cmd_mode |= SHOW_MAPS;
++	    break;
++	case 'n':
++	    cmd_mode |= SHOW_NONDEF;
++	    break;
++	case 't':
++	    if (ext_argv)
++		msg_fatal("specify one of -b and -t");
++	    ext_argv = argv_alloc(2);
++	    argv_add(ext_argv, "bounce", "-SVndump_templates", (char *) 0);
++	    break;
++	case 'v':
++	    msg_verbose++;
++	    break;
++	default:
++	    msg_fatal("usage: %s [-a (server SASL types)] [-A (client SASL types)] [-b (bounce templates)] [-c config_dir] [-d (defaults)] [-e (edit)] [-# (comment-out)] [-h (no names)] [-l (lock types)] [-m (map types)] [-n (non-defaults)] [-v] [name...]", argv[0]);
++	}
++    }
++
++    /*
++     * Sanity check.
++     */
++    junk = (cmd_mode & (SHOW_DEFS | SHOW_NONDEF | SHOW_MAPS | SHOW_LOCKS | EDIT_MAIN | SHOW_SASL_SERV | SHOW_SASL_CLNT | COMMENT_OUT));
++    if (junk != 0 && ((junk != SHOW_DEFS && junk != SHOW_NONDEF
++	     && junk != SHOW_MAPS && junk != SHOW_LOCKS && junk != EDIT_MAIN
++		       && junk != SHOW_SASL_SERV && junk != SHOW_SASL_CLNT
++		       && junk != COMMENT_OUT)
++		      || ext_argv != 0))
++	msg_fatal("specify one of -a, -A, -b, -d, -e, -#, -m, -l and -n");
++
++    /*
++     * Display bounce template information and exit.
++     */
++    if (ext_argv) {
++	if (argv[optind]) {
++	    if (argv[optind + 1])
++		msg_fatal("options -b and -t require at most one template file");
++	    argv_add(ext_argv, "-o",
++		     concatenate(VAR_BOUNCE_TMPL, "=",
++				 argv[optind], (char *) 0),
++		     (char *) 0);
++	}
++	/* Grr... */
++	argv_add(ext_argv, "-o",
++		 concatenate(VAR_QUEUE_DIR, "=", ".", (char *) 0),
++		 (char *) 0);
++	mail_conf_read();
++	mail_run_replace(var_daemon_dir, ext_argv->argv);
++	/* NOTREACHED */
++    }
++
++    /*
++     * If showing map types, show them and exit
++     */
++    if (cmd_mode & SHOW_MAPS) {
++	mail_dict_init();
++	show_maps();
++    }
++
++    /*
++     * If showing locking methods, show them and exit
++     */
++    else if (cmd_mode & SHOW_LOCKS) {
++	show_locks();
++    }
++
++    /*
++     * If showing SASL plug-in types, show them and exit
++     */
++    else if (cmd_mode & SHOW_SASL_SERV) {
++	show_sasl(SHOW_SASL_SERV);
++    } else if (cmd_mode & SHOW_SASL_CLNT) {
++	show_sasl(SHOW_SASL_CLNT);
++    }
++
++    /*
++     * Edit main.cf.
++     */
++    else if (cmd_mode & (EDIT_MAIN | COMMENT_OUT)) {
++	edit_parameters(cmd_mode, argc - optind, argv + optind);
++    }
++
++    /*
++     * If showing non-default values, read main.cf.
++     */
++    else {
++	if ((cmd_mode & SHOW_DEFS) == 0) {
++	    read_parameters();
++	    set_parameters();
++	}
++
++	/*
++	 * Throw together all parameters and show the asked values.
++	 */
++	hash_parameters();
++	show_parameters(cmd_mode, argv + optind);
++    }
++    vstream_fflush(VSTREAM_OUT);
++    exit(0);
++}
+diff -ruN a/src/postmap/postmap.c b/src/postmap/postmap.c
+--- a/src/postmap/postmap.c	2009-06-01 12:27:45.000000000 +0000
++++ b/src/postmap/postmap.c	2009-06-01 13:08:26.000000000 +0000
+@@ -5,7 +5,7 @@
+ /*	Postfix lookup table management
+ /* SYNOPSIS
+ /* .fi
+-/*	\fBpostmap\fR [\fB-Nbfhimnoprsvw\fR] [\fB-c \fIconfig_dir\fR]
++/*	\fBpostmap\fR [\fB-Nbfhimnoprsuvw\fR] [\fB-c \fIconfig_dir\fR]
+ /*	[\fB-d \fIkey\fR] [\fB-q \fIkey\fR]
+ /*		[\fIfile_type\fR:]\fIfile_name\fR ...
+ /* DESCRIPTION
+@@ -151,6 +151,8 @@
+ /* .sp
+ /*	This feature is available in Postfix version 2.2 and later,
+ /*	and is not available for all database types.
++/* .IP \fB-u\fR
++/*     Upgrade the database to the current version.
+ /* .IP \fB-v\fR
+ /*	Enable verbose logging for debugging purposes. Multiple \fB-v\fR
+ /*	options make the software increasingly verbose.
+@@ -723,6 +725,18 @@
+     dict_close(dict);
+ }
+ 
++/* postmap_upgrade - upgrade a map */
++
++static int postmap_upgrade(const char *map_type, const char *map_name)
++{
++    DICT   *dict;
++
++    dict = dict_open3(map_type, map_name, O_RDWR,
++                       DICT_FLAG_LOCK|DICT_FLAG_UPGRADE);
++    dict_close(dict);
++    return (dict != 0);
++}
++
+ /* usage - explain */
+ 
+ static NORETURN usage(char *myname)
+@@ -743,6 +757,7 @@
+     int     postmap_flags = POSTMAP_FLAG_AS_OWNER | POSTMAP_FLAG_SAVE_PERM;
+     int     open_flags = O_RDWR | O_CREAT | O_TRUNC;
+     int     dict_flags = DICT_FLAG_DUP_WARN | DICT_FLAG_FOLD_FIX;
++    int     upgrade = 0;
+     char   *query = 0;
+     char   *delkey = 0;
+     int     sequence = 0;
+@@ -787,7 +802,7 @@
+     /*
+      * Parse JCL.
+      */
+-    while ((ch = GETOPT(argc, argv, "Nbc:d:fhimnopq:rsvw")) > 0) {
++    while ((ch = GETOPT(argc, argv, "Nbc:d:fhimnopq:rsuvw")) > 0) {
+ 	switch (ch) {
+ 	default:
+ 	    usage(argv[0]);
+@@ -804,8 +819,8 @@
+ 		msg_fatal("out of memory");
+ 	    break;
+ 	case 'd':
+-	    if (sequence || query || delkey)
+-		msg_fatal("specify only one of -s -q or -d");
++	    if (sequence || query || delkey || upgrade)
++		msg_fatal("specify only one of -s -q -u or -d");
+ 	    delkey = optarg;
+ 	    break;
+ 	case 'f':
+@@ -831,8 +846,8 @@
+ 	    postmap_flags &= ~POSTMAP_FLAG_SAVE_PERM;
+ 	    break;
+ 	case 'q':
+-	    if (sequence || query || delkey)
+-		msg_fatal("specify only one of -s -q or -d");
++	    if (sequence || query || delkey || upgrade)
++		msg_fatal("specify only one of -s -q -u or -d");
+ 	    query = optarg;
+ 	    break;
+ 	case 'r':
+@@ -840,10 +855,15 @@
+ 	    dict_flags |= DICT_FLAG_DUP_REPLACE;
+ 	    break;
+ 	case 's':
+-	    if (query || delkey)
+-		msg_fatal("specify only one of -s or -q or -d");
++	    if (query || delkey || upgrade)
++		msg_fatal("specify only one of -s or -q or -u or -d");
+ 	    sequence = 1;
+ 	    break;
++       case 'u':
++           if (sequence || query || delkey || upgrade)
++               msg_fatal("specify only one of -s -q -u or -d");
++           upgrade=1;
++           break;
+ 	case 'v':
+ 	    msg_verbose++;
+ 	    break;
+@@ -914,6 +934,21 @@
+ 	    exit(0);
+ 	}
+ 	exit(1);
++    } else if (upgrade) {                      /* Upgrade the map(s) */
++       int success = 1;
++       if (optind + 1 > argc)
++           usage(argv[0]);
++       while (optind < argc) {
++           if ((path_name = split_at(argv[optind], ':')) != 0) {
++               success &= postmap_upgrade(argv[optind], path_name);
++           } else {
++               success &= postmap_upgrade(var_db_type, path_name);
++           }
++           if (!success)
++               exit(1);
++           optind++;
++       }
++       exit(0);
+     } else {					/* create/update map(s) */
+ 	if (optind + 1 > argc)
+ 	    usage(argv[0]);
+diff -ruN a/src/tls/Makefile.in b/src/tls/Makefile.in
+--- a/src/tls/Makefile.in	2009-06-01 12:27:45.000000000 +0000
++++ b/src/tls/Makefile.in	2009-06-01 13:08:26.000000000 +0000
+@@ -22,7 +22,7 @@
+ INC_DIR	= ../../include
+ MAKES	=
+ 
+-.c.o:;	$(CC) $(CFLAGS) -c $*.c
++.c.o:;	$(CC) -fPIC $(CFLAGS) -c $*.c
+ 
+ all: $(LIB)
+ 
+@@ -38,12 +38,10 @@
+ root_tests:
+ 
+ $(LIB):	$(OBJS)
+-	$(AR) $(ARFL) $(LIB) $?
+-	$(RANLIB) $(LIB)
++	gcc -shared -Wl,-soname,libpostfix-tls.so.1 -o $(LIB) $(OBJS) $(LIBS) $(SYSLIBS)
+ 
+ $(LIB_DIR)/$(LIB): $(LIB)
+ 	cp $(LIB) $(LIB_DIR)
+-	$(RANLIB) $(LIB_DIR)/$(LIB)
+ 
+ update: $(LIB_DIR)/$(LIB) $(HDRS)
+ 	-for i in $(HDRS); \
+diff -ruN a/src/util/Makefile.in b/src/util/Makefile.in
+--- a/src/util/Makefile.in	2009-06-01 12:27:45.000000000 +0000
++++ b/src/util/Makefile.in	2009-06-01 13:08:26.000000000 +0000
+@@ -31,21 +31,23 @@
+ 	vstream_popen.c vstring.c vstring_vstream.c watchdog.c writable.c \
+ 	write_buf.c write_wait.c sane_basename.c format_tv.c allspace.c \
+ 	allascii.c load_file.c killme_after.c vstream_tweak.c upass_connect.c \
+-	upass_listen.c upass_trigger.c edit_file.c inet_windowsize.c
++	upass_listen.c upass_trigger.c edit_file.c inet_windowsize.c \
++	load_lib.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 \
+ 	chroot_uid.o cidr_match.o clean_env.o close_on_exec.o concatenate.o \
+ 	ctable.o dict.o dict_alloc.o dict_cdb.o dict_cidr.o dict_db.o \
+ 	dict_dbm.o dict_debug.o dict_env.o dict_ht.o dict_ni.o dict_nis.o \
+-	dict_nisplus.o dict_open.o dict_pcre.o dict_regexp.o dict_sdbm.o \
+-	dict_static.o dict_tcp.o dict_unix.o dir_forest.o doze.o dummy_read.o \
++	dict_nisplus.o dict_open.o dict_regexp.o \
++	dict_static.o dict_unix.o dir_forest.o doze.o dummy_read.o \
+ 	dummy_write.o duplex_pipe.o environ.o events.o exec_command.o \
+ 	fifo_listen.o fifo_trigger.o file_limit.o find_inet.o fsspace.o \
+ 	fullname.o get_domainname.o get_hostname.o hex_code.o hex_quote.o \
+ 	host_port.o htable.o inet_addr_host.o inet_addr_list.o \
+ 	inet_addr_local.o inet_connect.o inet_listen.o inet_proto.o \
+ 	inet_trigger.o line_wrap.o lowercase.o lstat_as.o mac_expand.o \
++	load_lib.o \
+ 	mac_parse.o make_dirs.o mask_addr.o match_list.o match_ops.o msg.o \
+ 	msg_output.o msg_syslog.o msg_vstream.o mvect.o myaddrinfo.o myflock.o \
+ 	mymalloc.o myrand.o mystrtok.o name_code.o name_mask.o netstring.o \
+@@ -78,7 +80,7 @@
+ 	msg_output.h msg_syslog.h msg_vstream.h mvect.h myaddrinfo.h myflock.h \
+ 	mymalloc.h myrand.h name_code.h name_mask.h netstring.h nvtable.h \
+ 	open_as.h open_lock.h percentm.h posix_signals.h readlline.h ring.h \
+-	safe.h safe_open.h sane_accept.h sane_connect.h sane_fsops.h \
++	safe.h safe_open.h sane_accept.h sane_connect.h sane_fsops.h load_lib.h \
+ 	sane_socketpair.h sane_time.h scan_dir.h set_eugid.h set_ugid.h \
+ 	sigdelay.h sock_addr.h spawn_command.h split_at.h stat_as.h \
+ 	stringops.h sys_defs.h timed_connect.h timed_wait.h trigger.h \
+@@ -91,6 +93,7 @@
+ CFLAGS	= $(DEBUG) $(OPT) $(DEFS)
+ FILES	= Makefile $(SRCS) $(HDRS)
+ INCL	=
++PCRESO  = dict_pcre.so
+ LIB	= libutil.a
+ TESTPROG= dict_open dup2_pass_on_exec events exec_command fifo_open \
+ 	fifo_rdonly_bug fifo_rdwr_bug fifo_trigger fsspace fullname \
+@@ -105,10 +108,11 @@
+ 
+ LIB_DIR	= ../../lib
+ INC_DIR	= ../../include
++LIBS    = $(LIB_DIR)/$(LIB) $(PCRESO)
+ 
+-.c.o:;	$(CC) $(CFLAGS) -c $*.c
++.c.o:;	$(CC) -fPIC $(CFLAGS) -c $*.c
+ 
+-all: $(LIB)
++all: $(LIB) $(PCRESO)
+ 
+ $(OBJS): ../../conf/makedefs.out
+ 
+@@ -117,15 +121,19 @@
+ 
+ test:	$(TESTPROG)
+ 
++$(PCRESO): dict_pcre.o
++	gcc -shared -Wl,-soname,dict_pcre.so -o $@ $? -lpcre -L. -lutil
++
+ $(LIB):	$(OBJS)
+-	$(AR) $(ARFL) $(LIB) $?
+-	$(RANLIB) $(LIB)
++	gcc -shared -Wl,-soname,libpostfix-util.so.1 -o $(LIB) $(OBJS) -ldl $(SYSLIBS)
+ 
+ $(LIB_DIR)/$(LIB): $(LIB)
+ 	cp $(LIB) $(LIB_DIR)
+-	$(RANLIB) $(LIB_DIR)/$(LIB)
+ 
+-update: $(LIB_DIR)/$(LIB) $(HDRS)
++../../libexec/$(PCRESO): $(PCRESO)
++	cp $(PCRESO) ../../libexec
++
++update: $(LIBS) ../../libexec/$(PCRESO) $(HDRS)
+ 	-for i in $(HDRS); \
+ 	do \
+ 	  cmp -s $$i $(INC_DIR)/$$i 2>/dev/null || cp $$i $(INC_DIR); \
+@@ -147,7 +155,8 @@
+ 	lint $(SRCS)
+ 
+ clean:
+-	rm -f *.o $(LIB) *core $(TESTPROG) junk $(MAKES) *.tmp
++	rm -f *.o $(LIB) $(PCRESO) *core $(TESTPROG) \
++		junk $(MAKES) *.tmp
+ 	rm -rf printfck
+ 
+ tidy:	clean
+diff -ruN a/src/util/dict.h b/src/util/dict.h
+--- a/src/util/dict.h	2009-06-01 12:27:45.000000000 +0000
++++ b/src/util/dict.h	2009-06-01 13:08:26.000000000 +0000
+@@ -66,6 +66,7 @@
+ #define DICT_FLAG_NO_UNAUTH	(1<<13)	/* disallow unauthenticated data */
+ #define DICT_FLAG_FOLD_FIX	(1<<14)	/* case-fold key with fixed-case map */
+ #define DICT_FLAG_FOLD_MUL	(1<<15)	/* case-fold key with multi-case map */
++#define DICT_FLAG_UPGRADE	(1<<30) /* Upgrade the db */
+ #define DICT_FLAG_FOLD_ANY	(DICT_FLAG_FOLD_FIX | DICT_FLAG_FOLD_MUL)
+ 
+  /* IMPORTANT: Update the dict_mask[] table when the above changes */
+@@ -138,6 +139,11 @@
+ extern DICT *dict_open(const char *, int, int);
+ extern DICT *dict_open3(const char *, const char *, int, int);
+ extern void dict_open_register(const char *, DICT *(*) (const char *, int, int));
++#ifndef NO_DYNAMIC_MAPS
++extern void dict_open_dlinfo(const char *path);
++typedef void* (*dict_mkmap_func_t)(const char *);
++dict_mkmap_func_t dict_mkmap_func(const char *dict_type);
++#endif
+ 
+ #define dict_get(dp, key)	((const char *) (dp)->lookup((dp), (key)))
+ #define dict_put(dp, key, val)	(dp)->update((dp), (key), (val))
+diff -ruN a/src/util/dict_db.c b/src/util/dict_db.c
+--- a/src/util/dict_db.c	2009-06-01 12:27:45.000000000 +0000
++++ b/src/util/dict_db.c	2009-06-01 13:08:26.000000000 +0000
+@@ -664,6 +664,12 @@
+ 	msg_fatal("set DB cache size %d: %m", dict_db_cache_size);
+     if (type == DB_HASH && db->set_h_nelem(db, DICT_DB_NELM) != 0)
+ 	msg_fatal("set DB hash element count %d: %m", DICT_DB_NELM);
++    if (dict_flags & DICT_FLAG_UPGRADE) {
++	if (msg_verbose)
++	    msg_info("upgrading database %s",db_path);
++	if ((errno = db->upgrade(db,db_path,0)) != 0)
++	    msg_fatal("upgrade of database %s: %m",db_path);
++    }
+ #if (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR > 0)
+     if ((errno = db->open(db, 0, db_path, 0, type, db_flags, 0644)) != 0)
+ 	msg_fatal("open database %s: %m", db_path);
+diff -ruN a/src/util/dict_dbm.c b/src/util/dict_dbm.c
+--- a/src/util/dict_dbm.c	2009-06-01 12:27:45.000000000 +0000
++++ b/src/util/dict_dbm.c	2009-06-01 13:08:26.000000000 +0000
+@@ -407,6 +407,10 @@
+     char   *dbm_path;
+     int     lock_fd;
+ 
++#ifdef HAVE_GDBM
++    msg_fatal("%s: gdbm maps use locking that is incompatible with postfix.  Use a hash map instead.",
++		 path);
++#endif
+     /*
+      * Note: DICT_FLAG_LOCK is used only by programs that do fine-grained (in
+      * the time domain) locking while accessing individual database records.
+diff -ruN a/src/util/dict_open.c b/src/util/dict_open.c
+--- a/src/util/dict_open.c	2009-06-01 12:27:45.000000000 +0000
++++ b/src/util/dict_open.c	2009-06-01 13:08:26.000000000 +0000
+@@ -44,6 +44,8 @@
+ /*	DICT	*(*open) (const char *, int, int);
+ /*
+ /*	ARGV	*dict_mapnames()
++/*
++/*	void (*)() dict_mkmap_func(const char *dict_type)
+ /* DESCRIPTION
+ /*	This module implements a low-level interface to multiple
+ /*	physical dictionary types.
+@@ -159,6 +161,9 @@
+ /*
+ /*	dict_mapnames() returns a sorted list with the names of all available
+ /*	dictionary types.
++/*
++/*	dict_mkmap_func() returns a pointer to the mkmap setup function
++/*	for the given map type, as given in /etc/dynamicmaps.cf
+ /* DIAGNOSTICS
+ /*	Fatal error: open error, unsupported dictionary type, attempt to
+ /*	update non-writable dictionary.
+@@ -183,6 +188,9 @@
+ #include <strings.h>
+ #endif
+ 
++#include <sys/stat.h>
++#include <unistd.h>
++
+ /* Utility library. */
+ 
+ #include <argv.h>
+@@ -207,6 +215,27 @@
+ #include <split_at.h>
+ #include <htable.h>
+ 
++#ifndef NO_DYNAMIC_MAPS
++#include <load_lib.h>
++#include <vstring.h>
++#include <vstream.h>
++#include <vstring_vstream.h>
++#include <mvect.h>
++
++ /*
++  * Interface for dynamic map loading.
++  */
++typedef struct {
++    const char  *pattern;
++    const char  *soname;
++    const char  *openfunc;
++    const char  *mkmapfunc;
++} DLINFO;
++
++static DLINFO *dict_dlinfo;
++static DLINFO *dict_open_dlfind(const char *type);
++#endif
++
+  /*
+   * lookup table for available map types.
+   */
+@@ -221,9 +250,11 @@
+ #endif
+     DICT_TYPE_ENVIRON, dict_env_open,
+     DICT_TYPE_UNIX, dict_unix_open,
++#ifdef NO_DYNAMIC_MAPS
+ #ifdef SNAPSHOT
+     DICT_TYPE_TCP, dict_tcp_open,
+ #endif
++#endif
+ #ifdef HAS_SDBM
+     DICT_TYPE_SDBM, dict_sdbm_open,
+ #endif
+@@ -243,9 +274,11 @@
+ #ifdef HAS_NETINFO
+     DICT_TYPE_NETINFO, dict_ni_open,
+ #endif
++#ifdef NO_DYNAMIC_MAPS
+ #ifdef HAS_PCRE
+     DICT_TYPE_PCRE, dict_pcre_open,
+ #endif
++#endif /* NO_DYNAMIC_MAPS */
+ #ifdef HAS_POSIX_REGEXP
+     DICT_TYPE_REGEXP, dict_regexp_open,
+ #endif
+@@ -303,8 +336,31 @@
+ 		  dict_type, dict_name);
+     if (dict_open_hash == 0)
+ 	dict_open_init();
+-    if ((dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type)) == 0)
+-	msg_fatal("unsupported dictionary type: %s", dict_type);
++    if ((dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type)) == 0) {
++#ifdef NO_DYNAMIC_MAPS
++	msg_fatal("%s: unsupported dictionary type: %s", myname, dict_type);
++#else
++	struct stat st;
++	LIB_FN fn[2];
++	DICT *(*open) (const char *, int, int);
++	DLINFO *dl=dict_open_dlfind(dict_type);
++	if (!dl)
++	    msg_fatal("%s: unsupported dictionary type: %s:  Is the postfix-%s package installed?", myname, dict_type, dict_type);
++	if (stat(dl->soname,&st) < 0) {
++	    msg_fatal("%s: unsupported dictionary type: %s (%s not found.  Is the postfix-%s package installed?)",
++		myname, dict_type, dl->soname, dict_type);
++	}
++	fn[0].name = dl->openfunc;
++	fn[0].ptr  = (void**)&open;
++	fn[1].name = NULL;
++	load_library_symbols(dl->soname, fn, NULL);
++	dict_open_register(dict_type, open);
++	dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type);
++#endif
++    }
++    if (msg_verbose>1) {
++	msg_info("%s: calling %s open routine",myname,dict_type);
++    }
+     if ((dict = dp->open(dict_name, open_flags, dict_flags)) == 0)
+ 	msg_fatal("opening %s:%s %m", dict_type, dict_name);
+     if (msg_verbose)
+@@ -312,6 +368,36 @@
+     return (dict);
+ }
+ 
++dict_mkmap_func_t dict_mkmap_func(const char *dict_type)
++{
++    char   *myname="dict_mkmap_func";
++    struct stat st;
++    LIB_FN fn[2];
++    dict_mkmap_func_t mkmap;
++    DLINFO *dl;
++#ifndef NO_DYNAMIC_MAPS
++    if (!dict_dlinfo)
++	msg_fatal("dlinfo==NULL");
++    dl=dict_open_dlfind(dict_type);
++    if (!dl)
++	msg_fatal("%s: unsupported dictionary type: %s:  Is the postfix-%s package installed?", myname, dict_type, dict_type);
++    if (stat(dl->soname,&st) < 0) {
++	msg_fatal("%s: unsupported dictionary type: %s (%s not found.  Is the postfix-%s package installed?)",
++	    myname, dict_type, dl->soname, dict_type);
++    }
++    if (!dl->mkmapfunc)
++	msg_fatal("%s: unsupported dictionary type: %s does not allow map creation.", myname, dict_type);
++
++    fn[0].name = dl->mkmapfunc;
++    fn[0].ptr  = (void**)&mkmap;
++    fn[1].name = NULL;
++    load_library_symbols(dl->soname, fn, NULL);
++    return mkmap;
++#else
++    return (void(*)())NULL;
++#endif
++}
++
+ /* dict_open_register - register dictionary type */
+ 
+ void    dict_open_register(const char *type,
+@@ -345,6 +431,9 @@
+     HTABLE_INFO **ht;
+     DICT_OPEN_INFO *dp;
+     ARGV   *mapnames;
++#ifndef NO_DYNAMIC_MAPS
++    DLINFO *dlp;
++#endif
+ 
+     if (dict_open_hash == 0)
+ 	dict_open_init();
+@@ -353,6 +442,13 @@
+ 	dp = (DICT_OPEN_INFO *) ht[0]->value;
+ 	argv_add(mapnames, dp->type, ARGV_END);
+     }
++#ifndef NO_DYNAMIC_MAPS
++    if (!dict_dlinfo)
++	msg_fatal("dlinfo==NULL");
++    for (dlp=dict_dlinfo; dlp->pattern; dlp++) {
++	argv_add(mapnames, dlp->pattern, ARGV_END);
++    }
++#endif
+     qsort((void *) mapnames->argv, mapnames->argc, sizeof(mapnames->argv[0]),
+ 	  dict_sort_alpha_cpp);
+     myfree((char *) ht_info);
+@@ -360,6 +456,87 @@
+     return mapnames;
+ }
+ 
++#ifndef NO_DYNAMIC_MAPS
++#define	STREQ(x,y) (x == y || (x[0] == y[0] && strcmp(x,y) == 0))
++
++void dict_open_dlinfo(const char *path)
++{
++    char    *myname="dict_open_dlinfo";
++    VSTREAM *conf_fp=vstream_fopen(path,O_RDONLY,0);
++    VSTRING *buf = vstring_alloc(100);
++    char    *cp;
++    ARGV    *argv;
++    MVECT    vector;
++    int      nelm=0;
++    int      linenum=0;
++
++    dict_dlinfo=(DLINFO*)mvect_alloc(&vector,sizeof(DLINFO),3,NULL,NULL);
++
++    if (!conf_fp) {
++	msg_warn("%s: cannot open %s.  No dynamic maps will be allowed.",
++		myname, path);
++    } else {
++	while (vstring_get_nonl(buf,conf_fp) != VSTREAM_EOF) {
++	    cp = vstring_str(buf);
++	    linenum++;
++	    if (*cp == '#' || *cp == '\0')
++		continue;
++	    argv = argv_split(cp, " \t");
++	    if (argv->argc != 3 && argv->argc != 4) {
++		msg_fatal("%s: Expected \"pattern .so-name open-function [mkmap-function]\" at line %d",
++			  myname, linenum);
++	    }
++	    if (STREQ(argv->argv[0],"*")) {
++		msg_warn("%s: wildcard dynamic map entry no longer supported.",
++			  myname);
++		continue;
++	    }
++	    if (argv->argv[1][0] != '/') {
++		msg_fatal("%s: .so name must begin with a \"/\" at line %d",
++			  myname, linenum);
++	    }
++	    if (nelm >= vector.nelm) {
++		dict_dlinfo=(DLINFO*)mvect_realloc(&vector,vector.nelm+3);
++	    }
++	    dict_dlinfo[nelm].pattern  = mystrdup(argv->argv[0]);
++	    dict_dlinfo[nelm].soname   = mystrdup(argv->argv[1]);
++	    dict_dlinfo[nelm].openfunc = mystrdup(argv->argv[2]);
++	    if (argv->argc==4)
++		dict_dlinfo[nelm].mkmapfunc = mystrdup(argv->argv[3]);
++	    else
++		dict_dlinfo[nelm].mkmapfunc = NULL;
++	    nelm++;
++	    argv_free(argv);
++	}
++    }
++    if (nelm >= vector.nelm) {
++	dict_dlinfo=(DLINFO*)mvect_realloc(&vector,vector.nelm+1);
++    }
++    dict_dlinfo[nelm].pattern  = NULL;
++    dict_dlinfo[nelm].soname   = NULL;
++    dict_dlinfo[nelm].openfunc = NULL;
++    dict_dlinfo[nelm].mkmapfunc = NULL;
++    if (conf_fp)
++	vstream_fclose(conf_fp);
++    vstring_free(buf);
++}
++
++static DLINFO *dict_open_dlfind(const char *type)
++{
++    DLINFO *dp;
++
++    if (!dict_dlinfo)
++	return NULL;
++
++    for (dp=dict_dlinfo; dp->pattern; dp++) {
++	if (STREQ(dp->pattern,type))
++	    return dp;
++    }
++    return NULL;
++}
++
++#endif /* !NO_DYNAMIC_MAPS */
++
+ #ifdef TEST
+ 
+  /*
+diff -ruN a/src/util/load_lib.c b/src/util/load_lib.c
+--- a/src/util/load_lib.c	1970-01-01 00:00:00.000000000 +0000
++++ b/src/util/load_lib.c	2009-06-01 13:08:26.000000000 +0000
+@@ -0,0 +1,135 @@
++/*++
++/* NAME
++/*	load_lib 3
++/* SUMMARY
++/*	library loading wrappers
++/* SYNOPSIS
++/*	#include <load_lib.h>
++/*
++/*	extern int  load_library_symbols(const char *, LIB_FN *, LIB_FN *);
++/*	const char *libname;
++/*      LIB_FN     *libfuncs;
++/*      LIB_FN     *libdata;
++/*
++/* DESCRIPTION
++/*	This module loads functions from libraries, returnine pointers
++/*	to the named functions.
++/*
++/*	load_library_symbols() loads all of the desired functions, and
++/*	returns zero for success, or exits via msg_fatal().
++/*
++/* SEE ALSO
++/*	msg(3) diagnostics interface
++/* DIAGNOSTICS
++/*	Problems are reported via the msg(3) diagnostics routines:
++/*	library not found, symbols not found, other fatal errors.
++/* LICENSE
++/* .ad
++/* .fi
++/*	The Secure Mailer license must be distributed with this software.
++/* AUTHOR(S)
++/*	LaMont Jones
++/*	Hewlett-Packard Company
++/*	3404 Harmony Road
++/*	Fort Collins, CO 80528, USA
++/*
++/*	Wietse Venema
++/*	IBM T.J. Watson Research
++/*	P.O. Box 704
++/*	Yorktown Heights, NY 10598, USA
++/*--*/
++
++/* System libraries. */
++
++#include "sys_defs.h"
++#include <stdlib.h>
++#include <stddef.h>
++#include <string.h>
++#if defined(HAS_DLOPEN)
++#include <dlfcn.h>
++#elif defined(HAS_SHL_LOAD)
++#include <dl.h>
++#endif
++
++/* Application-specific. */
++
++#include "msg.h"
++#include "load_lib.h"
++
++extern int  load_library_symbols(const char * libname, LIB_FN * libfuncs, LIB_FN * libdata)
++{
++    char   *myname = "load_library_symbols";
++    LIB_FN *fn;
++
++#if defined(HAS_DLOPEN)
++    void   *handle;
++    char   *emsg;
++
++    handle=dlopen(libname,RTLD_NOW);
++    emsg=dlerror();
++    if (emsg) {
++	msg_fatal("%s: dlopen failure loading %s: %s", myname, libname, emsg);
++    }
++
++    if (libfuncs) {
++	for (fn=libfuncs; fn->name; fn++) {
++	    *(fn->ptr) = dlsym(handle,fn->name);
++	    emsg=dlerror();
++	    if (emsg) {
++		msg_fatal("%s: dlsym failure looking up %s in %s: %s", myname,
++			  fn->name, libname, emsg);
++	    }
++	    if (msg_verbose>1) {
++		msg_info("loaded %s = %lx",fn->name, *((long*)(fn->ptr)));
++	    }
++	}
++    }
++
++    if (libdata) {
++	for (fn=libdata; fn->name; fn++) {
++	    *(fn->ptr) = dlsym(handle,fn->name);
++	    emsg=dlerror();
++	    if (emsg) {
++		msg_fatal("%s: dlsym failure looking up %s in %s: %s", myname,
++			  fn->name, libname, emsg);
++	    }
++	    if (msg_verbose>1) {
++		msg_info("loaded %s = %lx",fn->name, *((long*)(fn->ptr)));
++	    }
++	}
++    }
++#elif defined(HAS_SHL_LOAD)
++    shl_t   handle;
++
++    handle = shl_load(libname,BIND_IMMEDIATE,0);
++
++    if (libfuncs) {
++	for (fn=libfuncs; fn->name; fn++) {
++	    if (shl_findsym(&handle,fn->name,TYPE_PROCEDURE,fn->ptr) != 0) {
++		msg_fatal("%s: shl_findsym failure looking up %s in %s: %m",
++			  myname, fn->name, libname);
++	    }
++	    if (msg_verbose>1) {
++		msg_info("loaded %s = %x",fn->name, *((long*)(fn->ptr)));
++	    }
++	}
++    }
++
++    if (libdata) {
++	for (fn=libdata; fn->name; fn++) {
++	    if (shl_findsym(&handle,fn->name,TYPE_DATA,fn->ptr) != 0) {
++		msg_fatal("%s: shl_findsym failure looking up %s in %s: %m",
++			  myname, fn->name, libname);
++	    }
++	    if (msg_verbose>1) {
++		msg_info("loaded %s = %x",fn->name, *((long*)(fn->ptr)));
++	    }
++	}
++    }
++
++#else
++    msg_fatal("%s: need dlopen or shl_load support for dynamic libraries",
++		myname);
++#endif
++    return 0;
++}
+diff -ruN a/src/util/load_lib.h b/src/util/load_lib.h
+--- a/src/util/load_lib.h	1970-01-01 00:00:00.000000000 +0000
++++ b/src/util/load_lib.h	2009-06-01 13:08:26.000000000 +0000
+@@ -0,0 +1,41 @@
++#ifndef _LOAD_LIB_H_INCLUDED_
++#define _LOAD_LIB_H_INCLUDED_
++
++/*++
++/* NAME
++/*	load_lib 3h
++/* SUMMARY
++/*	library loading wrappers
++/* SYNOPSIS
++/*	#include "load_lib.h"
++/* DESCRIPTION
++/* .nf
++
++ /*
++  * External interface.
++  */
++/* NULL name terminates list */
++typedef struct LIB_FN {
++    const char *name;
++    void       **ptr;
++} LIB_FN;
++
++extern int  load_library_symbols(const char *, LIB_FN *, LIB_FN *);
++
++/* LICENSE
++/* .ad
++/* .fi
++/*	The Secure Mailer license must be distributed with this software.
++/* AUTHOR(S)
++/*	LaMont Jones
++/*	Hewlett-Packard Company
++/*	3404 Harmony Road
++/*	Fort Collins, CO 80528, USA
++/*
++/*	Wietse Venema
++/*	IBM T.J. Watson Research
++/*	P.O. Box 704
++/*	Yorktown Heights, NY 10598, USA
++/*--*/
++
++#endif
diff --git a/testing/postfix/postfix-ldap.post-install b/testing/postfix/postfix-ldap.post-install
new file mode 100644
index 000000000000..b8d23833b665
--- /dev/null
+++ b/testing/postfix/postfix-ldap.post-install
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# update the dynamicmaps.cf
+conf=/etc/postfix/dynamicmaps.cf
+
+sed -i -e '/\#\# AUTO BEGIN/,/\#\# AUTO END/d' $conf
+
+(
+echo '## AUTO BEGIN ##'
+if cd /usr/lib/postfix/; then
+	for i in *.so; do
+		m=${i#dict_}
+		m=${m%.so}
+		echo -e "$m\t/usr/lib/postfix/$i\tdict_${m}_open"
+	done
+fi
+	
+echo '## AUTO END ##'
+) >> $conf
diff --git a/testing/postfix/postfix-mysql.post-install b/testing/postfix/postfix-mysql.post-install
new file mode 100644
index 000000000000..b8d23833b665
--- /dev/null
+++ b/testing/postfix/postfix-mysql.post-install
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# update the dynamicmaps.cf
+conf=/etc/postfix/dynamicmaps.cf
+
+sed -i -e '/\#\# AUTO BEGIN/,/\#\# AUTO END/d' $conf
+
+(
+echo '## AUTO BEGIN ##'
+if cd /usr/lib/postfix/; then
+	for i in *.so; do
+		m=${i#dict_}
+		m=${m%.so}
+		echo -e "$m\t/usr/lib/postfix/$i\tdict_${m}_open"
+	done
+fi
+	
+echo '## AUTO END ##'
+) >> $conf
diff --git a/testing/postfix/postfix-pcre.post-install b/testing/postfix/postfix-pcre.post-install
new file mode 100644
index 000000000000..b8d23833b665
--- /dev/null
+++ b/testing/postfix/postfix-pcre.post-install
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# update the dynamicmaps.cf
+conf=/etc/postfix/dynamicmaps.cf
+
+sed -i -e '/\#\# AUTO BEGIN/,/\#\# AUTO END/d' $conf
+
+(
+echo '## AUTO BEGIN ##'
+if cd /usr/lib/postfix/; then
+	for i in *.so; do
+		m=${i#dict_}
+		m=${m%.so}
+		echo -e "$m\t/usr/lib/postfix/$i\tdict_${m}_open"
+	done
+fi
+	
+echo '## AUTO END ##'
+) >> $conf
diff --git a/testing/postfix/postfix-pgsql.post-install b/testing/postfix/postfix-pgsql.post-install
new file mode 100644
index 000000000000..b8d23833b665
--- /dev/null
+++ b/testing/postfix/postfix-pgsql.post-install
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# update the dynamicmaps.cf
+conf=/etc/postfix/dynamicmaps.cf
+
+sed -i -e '/\#\# AUTO BEGIN/,/\#\# AUTO END/d' $conf
+
+(
+echo '## AUTO BEGIN ##'
+if cd /usr/lib/postfix/; then
+	for i in *.so; do
+		m=${i#dict_}
+		m=${m%.so}
+		echo -e "$m\t/usr/lib/postfix/$i\tdict_${m}_open"
+	done
+fi
+	
+echo '## AUTO END ##'
+) >> $conf
diff --git a/testing/postfix/postfix.initd b/testing/postfix/postfix.initd
new file mode 100644
index 000000000000..b2396b3aea3c
--- /dev/null
+++ b/testing/postfix/postfix.initd
@@ -0,0 +1,48 @@
+#!/sbin/runscript
+# Copyright 1999-2004 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/mail-mta/postfix/files/postfix.rc6.2.5,v 1.3 2008/08/18 14:18:40 falco Exp $
+
+# If you plan to simultaneously use several Postfix instances, don't forget
+# to specify your alternate_config_directories variable in your main main.cf file.
+# Then make a symlink from /etc/init.d/postfix to /etc/init.d/postfix.alt,
+# prepare your new /etc/postfix.alt environment, and at least change these working paths:
+# queue_directory = /var/spool/postfix.alt
+# data_directory = /var/lib/postfix.alt
+
+CONF_DIR="/etc/postfix"
+CONF_OPT="${SVCNAME##*.}"
+if [ -n ${CONF_OPT} -a ${SVCNAME} != "postfix" ]; then
+	CONF_DIR="${CONF_DIR}.${CONF_OPT}"
+fi
+
+opts="${opts} reload"
+
+depend() {
+	use logger dns ypbind amavisd mysql postgresql antivirus postfix_greylist net saslauthd
+	if [ "${SVCNAME}" = "postfix" ]; then
+		provide mta
+	fi
+}
+
+start() {
+	ebegin "Starting postfix (${CONF_DIR})"
+	if [ ! -d ${CONF_DIR} ]; then
+		eend 1 "${CONF_DIR} does not exist"
+		return 1
+	fi
+	/usr/sbin/postfix -c ${CONF_DIR} start >/dev/null 2>&1
+	eend $?
+}
+
+stop() {
+	ebegin "Stopping postfix (${CONF_DIR})"
+	/usr/sbin/postfix -c ${CONF_DIR} stop >/dev/null 2>&1
+	eend $?
+}
+
+reload() {
+	ebegin "Reloading postfix (${CONF_DIR})"
+	/usr/sbin/postfix -c ${CONF_DIR} reload >/dev/null 2>&1
+	eend $?
+}
diff --git a/testing/postfix/postfix.post-install b/testing/postfix/postfix.post-install
new file mode 100644
index 000000000000..98e01db0bb40
--- /dev/null
+++ b/testing/postfix/postfix.post-install
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+chown postfix /var/spool/postfix/* /var/lib/postfix
+chgrp postdrop /var/spool/postfix/maildrop /var/spool/postfix/public
+
+exit 0
diff --git a/testing/postfix/postfix.pre-install b/testing/postfix/postfix.pre-install
new file mode 100644
index 000000000000..22414ef615c4
--- /dev/null
+++ b/testing/postfix/postfix.pre-install
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+addgroup postfix 2>/dev/null
+addgroup postdrop 2>/dev/null
+adduser postfix -h /var/spool/postfix -G postfix,mail 2>/dev/null
+
+exit 0
-- 
GitLab