]> granicus.if.org Git - curl/commitdiff
Patrick Monnerat modified the LDAP code and approach in curl. Starting now,
authorDaniel Stenberg <daniel@haxx.se>
Sat, 11 Aug 2007 20:57:54 +0000 (20:57 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 11 Aug 2007 20:57:54 +0000 (20:57 +0000)
the configure script checks for openldap and friends and we link with those
libs just like we link all other third party libraries, and we no longer
dlopen() those libraries. Our private header file lib/ldap.h was renamed to
lib/curl_ldap.h due to this. I set a tag in CVS (curl-7_17_0-preldapfix)
just before this commit, just in case.

19 files changed:
CHANGES
RELEASE-NOTES
acinclude.m4
configure.ac
docs/examples/Makefile.example
hiper/Makefile
lib/Makefile.Watcom
lib/Makefile.inc
lib/Makefile.netware
lib/config-riscos.h
lib/config-tpf.h
lib/config-win32.h
lib/config-win32ce.h
lib/curl_ldap.h [moved from lib/ldap.h with 88% similarity]
lib/ldap.c
lib/url.c
packages/vms/config-vms.h
src/Makefile.netware
src/config-riscos.h

diff --git a/CHANGES b/CHANGES
index d8a4bdaea2fdcf8cb0a0ce119521527408aee16f..cb0cd4e94e0299dea46ca90754d5104d9eed42d1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,14 @@
 
                                   Changelog
 
+Daniel S (11 August 2007)
+- Patrick Monnerat modified the LDAP code and approach in curl. Starting now,
+  the configure script checks for openldap and friends and we link with those
+  libs just like we link all other third party libraries, and we no longer
+  dlopen() those libraries. Our private header file lib/ldap.h was renamed to
+  lib/curl_ldap.h due to this. I set a tag in CVS (curl-7_17_0-preldapfix)
+  just before this commit, just in case.
+
 Dan F (8 August 2007)
 - Song Ma noted a zlib memory leak in the illegal compressed header
   countermeasures code path.
index 2f2962bb98ed86e213f9cbd3a3a95aff9826064b..9de5d7bf6e24710de43f5fe7f145ee94bdf9f5c4 100644 (file)
@@ -14,6 +14,7 @@ This release includes the following changes:
  o support for OS/400 Secure Sockets Layer library
  o curl_easy_setopt() now allocates strings passed to it
  o SCP and SFTP support now requires libssh2 0.16 or later
+ o LDAP libraries are now linked "regularly" and not with dlopen
 
 This release includes the following bugfixes:
 
index 53c8b1e3bb1cbc2abc761adf6f53f83e5e364722..5cb20f47c7ec52ddb422f327c03e977435cd4460 100644 (file)
@@ -1830,81 +1830,6 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
 
 ]) dnl end of AC_DEFUN()
 
-
-dnl Determine the name of the library to pass to dlopen() based on the name
-dnl that would normally be given to AC_CHECK_LIB.  The preprocessor symbol
-dnl given is set to the quoted library file name. 
-dnl The standard dynamic library file name is first generated, based on the
-dnl current system type, then a search is performed for that file on the
-dnl standard dynamic library path.  If it is a symbolic link, the destination
-dnl of the link is used as the file name, after stripping off any minor
-dnl version numbers. If a library file can't be found, a guess is made.
-dnl This macro assumes AC_PROG_LIBTOOL has been called and requires perl
-dnl to be available in the PATH, or $PERL to be set to its location.
-dnl
-dnl CURL_DLLIB_NAME(VARIABLE, library_name)
-dnl e.g. CURL_DLLIB_NAME(LDAP_NAME, ldap) on a Linux system might result
-dnl in LDAP_NAME holding the string "libldap.so.2".
-
-AC_DEFUN([CURL_DLLIB_NAME],
-[
-AC_MSG_CHECKING([name of dynamic library $2])
-dnl The shared library extension variable name changes from version to
-dnl version of libtool.  Try a few names then just set one statically.
-test -z "$shared_ext" && eval shared_ext=\"$shrext_cmds\"
-test -z "$shared_ext" && shared_ext="$std_shrext"
-test -z "$shared_ext" && shared_ext="$shrext"
-test -z "$shared_ext" && shared_ext=".so"
-
-dnl Create the library link name of the correct form for this platform
-LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'`
-DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
-DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"`
-dnl Last resort in case libtool knows nothing about shared libs on this platform
-test -z "$DLGUESSFILE" && DLGUESSFILE="$DLGUESSLIB$shared_ext"
-
-dnl Synthesize a likely dynamic library name in case we can't find an actual one
-SO_NAME_SPEC="$soname_spec"
-dnl soname_spec undefined when identical to the 1st entry in library_names_spec
-test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'`
-DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"`
-dnl Last resort in case libtool knows nothing about shared libs on this platform
-test -z "$DLGUESSSOFILE" && DLGUESSSOFILE="$DLGUESSFILE"
-
-if test "$cross_compiling" = yes; then
-  dnl Can't look at filesystem when cross-compiling
-  AC_DEFINE_UNQUOTED($1, "$DLGUESSSOFILE", [$2 dynamic library file])
-  AC_MSG_RESULT([$DLGUESSSOFILE (guess while cross-compiling)])
-else
-
-  DLFOUNDFILE=""
-  if test "$sys_lib_dlsearch_path_spec" ; then
-    dnl Search for the link library name and see what it points to.
-    for direc in $sys_lib_dlsearch_path_spec ; do
-      DLTRYFILE="$direc/$DLGUESSFILE"
-      dnl Find where the symbolic link for this name points
-      changequote(<<, >>)dnl
-      <<
-      DLFOUNDFILE=`${PERL:-perl} -e 'use File::Basename; (basename(readlink($ARGV[0])) =~ /^(.*[^\d]\.\d+)[\d\.]*$/ && print ${1}) || exit 1;' "$DLTRYFILE" 2>&5`
-      >>
-      changequote([, ])dnl
-      if test "$?" -eq "0"; then
-        dnl Found the file link
-        break
-      fi
-    done
-  fi
-
-  if test -z "$DLFOUNDFILE" ; then
-    dnl Couldn't find a link library, so guess at a name.
-    DLFOUNDFILE="$DLGUESSSOFILE"
-  fi
-
-  AC_DEFINE_UNQUOTED($1, "$DLFOUNDFILE", [$2 dynamic library file])
-  AC_MSG_RESULT($DLFOUNDFILE)
-fi
-])
-
 # This is only a temporary fix. This macro is here to replace the broken one
 # delivered by the automake project (including the 1.9.6 release). As soon as
 # they ship a working version we SHOULD remove this work-around.
