diff --git a/CHANGES b/CHANGES index d8a4bdaea..cb0cd4e94 100644 --- 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. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 2f2962bb9..9de5d7bf6 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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: diff --git a/acinclude.m4 b/acinclude.m4 index 53c8b1e3b..5cb20f47c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -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. diff --git a/configure.ac b/configure.ac index a3cf7ecea..f03a81c78 100644 --- a/configure.ac +++ b/configure.ac @@ -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} ]) diff --git a/docs/examples/Makefile.example b/docs/examples/Makefile.example index 0852c0f3c..7afe04cf6 100644 --- a/docs/examples/Makefile.example +++ b/docs/examples/Makefile.example @@ -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) diff --git a/hiper/Makefile b/hiper/Makefile index ba3cc0709..fea1655ae 100644 --- a/hiper/Makefile +++ b/hiper/Makefile @@ -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 diff --git a/lib/Makefile.Watcom b/lib/Makefile.Watcom index 8301925e9..4bd709509 100644 --- a/lib/Makefile.Watcom +++ b/lib/Makefile.Watcom @@ -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 & diff --git a/lib/Makefile.inc b/lib/Makefile.inc index 759c923d5..e203d3658 100644 --- a/lib/Makefile.inc +++ b/lib/Makefile.inc @@ -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 \ diff --git a/lib/Makefile.netware b/lib/Makefile.netware index db8cb78e4..ff98021f5 100644 --- a/lib/Makefile.netware +++ b/lib/Makefile.netware @@ -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) >> $@ diff --git a/lib/config-riscos.h b/lib/config-riscos.h index aedf24793..17f76b507 100644 --- a/lib/config-riscos.h +++ b/lib/config-riscos.h @@ -74,12 +74,6 @@ /* Define if you have the header file. */ #undef HAVE_DES_H -/* Define if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define if you have the `dlopen' function. */ -#undef HAVE_DLOPEN - /* Define if you have the header file. */ #undef HAVE_ERR_H @@ -146,9 +140,6 @@ /* 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 diff --git a/lib/config-tpf.h b/lib/config-tpf.h index a22756c52..56ef38ac7 100644 --- a/lib/config-tpf.h +++ b/lib/config-tpf.h @@ -104,12 +104,6 @@ /* disabled non-blocking sockets */ /* #undef HAVE_DISABLED_NONBLOCKING */ -/* Define to 1 if you have the 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 @@ -244,9 +238,6 @@ /* Define to 1 if you have the 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 header file. */ /* #undef HAVE_LIBGEN_H 1 */ diff --git a/lib/config-win32.h b/lib/config-win32.h index 5b2a4220a..91e76e974 100644 --- a/lib/config-win32.h +++ b/lib/config-win32.h @@ -18,9 +18,6 @@ /* Define if you have the header file. */ /* #define HAVE_CRYPTO_H 1 */ -/* Define if you have the header file. */ -/* #define HAVE_DLFCN_H 1 */ - /* Define if you have the header file. */ /* #define HAVE_ERR_H 1 */ @@ -353,14 +350,12 @@ #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 */ diff --git a/lib/config-win32ce.h b/lib/config-win32ce.h index c8dc35c3f..e7d157202 100644 --- a/lib/config-win32ce.h +++ b/lib/config-win32ce.h @@ -18,9 +18,6 @@ /* Define if you have the header file. */ /* #define HAVE_CRYPTO_H 1 */ -/* Define if you have the header file. */ -/* #define HAVE_DLFCN_H 1 */ - /* Define if you have the header file. */ /* #define HAVE_ERR_H 1 */ @@ -317,14 +314,12 @@ /* #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 */ diff --git a/lib/ldap.h b/lib/curl_ldap.h similarity index 88% rename from lib/ldap.h rename to lib/curl_ldap.h index b2d4f3973..071cbcb43 100644 --- a/lib/ldap.h +++ b/lib/curl_ldap.h @@ -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, , et al. + * Copyright (C) 1998 - 2007, Daniel Stenberg, , 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 */ diff --git a/lib/ldap.c b/lib/ldap.c index 61813bb2b..1f29ac042 100644 --- a/lib/ldap.c +++ b/lib/ldap.c @@ -35,18 +35,25 @@ #endif #include -#if defined(WIN32) +#ifdef CURL_LDAP_HYBRID /* If W$ definitions are needed. */ +# include + /* Remember we are NOT in a W$ compiler! */ +# undef WIN32 +# undef _WIN32 +# undef __WIN32__ +#endif + +#ifdef CURL_LDAP_WIN /* Use W$ LDAP implementation. */ # include +#else +#define LDAP_DEPRECATED /* Be sure ldap_init() is defined. */ +# include #endif #ifdef HAVE_UNISTD_H # include #endif -#ifdef HAVE_DLFCN_H -# include -#endif - #include "urldata.h" #include #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" @@ -63,160 +70,10 @@ #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 HAVE_LDAP_URL_PARSE -#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 +/* Use our own implementation. */ -#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 -} - -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; -} - -/*********************************************************************** - */ 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 */ diff --git a/lib/url.c b/lib/url.c index 901b1495c..7699e38d2 100644 --- 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" diff --git a/packages/vms/config-vms.h b/packages/vms/config-vms.h index 93dbe3602..30c5cf059 100644 --- a/packages/vms/config-vms.h +++ b/packages/vms/config-vms.h @@ -227,9 +227,6 @@ /* 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 header file. */ #undef HAVE_INTTYPES_H @@ -262,9 +259,6 @@ /* Define to 1 if you have the header file. */ #define HAVE_LIMITS_H 1 -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - /* Define to 1 if you have the header file. */ #define HAVE_SYS_IOCTL_H 1 diff --git a/src/Makefile.netware b/src/Makefile.netware index 4a12dc6f4..b359ce2d9 100644 --- a/src/Makefile.netware +++ b/src/Makefile.netware @@ -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) >> $@ diff --git a/src/config-riscos.h b/src/config-riscos.h index 90e2d9f2e..34f475857 100644 --- a/src/config-riscos.h +++ b/src/config-riscos.h @@ -77,12 +77,6 @@ /* Define if you have the header file. */ #undef HAVE_DES_H -/* Define if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define if you have the `dlopen' function. */ -#undef HAVE_DLOPEN - /* Define if you have the header file. */ #undef HAVE_ERR_H @@ -152,9 +146,6 @@ /* 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