From 39cb725ef457c22208e9ee0eede7dc52e7db2f61 Mon Sep 17 00:00:00 2001 From: Wietse Venema Date: Tue, 23 Sep 2014 00:00:00 -0500 Subject: [PATCH] postfix-2.12-20140923 --- postfix/HISTORY | 9 ++ postfix/README_FILES/DATABASE_README | 4 + postfix/WISHLIST | 2 - postfix/html/DATABASE_README.html | 6 + postfix/html/postconf.1.html | 87 ++++++------ postfix/man/man1/postconf.1 | 4 + postfix/mantools/postlink | 1 + postfix/proto/DATABASE_README.html | 6 + postfix/src/global/mail_params.c | 3 - postfix/src/global/mail_version.h | 2 +- postfix/src/postconf/Makefile.in | 138 +++++++++---------- postfix/src/postconf/postconf.c | 4 + postfix/src/postconf/test58.ref | 3 +- postfix/src/util/Makefile.in | 23 +++- postfix/src/util/dict_open.c | 11 +- postfix/src/util/dict_union.c | 195 +++++++++++++++++++++++++++ postfix/src/util/dict_union.h | 37 +++++ 17 files changed, 412 insertions(+), 123 deletions(-) create mode 100644 postfix/src/util/dict_union.c create mode 100644 postfix/src/util/dict_union.h diff --git a/postfix/HISTORY b/postfix/HISTORY index 14e6c6d9f..a68f8a7f3 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -20426,3 +20426,12 @@ Apologies for any names omitted. Cleanup: replace stress-dependent main.cf defaults with the ternary form: "${stress?{x}:{y}}" File: global/mail_params.h, proto/postconf.proto, postscreen/postscreen.c (comments). + +20140923 + + Cleanup: dict_db and dict_lmdb global settings. Files: + global/mail_params.c, util/dict_open.c. + + Feature: unionmap, based on contribution by Roel van Meer. + Files: mantools/postlink, postconf/postconf.c (manpage), + proto/DATABASE_README.html, util/dict_open.c, util/dict_union.[hc]. diff --git a/postfix/README_FILES/DATABASE_README b/postfix/README_FILES/DATABASE_README index 8e0bd8829..2d4d4ffa8 100644 --- a/postfix/README_FILES/DATABASE_README +++ b/postfix/README_FILES/DATABASE_README @@ -293,6 +293,10 @@ To find out what database types your Postfix system supports, use the "ppooss and that texthash: does not detect changes after the file is read. The lookup table name is "texthash:filename", where the file name is taken literally; no suffix is appended. + uunniioonnmmaapp (read-only) + A table that sends each query to multiple lookup tables and that + concatenates all found results, separated by comma. The table name + syntax is the same as for pipemap tables. uunniixx (read-only) A limited view of the UNIX authentication database. The following tables are implemented: diff --git a/postfix/WISHLIST b/postfix/WISHLIST index 6a6f6a3f4..46ff863f5 100644 --- a/postfix/WISHLIST +++ b/postfix/WISHLIST @@ -30,8 +30,6 @@ Wish list: lookups for the invidual addresses, converting back and forth between external and internal forms. - union: map, concatenates results, default separator is ','. - Include <3htPpS5B6bzbcpM@spike.porcupine.org> example with filter policies for different mail streams. Correction: filter should be content_filter. Posted Wed, 10 Sep 2014 diff --git a/postfix/html/DATABASE_README.html b/postfix/html/DATABASE_README.html index 830fb4fab..b90023dc5 100644 --- a/postfix/html/DATABASE_README.html +++ b/postfix/html/DATABASE_README.html @@ -442,6 +442,12 @@ use the file, and that texthash: does n file is read. The lookup table name is "texthash:filename", where the file name is taken literally; no suffix is appended. +
unionmap (read-only)
+ +
A table that sends each query to multiple lookup tables and +that concatenates all found results, separated by comma. The table +name syntax is the same as for pipemap tables.
+
unix (read-only)
A limited view of the UNIX authentication database. The following diff --git a/postfix/html/postconf.1.html b/postfix/html/postconf.1.html index bb64bd3af..35967bebc 100644 --- a/postfix/html/postconf.1.html +++ b/postfix/html/postconf.1.html @@ -305,43 +305,48 @@ POSTCONF(1) POSTCONF(1) use the file, and that it does not detect changes after the file is read. + union (read-only) + A table that sends each query to multiple lookup tables + and that concatenates all found results, separated by + comma. The table name syntax is the same as for pipemap. + unix (read-only) - A limited view of the UNIX authentication database. The + A limited view of the UNIX authentication database. The following tables are implemented: unix:passwd.byname - The table is the UNIX password database. The key - is a login name. The result is a password file + The table is the UNIX password database. The key + is a login name. The result is a password file entry in passwd(5) format. unix:group.byname The table is the UNIX group database. The key is a - group name. The result is a group file entry in + group name. The result is a group file entry in group(5) format. - Other table types may exist depending on how Postfix was built. + Other table types may exist depending on how Postfix was built. - -M Show master.cf file contents instead of main.cf file contents. + -M Show master.cf file contents instead of main.cf file contents. Specify -Mf to fold long lines for human readability. Specify zero or more arguments, each with a service-name or ser‐ - vice-name/service-type pair, where service-name is the first - field of a master.cf entry and service-type is one of (inet, + vice-name/service-type pair, where service-name is the first + field of a master.cf entry and service-type is one of (inet, unix, fifo, or pass). - If service-name or service-name/service-type is specified, only - the matching master.cf entries will be output. For example, - "postconf -Mf smtp" will output all services named "smtp", and - "postconf -Mf smtp/inet" will output only the smtp service that - listens on the network. Trailing service type fields that are + If service-name or service-name/service-type is specified, only + the matching master.cf entries will be output. For example, + "postconf -Mf smtp" will output all services named "smtp", and + "postconf -Mf smtp/inet" will output only the smtp service that + listens on the network. Trailing service type fields that are omitted will be handled as "*" wildcard fields. This feature is available with Postfix 2.9 and later. The syntax - was changed from "name.type" to "name/type", and "*" wildcard + was changed from "name.type" to "name/type", and "*" wildcard support was added with Postfix 2.11. -n Show only configuration parameters that have explicit name=value - settings in main.cf. Specify -nf to fold long lines for human + settings in main.cf. Specify -nf to fold long lines for human readability (Postfix 2.9 and later). -o name=value @@ -353,50 +358,50 @@ POSTCONF(1) POSTCONF(1) This feature is available with Postfix 2.11 and later. - -P Show master.cf service parameter settings (by default all ser‐ + -P Show master.cf service parameter settings (by default all ser‐ vices and all parameters). formatted as one "ser‐ - vice/type/parameter=value" per line. Specify -Pf to fold long + vice/type/parameter=value" per line. Specify -Pf to fold long lines. - Specify one or more "service/type/parameter" instances on the - postconf(1) command line to limit the output to parameters of - interest. Trailing parameter name or service type fields that + Specify one or more "service/type/parameter" instances on the + postconf(1) command line to limit the output to parameters of + interest. Trailing parameter name or service type fields that are omitted will be handled as "*" wildcard fields. This feature is available with Postfix 2.11 and later. -t [template_file] - Display the templates for text that appears at the beginning of - delivery status notification (DSN) messages, without expanding + Display the templates for text that appears at the beginning of + delivery status notification (DSN) messages, without expanding $name expressions. To override the built-in templates, specify a template file name - at the end of the postconf(1) command line, or specify a file + at the end of the postconf(1) command line, or specify a file name in main.cf with the bounce_template_file parameter. - To force selection of the built-in templates, specify an empty - template file name on the postconf(1) command line (in shell + To force selection of the built-in templates, specify an empty + template file name on the postconf(1) command line (in shell language: ""). This feature is available with Postfix 2.3 and later. - -v Enable verbose logging for debugging purposes. Multiple -v + -v Enable verbose logging for debugging purposes. Multiple -v options make the software increasingly verbose. - -x Expand $name in main.cf or master.cf parameter values. The + -x Expand $name in main.cf or master.cf parameter values. The expansion is recursive. This feature is available with Postfix 2.10 and later. - -X Edit the main.cf configuration file, and remove the parameters + -X Edit the main.cf configuration file, and remove the parameters named on the postconf(1) command line. Specify a list of param‐ eter names, not "name=value" pairs. - With -M, edit the master.cf configuration file, and remove one - or more service entries as specified with "service/type" on the + With -M, edit the master.cf configuration file, and remove one + or more service entries as specified with "service/type" on the postconf(1) command line. - With -P, edit the master.cf configuration file, and remove one + With -P, edit the master.cf configuration file, and remove one or more service parameter settings (-o parameter=value settings) as specied with "service/type/parameter" on the postconf(1) com‐ mand line. @@ -405,10 +410,10 @@ POSTCONF(1) POSTCONF(1) into place. Specify quotes to protect special characters on the postconf(1) command line. - There is no postconf(1) command to perform the reverse opera‐ + There is no postconf(1) command to perform the reverse opera‐ tion. - This feature is available with Postfix 2.10 and later. Support + This feature is available with Postfix 2.10 and later. Support for -M and -P was added with Postfix 2.11. -# Edit the main.cf configuration file, and comment out the parame‐ @@ -416,18 +421,18 @@ POSTCONF(1) POSTCONF(1) eters revert to their default values. Specify a list of parame‐ ter names, not "name=value" pairs. - With -M, edit the master.cf configuration file, and comment out - one or more service entries as specified with "service/type" on + With -M, edit the master.cf configuration file, and comment out + one or more service entries as specified with "service/type" on the postconf(1) command line. In all cases the file is copied to a temporary file then renamed into place. Specify quotes to protect special characters on the postconf(1) command line. - There is no postconf(1) command to perform the reverse opera‐ + There is no postconf(1) command to perform the reverse opera‐ tion. - This feature is available with Postfix 2.6 and later. Support + This feature is available with Postfix 2.6 and later. Support for -M was added with Postfix 2.11. DIAGNOSTICS @@ -438,18 +443,18 @@ POSTCONF(1) POSTCONF(1) Directory with Postfix configuration files. CONFIGURATION PARAMETERS - The following main.cf parameters are especially relevant to this pro‐ + The following main.cf parameters are especially relevant to this pro‐ gram. - The text below provides only a parameter summary. See postconf(5) for + The text below provides only a parameter summary. See postconf(5) for more details including examples. config_directory (see 'postconf -d' output) - The default location of the Postfix main.cf and master.cf con‐ + The default location of the Postfix main.cf and master.cf con‐ figuration files. bounce_template_file (empty) - Pathname of a configuration file with bounce message templates. + Pathname of a configuration file with bounce message templates. FILES /etc/postfix/main.cf, Postfix configuration parameters diff --git a/postfix/man/man1/postconf.1 b/postfix/man/man1/postconf.1 index a2db7755a..49d68800d 100644 --- a/postfix/man/man1/postconf.1 +++ b/postfix/man/man1/postconf.1 @@ -318,6 +318,10 @@ Produces similar results as hash: files, except that you don't need to run the \fBpostmap\fR(1) command before you can use the file, and that it does not detect changes after the file is read. +.IP "\fBunion\fR (read-only)" +A table that sends each query to multiple lookup tables and +that concatenates all found results, separated by comma. +The table name syntax is the same as for \fBpipemap\fR. .IP "\fBunix\fR (read-only)" A limited view of the UNIX authentication database. The following tables are implemented: diff --git a/postfix/mantools/postlink b/postfix/mantools/postlink index 20338dbbb..733640dd4 100755 --- a/postfix/mantools/postlink +++ b/postfix/mantools/postlink @@ -1136,6 +1136,7 @@ while (<>) { s/\b(tcp):/$1<\/a>:/g; s/\b(texthash):/$1<\/a>:/g; #s/\b(unix):/$1<\/a>:/g; + s/\b(unionmap):/$1<\/a>:/g; # Do nice links for smtp:host:port etc. diff --git a/postfix/proto/DATABASE_README.html b/postfix/proto/DATABASE_README.html index 847ad01b9..500f4dc99 100644 --- a/postfix/proto/DATABASE_README.html +++ b/postfix/proto/DATABASE_README.html @@ -442,6 +442,12 @@ use the file, and that texthash: does not detect changes after the file is read. The lookup table name is "texthash:filename", where the file name is taken literally; no suffix is appended.
+
unionmap (read-only)
+ +
A table that sends each query to multiple lookup tables and +that concatenates all found results, separated by comma. The table +name syntax is the same as for pipemap tables.
+
unix (read-only)
A limited view of the UNIX authentication database. The following diff --git a/postfix/src/global/mail_params.c b/postfix/src/global/mail_params.c index 67953414b..85682c7b4 100644 --- a/postfix/src/global/mail_params.c +++ b/postfix/src/global/mail_params.c @@ -325,9 +325,6 @@ char *var_smtputf8_autoclass; const char null_format_string[1] = ""; -DEFINE_DICT_LMDB_MAP_SIZE; -DEFINE_DICT_DB_CACHE_SIZE; - /* check_myhostname - lookup hostname and validate */ static const char *check_myhostname(void) diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index 3091735b8..026357a5e 100644 --- a/postfix/src/global/mail_version.h +++ b/postfix/src/global/mail_version.h @@ -20,7 +20,7 @@ * Patches change both the patchlevel and the release date. Snapshots have no * patchlevel; they change the release date only. */ -#define MAIL_RELEASE_DATE "20140922" +#define MAIL_RELEASE_DATE "20140923" #define MAIL_VERSION_NUMBER "2.12" #ifdef SNAPSHOT diff --git a/postfix/src/postconf/Makefile.in b/postfix/src/postconf/Makefile.in index 1a7791f39..6c885cc35 100644 --- a/postfix/src/postconf/Makefile.in +++ b/postfix/src/postconf/Makefile.in @@ -34,7 +34,7 @@ $(PROG): $(OBJS) $(LIBS) rm -f $@ (echo "# DO NOT EDIT THIS FILE. EDIT THE MAIN.CF FILE INSTEAD. THE"; \ echo "# TEXT HERE JUST SHOWS DEFAULT SETTINGS BUILT INTO POSTFIX."; \ - echo "#"; $(SHLIB_ENV) ./$(PROG) -d -c ../../conf) | \ + echo "#"; $(SHLIB_ENV) $(SHLIB_ENV) ./$(PROG) -d -c ../../conf) | \ egrep -v '^(myhostname|mydomain|mynetworks|process_name|process_id) ' >$@ $(OBJS): ../../conf/makedefs.out @@ -73,7 +73,7 @@ test1: $(PROG) test1.ref echo smtpd_restriction_classes = foo bar >> main.cf echo foo = yes >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test1.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test1.tmp 2>&1 diff test1.ref test1.tmp rm -f main.cf master.cf test1.tmp @@ -85,7 +85,7 @@ test2: $(PROG) test2.ref echo restriction_classes = foo bar >> main.cf echo foo = yes >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test2.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test2.tmp 2>&1 diff test2.ref test2.tmp rm -f main.cf master.cf test2.tmp @@ -98,7 +98,7 @@ test3: $(PROG) test3.ref echo 'bar = $$foo' >> main.cf echo 'always_bcc = $$bar' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test3.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test3.tmp 2>&1 diff test3.ref test3.tmp rm -f main.cf master.cf test3.tmp @@ -112,7 +112,7 @@ test4: $(PROG) test4.ref echo smtpd unix - n n - 0 smtpd >> master.cf echo ' -o always_bcc=$$bar' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test4.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test4.tmp 2>&1 diff test4.ref test4.tmp rm -f main.cf master.cf test4.tmp @@ -128,7 +128,7 @@ test4b: $(PROG) test4b.ref echo ' -o foo=xxx -o bar=yyy -o baz=zzz' >> master.cf echo '#smtpd2 unix - n n - 0 smtpd' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test4b.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test4b.tmp 2>&1 diff test4b.ref test4b.tmp rm -f main.cf master.cf test4b.tmp @@ -141,7 +141,7 @@ test5: $(PROG) test5.ref echo smtpd unix - n n - 0 smtpd >> master.cf echo ' -o bar=yes -o always_bcc=$$bar -o' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test5.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test5.tmp 2>&1 diff test5.ref test5.tmp rm -f main.cf master.cf test5.tmp @@ -152,7 +152,7 @@ test6: $(PROG) test6.ref touch main.cf master.cf echo whatevershebrings unix - n n - 0 pipe >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . 2>&1 | grep whatevershebrings >test6.tmp + $(SHLIB_ENV) ./$(PROG) -c . 2>&1 | grep whatevershebrings >test6.tmp diff test6.ref test6.tmp rm -f main.cf master.cf test6.tmp @@ -163,7 +163,7 @@ test7: $(PROG) test7.ref touch main.cf master.cf echo whatevershebrings unix - n n - 0 spawn >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . 2>&1 | grep whatevershebrings >test7.tmp + $(SHLIB_ENV) ./$(PROG) -c . 2>&1 | grep whatevershebrings >test7.tmp diff test7.ref test7.tmp rm -f main.cf master.cf test7.tmp @@ -173,7 +173,7 @@ test8: $(PROG) test8.ref echo whatevershebrings inet - n n - 0 spawn >> master.cf echo whatevershebrings_time_limit=1 >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -c . 2>&1 | grep whatevershebrings >test8.tmp + $(SHLIB_ENV) ./$(PROG) -c . 2>&1 | grep whatevershebrings >test8.tmp diff test8.ref test8.tmp rm -f main.cf master.cf test8.tmp @@ -183,7 +183,7 @@ test9: $(PROG) test9.ref echo foo inet - n n - 0 spawn >> master.cf echo bar unix - n n - 0 spawn >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -M '*'/inet >test9.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -c . -M '*'/inet >test9.tmp 2>&1 diff test9.ref test9.tmp rm -f main.cf master.cf test9.tmp @@ -193,7 +193,7 @@ test10: $(PROG) test10.ref echo foo inet - n n - 0 spawn >> master.cf echo bar unix - n n - 0 spawn >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -M bar/inet foo/unix >test10.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -c . -M bar/inet foo/unix >test10.tmp 2>&1 diff test10.ref test10.tmp rm -f main.cf master.cf test10.tmp @@ -203,7 +203,7 @@ test11: $(PROG) test11.ref echo foo inet - n n - 0 spawn >> master.cf echo bar unix - n n - 0 spawn >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -M >test11.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -c . -M >test11.tmp 2>&1 diff test11.ref test11.tmp rm -f main.cf master.cf test11.tmp @@ -218,7 +218,7 @@ test12: $(PROG) test12.ref echo foo inet - n n - 0 spawn >> master.cf echo ' -o always_bcc=$$bar -o' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -M >test12.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -c . -M >test12.tmp 2>&1 diff test12.ref test12.tmp rm -f main.cf master.cf test12.tmp @@ -232,7 +232,7 @@ test13: $(PROG) test13.ref echo foo inet - n n - 0 spawn >> master.cf echo ' -o smtpd_restriction_classes=bar' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test13.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test13.tmp 2>&1 diff test13.ref test13.tmp rm -f main.cf master.cf test13.tmp @@ -245,7 +245,7 @@ test14: $(PROG) test14.ref echo foo inet - n n - 0 spawn >> master.cf echo ' -o bar=yes -o baz=xx' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test14.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test14.tmp 2>&1 diff test14.ref test14.tmp rm -f main.cf master.cf test14.tmp @@ -259,7 +259,7 @@ test15: $(PROG) test15.ref echo foo inet - n n - 0 spawn >> master.cf echo ' -o bar=yes -o always_bcc=$$bar$$baz' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test15.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test15.tmp 2>&1 diff test15.ref test15.tmp rm -f main.cf master.cf test15.tmp @@ -268,14 +268,14 @@ test15: $(PROG) test15.ref test16: $(PROG) test16.ref rm -f main.cf master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test16.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test16.tmp 2>&1 diff test16.ref test16.tmp rm -f main.cf master.cf test16.tmp test17: $(PROG) test17.ref rm -f main.cf master.cf touch -t 197101010000 main.cf - -./$(PROG) -Mc . >test17.tmp 2>&1; exit 0 + -$(SHLIB_ENV) ./$(PROG) -Mc . >test17.tmp 2>&1; exit 0 diff test17.ref test17.tmp rm -f main.cf master.cf test17.tmp @@ -287,7 +287,7 @@ test18: $(PROG) test18.ref echo virtual_maps=xxx >> main.cf echo smtpd_client_connection_limit_exceptions=yyy >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test18.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test18.tmp 2>&1 diff test18.ref test18.tmp rm -f main.cf master.cf test18.tmp @@ -299,7 +299,7 @@ test19: $(PROG) test19.ref echo forward_path='$$'aaaa >> main.cf echo default_rbl_reply='$$'bbbb >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test19.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test19.tmp 2>&1 diff test19.ref test19.tmp rm -f main.cf master.cf test19.tmp @@ -311,7 +311,7 @@ test20: $(PROG) test20.ref echo foo inet - n n - 0 spawn >> master.cf echo ' -o always_bcc=$$bar$$baz' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc . >test20.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc . >test20.tmp 2>&1 diff test20.ref test20.tmp rm -f main.cf master.cf test20.tmp @@ -323,7 +323,7 @@ test21: $(PROG) test21.ref echo forward_path = xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx \ xxxxxxxxxxxxx xxxxxxxxxxxxxx >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nfc . >test21.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nfc . >test21.tmp 2>&1 diff test21.ref test21.tmp rm -f main.cf master.cf test21.tmp @@ -334,7 +334,7 @@ test22: $(PROG) test22.ref touch main.cf master.cf echo whatevershebrings unix - n n - 0 smtp >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . 2>&1 | grep whatevershebrings >test22.tmp + $(SHLIB_ENV) ./$(PROG) -c . 2>&1 | grep whatevershebrings >test22.tmp diff test22.ref test22.tmp rm -f main.cf master.cf test22.tmp @@ -348,7 +348,7 @@ test23: $(PROG) test23.ref echo whatevershebrings unix - n n - 0 smtp >> master.cf echo ' -o always_bcc=$$name' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -nC builtin >test23.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -c . -nC builtin >test23.tmp 2>&1 diff test23.ref test23.tmp rm -f main.cf master.cf test23.tmp @@ -360,7 +360,7 @@ test24: $(PROG) test24.ref echo whatevershebrings unix - n n - 0 smtp >> master.cf echo ' -o always_bcc=$$name' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -nC user >test24.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -c . -nC user >test24.tmp 2>&1 diff test24.ref test24.tmp rm -f main.cf master.cf test24.tmp @@ -372,7 +372,7 @@ test25: $(PROG) test25.ref echo whatevershebrings unix - n n - 0 smtp >> master.cf echo ' -o always_bcc=$$name' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -C service 2>&1 | grep whatevershebrings >test25.tmp + $(SHLIB_ENV) ./$(PROG) -c . -C service 2>&1 | grep whatevershebrings >test25.tmp diff test25.ref test25.tmp rm -f main.cf master.cf test25.tmp @@ -386,7 +386,7 @@ test26: $(PROG) test26.ref echo whatevershebrings unix - n n - 0 smtp >> master.cf echo ' -o always_bcc=$$name' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . -C all >test26.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . -C all >test26.tmp 2>&1 diff test26.ref test26.tmp rm -f main.cf master.cf test26.tmp @@ -398,7 +398,7 @@ test27: $(PROG) test27.ref echo whatevershebrings unix - n n - 0 smtp >> master.cf echo ' -o always_bcc=$$name' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -c . -C all 2>&1 | grep whatevershebrings >test27.tmp + $(SHLIB_ENV) ./$(PROG) -c . -C all 2>&1 | grep whatevershebrings >test27.tmp diff test27.ref test27.tmp rm -f main.cf master.cf test27.tmp @@ -419,7 +419,7 @@ test28: $(PROG) test28.ref echo 'zz_domain = whatever' >> main.cf echo 'aa_domain = whatever' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test28.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test28.tmp 2>&1 diff test28.ref test28.tmp rm -f main.cf master.cf test28.tmp @@ -444,7 +444,7 @@ test29: $(PROG) test29.ref echo 'memcachefoo_domain = bar' >> main.cf echo 'memcachefoo_domainx = bar' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test29.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test29.tmp 2>&1 diff test29.ref test29.tmp rm -f main.cf master.cf test29.tmp @@ -461,7 +461,7 @@ test30: $(PROG) test30.ref echo ' -oheader_checks=$$p3' >> master.cf echo ' -oheaderx_checks=$$p4' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -nc . >test30.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nc . >test30.tmp 2>&1 diff test30.ref test30.tmp rm -f main.cf master.cf test30.tmp @@ -473,7 +473,7 @@ test31: $(PROG) test31.ref echo 'smtpd_helo_restrictions=whatever' >> main.cf echo 'smtpd_sender_restrictions=$$smtpd_helo_restrictions' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nxc . >test31.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nxc . >test31.tmp 2>&1 diff test31.ref test31.tmp rm -f main.cf master.cf test31.tmp @@ -484,7 +484,7 @@ test32: $(PROG) test32.ref touch main.cf master.cf echo 'relay_domains=whatever' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -xc . fast_flush_domains >test32.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -xc . fast_flush_domains >test32.tmp 2>&1 diff test32.ref test32.tmp rm -f main.cf master.cf test32.tmp @@ -496,7 +496,7 @@ test33: $(PROG) test33.ref echo 'mydestination=whatever' >> main.cf echo 'always_bcc=$$relay_domains' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -xc . always_bcc >test33.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -xc . always_bcc >test33.tmp 2>&1 diff test33.ref test33.tmp rm -f main.cf master.cf test33.tmp @@ -507,7 +507,7 @@ test34: $(PROG) test34.ref echo 'process_name=xxx' >> main.cf echo 'process_id=yyy' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -xc . mydestination process_name >test34.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -xc . mydestination process_name >test34.tmp 2>&1 diff test34.ref test34.tmp rm -f main.cf master.cf test34.tmp @@ -519,7 +519,7 @@ test35: $(PROG) test35.ref echo ' -o process_name=aaa' >> master.cf echo ' -o process_id=bbb' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -xc . process_name >test35.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -xc . process_name >test35.tmp 2>&1 diff test35.ref test35.tmp rm -f main.cf master.cf test35.tmp @@ -529,7 +529,7 @@ test36: $(PROG) test36.ref echo 'mydestination=$$virtual_mapx' >> main.cf echo 'virtual_alias_maps=$$virtual_maps' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nxc . >test36.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nxc . >test36.tmp 2>&1 diff test36.ref test36.tmp rm -f main.cf master.cf test36.tmp @@ -543,7 +543,7 @@ test37: $(PROG) test37.ref echo ' -o always_bcc=$$aaa' >> master.cf echo ' -o aaa=ccc' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfxc . >test37.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfxc . >test37.tmp 2>&1 diff test37.ref test37.tmp rm -f main.cf master.cf test37.tmp @@ -554,7 +554,7 @@ test39: $(PROG) test39.ref echo bar inet - n n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc . '*'/unix >test39.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc . '*'/unix >test39.tmp 2>&1 diff test39.ref test39.tmp rm -f main.cf master.cf test39.tmp @@ -566,7 +566,7 @@ test40: $(PROG) test40.ref echo ' -vo ccc=$$aaa' >> master.cf echo ' -v -oddd=$$ccc' >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfxc . '*'/unix >test40.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfxc . '*'/unix >test40.tmp 2>&1 diff test40.ref test40.tmp rm -f main.cf master.cf test40.tmp @@ -577,11 +577,11 @@ test41: $(PROG) test41.ref echo bar unix - n n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Pc . bar/unix/xxx=yyy bar/unix/aaa=bbb >test41.tmp 2>&1 - ./$(PROG) -Mfc. >>test41.tmp 2>&1 - ./$(PROG) -Pc . bar/unix/xxx=YYY bar/unix/aaa=BBB >>test41.tmp 2>&1 - ./$(PROG) -Mfc. >>test41.tmp 2>&1 - ./$(PROG) -Pc . >>test41.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Pc . bar/unix/xxx=yyy bar/unix/aaa=bbb >test41.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc. >>test41.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Pc . bar/unix/xxx=YYY bar/unix/aaa=BBB >>test41.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc. >>test41.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Pc . >>test41.tmp 2>&1 diff test41.ref test41.tmp rm -f main.cf master.cf test41.tmp @@ -592,11 +592,11 @@ test42: $(PROG) test42.ref echo bar unix - n n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Pc . bar/unix/xxx=yyy bar/unix/aaa=bbb >test42.tmp 2>&1 - ./$(PROG) -Mfc. >>test42.tmp 2>&1 - ./$(PROG) -Pc . >>test42.tmp 2>&1 - ./$(PROG) -PXc. bar/unix/xxx bar/unix/aaa >>test42.tmp 2>&1 - ./$(PROG) -Mfc. >>test42.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Pc . bar/unix/xxx=yyy bar/unix/aaa=bbb >test42.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc. >>test42.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Pc . >>test42.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -PXc. bar/unix/xxx bar/unix/aaa >>test42.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc. >>test42.tmp 2>&1 diff test42.ref test42.tmp rm -f main.cf master.cf test42.tmp @@ -607,8 +607,8 @@ test43: $(PROG) test43.ref echo bar unix - n n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Fc . bar/unix/chroot=y bar/unix/command='aa -stuffobb=cc dd' >test43.tmp 2>&1 - ./$(PROG) -Mfc. >>test43.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Fc . bar/unix/chroot=y bar/unix/command='aa -stuffobb=cc dd' >test43.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc. >>test43.tmp 2>&1 diff test43.ref test43.tmp rm -f main.cf master.cf test43.tmp @@ -619,8 +619,8 @@ test44: $(PROG) test44.ref echo bar unix - n n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mc . bar/unix='xx inet - n n - 0 aa -stuffobb=cc dd' >test44.tmp 2>&1 - ./$(PROG) -Mfc. >>test44.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mc . bar/unix='xx inet - n n - 0 aa -stuffobb=cc dd' >test44.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -Mfc. >>test44.tmp 2>&1 diff test44.ref test44.tmp rm -f main.cf master.cf test44.tmp @@ -631,7 +631,7 @@ test45: $(PROG) test45.ref echo bar xxxx - n n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc. >test45.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -Mfc. >test45.tmp 2>&1 || true diff test45.ref test45.tmp rm -f main.cf master.cf test45.tmp @@ -642,7 +642,7 @@ test46: $(PROG) test46.ref echo bar inet X n n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc. >test46.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -Mfc. >test46.tmp 2>&1 || true diff test46.ref test46.tmp rm -f main.cf master.cf test46.tmp @@ -653,7 +653,7 @@ test47: $(PROG) test47.ref echo bar inet - X n - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc. >test47.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -Mfc. >test47.tmp 2>&1 || true diff test47.ref test47.tmp rm -f main.cf master.cf test47.tmp @@ -664,7 +664,7 @@ test48: $(PROG) test48.ref echo bar inet - n X - 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc. >test48.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -Mfc. >test48.tmp 2>&1 || true diff test48.ref test48.tmp rm -f main.cf master.cf test48.tmp @@ -675,7 +675,7 @@ test49: $(PROG) test49.ref echo bar inet - n n X 0 other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc. >test49.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -Mfc. >test49.tmp 2>&1 || true diff test49.ref test49.tmp rm -f main.cf master.cf test49.tmp @@ -686,7 +686,7 @@ test50: $(PROG) test50.ref echo bar inet - n n - X other >> master.cf echo baz unix - n n - 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc. >test50.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -Mfc. >test50.tmp 2>&1 || true diff test50.ref test50.tmp rm -f main.cf master.cf test50.tmp @@ -697,7 +697,7 @@ test51: $(PROG) test51.ref echo bar inet - n n X? 0 other >> master.cf echo baz unix - n n 0? 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -Mfc. >test51.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -Mfc. >test51.tmp 2>&1 || true diff test51.ref test51.tmp rm -f main.cf master.cf test51.tmp @@ -708,8 +708,8 @@ test52: $(PROG) test52.ref echo bar inet - n n 0 0 other >> master.cf echo baz unix - n n 0 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -MXc. bar/inet foo/unix xxx/yyy - ./$(PROG) -Mfc. >test52.tmp 2>&1 || true + $(SHLIB_ENV) ./$(PROG) -MXc. bar/inet foo/unix xxx/yyy + $(SHLIB_ENV) ./$(PROG) -Mfc. >test52.tmp 2>&1 || true diff test52.ref test52.tmp rm -f main.cf master.cf test52.tmp @@ -720,7 +720,7 @@ test53: $(PROG) test53.ref echo bar inet - n n 0 0 other >> master.cf echo baz unix - n n 0 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -M#c. bar/inet xxx/yyy + $(SHLIB_ENV) ./$(PROG) -M#c. bar/inet xxx/yyy diff test53.ref master.cf rm -f main.cf master.cf test53.tmp @@ -731,7 +731,7 @@ test54: $(PROG) test54.ref echo bar inet - n n 0 0 other >> master.cf echo baz unix - n n 0 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -M#c. bar/inet foo/unix + $(SHLIB_ENV) ./$(PROG) -M#c. bar/inet foo/unix diff test54.ref master.cf rm -f main.cf master.cf test54.tmp @@ -742,7 +742,7 @@ test55: $(PROG) test55.ref echo bar inet - n n 0 0 other >> master.cf echo baz unix - n n 0 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -M#c. bar/inet baz/unix + $(SHLIB_ENV) ./$(PROG) -M#c. bar/inet baz/unix diff test55.ref master.cf rm -f main.cf master.cf test55.tmp @@ -755,7 +755,7 @@ test56: $(PROG) test56.ref echo " -o second" >> master.cf echo baz unix - n n 0 0 other >> master.cf touch -t 197101010000 main.cf - ./$(PROG) -M#c. bar/inet xxx/yyy + $(SHLIB_ENV) ./$(PROG) -M#c. bar/inet xxx/yyy diff test56.ref master.cf rm -f main.cf master.cf test56.tmp @@ -772,7 +772,7 @@ test57: $(PROG) test57.ref echo 't1 = Postfix 2.11 $${{$${x?bug:x}} == {bug}?in}compatible' >> main.cf echo 't2 = $$t1' >> main.cf touch -t 197101010000 main.cf - ./$(PROG) -nxc. >test57.tmp 2>&1 + $(SHLIB_ENV) ./$(PROG) -nxc. >test57.tmp 2>&1 diff test57.ref test57.tmp rm -f main.cf master.cf test57.tmp diff --git a/postfix/src/postconf/postconf.c b/postfix/src/postconf/postconf.c index 016304f1a..ca5e9be14 100644 --- a/postfix/src/postconf/postconf.c +++ b/postfix/src/postconf/postconf.c @@ -312,6 +312,10 @@ /* don't need to run the \fBpostmap\fR(1) command before you /* can use the file, and that it does not detect changes after /* the file is read. +/* .IP "\fBunion\fR (read-only)" +/* A table that sends each query to multiple lookup tables and +/* that concatenates all found results, separated by comma. +/* The table name syntax is the same as for \fBpipemap\fR. /* .IP "\fBunix\fR (read-only)" /* A limited view of the UNIX authentication database. The /* following tables are implemented: diff --git a/postfix/src/postconf/test58.ref b/postfix/src/postconf/test58.ref index 8de9edc81..bb8e0c5b6 100644 --- a/postfix/src/postconf/test58.ref +++ b/postfix/src/postconf/test58.ref @@ -1,6 +1,7 @@ +./postconf: warning: main.cf: syntax error after '}' in "pipemap:{ldap:xxx, memcache:yy}x" ./postconf: warning: main.cf: missing '}' in parameter value: "randmap:{xx" config_directory = . -mydestination = foo bar pipemap:{ldap:xxx, memcache:yy} randmap:{xx +mydestination = foo bar pipemap:{ldap:xxx, memcache:yy}x randmap:{xx xxx_domain = foo yy_backup = bbb ./postconf: warning: ./main.cf: unused parameter: yy_bogus=bbb diff --git a/postfix/src/util/Makefile.in b/postfix/src/util/Makefile.in index 12e829b7c..803535bea 100644 --- a/postfix/src/util/Makefile.in +++ b/postfix/src/util/Makefile.in @@ -38,7 +38,7 @@ SRCS = alldig.c allprint.c argv.c argv_split.c attr_clnt.c attr_print0.c \ dict_fail.c msg_rate_delay.c dict_surrogate.c warn_stat.c \ dict_sockmap.c line_number.c recv_pass_attr.c pass_accept.c \ poll_fd.c timecmp.c slmdb.c dict_pipe.c dict_random.c \ - valid_utf8_hostname.c midna.c argv_splitq.c balpar.c + valid_utf8_hostname.c midna.c argv_splitq.c balpar.c dict_union.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 \ @@ -78,7 +78,7 @@ OBJS = alldig.o allprint.o argv.o argv_split.o attr_clnt.o attr_print0.o \ dict_fail.o msg_rate_delay.o dict_surrogate.o warn_stat.o \ dict_sockmap.o line_number.o recv_pass_attr.o pass_accept.o \ poll_fd.o timecmp.o $(NON_PLUGIN_MAP_OBJ) dict_pipe.o dict_random.o \ - valid_utf8_hostname.o midna.o argv_splitq.o balpar.o + valid_utf8_hostname.o midna.o argv_splitq.o balpar.o dict_union.o # MAP_OBJ is for maps that may be dynamically loaded with dynamicmaps.cf. # When hard-linking these, makedefs sets NON_PLUGIN_MAP_OBJ=$(MAP_OBJ), # otherwise it sets the PLUGIN_* macros. @@ -107,7 +107,7 @@ HDRS = argv.h attr.h attr_clnt.h auto_clnt.h base64_code.h binhash.h \ edit_file.h dict_cache.h dict_thash.h ip_match.h nbbio.h base32_code.h \ dict_fail.h warn_stat.h dict_sockmap.h line_number.h timecmp.h \ slmdb.h compat_va_copy.h dict_pipe.h dict_random.h \ - valid_utf8_hostname.h midna.h + valid_utf8_hostname.h midna.h dict_union.h TESTSRC = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \ stream_test.c dup2_pass_on_exec.c DEFS = -I. -D$(SYSTYPE) @@ -1121,6 +1121,7 @@ dict_open.o: dict_sockmap.h dict_open.o: dict_static.h dict_open.o: dict_tcp.h dict_open.o: dict_thash.h +dict_open.o: dict_union.h dict_open.o: dict_unix.h dict_open.o: htable.h dict_open.o: msg.h @@ -1289,6 +1290,19 @@ dict_thash.o: vbuf.h dict_thash.o: vstream.h dict_thash.o: vstring.h dict_thash.o: warn_stat.h +dict_union.o: argv.h +dict_union.o: dict.h +dict_union.o: dict_union.c +dict_union.o: dict_union.h +dict_union.o: htable.h +dict_union.o: msg.h +dict_union.o: myflock.h +dict_union.o: mymalloc.h +dict_union.o: stringops.h +dict_union.o: sys_defs.h +dict_union.o: vbuf.h +dict_union.o: vstream.h +dict_union.o: vstring.h dict_unix.o: argv.h dict_unix.o: dict.h dict_unix.o: dict_unix.c @@ -1537,6 +1551,8 @@ load_file.o: vbuf.h load_file.o: vstream.h load_file.o: warn_stat.h load_lib.o: load_lib.c +load_lib.o: load_lib.h +load_lib.o: msg.h load_lib.o: sys_defs.h lowercase.o: lowercase.c lowercase.o: stringops.h @@ -1554,6 +1570,7 @@ mac_expand.o: mac_expand.h mac_expand.o: mac_parse.h mac_expand.o: msg.h mac_expand.o: mymalloc.h +mac_expand.o: name_code.h mac_expand.o: stringops.h mac_expand.o: sys_defs.h mac_expand.o: vbuf.h diff --git a/postfix/src/util/dict_open.c b/postfix/src/util/dict_open.c index b50d49dd5..cd89f86a2 100644 --- a/postfix/src/util/dict_open.c +++ b/postfix/src/util/dict_open.c @@ -300,6 +300,7 @@ #include #include #include +#include #include #include #include @@ -344,6 +345,7 @@ static const DICT_OPEN_INFO dict_open_info[] = { DICT_TYPE_FAIL, dict_fail_open, DICT_TYPE_PIPE, dict_pipe_open, DICT_TYPE_RANDOM, dict_random_open, + DICT_TYPE_UNION, dict_union_open, #ifndef USE_DYNAMIC_MAPS #ifdef HAS_PCRE DICT_TYPE_PCRE, dict_pcre_open, @@ -369,6 +371,12 @@ static HTABLE *dict_open_hash; static DICT_OPEN_EXTEND_FN dict_open_extend_hook; static DICT_MAPNAMES_EXTEND_FN dict_mapnames_extend_hook; + /* + * Workaround. + */ +DEFINE_DICT_LMDB_MAP_SIZE; +DEFINE_DICT_DB_CACHE_SIZE; + /* dict_open_init - one-off initialization */ static void dict_open_init(void) @@ -524,9 +532,6 @@ DICT_MAPNAMES_EXTEND_FN dict_mapnames_extend(DICT_MAPNAMES_EXTEND_FN new_cb) #ifdef TEST -DEFINE_DICT_LMDB_MAP_SIZE; -DEFINE_DICT_DB_CACHE_SIZE; - /* * Proof-of-concept test program. */ diff --git a/postfix/src/util/dict_union.c b/postfix/src/util/dict_union.c new file mode 100644 index 000000000..cb2300954 --- /dev/null +++ b/postfix/src/util/dict_union.c @@ -0,0 +1,195 @@ +/*++ +/* NAME +/* dict_union 3 +/* SUMMARY +/* dictionary manager interface for union of tables +/* SYNOPSIS +/* #include +/* +/* DICT *dict_union_open(name, open_flags, dict_flags) +/* const char *name; +/* int open_flags; +/* int dict_flags; +/* DESCRIPTION +/* dict_union_open() opens a sequence of one or more tables. +/* Example: "\fBunionmap:{\fItype_1:name_1, ..., type_n:name_n\fR}". +/* +/* Each "unionmap:" query is given to each table in the specified +/* order. All found results are concatenated, separated by +/* comma. The unionmap table produces no result when all +/* lookup tables return no result. +/* +/* The first and last characters of a "unionmap:" table name +/* must be '{' and '}'. Within these, individual maps are +/* separated with comma or whitespace. +/* +/* The open_flags and dict_flags arguments are passed on to +/* the underlying dictionaries. +/* SEE ALSO +/* dict(3) generic dictionary manager +/* 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 +#include + +/* Utility library. */ + +#include +#include +#include +#include +#include +#include +#include + +/* Application-specific. */ + +typedef struct { + DICT dict; /* generic members */ + ARGV *map_union; /* pipelined tables */ + VSTRING *re_buf; /* reply buffer */ +} DICT_UNION; + +#define STR(x) vstring_str(x) + +/* dict_union_lookup - search a bunch of tables and combine the results */ + +static const char *dict_union_lookup(DICT *dict, const char *query) +{ + const char myname[] = "dict_union_lookup"; + DICT_UNION *dict_union = (DICT_UNION *) dict; + DICT *map; + char **cpp; + char *dict_type_name; + const char *result = 0; + + /* + * After Roel van Meer, postfix-users mailing list, Sept 2014. + */ + VSTRING_RESET(dict_union->re_buf); + for (cpp = dict_union->map_union->argv; (dict_type_name = *cpp) != 0; cpp++) { + if ((map = dict_handle(dict_type_name)) == 0) + msg_panic("%s: dictionary \"%s\" not found", myname, dict_type_name); + if ((result = dict_get(map, query)) == 0) + continue; + if (VSTRING_LEN(dict_union->re_buf) > 0) + VSTRING_ADDCH(dict_union->re_buf, ','); + vstring_strcat(dict_union->re_buf, result); + } + DICT_ERR_VAL_RETURN(dict, DICT_ERR_NONE, + VSTRING_LEN(dict_union->re_buf) > 0 ? + STR(dict_union->re_buf) : 0); +} + +/* dict_union_close - disassociate from a bunch of tables */ + +static void dict_union_close(DICT *dict) +{ + DICT_UNION *dict_union = (DICT_UNION *) dict; + char **cpp; + char *dict_type_name; + + for (cpp = dict_union->map_union->argv; (dict_type_name = *cpp) != 0; cpp++) + dict_unregister(dict_type_name); + argv_free(dict_union->map_union); + vstring_free(dict_union->re_buf); + dict_free(dict); +} + +/* dict_union_open - open a bunch of tables */ + +DICT *dict_union_open(const char *name, int open_flags, int dict_flags) +{ + const char myname[] = "dict_union_open"; + DICT_UNION *dict_union; + char *saved_name = 0; + char *dict_type_name; + ARGV *argv = 0; + char **cpp; + DICT *dict; + int match_flags = 0; + struct DICT_OWNER aggr_owner; + size_t len; + + /* + * Clarity first. Let the optimizer worry about redundant code. + */ +#define DICT_UNION_RETURN(x) do { \ + if (saved_name != 0) \ + myfree(saved_name); \ + if (argv != 0) \ + argv_free(argv); \ + return (x); \ + } while (0) + + /* + * Sanity checks. + */ + if (open_flags != O_RDONLY) + DICT_UNION_RETURN(dict_surrogate(DICT_TYPE_UNION, name, + open_flags, dict_flags, + "%s:%s map requires O_RDONLY access mode", + DICT_TYPE_UNION, name)); + + /* + * Split the table name into its constituent parts. + */ + saved_name = mystrdup(name + 1); /* XXX ASCII delimiter */ + if ((len = balpar(name, "{}")) == 0 || name[len] != 0 + || *(saved_name = mystrndup(name + 1, len - 2)) == 0) + DICT_UNION_RETURN(dict_surrogate(DICT_TYPE_UNION, name, + open_flags, dict_flags, + "bad syntax: \"%s:%s\"; " + "need \"%s:{type:name...}\"", + DICT_TYPE_UNION, name, + DICT_TYPE_UNION)); + + /* + * The least-trusted table in the set determines the over-all trust + * level. The first table determines the pattern-matching flags. + */ + DICT_OWNER_AGGREGATE_INIT(aggr_owner); + argv = argv_splitq(saved_name, ", \t\r\n", "{}"); + for (cpp = argv->argv; (dict_type_name = *cpp) != 0; cpp++) { + if (msg_verbose) + msg_info("%s: %s", myname, dict_type_name); + if (strchr(dict_type_name, ':') == 0) + DICT_UNION_RETURN(dict_surrogate(DICT_TYPE_UNION, name, + open_flags, dict_flags, + "bad syntax: \"%s:%s\"; " + "need \"%s:{type:name...}\"", + DICT_TYPE_UNION, name, + DICT_TYPE_UNION)); + if ((dict = dict_handle(dict_type_name)) == 0) + dict = dict_open(dict_type_name, open_flags, dict_flags); + dict_register(dict_type_name, dict); + DICT_OWNER_AGGREGATE_UPDATE(aggr_owner, dict->owner); + if (cpp == argv->argv) + match_flags = dict->flags & (DICT_FLAG_FIXED | DICT_FLAG_PATTERN); + } + + /* + * Bundle up the result. + */ + dict_union = + (DICT_UNION *) dict_alloc(DICT_TYPE_UNION, name, sizeof(*dict_union)); + dict_union->dict.lookup = dict_union_lookup; + dict_union->dict.close = dict_union_close; + dict_union->dict.flags = dict_flags | match_flags; + dict_union->dict.owner = aggr_owner; + dict_union->re_buf = vstring_alloc(100); + dict_union->map_union = argv; + argv = 0; + DICT_UNION_RETURN(DICT_DEBUG (&dict_union->dict)); +} diff --git a/postfix/src/util/dict_union.h b/postfix/src/util/dict_union.h new file mode 100644 index 000000000..9554f8408 --- /dev/null +++ b/postfix/src/util/dict_union.h @@ -0,0 +1,37 @@ +#ifndef _DICT_UNION_H_INCLUDED_ +#define _DICT_UNION_H_INCLUDED_ + +/*++ +/* NAME +/* dict_union 3h +/* SUMMARY +/* dictionary manager interface for union of tables +/* SYNOPSIS +/* #include +/* DESCRIPTION +/* .nf + + /* + * Utility library. + */ +#include + + /* + * External interface. + */ +#define DICT_TYPE_UNION "unionmap" + +extern DICT *dict_union_open(const char *, int, int); + +/* LICENSE +/* .ad +/* .fi +/* The Secure Mailer license must be distributed with this software. +/* AUTHOR(S) +/* Wietse Venema +/* IBM T.J. Watson Research +/* P.O. Box 704 +/* Yorktown Heights, NY 10598, USA +/*--*/ + +#endif