index a3cf7ecea0bdb7a192831a1a0732b54dae44c709..f03a81c78a7800cd2d422d8ef7aff23760402dd7 100644 (file)
@@ -89,6 +89,7 @@ dnl initialize all the info variables
  curl_manual_msg="no      (--enable-manual)"
 curl_verbose_msg="enabled (--disable-verbose)"
    curl_sspi_msg="no      (--enable-sspi)"
+   curl_ldap_msg="no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)"
 
 dnl
 dnl Save anything in $LIBS for later
@@ -500,55 +501,79 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
        AC_MSG_RESULT(no)
 )
 
-dnl dl lib?
-AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
-
 dnl **********************************************************************
-dnl Check for the name of dynamic OpenLDAP libraries
+dnl Check for LDAP
 dnl **********************************************************************
 
 LDAPLIBNAME=""
 AC_ARG_WITH(ldap-lib,
-AC_HELP_STRING([--with-ldap-lib=libname],[Specify name of dynamic ldap lib file]),
+AC_HELP_STRING([--with-ldap-lib=libname],[Specify name of ldap lib file]),
  [LDAPLIBNAME="$withval"])
 
 LBERLIBNAME=""
 AC_ARG_WITH(lber-lib,
-AC_HELP_STRING([--with-lber-lib=libname],[Specify name of dynamic lber lib file]),
+AC_HELP_STRING([--with-lber-lib=libname],[Specify name of lber lib file]),
  [LBERLIBNAME="$withval"])
 
 if test x$CURL_DISABLE_LDAP != x1 ; then
 
   if test -z "$LDAPLIBNAME" ; then
     case $host in
-      *-*-cygwin | *-*-mingw* | *-*-pw32*)
+      *-*-cygwin* | *-*-mingw* | *-*-pw32*)
         dnl Windows uses a single and unique OpenLDAP DLL name
-        LDAPLIBNAME="wldap32.dll"
+        LDAPLIBNAME="wldap32"
         LBERLIBNAME="no"
         ;;
     esac
   fi
 
   if test "$LDAPLIBNAME" ; then
-    AC_DEFINE_UNQUOTED(DL_LDAP_FILE, "$LDAPLIBNAME")
-    AC_MSG_CHECKING([name of dynamic library ldap])
-    AC_MSG_RESULT($LDAPLIBNAME)
+    AC_CHECK_LIB("$LDAPLIBNAME", ldap_init,, [
+      AC_MSG_WARN(["$LDAPLIBNAME" is not an LDAP library: LDAP disabled])
+      AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
+      AC_SUBST(CURL_DISABLE_LDAP, [1])])
   else
     dnl Try to find the right ldap library name for this system
-    CURL_DLLIB_NAME(DL_LDAP_FILE, ldap)
+    AC_SEARCH_LIBS(ldap_init, [ldap],, [
+      AC_MSG_WARN([Cannot find LDAP library: LDAP disabled])
+      AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
+      AC_SUBST(CURL_DISABLE_LDAP, [1])])
   fi
+fi
+
+if test x$CURL_DISABLE_LDAP != x1 ; then
 
   if test "$LBERLIBNAME" ; then
-    dnl If name is "no" then don't define this variable at all
+    dnl If name is "no" then don't define this library at all
     dnl (it's only needed if libldap.so's dependencies are broken).
     if test "$LBERLIBNAME" != "no" ; then 
-      AC_DEFINE_UNQUOTED(DL_LBER_FILE, "$LBERLIBNAME")
+      AC_CHECK_LIB("$LBERLIBNAME", ber_free,, [
+        AC_MSG_WARN(["$LBERLIBNAME" is not an LBER library: LDAP disabled])
+        AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
+        AC_SUBST(CURL_DISABLE_LDAP, [1])])
     fi
