summaryrefslogtreecommitdiffstats
path: root/main/postfix/postfix-2.6.1-dynamicmaps.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/postfix/postfix-2.6.1-dynamicmaps.patch')
-rw-r--r--main/postfix/postfix-2.6.1-dynamicmaps.patch5273
1 files changed, 5273 insertions, 0 deletions
diff --git a/main/postfix/postfix-2.6.1-dynamicmaps.patch b/main/postfix/postfix-2.6.1-dynamicmaps.patch
new file mode 100644
index 00000000..630abedc
--- /dev/null
+++ b/main/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) ../../lib/libglobal.a
++ gcc -shared -Wl,-soname,dict_ldap.so -o $@ $? -lldap -llber -L../../lib -lutil -L. -lglobal
++
++$(MYSQLSO): dict_mysql.o $(LIB) ../../lib/libglobal.a
++ gcc -shared -Wl,-soname,dict_mysql.so -o $@ $? -lmysqlclient -L. -lutil -lglobal
++
++$(PGSQLSO): dict_pgsql.o $(LIB) ../../lib/libglobal.a
++ 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 libutil.a
++ 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