summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Pennock <pdp@exim.org>2011-01-17 08:43:35 -0500
committerPhil Pennock <pdp@exim.org>2011-01-17 08:43:35 -0500
commit56e0c4ce946ae13628c4349f982c3407e1019dd0 (patch)
treeaa0928a5f64b68f5b9a6fa1af3902d951838150d
parenta01ba0815be7209559968f44f3498136a7924527 (diff)
Module loading working on FreeBSD (and unbreak).
(1) Commit eec525c43adade97ff94d839810faf7cb35bd87f broke module support, because we *do* still need some exported variable definitions, as for a module to actually work, we need the per-module _INCLUDE/_LIBS settings. (2) FreeBSD's nsdispatch() will leave dlerror() returning a complaint about "_nss_cache_cycle_prevention_function"; we need to clear the error state before the dlsym() call, so that any error found afterwards must have come from that dlsym() call. Fix is just an extra call to dlerror(), which should be portable. I can now use sqlite3 from a module, in FreeBSD.
-rwxr-xr-xsrc/scripts/lookups-Makefile1
-rw-r--r--src/src/drtables.c7
2 files changed, 8 insertions, 0 deletions
diff --git a/src/scripts/lookups-Makefile b/src/scripts/lookups-Makefile
index 31820ea2f..7f2dd1b9e 100755
--- a/src/scripts/lookups-Makefile
+++ b/src/scripts/lookups-Makefile
@@ -47,6 +47,7 @@ emit_module_rule() {
if want_dynamic "$lookup_name"
then
echo "MODS += ${mod_name}.so"
+ grep "^LOOKUP_${lookup_name}_" "$defs_source"
echo "LOOKUP_${mod_name}_INCLUDE = \$(LOOKUP_${lookup_name}_INCLUDE)"
echo "LOOKUP_${mod_name}_LIBS = \$(LOOKUP_${lookup_name}_LIBS)"
elif want_at_all "$lookup_name"
diff --git a/src/src/drtables.c b/src/src/drtables.c
index 276c0e67b..e54202f43 100644
--- a/src/src/drtables.c
+++ b/src/src/drtables.c
@@ -518,6 +518,13 @@ extern lookup_module_info whoson_lookup_module_info;
continue;
}
+ /* FreeBSD nsdispatch() can trigger dlerror() errors about
+ * _nss_cache_cycle_prevention_function; we need to clear the dlerror()
+ * state before calling dlsym(), so that any error afterwards only
+ * comes from dlsym().
+ */
+ errormsg = dlerror();
+
info = (struct lookup_module_info*) dlsym(dl, "_lookup_module_info");
if ((errormsg = dlerror()) != NULL) {
fprintf(stderr, "%s does not appear to be a lookup module (%s)\n", name, errormsg);