-    AC_MSG_CHECKING([name of dynamic library lber])
-    AC_MSG_RESULT($LBERLIBNAME)
   else
     dnl Try to find the right lber library name for this system
-    CURL_DLLIB_NAME(DL_LBER_FILE, lber)
+    AC_SEARCH_LIBS(ber_free, [lber],, [
+      AC_MSG_WARN([Cannot find a library defining ber_free(): LDAP disabled])
+      AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
+      AC_SUBST(CURL_DISABLE_LDAP, [1])])
+  fi
+fi
+
+if test x$CURL_DISABLE_LDAP != x1 ; then
+  AC_CHECK_FUNCS([ldap_url_parse])
+
+  if test "$LDAPLIBNAME" = "wldap32"; then
+    curl_ldap_msg="yes (winldap)"
+    AC_DEFINE(CURL_LDAP_WIN, 1, [Use W$ LDAP implementation])
+    case $host in
+      *-*-cygwin* | *-*-mingw* | *-*-pw32*)
+        AC_DEFINE(CURL_LDAP_HYBRID, 1, [W$ LDAP with non-W$ compiler])
+        ;;
+    esac
+  else
+    curl_ldap_msg="yes (OpenLDAP)"
   fi
 fi
 
@@ -1716,7 +1741,6 @@ AC_CHECK_HEADERS(
         termio.h \
         sgtty.h \
         fcntl.h \
-        dlfcn.h \
         alloca.h \
         time.h \
         io.h \
@@ -1858,7 +1882,6 @@ AC_CHECK_FUNCS( strtoll \
                 strlcat \
                 getpwuid \
                 geteuid \
-                dlopen \
                 utime \
                 sigsetjmp \
                 basename \
@@ -2363,4 +2386,5 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
   Verbose errors:  ${curl_verbose_msg}
   SSPI support:    ${curl_sspi_msg}
   ca cert path:    ${ca}
+  LDAP support:    ${curl_ldap_msg}
 ])
index 0852c0f3c84d9e7dd0979527ecb8ff38cda0e3a5..7afe04cf6b02a1d2eceb7f3e2e1602023fc06851 100644 (file)
@@ -29,9 +29,8 @@ LDFLAGS = -L/home/dast/lib -L/usr/local/ssl/lib
 # We need -lcurl for the curl stuff
 # We need -lsocket and -lnsl when on Solaris
 # We need -lssl and -lcrypto when using libcurl with SSL support
-# We need -ldl for dlopen() if that is in libdl
 # We need -lpthread for the pthread example
-LIBS = -lcurl -lsocket -lnsl -lssl -lcrypto -dl
+LIBS = -lcurl -lsocket -lnsl -lssl -lcrypto
 
 # Link the target with all objects and libraries
 $(TARGET) : $(OBJS)
index ba3cc07099c19665e857e0be5035c63a17c1bbae..fea1655ae87730d234ba71d10aaf847036095930 100644 (file)
@@ -3,7 +3,7 @@
 # During dev at least, we use a static libcurl.
 #
 
-LDFLAGS = -lcrypt -lidn -lssl -lcrypto -ldl -lz -lresolv -L../ares/.libs \
+LDFLAGS = -lcrypt -lidn -lssl -lcrypto -lz -lresolv -L../ares/.libs \
  -lcares
 LIBCURL = -L../lib/.libs/ -lcurl
 CFLAGS = -I../include -g
index 8301925e9a3ff42bfbefbe43843bd5688f63d529..4bd709509149a889ac76f5531435d308474264e7 100644 (file)
@@ -154,7 +154,7 @@ $(OBJ_DIR)\url.obj: url.c setup.h config-win32.h setup_once.h urldata.h cookie.h
   http_chunks.h hostip.h hash.h llist.h splay.h netrc.h base64.h sslgen.h &
   transfer.h sendf.h progress.h strequal.h strerror.h escape.h strtok.h &
   share.h content_encoding.h http_digest.h http_negotiate.h select.h &
-  multiif.h ftp.h dict.h telnet.h tftp.h http.h file.h ldap.h url.h &
+  multiif.h ftp.h dict.h telnet.h tftp.h http.h file.h curl_ldap.h url.h &
   connect.h inet_ntop.h http_ntlm.h .\ca-bundle.h &
   ..\include\curl\mprintf.h memory.h memdebug.h .\memory.h
 $(OBJ_DIR)\dict.obj: dict.c setup.h config-win32.h setup_once.h urldata.h cookie.h &
index 759c923d55352f1e346a8b8805030197f5530445..e203d3658e49cf782f6efc2fa3a8cfccc1938530 100644 (file)
@@ -13,7 +13,7 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
 
 HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h    \
   progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h     \
-  if2ip.h speedcheck.h urldata.h ldap.h ssluse.h escape.h telnet.h     \
+  if2ip.h speedcheck.h urldata.h curl_ldap.h ssluse.h escape.h telnet.h        \
   getinfo.h strequal.h krb4.h memdebug.h inet_ntoa_r.h http_chunks.h   \
   strtok.h connect.h llist.h hash.h content_encoding.h share.h md5.h   \
   http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h inet_pton.h   \
