diff options
author | Phil Pennock <pdp@exim.org> | 2011-01-17 08:43:35 -0500 |
---|---|---|
committer | Phil Pennock <pdp@exim.org> | 2011-01-17 08:43:35 -0500 |
commit | 56e0c4ce946ae13628c4349f982c3407e1019dd0 (patch) | |
tree | aa0928a5f64b68f5b9a6fa1af3902d951838150d | |
parent | a01ba0815be7209559968f44f3498136a7924527 (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-x | src/scripts/lookups-Makefile | 1 | ||||
-rw-r--r-- | src/src/drtables.c | 7 |
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); |