]> git.pld-linux.org Git - packages/postfix.git/commitdiff
- based on debian patch: support for loadable map modules
authorJakub Bogusz <qboosh@pld-linux.org>
Thu, 21 Feb 2002 13:05:08 +0000 (13:05 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    postfix-dynamicmaps.patch -> 1.1

postfix-dynamicmaps.patch [new file with mode: 0644]

diff --git a/postfix-dynamicmaps.patch b/postfix-dynamicmaps.patch
new file mode 100644 (file)
index 0000000..1708868
--- /dev/null
@@ -0,0 +1,709 @@
+--- postfix-1.1.3.orig/conf/dynamicmaps.cf
++++ postfix-1.1.3/conf/dynamicmaps.cf
+@@ -0,0 +1,9 @@
++# Postfix dynamic maps configuration file.
++#
++# The first match found is the one that is used.  The only wildcard
++# allowed is '*', which matches everything.  The first %s is expanded
++# to the map type.
++#
++#type location of .so file                    name of open function
++#==== ================================        =====================
++*     /usr/lib/postfix/dict_%s.so             dict_%s_open
+--- postfix-1.1.3.orig/src/dns/Makefile.in
++++ postfix-1.1.3/src/dns/Makefile.in
+@@ -15,7 +15,7 @@
+ LIB_DIR       = ../../lib
+ INC_DIR       = ../../include
+-.c.o:;        $(CC) $(CFLAGS) -c $*.c
++.c.o:;        $(CC) -fPIC $(CFLAGS) -c $*.c
+ all: $(LIB)
+@@ -25,12 +25,10 @@
+ test: $(TESTPROG)
+ $(LIB):       $(OBJS)
+-      $(AR) $(ARFL) $(LIB) $?
+-      $(RANLIB) $(LIB)
++      gcc -shared -Wl,-soname,libpostfix-dns.so.1 -o $(LIB) $(OBJS)
+ $(LIB_DIR)/$(LIB): $(LIB)
+       cp $(LIB) $(LIB_DIR)
+-      $(RANLIB) $(LIB_DIR)/$(LIB)
+ update: $(LIB_DIR)/$(LIB) $(HDRS)
+       -for i in $(HDRS); \
+--- postfix-1.1.3.orig/src/global/Makefile.in
++++ postfix-1.1.3/src/global/Makefile.in
+@@ -76,8 +76,9 @@
+ LIB_DIR       = ../../lib
+ INC_DIR       = ../../include
+ MAKES =
++LDAPSO  = dict_ldap.so
+-.c.o:;        $(CC) $(CFLAGS) -c $*.c
++.c.o:;        $(CC) -fPIC $(CFLAGS) -c $*.c
+ all: $(LIB)
+@@ -87,14 +88,21 @@
+ test: $(TESTPROG)
+ $(LIB):       $(OBJS)
+-      $(AR) $(ARFL) $(LIB) $?
+-      $(RANLIB) $(LIB)
++      gcc -shared -Wl,-soname,libpostfix-global.so.1 -o $(LIB) $(OBJS)
++
++$(LDAPSO): dict_ldap.o
++      gcc -shared -Wl,-soname,dict_ldap.so -o $@ $? -lldap -llber -L../../lib -lutil -L. -lglobal
++
++dict_ldap.c:  ../util/dict_ldap.c
++      ln -f $? $@
+ $(LIB_DIR)/$(LIB): $(LIB)
+       cp $(LIB) $(LIB_DIR)
+-      $(RANLIB) $(LIB_DIR)/$(LIB)
+-update: $(LIB_DIR)/$(LIB) $(HDRS)
++$(LIB_DIR)/$(LDAPSO): $(LDAPSO)
++      cp $(LDAPSO) $(LIB_DIR)
++
++update: $(LIB_DIR)/$(LIB) $(LIB_DIR)/${LDAPSO} $(HDRS)
+       -for i in $(HDRS); \
+       do \
+         cmp -s $$i $(INC_DIR)/$$i 2>/dev/null || cp $$i $(INC_DIR); \
+@@ -232,7 +240,7 @@
+       lint $(DEFS) $(SRCS) $(LINTFIX)
+ clean:
+-      rm -f *.o $(LIB) *core $(TESTPROG) junk
++      rm -f *.o $(LIB) $(LDAPSO) dict_ldap.c *core $(TESTPROG) junk
+       rm -rf printfck
+ tidy: clean
+@@ -389,6 +397,8 @@
+ deliver_request.o: mail_open_ok.h
+ deliver_request.o: recipient_list.h
+ deliver_request.o: deliver_request.h
++dict_ldap.o: dict_ldap.c
++dict_ldap.o: ../../include/sys_defs.h
+ domain_list.o: domain_list.c
+ domain_list.o: ../../include/sys_defs.h
+ domain_list.o: ../../include/match_list.h
+--- postfix-1.1.3.orig/src/global/mail_conf.c
++++ postfix-1.1.3/src/global/mail_conf.c
+@@ -175,6 +175,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_eval - expand macros in string */
+--- postfix-1.1.3.orig/src/global/mail_params.c
++++ postfix-1.1.3/src/global/mail_params.c
+@@ -122,6 +122,8 @@
+ #include <valid_hostname.h>
+ #include <stringops.h>
+ #include <safe.h>
++#include <safe_open.h>
++#include <mymalloc.h>
+ /* Global library. */
+@@ -204,6 +206,7 @@
+ char   *var_debug_peer_list;
+ int     var_debug_peer_level;
+ char   *var_reject_reply_msg_access_denied;
++int     var_command_maxtime;
+ int     var_fault_inj_code;
+
+ #define MAIN_CONF_FILE "main.cf"
+@@ -367,6 +370,38 @@
+                 (long) var_sgid_gid);
+ }
++static char *read_file(const char *name)
++{
++    char *ret;
++    VSTRING *why=vstring_alloc(1);
++    VSTRING *new_name=vstring_alloc(1);
++    VSTREAM *vp=safe_open(name, O_RDONLY, 0, NULL, -1, -1, why);
++
++    /*
++     * 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; \
++    }
++
++    if (!vp) {
++      msg_fatal("%s: unable to open: %s",name,vstring_str(why));
++    }
++    vstring_get_nonl(new_name,vp);
++    vstream_fclose(vp);
++    SKIP(vstring_str(new_name),ret,ISSPACE(*ret));
++    ret=mystrdup(ret);
++    TRIM(ret);
++    vstring_free(why);
++    vstring_free(new_name);
++    return ret;
++}
++
+ /* mail_params_init - configure built-in parameters */
+ void    mail_params_init()
+@@ -481,6 +516,9 @@
+      * Variables that are needed by almost every program.
+      */
+     get_mail_conf_str_table(other_str_defaults);
++    if (*var_myorigin=='/') {
++      var_myorigin=read_file(var_myorigin);
++    }
+     get_mail_conf_int_table(other_int_defaults);
+     get_mail_conf_bool_table(bool_defaults);
+     get_mail_conf_time_table(time_defaults);
+--- postfix-1.1.3.orig/src/master/Makefile.in
++++ postfix-1.1.3/src/master/Makefile.in
+@@ -23,7 +23,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)
+@@ -36,12 +36,10 @@
+ test: $(TESTPROG)
+ $(LIB):       $(LIB_OBJ)
+-      $(AR) $(ARFL) $(LIB) $?
+-      $(RANLIB) $(LIB)
++      gcc -shared -Wl,-soname,libpostfix-master.so.1 -o $(LIB) $(LIB_OBJ)
+ $(LIB_DIR)/$(LIB): $(LIB)
+       cp $(LIB) $(LIB_DIR)/$(LIB)
+-      $(RANLIB) $(LIB_DIR)/$(LIB)
+ $(BIN_DIR)/$(PROG): $(PROG)
+        cp $(PROG) $(BIN_DIR)
+--- postfix-1.1.3.orig/src/util/Makefile.in
++++ postfix-1.1.3/src/util/Makefile.in
+@@ -3,7 +3,7 @@
+       attr_scan0.c attr_scan64.c base64_code.c basename.c binhash.c \
+       chroot_uid.c clean_env.c close_on_exec.c concatenate.c ctable.c \
+       dict.c dict_alloc.c dict_db.c dict_dbm.c dict_debug.c dict_env.c \
+-      dict_ht.c dict_ldap.c dict_mysql.c dict_ni.c dict_nis.c \
++      dict_ht.c dict_mysql.c dict_ni.c dict_nis.c \
+       dict_nisplus.c dict_open.c dict_pcre.c dict_regexp.c dict_static.c \
+       dict_tcp.c dict_unix.c dir_forest.c doze.c duplex_pipe.c \
+       environ.c events.c exec_command.c fifo_listen.c fifo_trigger.c \
+@@ -26,13 +26,13 @@
+       unix_connect.c unix_listen.c unix_trigger.c unsafe.c username.c \
+       valid_hostname.c vbuf.c vbuf_print.c vstream.c vstream_popen.c \
+       vstring.c vstring_vstream.c watchdog.c writable.c write_buf.c \
+-      write_wait.c dict_sdbm.c sdbm.c
++      write_wait.c dict_sdbm.c sdbm.c load_lib.c
+ OBJS  = alldig.o argv.o argv_split.o attr_print0.o attr_print64.o \
+       attr_scan0.o attr_scan64.o base64_code.o basename.o binhash.o \
+       chroot_uid.o clean_env.o close_on_exec.o concatenate.o ctable.o \
+       dict.o dict_alloc.o dict_db.o dict_dbm.o dict_debug.o dict_env.o \
+-      dict_ht.o dict_ldap.o dict_mysql.o dict_ni.o dict_nis.o \
+-      dict_nisplus.o dict_open.o dict_pcre.o dict_regexp.o dict_static.o \
++      dict_ht.o dict_ni.o dict_nis.o \
++      dict_nisplus.o dict_open.o dict_regexp.o dict_static.o \
+       dict_tcp.o dict_unix.o dir_forest.o doze.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 \
+@@ -54,7 +54,7 @@
+       unix_connect.o unix_listen.o unix_trigger.o unsafe.o username.o \
+       valid_hostname.o vbuf.o vbuf_print.o vstream.o vstream_popen.o \
+       vstring.o vstring_vstream.o watchdog.o writable.o write_buf.o \
+-      write_wait.o dict_sdbm.o sdbm.o
++      write_wait.o dict_sdbm.o sdbm.o load_lib.o
+ HDRS  = argv.h attr.h base64_code.h binhash.h chroot_uid.h clean_env.h \
+       connect.h ctable.h dict.h dict_db.h dict_dbm.h dict_env.h \
+       dict_ht.h dict_ldap.h dict_mysql.h dict_ni.h dict_nis.h \
+@@ -71,7 +71,7 @@
+       scan_dir.h set_eugid.h set_ugid.h sigdelay.h spawn_command.h \
+       split_at.h stat_as.h stringops.h sys_defs.h timed_connect.h \
+       timed_wait.h trigger.h username.h valid_hostname.h vbuf.h \
+-      vbuf_print.h vstream.h vstring.h vstring_vstream.h watchdog.h \
++      vbuf_print.h vstream.h vstring.h vstring_vstream.h watchdog.h load_lib.h \
+       dict_sdbm.h sdbm.h
+ TESTSRC       = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
+       stream_test.c dup2_pass_on_exec.c
+@@ -81,6 +81,8 @@
+ CFLAGS        = $(DEBUG) $(OPT) $(DEFS)
+ FILES = Makefile $(SRCS) $(HDRS)
+ INCL  =
++PCRESO  = dict_pcre.so
++MYSQLSO = dict_mysql.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 \
+@@ -93,8 +95,9 @@
+ LIB_DIR       = ../../lib
+ INC_DIR       = ../../include
++LIBS    = $(LIB_DIR)/$(LIB) $(LIB_DIR)/$(PCRESO) $(LIB_DIR)/$(MYSQLSO)
+-.c.o:;        $(CC) $(CFLAGS) -c $*.c
++.c.o:;        $(CC) -fPIC $(CFLAGS) -c $*.c
+ all: $(LIB)
+@@ -103,15 +106,25 @@
+ test: $(TESTPROG)
++$(PCRESO): dict_pcre.o
++      gcc -shared -Wl,-soname,dict_pcre.so -o $@ $? -lpcre -L. -lutil
++
++$(MYSQLSO): dict_mysql.o
++      gcc -shared -Wl,-soname,dict_mysql.so -o $@ $? -lmysqlclient -L. -lutil
++
+ $(LIB):       $(OBJS)
+-      $(AR) $(ARFL) $(LIB) $?
+-      $(RANLIB) $(LIB)
++      gcc -shared -Wl,-soname,libpostfix-util.so.1 -o $(LIB) $(OBJS) -ldl
+ $(LIB_DIR)/$(LIB): $(LIB)
+       cp $(LIB) $(LIB_DIR)
+-      $(RANLIB) $(LIB_DIR)/$(LIB)
+-update: $(LIB_DIR)/$(LIB) $(HDRS)
++$(LIB_DIR)/$(PCRESO): $(PCRESO)
++      cp $(PCRESO) $(LIB_DIR)
++
++$(LIB_DIR)/$(MYSQLSO): $(MYSQLSO)
++      cp $(MYSQLSO) $(LIB_DIR)
++
++update: $(LIBS) $(HDRS)
+       -for i in $(HDRS); \
+       do \
+         cmp -s $$i $(INC_DIR)/$$i 2>/dev/null || cp $$i $(INC_DIR); \
+@@ -133,7 +146,8 @@
+       lint $(SRCS)
+ clean:
+-      rm -f *.o $(LIB) *core $(TESTPROG) junk $(MAKES) *.tmp
++      rm -f *.o $(LIB) $(PCRESO) $(MYSQLSO) *core $(TESTPROG) \
++              junk $(MAKES) *.tmp
+       rm -rf printfck
+ tidy: clean
+--- postfix-1.1.3.orig/src/util/dict.h
++++ postfix-1.1.3/src/util/dict.h
+@@ -74,6 +74,20 @@
+   */
+ extern ARGV *dict_mapnames(void);
++#ifndef NO_DYNAMIC_MAPS
++ /*
++  * Interface for dynamic map loading.
++  */
++typedef struct {
++    const char  *pattern;
++    const char  *soname;
++    const char  *openfunc;
++} DLINFO;
++
++extern void dict_open_dlinfo(const char *path);
++extern DLINFO *dict_open_dlfind(const char *type);
++#endif
++
+  /*
+   * High-level interface, with logical dictionary names.
+   */
+--- postfix-1.1.3.orig/src/util/dict_open.c
++++ postfix-1.1.3/src/util/dict_open.c
+@@ -150,6 +150,9 @@
+ #include <strings.h>
+ #endif
++#include <sys/stat.h>
++#include <unistd.h>
++
+ /* Utility library. */
+ #include <argv.h>
+@@ -173,6 +176,14 @@
+ #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>
++#endif
++
+  /*
+   * lookup table for available map types.
+   */
+@@ -203,6 +214,7 @@
+ #ifdef HAS_NETINFO
+     DICT_TYPE_NETINFO, dict_ni_open,
+ #endif
++#ifndef MAX_DYNAMIC_MAPS
+ #ifdef HAS_LDAP
+     DICT_TYPE_LDAP, dict_ldap_open,
+ #endif
+@@ -212,6 +224,7 @@
+ #ifdef HAS_PCRE
+     DICT_TYPE_PCRE, dict_pcre_open,
+ #endif
++#endif /* MAX_DYNAMIC_MAPS */
+ #ifdef HAS_POSIX_REGEXP
+     DICT_TYPE_REGEXP, dict_regexp_open,
+ #endif
+@@ -264,8 +277,38 @@
+     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) {
++#ifndef NO_DYNAMIC_MAPS
++      struct stat st;
++      VSTRING *lib, *func;
++      LIB_FN fn[2];
++      DICT *(*open) (const char *, int, int);
++      DLINFO *dl=dict_open_dlfind(dict_type);
++      if (!dl)
++#endif
++          msg_fatal("%s: unsupported dictionary type: %s", myname, dict_type);
++#ifndef NO_DYNAMIC_MAPS
++      lib=vstring_alloc(1);
++      vstring_sprintf(lib,dl->soname,dict_type);
++      if (stat(vstring_str(lib),&st) < 0) {
++          msg_fatal("%s: unsupported dictionary type: %s (%s not found.  Is the postfix-%s package installed?)",
++              myname, dict_type, vstring_str(lib), dict_type);
++      }
++      func=vstring_alloc(1);
++      vstring_sprintf(func,dl->openfunc,dict_type);
++      fn[0].name = vstring_str(func);
++      fn[0].ptr  = (void**)&open;
++      fn[1].name = NULL;
++      load_library_symbols(vstring_str(lib), fn, NULL);
++      dict_open_register(dict_type, open);
++      dp = (DICT_OPEN_INFO *) htable_find(dict_open_hash, dict_type);
++      vstring_free(lib);
++      vstring_free(func);
++#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)
+@@ -311,6 +354,76 @@
+     argv_terminate(mapnames);
+     return mapnames;
+ }
++
++#ifndef NO_DYNAMIC_MAPS
++static DLINFO  *dict_dlinfo;
++
++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) {
++              msg_fatal("%s: Expected \"pattern .so-name function\" at line %d",
++                        myname, linenum);
++          }
++          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]);
++          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;
++    if (conf_fp)
++      vstream_fclose(conf_fp);
++    vstring_free(buf);
++}
++
++DLINFO *dict_open_dlfind(const char *type)
++{
++    DLINFO *dp;
++
++    if (!dict_dlinfo)
++      return NULL;
++
++    for (dp=dict_dlinfo; dp->pattern; dp++) {
++      if (strcmp(dp->pattern,type)==0 || strcmp(dp->pattern,"*")==0)
++          return dp;
++    }
++    return NULL;
++}
++#endif /* !NO_DYNAMIC_MAPS */
+ #ifdef TEST
+--- postfix-1.1.3.orig/src/util/load_lib.c
++++ postfix-1.1.3/src/util/load_lib.c
+@@ -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;
++}
+--- postfix-1.1.3.orig/src/util/load_lib.h
++++ postfix-1.1.3/src/util/load_lib.h
+@@ -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
+--- postfix-1.1.3.orig/src/util/sys_defs.h
++++ postfix-1.1.3/src/util/sys_defs.h
+@@ -494,6 +494,7 @@
+ #define UNIX_DOMAIN_CONNECT_BLOCKS_FOR_ACCEPT
+ #define PREPEND_PLUS_TO_OPTSTRING
+ #define HAS_POSIX_REGEXP
++#define HAS_DLOPEN
+ #define DEF_SENDMAIL_PATH "/usr/sbin/sendmail"
+ #define DEF_MAILQ_PATH        "/usr/bin/mailq"
+ #define DEF_NEWALIAS_PATH "/usr/bin/newaliases"
+@@ -532,6 +533,7 @@
+ #define USE_STATFS
+ #define STATFS_IN_SYS_VFS_H
+ #define HAS_POSIX_REGEXP
++#define HAS_DLOPEN
+ #define DEF_SENDMAIL_PATH "/usr/sbin/sendmail"
+ #define DEF_MAILQ_PATH        "/usr/bin/mailq"
+ #define DEF_NEWALIAS_PATH "/usr/bin/newaliases"
+@@ -567,6 +569,7 @@
+ #define USE_STATFS
+ #define STATFS_IN_SYS_VFS_H
+ #define HAS_POSIX_REGEXP
++#define HAS_SHL_LOAD
+ #define DEF_SENDMAIL_PATH "/usr/sbin/sendmail"
+ #define DEF_MAILQ_PATH        "/usr/bin/mailq"
+ #define DEF_NEWALIAS_PATH "/usr/bin/newaliases"
+@@ -604,6 +607,7 @@
+ #define USE_STATFS
+ #define STATFS_IN_SYS_VFS_H
+ #define HAS_POSIX_REGEXP
++#define HAS_SHL_LOAD
+ #define DEF_SENDMAIL_PATH "/usr/bin/sendmail"
+ #define DEF_MAILQ_PATH        "/usr/bin/mailq"
+ #define DEF_NEWALIAS_PATH "/usr/bin/newaliases"
This page took 0.19312 seconds and 4 git commands to generate.