index db8cb78e49e356300bc6f9373ce4cf3a678a7335..ff98021f55bd0bf073951f28cfa639ea9c24cae2 100644 (file)
@@ -370,8 +370,6 @@ ifeq ($(LIBARCH),CLIB)
        @echo $(DL)#define DL_LDAP_FILE "ldapsdk.nlm"$(DL) >> $@
 else
        @echo $(DL)#define OS "i586-pc-libc-NetWare"$(DL) >> $@
-       @echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@
-       @echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@
        @echo $(DL)#define HAVE_FTRUNCATE 1$(DL) >> $@
        @echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@
        @echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@
index aedf247937112617b9ac7a19bd6b129eab493c77..17f76b507ede41c3e6b8341e14a5add4ba426f74 100644 (file)
 /* Define if you have the <des.h> header file. */
 #undef HAVE_DES_H
 
-/* Define if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define if you have the `dlopen' function. */
-#undef HAVE_DLOPEN
-
 /* Define if you have the <err.h> header file. */
 #undef HAVE_ERR_H
 
 /* Define if you have the `crypto' library (-lcrypto). */
 #undef HAVE_LIBCRYPTO
 
-/* Define if you have the `dl' library (-ldl). */
-#undef HAVE_LIBDL
-
 /* Define if you have the `nsl' library (-lnsl). */
 #undef HAVE_LIBNSL
 
index a22756c525a18095852dd71495d13a7a39a15b3b..56ef38ac75d7209c3c3d352a39e456a16885298f 100644 (file)
 /* disabled non-blocking sockets */
 /* #undef HAVE_DISABLED_NONBLOCKING */
 
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the `dlopen' function. */
-#define HAVE_DLOPEN 1
-
 /* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */
 /* #undef HAVE_ENGINE_LOAD_BUILTIN_ENGINES */
 #define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
 /* Define to 1 if you have the <krb.h> header file. */
 /* #undef HAVE_KRB_H */
 
-/* Define to 1 if you have the `dl' library (-ldl). */
-#define HAVE_LIBDL 1
-
 /* Define to 1 if you have the <libgen.h> header file. */
 /* #undef HAVE_LIBGEN_H 1 */
 
index 5b2a4220ae0733eebd98751acf5b76924e4978c3..91e76e974d06399d7b0417b2147a17ffb2f50ecd 100644 (file)
@@ -18,9 +18,6 @@
 /* Define if you have the <crypto.h> header file.  */
 /* #define HAVE_CRYPTO_H 1 */
 
-/* Define if you have the <dlfcn.h> header file.  */
-/* #define HAVE_DLFCN_H 1 */
-
 /* Define if you have the <err.h> header file.  */
 /* #define HAVE_ERR_H 1 */
 
 #endif
 
 /* ---------------------------------------------------------------- */
-/*                        LDAP LIBRARY FILES                        */
+/*                           LDAP SUPPORT                           */
 /* ---------------------------------------------------------------- */
 
-/* lber dynamic library file */
-/* #define DL_LBER_FILE */
-
-/* ldap dynamic library file */
-#define DL_LDAP_FILE "wldap32.dll"
+#define CURL_LDAP_WIN 1
+#undef CURL_LDAP_HYBRID
+#undef HAVE_LDAP_URL_PARSE
 
 /* ---------------------------------------------------------------- */
 /*                       ADDITIONAL DEFINITIONS                     */
index c8dc35c3fcba04fdb1e405de46371eaa15a83dbb..e7d157202a7755a5237404351a77877d764be12c 100644 (file)
@@ -18,9 +18,6 @@
 /* Define if you have the <crypto.h> header file.  */
 /* #define HAVE_CRYPTO_H 1 */
 
-/* Define if you have the <dlfcn.h> header file.  */
-/* #define HAVE_DLFCN_H 1 */
-
 /* Define if you have the <err.h> header file.  */
 /* #define HAVE_ERR_H 1 */
 
 /* #undef const */
 
 /* ---------------------------------------------------------------- */
-/*                        LDAP LIBRARY FILES                        */
+/*                           LDAP SUPPORT                           */
 /* ---------------------------------------------------------------- */
 
-/* lber dynamic library file */
-/* #define DL_LBER_FILE */
-
-/* ldap dynamic library file */
-/* #define DL_LDAP_FILE "wldap32.dll" */
+#define CURL_LDAP_WIN 1
+#undef CURL_LDAP_HYBRID
+#undef HAVE_LDAP_URL_PARSE
 
 /* ---------------------------------------------------------------- */
 /*                       ADDITIONAL DEFINITIONS                     */
