1. properly detect.
2. Link only required components.
3. No way we don't have LoadLibrary on Windows.
4. ENABLE_PLUGIN should be controlled in autoconf.

Signed-off-by: Alon Bar-Lev <alon.bar...@gmail.com>
---
 configure.ac            |   50 ++++++++++++++++-------------------------------
 src/openvpn/Makefile.am |    2 +
 src/openvpn/plugin.c    |   16 +++++++++-----
 src/openvpn/plugin.h    |    4 +-
 src/openvpn/syshead.h   |   11 ----------
 5 files changed, 31 insertions(+), 52 deletions(-)

diff --git a/configure.ac b/configure.ac
index c34e8c4..e893d8d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -381,7 +381,7 @@ AC_CHECK_HEADERS([ \
        stdio.h stdarg.h \
        time.h errno.h fcntl.h io.h direct.h \
        ctype.h sys/types.h sys/socket.h \
-       signal.h unistd.h \
+       signal.h unistd.h dlfcn.h \
        netinet/in.h netinet/in_systm.h \
        netinet/tcp.h arpa/inet.h netdb.h \
        windows.h winsock2.h ws2tcpip.h \
@@ -592,6 +592,13 @@ else
        AC_CHECK_FUNCS(SOCKET_OPT_FUNCS)
 fi

+AC_CHECK_LIB(
+       [dl],
+       [dlopen],
+       [DL_LIBS="-ldl"]
+)
+AC_SUBST([DL_LIBS])
+
 case "${with_mem_check}" in
        valgrind)
                AC_CHECK_HEADER(
@@ -644,38 +651,6 @@ case "${with_mem_check}" in
 esac

 dnl
-dnl Check for dlopen -- first try libc then libdl.
-dnl
-if test "${WIN32}" != "yes" -a "${enable_plugins}" = "yes"; then
-       AC_CHECK_HEADER(
-               [dlfcn.h],
-               [AC_CHECK_FUNC(
-                       [dlopen],
-                       [AC_DEFINE(USE_LIBDL, 1, [Use libdl for dynamic library 
loading])],
-                       [AC_CHECK_LIB(
-                               [dl],
-                               [dlopen],
-                               [
-                                       LIBS="${LIBS} -ldl"
-                                       AC_DEFINE(USE_LIBDL, 1, [Use libdl for 
dynamic library loading])
-                               ],
-                               [AC_MSG_RESULT([libdl library not found.])]
-                       )],
-               )],
-       )
-       if test "${enable_eurephia}" = "yes"; then
-               AC_DEFINE([ENABLE_EUREPHIA], [1], [Enable support for the 
eurephia plug-in])
-       fi
-fi
-
-dnl
-dnl Check if LoadLibrary exists on Windows
-dnl
-if test "${WIN32}" = "yes"; then
-       AC_DEFINE(USE_LOAD_LIBRARY, 1, [Use LoadLibrary to load DLLs on 
Windows])
-fi
-
-dnl
 dnl check for LZO library
 dnl
 if test "${enable_lzo}" = "yes" && test "${enable_lzo_stub}" = "no"; then
@@ -876,6 +851,13 @@ test "${enable_strict_options}" = "yes" && 
AC_DEFINE([ENABLE_STRICT_OPTIONS_CHEC
 test "${enable_password_save}" = "yes" && AC_DEFINE([ENABLE_PASSWORD_SAVE], 
[1], [Allow --askpass and --auth-user-pass passwords to be read from a file])
 test "${enable_systemd}" = "yes" && AC_DEFINE([ENABLE_SYSTEMD], [1], [Enable 
systemd support])

+if test "${enable_plugins}" = "yes"; then
+       test "${WIN32}" != "yes" -a -z "${DL_LIBS}" && AC_MSG_ERROR([libdl is 
required for plugins])
+       OPTIONAL_DL_LIBS="${DL_LIBS}"
+       AC_DEFINE([ENABLE_PLUGIN], [1], [Enable systemd support])
+       test "${enable_eurephia}" = "yes" && AC_DEFINE([ENABLE_EUREPHIA], [1], 
[Enable support for the eurephia plug-in])
+fi
+
 if test "${enable_iproute2}" = "yes"; then
        test -z "${IPROUTE}" && AC_MSG_ERROR([ip utility is required but 
missing])
        AC_DEFINE([ENABLE_IPROUTE], [1], [enable iproute2 support])
@@ -911,6 +893,8 @@ AC_SUBST([TAP_WIN_COMPONENT_ID])
 AC_SUBST([TAP_WIN_MIN_MAJOR])
 AC_SUBST([TAP_WIN_MIN_MINOR])

+AC_SUBST([OPTIONAL_DL_LIBS])
+
 AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"])

 AC_CONFIG_FILES([
diff --git a/src/openvpn/Makefile.am b/src/openvpn/Makefile.am
index deb3f84..cc00e27 100644
--- a/src/openvpn/Makefile.am
+++ b/src/openvpn/Makefile.am
@@ -95,6 +95,8 @@ openvpn_SOURCES = \
        tun.c tun.h \
        win32.h win32.c \
        cryptoapi.h cryptoapi.c
+openvpn_LDADD = \
+       $(OPTIONAL_DL_LIBS)
 if WIN32
 openvpn_SOURCES += openvpn_win32_resources.rc
 openvpn_LDADD = -lgdi32 -lws2_32 -lwininet -lcrypt32 -liphlpapi -lwinmm 
-lshell32
diff --git a/src/openvpn/plugin.c b/src/openvpn/plugin.c
index 4cc9c36..3f379dd 100644
--- a/src/openvpn/plugin.c
+++ b/src/openvpn/plugin.c
@@ -26,6 +26,10 @@

 #ifdef ENABLE_PLUGIN

+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
 #include "buffer.h"
 #include "error.h"
 #include "misc.h"
@@ -160,7 +164,7 @@ plugin_option_list_print (const struct plugin_option_list 
*list, int msglevel)
 }
 #endif

-#if defined(USE_LIBDL)
+#ifndef WIN32

 static void
 libdl_resolve_symbol (void *handle, void **dest, const char *symbol, const 
char *plugin_name, const unsigned int flags)
@@ -170,7 +174,7 @@ libdl_resolve_symbol (void *handle, void **dest, const char 
*symbol, const char
     msg (M_FATAL, "PLUGIN: could not find required symbol '%s' in plugin 
shared object %s: %s", symbol, plugin_name, dlerror());
 }

-#elif defined(USE_LOAD_LIBRARY)
+#else

 static void
 dll_resolve_symbol (HMODULE module, void **dest, const char *symbol, const 
char *plugin_name, const unsigned int flags)
@@ -191,7 +195,7 @@ plugin_init_item (struct plugin *p, const struct 
plugin_option *o)
   p->so_pathname = o->so_pathname;
   p->plugin_type_mask = plugin_supported_types ();

-#if defined(USE_LIBDL)
+#ifndef WIN32

   p->handle = NULL;
 #if defined(PLUGIN_LIBDIR)
@@ -220,7 +224,7 @@ plugin_init_item (struct plugin *p, const struct 
plugin_option *o)

 # define PLUGIN_SYM(var, name, flags) libdl_resolve_symbol (p->handle, 
(void*)&p->var, name, p->so_pathname, flags)

-#elif defined(USE_LOAD_LIBRARY)
+#else

   rel = !absolute_pathname (p->so_pathname);
   p->module = LoadLibraryW (wide_string (p->so_pathname, &gc));
@@ -427,10 +431,10 @@ plugin_close_item (struct plugin *p)
       if (p->plugin_handle)
        (*p->close)(p->plugin_handle);

-#if defined(USE_LIBDL)
+#ifndef WIN32
       if (dlclose (p->handle))
        msg (M_WARN, "PLUGIN_CLOSE: dlclose() failed on plugin: %s", 
p->so_pathname);
-#elif defined(USE_LOAD_LIBRARY)
+#elif defined(WIN32)
       if (!FreeLibrary (p->module))
        msg (M_WARN, "PLUGIN_CLOSE: FreeLibrary() failed on plugin: %s", 
p->so_pathname);
 #endif
diff --git a/src/openvpn/plugin.h b/src/openvpn/plugin.h
index 6f75e27..4c0a1fd 100644
--- a/src/openvpn/plugin.h
+++ b/src/openvpn/plugin.h
@@ -59,9 +59,9 @@ struct plugin {
   unsigned int plugin_type_mask;
   int requested_initialization_point;

-#if defined(USE_LIBDL)
+#ifndef WIN32
   void *handle;
-#elif defined(USE_LOAD_LIBRARY)
+#else
   HMODULE module;
 #endif

diff --git a/src/openvpn/syshead.h b/src/openvpn/syshead.h
index d115273..00b7bfc 100644
--- a/src/openvpn/syshead.h
+++ b/src/openvpn/syshead.h
@@ -154,10 +154,6 @@
 #include <grp.h>
 #endif

-#ifdef USE_LIBDL
-#include <dlfcn.h>
-#endif
-
 #ifdef HAVE_NETDB_H
 #include <netdb.h>
 #endif
@@ -505,13 +501,6 @@ socket_defined (const socket_descriptor_t sd)
 #endif

 /*
- * Do we have a plug-in capability?
- */
-#if defined(USE_LIBDL) || defined(USE_LOAD_LIBRARY)
-#define ENABLE_PLUGIN
-#endif
-
-/*
  * Enable deferred authentication?
  */
 #if defined(ENABLE_DEF_AUTH) && P2MP_SERVER && defined(ENABLE_PLUGIN)
-- 
1.7.3.4


Reply via email to