similarity index 88%
rename from lib/ldap.h
rename to lib/curl_ldap.h
index b2d4f3973ad4990bd799b1032e4ce7561bfda9c5..071cbcb43d200e72edcb79347fbad01d639bdce7 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __LDAP_H
-#define __LDAP_H
+#ifndef __CURL_LDAP_H
+#define __CURL_LDAP_H
 
 /***************************************************************************
  *                                  _   _ ____  _
@@ -8,7 +8,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -26,4 +26,4 @@
 #ifndef CURL_DISABLE_LDAP
 CURLcode Curl_ldap(struct connectdata *conn, bool *done);
 #endif
-#endif /* __LDAP_H */
+#endif /* __CURL_LDAP_H */
index 61813bb2b4d536540e440f0fb6f9bae6c0fa24ac..1f29ac04207798d61708352781c496f998282f3f 100644 (file)
 #endif
 #include <errno.h>
 
-#if defined(WIN32)
+#ifdef CURL_LDAP_HYBRID         /* If W$ definitions are needed. */
+# include <windows.h>
+  /* Remember we are NOT in a W$ compiler! */
+# undef WIN32
+# undef _WIN32
+# undef __WIN32__
+#endif
+
+#ifdef CURL_LDAP_WIN            /* Use W$ LDAP implementation. */
 # include <winldap.h>
+#else
+#define LDAP_DEPRECATED         /* Be sure ldap_init() is defined. */
+# include <ldap.h>
 #endif
 
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
 
-#ifdef HAVE_DLFCN_H
-# include <dlfcn.h>
-#endif
-
 #include "urldata.h"
 #include <curl/curl.h>
 #include "sendf.h"
@@ -54,7 +61,7 @@
 #include "transfer.h"
 #include "strequal.h"
 #include "strtok.h"
-#include "ldap.h"
+#include "curl_ldap.h"
 #include "memory.h"
 #include "base64.h"
 
 
 #include "memdebug.h"
 
-/* WLdap32.dll functions are *not* stdcall. Must call these via __cdecl
- * pointers in case libcurl was compiled as fastcall (cl -Gr). Watcom
- * uses fastcall by default.
- */
-#if !defined(WIN32) && !defined(__cdecl)
-#define __cdecl
-#endif
-
-#ifndef LDAP_SIZELIMIT_EXCEEDED
-#define LDAP_SIZELIMIT_EXCEEDED 4
-#endif
-#ifndef LDAP_VERSION2
-#define LDAP_VERSION2 2
-#endif
-#ifndef LDAP_VERSION3
-#define LDAP_VERSION3 3
-#endif
-#ifndef LDAP_OPT_PROTOCOL_VERSION
-#define LDAP_OPT_PROTOCOL_VERSION 0x0011
-#endif
-
-#define DLOPEN_MODE   RTLD_LAZY  /*! assume all dlopen() implementations have
-                                   this */
-
-#if defined(RTLD_LAZY_GLOBAL)    /* It turns out some systems use this: */
-# undef  DLOPEN_MODE
-# define DLOPEN_MODE  RTLD_LAZY_GLOBAL
-#elif defined(RTLD_GLOBAL)
-# undef  DLOPEN_MODE
-# define DLOPEN_MODE  (RTLD_LAZY | RTLD_GLOBAL)
-#endif
-
-#define DYNA_GET_FUNCTION(type, fnc) do { \
-          (fnc) = (type)DynaGetFunction(#fnc); \
-          if ((fnc) == NULL) \
-             return CURLE_FUNCTION_NOT_FOUND; \
-        } while (0)
-
-/*! CygWin etc. configure could set these, but we don't want it.
- * Must use WLdap32.dll code.
- */
-#if defined(WIN32)
-#undef HAVE_DLOPEN
-#undef HAVE_LIBDL
-#endif
-
-/*
- * We use this ZERO_NULL to avoid picky compiler warnings,
- * when assigning a NULL pointer to a function pointer var.
- */
-
-#define ZERO_NULL 0
-
-typedef void * (*dynafunc)(void *input);
-
-/***********************************************************************
- */
-#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL) || defined(WIN32)
-static void *libldap = NULL;
-#if defined(DL_LBER_FILE)
-static void *liblber = NULL;
-#endif
-#endif
-
-struct bv {
-  unsigned long bv_len;
-  char  *bv_val;
-};
-
-static int DynaOpen(const char **mod_name)
-{
-#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
-  if (libldap == NULL) {
-    /*
-     * libldap.so can normally resolve its dependency on liblber.so
-     * automatically, but in broken installation it does not so
-     * handle it here by opening liblber.so as global.
-     */
-#ifdef DL_LBER_FILE
-    *mod_name = DL_LBER_FILE;
-    liblber = dlopen(*mod_name, DLOPEN_MODE);
-    if (!liblber)
-      return 0;
-#endif
-
-    /* Assume loading libldap.so will fail if loading of liblber.so failed
-     */
-    *mod_name = DL_LDAP_FILE;
-    libldap = dlopen(*mod_name, RTLD_LAZY);
-  }
-  return (libldap != NULL);
-
-#elif defined(WIN32)
-  *mod_name = DL_LDAP_FILE;
-  if (!libldap)
-    libldap = (void*)LoadLibrary(*mod_name);
-  return (libldap != NULL);
-
-#else
-  *mod_name = "";
-  return (0);
-#endif
-}
+#ifndef HAVE_LDAP_URL_PARSE
 
-static void DynaClose(void)
-{
-#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
-  if (libldap) {
-    dlclose(libldap);
-    libldap=NULL;
-  }
-#ifdef DL_LBER_FILE
-  if (liblber) {
-    dlclose(liblber);
-    liblber=NULL;
-  }
-#endif
-#elif defined(WIN32)
-  if (libldap) {
-    FreeLibrary ((HMODULE)libldap);
-    libldap = NULL;
-  }
-#endif
-}
-
-static dynafunc DynaGetFunction(const char *name)
-{
-  dynafunc func = (dynafunc)ZERO_NULL;
-
-#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
-  if (libldap) {
-    /* This typecast magic below was brought by Joe Halpin. In ISO C, you
-     * cannot typecast a data pointer to a function pointer, but that's
-     * exactly what we need to do here to avoid compiler warnings on picky
-     * compilers! */
-    *(void**) (&func) = dlsym(libldap, name);
-  }
-#ifdef DL_LBER_FILE
-  if (!func && liblber) {
-    *(void**) (&func) = dlsym(liblber, name);
-  }
-#endif
-#elif defined(WIN32)
-  if (libldap) {
-    func = (dynafunc)GetProcAddress((HINSTANCE)libldap, name);
-  }
-#else
-  (void) name;
-#endif
-  return func;
-}
+/* Use our own implementation. */
 
-/***********************************************************************
- */
 typedef struct ldap_url_desc {
     struct ldap_url_desc *lud_next;
     char   *lud_scheme;
@@ -230,7 +87,6 @@ typedef struct ldap_url_desc {
     int     lud_crit_exts;
 } LDAPURLDesc;
 
-#ifdef WIN32
 static int  _ldap_url_parse (const struct connectdata *conn,
                              LDAPURLDesc **ludp);
 static void _ldap_free_urldesc (LDAPURLDesc *ludp);
@@ -238,6 +94,19 @@ static void _ldap_free_urldesc (LDAPURLDesc *ludp);
 static void (*ldap_free_urldesc)(LDAPURLDesc *) = _ldap_free_urldesc;
 #endif
 
+#ifndef LDAP_SIZELIMIT_EXCEEDED
+#define LDAP_SIZELIMIT_EXCEEDED 4
+#endif
+#ifndef LDAP_VERSION2
+#define LDAP_VERSION2 2
+#endif
+#ifndef LDAP_VERSION3
+#define LDAP_VERSION3 3
+#endif
+#ifndef LDAP_OPT_PROTOCOL_VERSION
+#define LDAP_OPT_PROTOCOL_VERSION 0x0011
+#endif
+
 #ifdef DEBUG_LDAP
   #define LDAP_TRACE(x)   do { \
                             _ldap_trace ("%u: ", __LINE__); \
@@ -254,32 +123,11 @@ CURLcode Curl_ldap(struct connectdata *conn, bool *done)
 {
   CURLcode status = CURLE_OK;
   int rc = 0;
-#ifndef WIN32
-  int    (*ldap_url_parse)(char *, LDAPURLDesc **);
-  void   (*ldap_free_urldesc)(void *);
-#endif
-  void  *(__cdecl *ldap_init)(char *, int);
-  int    (__cdecl *ldap_simple_bind_s)(void *, char *, char *);
-  int    (__cdecl *ldap_unbind_s)(void *);
-  int    (__cdecl *ldap_search_s)(void *, char *, int, char *, char **,
-                                  int, void **);
-  void  *(__cdecl *ldap_first_entry)(void *, void *);
-  void  *(__cdecl *ldap_next_entry)(void *, void *);
-  char  *(__cdecl *ldap_err2string)(int);
-  char  *(__cdecl *ldap_get_dn)(void *, void *);
-  char  *(__cdecl *ldap_first_attribute)(void *, void *, void **);
-  char  *(__cdecl *ldap_next_attribute)(void *, void *, void *);
-  void **(__cdecl *ldap_get_values_len)(void *, void *, const char *);
-  void   (__cdecl *ldap_value_free_len)(void **);
-  void   (__cdecl *ldap_memfree)(void *);
-  void   (__cdecl *ber_free)(void *, int);
-  int    (__cdecl *ldap_set_option)(void *, int, void *);
-
-  void *server;
+  LDAP *server;
   LDAPURLDesc *ludp = NULL;
   const char *mod_name;
-  void *result;
-  void *entryIterator;     /*! type should be 'LDAPMessage *' */
+  LDAPMessage *result;
+  LDAPMessage *entryIterator;
   int num = 0;
   struct SessionHandle *data=conn->data;
   int ldap_proto;
@@ -289,40 +137,7 @@ CURLcode Curl_ldap(struct connectdata *conn, bool *done)
   *done = TRUE; /* unconditionally */
   infof(data, "LDAP local: %s\n", data->change.url);
 
-  if (!DynaOpen(&mod_name)) {
-    failf(data, "The %s LDAP library/libraries couldn't be opened", mod_name);
-    return CURLE_LIBRARY_NOT_FOUND;
-  }
-
-  /* The types are needed because ANSI C distinguishes between
-   * pointer-to-object (data) and pointer-to-function.
-   */
-  DYNA_GET_FUNCTION(void *(__cdecl *)(char *, int), ldap_init);
-  DYNA_GET_FUNCTION(int (__cdecl *)(void *, char *, char *),
-                    ldap_simple_bind_s);
-  DYNA_GET_FUNCTION(int (__cdecl *)(void *), ldap_unbind_s);
-#ifndef WIN32
-  DYNA_GET_FUNCTION(int (*)(char *, LDAPURLDesc **), ldap_url_parse);
-  DYNA_GET_FUNCTION(void (*)(void *), ldap_free_urldesc);
-#endif
-  DYNA_GET_FUNCTION(int (__cdecl *)(void *, char *, int, char *, char **, int,
-                                    void **), ldap_search_s);
-  DYNA_GET_FUNCTION(void *(__cdecl *)(void *, void *), ldap_first_entry);
-  DYNA_GET_FUNCTION(void *(__cdecl *)(void *, void *), ldap_next_entry);
-  DYNA_GET_FUNCTION(char *(__cdecl *)(int), ldap_err2string);
-  DYNA_GET_FUNCTION(char *(__cdecl *)(void *, void *), ldap_get_dn);
-  DYNA_GET_FUNCTION(char *(__cdecl *)(void *, void *, void **),
-                    ldap_first_attribute);
-  DYNA_GET_FUNCTION(char *(__cdecl *)(void *, void *, void *),
-                    ldap_next_attribute);
-  DYNA_GET_FUNCTION(void **(__cdecl *)(void *, void *, const char *),
-                    ldap_get_values_len);
-  DYNA_GET_FUNCTION(void (__cdecl *)(void **), ldap_value_free_len);
-  DYNA_GET_FUNCTION(void (__cdecl *)(void *), ldap_memfree);
-  DYNA_GET_FUNCTION(void (__cdecl *)(void *, int), ber_free);
-  DYNA_GET_FUNCTION(int (__cdecl *)(void *, int, void *), ldap_set_option);
-
-  server = (*ldap_init)(conn->host.name, (int)conn->port);
+  server = ldap_init(conn->host.name, (int)conn->port);
   if (server == NULL) {
     failf(data, "LDAP local: Cannot connect to %s:%d",
           conn->host.name, conn->port);
@@ -331,63 +146,62 @@ CURLcode Curl_ldap(struct connectdata *conn, bool *done)
   }
 
   ldap_proto = LDAP_VERSION3;
-  (*ldap_set_option)(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
-  rc = (*ldap_simple_bind_s)(server,
-                             conn->bits.user_passwd ? conn->user : NULL,
-                             conn->bits.user_passwd ? conn->passwd : NULL);
+  ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
+  rc = ldap_simple_bind_s(server,
+                          conn->bits.user_passwd ? conn->user : NULL,
+                          conn->bits.user_passwd ? conn->passwd : NULL);
   if (rc != 0) {
     ldap_proto = LDAP_VERSION2;
-    (*ldap_set_option)(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
-    rc = (*ldap_simple_bind_s)(server,
-                               conn->bits.user_passwd ? conn->user : NULL,
-                               conn->bits.user_passwd ? conn->passwd : NULL);
+    ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
+    rc = ldap_simple_bind_s(server,
+                            conn->bits.user_passwd ? conn->user : NULL,
+                            conn->bits.user_passwd ? conn->passwd : NULL);
   }
   if (rc != 0) {
-     failf(data, "LDAP local: %s", (*ldap_err2string)(rc));
+     failf(data, "LDAP local: %s", ldap_err2string(rc));
      status = CURLE_LDAP_CANNOT_BIND;
      goto quit;
   }
 
-#ifdef WIN32
+#ifndef HAVE_LDAP_URL_PARSE
   rc = _ldap_url_parse(conn, &ludp);
 #else
-  rc = (*ldap_url_parse)(data->change.url, &ludp);
+  rc = ldap_url_parse(data->change.url, &ludp);
 #endif
 
   if (rc != 0) {
-     failf(data, "LDAP local: %s", (*ldap_err2string)(rc));
+     failf(data, "LDAP local: %s", ldap_err2string(rc));
      status = CURLE_LDAP_INVALID_URL;
      goto quit;
   }
 
-  rc = (*ldap_search_s)(server, ludp->lud_dn, ludp->lud_scope,
-                        ludp->lud_filter, ludp->lud_attrs, 0, &result);
+  rc = ldap_search_s(server, ludp->lud_dn, ludp->lud_scope,
+                     ludp->lud_filter, ludp->lud_attrs, 0, &result);
 
   if (rc != 0 && rc != LDAP_SIZELIMIT_EXCEEDED) {
-    failf(data, "LDAP remote: %s", (*ldap_err2string)(rc));
+    failf(data, "LDAP remote: %s", ldap_err2string(rc));
     status = CURLE_LDAP_SEARCH_FAILED;
     goto quit;
   }
 
-  for(num = 0, entryIterator = (*ldap_first_entry)(server, result);
+  for(num = 0, entryIterator = ldap_first_entry(server, result);
       entryIterator;
-      entryIterator = (*ldap_next_entry)(server, entryIterator), num++)
+      entryIterator = ldap_next_entry(server, entryIterator), num++)
   {
-    void  *ber = NULL;      /*! is really 'BerElement **' */
-    void  *attribute;       /*! suspicious that this isn't 'const' */
-    char  *dn = (*ldap_get_dn)(server, entryIterator);
+    BerElement *ber = NULL;
+    char  *attribute;       /*! suspicious that this isn't 'const' */
+    char  *dn = ldap_get_dn(server, entryIterator);
     int i;
 
     Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"DN: ", 4);
     Curl_client_write(conn, CLIENTWRITE_BODY, (char *)dn, 0);
     Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
 
-    for (attribute = (*ldap_first_attribute)(server, entryIterator, &ber);
+    for (attribute = ldap_first_attribute(server, entryIterator, &ber);
          attribute;
-         attribute = (*ldap_next_attribute)(server, entryIterator, ber))
+         attribute = ldap_next_attribute(server, entryIterator, ber))
     {
-      struct bv **vals = (struct bv **)
-        (*ldap_get_values_len)(server, entryIterator, attribute);
+      BerValue **vals = ldap_get_values_len(server, entryIterator, attribute);
 
       if (vals != NULL)
       {
@@ -416,15 +230,15 @@ CURLcode Curl_ldap(struct connectdata *conn, bool *done)
         }
 
         /* Free memory used to store values */
-        (*ldap_value_free_len)((void **)vals);
+        ldap_value_free_len(vals);
       }
       Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
 
-      (*ldap_memfree)(attribute);
+      ldap_memfree(attribute);
     }
-    (*ldap_memfree)(dn);
+    ldap_memfree(dn);
     if (ber)
-       (*ber_free)(ber, 0);
+       ber_free(ber, 0);
   }
 
 quit:
@@ -432,11 +246,9 @@ quit:
   if (rc == LDAP_SIZELIMIT_EXCEEDED)
      infof(data, "There are more than %d entries\n", num);
   if (ludp)
-     (*ldap_free_urldesc)(ludp);
+     ldap_free_urldesc(ludp);
   if (server)
-     (*ldap_unbind_s)(server);
-
-  DynaClose();
+     ldap_unbind_s(server);
 
   /* no data to transfer */
   Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
@@ -464,7 +276,8 @@ static void _ldap_trace (const char *fmt, ...)
 }
 #endif
 
-#ifdef WIN32
+#ifndef HAVE_LDAP_URL_PARSE
+
 /*
  * Return scope-value for a scope-string.
  */
@@ -697,5 +510,5 @@ static void _ldap_free_urldesc (LDAPURLDesc *ludp)
   }
   free (ludp);
 }
-#endif  /* WIN32 */
+#endif  /* HAVE_LDAP_URL_PARSE */
 #endif  /* CURL_DISABLE_LDAP */
index 901b1495cf3659bb1b359f09be109db4d558369b..7699e38d2c5df50278b258a27db6cab0fc6c10e4 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -130,7 +130,7 @@ void idn_free (void *ptr); /* prototype from idn-free.h, not provided by
 #include "tftp.h"
 #include "http.h"
 #include "file.h"
-#include "ldap.h"
+#include "curl_ldap.h"
 #include "ssh.h"
 #include "url.h"
 #include "connect.h"
index 93dbe3602eb1387fb4f1c8370e6ea21345da11d8..30c5cf059d1e04aa093c99a6930ed0279a1b9332 100644 (file)
 /* Define if you have the getpass function.  */
 #undef HAVE_GETPASS
 
-/* Define if you have the `dlopen' function. */
-#define HAVE_DLOPEN 1
-
 /* Define if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
 /* Define to 1 if you have the <limits.h> header file. */
 #define HAVE_LIMITS_H 1
 
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #define HAVE_SYS_IOCTL_H 1
 
index 4a12dc6f4454428146fffe4ed356e9f349abaf00..b359ce2d9050289881cdbe148c3bc614dc65c588 100644 (file)
@@ -356,8 +356,6 @@ ifeq ($(LIBARCH),CLIB)
        @echo $(DL)#define pressanykey PressAnyKeyToContinue$(DL) >> $@
 else
        @echo $(DL)#define OS "i586-pc-libc-NetWare"$(DL) >> $@
-       @echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@
-       @echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@
        @echo $(DL)#define HAVE_FTRUNCATE 1$(DL) >> $@
        @echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@
        @echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@
index 90e2d9f2ef9bc6c7ede6a81a7c296651e50185d0..34f475857d8ff0b933edf073b5f81acc5fa3959b 100644 (file)
 /* Define if you have the <des.h> header file. */
 #undef HAVE_DES_H
 
-/* Define if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define if you have the `dlopen' function. */
-#undef HAVE_DLOPEN
-
 /* Define if you have the <err.h> header file. */
 #undef HAVE_ERR_H
 
 /* Define if you have the `crypto' library (-lcrypto). */
 #undef HAVE_LIBCRYPTO
 
-/* Define if you have the `dl' library (-ldl). */
-#undef HAVE_LIBDL
-
 /* Define if you have the `nsl' library (-lnsl). */
 #undef HAVE_LIBNSL