[PATCH 1/5] wldap32: Move support for init functions to the Unix library.
Hans Leidekker
hans at codeweavers.com
Fri Apr 16 02:59:14 CDT 2021
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/wldap32/init.c | 218 ++++++++-------------------------
dlls/wldap32/libldap.c | 18 +++
dlls/wldap32/libldap.h | 6 +
dlls/wldap32/winldap_private.h | 4 +
4 files changed, 78 insertions(+), 168 deletions(-)
diff --git a/dlls/wldap32/init.c b/dlls/wldap32/init.c
index 6586caa0ef5..d65554afb3c 100644
--- a/dlls/wldap32/init.c
+++ b/dlls/wldap32/init.c
@@ -18,25 +18,18 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "config.h"
-#include "wine/port.h"
-
-#include <stdio.h>
#include <stdarg.h>
-#ifdef HAVE_LDAP_H
-#include <ldap.h>
-#endif
-
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "winternl.h"
-#include "winldap_private.h"
-#include "wldap32.h"
#include "wine/debug.h"
+#include "wine/heap.h"
+#include "winldap_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
-#ifdef HAVE_LDAP
/* Should eventually be determined by the algorithm documented on MSDN. */
static const WCHAR defaulthost[] = { 'l','o','c','a','l','h','o','s','t',0 };
@@ -200,55 +193,41 @@ static char *urlify_hostnames( const char *scheme, char *hostnames, ULONG port )
strarrayfreeU( strarray );
return url;
}
-#endif
-WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
-#ifdef HAVE_LDAP
static WLDAP32_LDAP *create_context( const char *url )
{
WLDAP32_LDAP *ld;
- int version = LDAP_VERSION3;
+ int version = WLDAP32_LDAP_VERSION3;
- ld = heap_alloc_zero( sizeof( *ld ));
- if (!ld) return NULL;
- if (ldap_initialize( (LDAP **)&ld->ld, url ) != LDAP_SUCCESS)
+ if (!(ld = heap_alloc_zero( sizeof( *ld )))) return NULL;
+ if (map_error( ldap_funcs->ldap_initialize( &ld->ld, url ) ) != WLDAP32_LDAP_SUCCESS)
{
heap_free( ld );
return NULL;
}
- ldap_set_option( ld->ld, LDAP_OPT_PROTOCOL_VERSION, &version );
+ ldap_funcs->ldap_set_option( ld->ld, WLDAP32_LDAP_OPT_PROTOCOL_VERSION, &version );
return ld;
}
-#endif
/***********************************************************************
* cldap_openA (WLDAP32.@)
*
* See cldap_openW.
*/
-WLDAP32_LDAP * CDECL cldap_openA( PCHAR hostname, ULONG portnumber )
+WLDAP32_LDAP * CDECL cldap_openA( char *hostname, ULONG portnumber )
{
-#ifdef HAVE_LDAP
- WLDAP32_LDAP *ld = NULL;
+ WLDAP32_LDAP *ld;
WCHAR *hostnameW = NULL;
TRACE( "(%s, %d)\n", debugstr_a(hostname), portnumber );
- if (hostname) {
- hostnameW = strAtoW( hostname );
- if (!hostnameW) goto exit;
- }
+ if (hostname && !(hostnameW = strAtoW( hostname ))) return NULL;
ld = cldap_openW( hostnameW, portnumber );
-exit:
strfreeW( hostnameW );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -272,25 +251,15 @@ exit:
* will take precedence over the port number supplied as a parameter
* to this function.
*/
-WLDAP32_LDAP * CDECL cldap_openW( PWCHAR hostname, ULONG portnumber )
+WLDAP32_LDAP * CDECL cldap_openW( WCHAR *hostname, ULONG portnumber )
{
-#ifdef HAVE_LDAP
WLDAP32_LDAP *ld = NULL;
- char *hostnameU = NULL, *url = NULL;
+ char *hostnameU, *url = NULL;
TRACE( "(%s, %d)\n", debugstr_w(hostname), portnumber );
- if (hostname) {
- hostnameU = strWtoU( hostname );
- if (!hostnameU) goto exit;
- }
- else {
- hostnameU = strWtoU( defaulthost );
- if (!hostnameU) goto exit;
- }
-
- url = urlify_hostnames( "cldap://", hostnameU, portnumber );
- if (!url) goto exit;
+ if (!(hostnameU = strWtoU( hostname ? hostname : defaulthost ))) return NULL;
+ if (!(url = urlify_hostnames( "cldap://", hostnameU, portnumber ))) goto exit;
ld = create_context( url );
@@ -298,10 +267,6 @@ exit:
strfreeU( hostnameU );
strfreeU( url );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -337,26 +302,17 @@ ULONG CDECL ldap_connect( WLDAP32_LDAP *ld, struct l_timeval *timeout )
*/
WLDAP32_LDAP * CDECL ldap_initA( const PCHAR hostname, ULONG portnumber )
{
-#ifdef HAVE_LDAP
- WLDAP32_LDAP *ld = NULL;
+ WLDAP32_LDAP *ld;
WCHAR *hostnameW = NULL;
TRACE( "(%s, %d)\n", debugstr_a(hostname), portnumber );
- if (hostname) {
- hostnameW = strAtoW( hostname );
- if (!hostnameW) goto exit;
- }
+ if (hostname && !(hostnameW = strAtoW( hostname ))) return NULL;
ld = ldap_initW( hostnameW, portnumber );
-exit:
strfreeW( hostnameW );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -383,23 +339,13 @@ exit:
*/
WLDAP32_LDAP * CDECL ldap_initW( const PWCHAR hostname, ULONG portnumber )
{
-#ifdef HAVE_LDAP
WLDAP32_LDAP *ld = NULL;
- char *hostnameU = NULL, *url = NULL;
+ char *hostnameU, *url = NULL;
TRACE( "(%s, %d)\n", debugstr_w(hostname), portnumber );
- if (hostname) {
- hostnameU = strWtoU( hostname );
- if (!hostnameU) goto exit;
- }
- else {
- hostnameU = strWtoU( defaulthost );
- if (!hostnameU) goto exit;
- }
-
- url = urlify_hostnames( "ldap://", hostnameU, portnumber );
- if (!url) goto exit;
+ if (!(hostnameU = strWtoU( hostname ? hostname : defaulthost ))) return NULL;
+ if (!(url = urlify_hostnames( "ldap://", hostnameU, portnumber ))) goto exit;
ld = create_context( url );
@@ -407,10 +353,6 @@ exit:
strfreeU( hostnameU );
strfreeU( url );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -418,28 +360,19 @@ exit:
*
* See ldap_openW.
*/
-WLDAP32_LDAP * CDECL ldap_openA( PCHAR hostname, ULONG portnumber )
+WLDAP32_LDAP * CDECL ldap_openA( char *hostname, ULONG portnumber )
{
-#ifdef HAVE_LDAP
- WLDAP32_LDAP *ld = NULL;
+ WLDAP32_LDAP *ld;
WCHAR *hostnameW = NULL;
TRACE( "(%s, %d)\n", debugstr_a(hostname), portnumber );
- if (hostname) {
- hostnameW = strAtoW( hostname );
- if (!hostnameW) goto exit;
- }
+ if (hostname && !(hostnameW = strAtoW( hostname ))) return NULL;
ld = ldap_openW( hostnameW, portnumber );
-exit:
strfreeW( hostnameW );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -463,25 +396,15 @@ exit:
* will take precedence over the port number supplied as a parameter
* to this function.
*/
-WLDAP32_LDAP * CDECL ldap_openW( PWCHAR hostname, ULONG portnumber )
+WLDAP32_LDAP * CDECL ldap_openW( WCHAR *hostname, ULONG portnumber )
{
-#ifdef HAVE_LDAP
WLDAP32_LDAP *ld = NULL;
- char *hostnameU = NULL, *url = NULL;
+ char *hostnameU, *url = NULL;
TRACE( "(%s, %d)\n", debugstr_w(hostname), portnumber );
- if (hostname) {
- hostnameU = strWtoU( hostname );
- if (!hostnameU) goto exit;
- }
- else {
- hostnameU = strWtoU( defaulthost );
- if (!hostnameU) goto exit;
- }
-
- url = urlify_hostnames( "ldap://", hostnameU, portnumber );
- if (!url) goto exit;
+ if (!(hostnameU = strWtoU( hostname ? hostname : defaulthost ))) return NULL;
+ if (!(url = urlify_hostnames( "ldap://", hostnameU, portnumber ))) goto exit;
ld = create_context( url );
@@ -489,10 +412,6 @@ exit:
strfreeU( hostnameU );
strfreeU( url );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -500,27 +419,19 @@ exit:
*
* See ldap_sslinitW.
*/
-WLDAP32_LDAP * CDECL ldap_sslinitA( PCHAR hostname, ULONG portnumber, int secure )
+WLDAP32_LDAP * CDECL ldap_sslinitA( char *hostname, ULONG portnumber, int secure )
{
-#ifdef HAVE_LDAP
WLDAP32_LDAP *ld;
WCHAR *hostnameW = NULL;
TRACE( "(%s, %d, 0x%08x)\n", debugstr_a(hostname), portnumber, secure );
- if (hostname) {
- hostnameW = strAtoW( hostname );
- if (!hostnameW) return NULL;
- }
+ if (hostname && !(hostnameW = strAtoW( hostname ))) return NULL;
ld = ldap_sslinitW( hostnameW, portnumber, secure );
strfreeW( hostnameW );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -546,22 +457,14 @@ WLDAP32_LDAP * CDECL ldap_sslinitA( PCHAR hostname, ULONG portnumber, int secure
* to this function. The connection will not be made until the first
* LDAP function that needs it is called.
*/
-WLDAP32_LDAP * CDECL ldap_sslinitW( PWCHAR hostname, ULONG portnumber, int secure )
+WLDAP32_LDAP * CDECL ldap_sslinitW( WCHAR *hostname, ULONG portnumber, int secure )
{
-#ifdef HAVE_LDAP
WLDAP32_LDAP *ld = NULL;
- char *hostnameU = NULL, *url = NULL;
+ char *hostnameU, *url = NULL;
TRACE( "(%s, %d, 0x%08x)\n", debugstr_w(hostname), portnumber, secure );
- if (hostname) {
- hostnameU = strWtoU( hostname );
- if (!hostnameU) goto exit;
- }
- else {
- hostnameU = strWtoU( defaulthost );
- if (!hostnameU) goto exit;
- }
+ if (!(hostnameU = strWtoU( hostname ? hostname : defaulthost ))) return NULL;
if (secure)
url = urlify_hostnames( "ldaps://", hostnameU, portnumber );
@@ -575,10 +478,6 @@ exit:
strfreeU( hostnameU );
strfreeU( url );
return ld;
-
-#else
- return NULL;
-#endif
}
/***********************************************************************
@@ -586,35 +485,24 @@ exit:
*
* See ldap_start_tls_sW.
*/
-ULONG CDECL ldap_start_tls_sA( WLDAP32_LDAP *ld, PULONG retval, WLDAP32_LDAPMessage **result,
- PLDAPControlA *serverctrls, PLDAPControlA *clientctrls )
+ULONG CDECL ldap_start_tls_sA( WLDAP32_LDAP *ld, ULONG *retval, WLDAP32_LDAPMessage **result,
+ LDAPControlA **serverctrls, LDAPControlA **clientctrls )
{
- ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
-#ifdef HAVE_LDAP
+ ULONG ret = WLDAP32_LDAP_NO_MEMORY;
LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
- ret = WLDAP32_LDAP_NO_MEMORY;
-
TRACE( "(%p, %p, %p, %p, %p)\n", ld, retval, result, serverctrls, clientctrls );
if (!ld) return ~0u;
- if (serverctrls) {
- serverctrlsW = controlarrayAtoW( serverctrls );
- if (!serverctrlsW) goto exit;
- }
- if (clientctrls) {
- clientctrlsW = controlarrayAtoW( clientctrls );
- if (!clientctrlsW) goto exit;
- }
+ if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit;
+ if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) goto exit;
ret = ldap_start_tls_sW( ld, retval, result, serverctrlsW, clientctrlsW );
exit:
controlarrayfreeW( serverctrlsW );
controlarrayfreeW( clientctrlsW );
-
-#endif
return ret;
}
@@ -637,42 +525,36 @@ exit:
* NOTES
* LDAP function that needs it is called.
*/
-ULONG CDECL ldap_start_tls_sW( WLDAP32_LDAP *ld, PULONG retval, WLDAP32_LDAPMessage **result,
- PLDAPControlW *serverctrls, PLDAPControlW *clientctrls )
+ULONG CDECL ldap_start_tls_sW( WLDAP32_LDAP *ld, ULONG *retval, WLDAP32_LDAPMessage **result,
+ LDAPControlW **serverctrls, LDAPControlW **clientctrls )
{
- ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
-#ifdef HAVE_LDAP
- LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
-
- ret = WLDAP32_LDAP_NO_MEMORY;
+ ULONG ret = WLDAP32_LDAP_NO_MEMORY;
+ LDAPControlU **serverctrlsU = NULL, **clientctrlsU = NULL;
TRACE( "(%p, %p, %p, %p, %p)\n", ld, retval, result, serverctrls, clientctrls );
+ if (result)
+ {
+ FIXME( "result message not supported\n" );
+ *result = NULL;
+ }
if (!ld) return ~0u;
- if (serverctrls) {
- serverctrlsU = controlarrayWtoU( serverctrls );
- if (!serverctrlsU) goto exit;
- }
- if (clientctrls) {
- clientctrlsU = controlarrayWtoU( clientctrls );
- if (!clientctrlsU) goto exit;
- }
+ if (serverctrls && !(serverctrlsU = controlarrayWtoU( serverctrls ))) goto exit;
+ if (clientctrls && !(clientctrlsU = controlarrayWtoU( clientctrls ))) goto exit;
- ret = map_error( ldap_start_tls_s( ld->ld, serverctrlsU, clientctrlsU ));
+ ret = map_error( ldap_funcs->ldap_start_tls_s( ld->ld, serverctrlsU, clientctrlsU ) );
exit:
controlarrayfreeU( serverctrlsU );
controlarrayfreeU( clientctrlsU );
-
-#endif
return ret;
}
/***********************************************************************
* ldap_startup (WLDAP32.@)
*/
-ULONG CDECL ldap_startup( PLDAP_VERSION_INFO version, HANDLE *instance )
+ULONG CDECL ldap_startup( LDAP_VERSION_INFO *version, HANDLE *instance )
{
TRACE( "(%p, %p)\n", version, instance );
return WLDAP32_LDAP_SUCCESS;
diff --git a/dlls/wldap32/libldap.c b/dlls/wldap32/libldap.c
index de6974570f6..cf2c2b7e38c 100644
--- a/dlls/wldap32/libldap.c
+++ b/dlls/wldap32/libldap.c
@@ -414,6 +414,11 @@ void * CDECL wrap_ldap_first_reference( void *ld, void *chain )
return ldap_first_reference( ld, chain );
}
+int CDECL wrap_ldap_initialize( void **ld, const char *url )
+{
+ return ldap_initialize( (LDAP **)ld, url );
+}
+
void CDECL wrap_ldap_memfree( void *ptr )
{
return ldap_memfree( ptr );
@@ -502,6 +507,16 @@ int CDECL wrap_ldap_search_ext_s( void *ld, const char *base, int scope, const c
(LDAPMessage **)result );
}
+int CDECL wrap_ldap_set_option( void *ld, int option, const void *value )
+{
+ return ldap_set_option( ld, option, value );
+}
+
+int CDECL wrap_ldap_start_tls_s( void *ld, LDAPControlU **serverctrls, LDAPControlU **clientctrls )
+{
+ return ldap_start_tls_s( ld, (LDAPControl **)serverctrls, (LDAPControl **)clientctrls );
+}
+
int CDECL wrap_ldap_unbind_ext( void *ld, LDAPControlU **serverctrls, LDAPControlU **clientctrls )
{
return ldap_unbind_ext( ld, (LDAPControl **)serverctrls, (LDAPControl **)clientctrls );
@@ -548,6 +563,7 @@ static const struct ldap_funcs funcs =
wrap_ldap_extended_operation,
wrap_ldap_extended_operation_s,
wrap_ldap_get_dn,
+ wrap_ldap_initialize,
wrap_ldap_first_attribute,
wrap_ldap_first_entry,
wrap_ldap_first_reference,
@@ -564,6 +580,8 @@ static const struct ldap_funcs funcs =
wrap_ldap_sasl_interactive_bind_s,
wrap_ldap_search_ext,
wrap_ldap_search_ext_s,
+ wrap_ldap_set_option,
+ wrap_ldap_start_tls_s,
wrap_ldap_unbind_ext,
wrap_ldap_unbind_ext_s,
wrap_ldap_value_free_len,
diff --git a/dlls/wldap32/libldap.h b/dlls/wldap32/libldap.h
index f3fc5796fdc..9f26704d053 100644
--- a/dlls/wldap32/libldap.h
+++ b/dlls/wldap32/libldap.h
@@ -119,6 +119,7 @@ extern int CDECL wrap_ldap_extended_operation(void *, const char *, struct berva
extern int CDECL wrap_ldap_extended_operation_s(void *, const char *, struct bervalU *, LDAPControlU **,
LDAPControlU **, char **, struct bervalU **) DECLSPEC_HIDDEN;
extern char * CDECL wrap_ldap_get_dn(void *, void *) DECLSPEC_HIDDEN;
+extern int CDECL wrap_ldap_initialize(void **, const char *) DECLSPEC_HIDDEN;
extern char * CDECL wrap_ldap_first_attribute(void *, void *, void **) DECLSPEC_HIDDEN;
extern void * CDECL wrap_ldap_first_entry(void *, void *) DECLSPEC_HIDDEN;
extern void * CDECL wrap_ldap_first_reference(void *, void *) DECLSPEC_HIDDEN;
@@ -141,6 +142,8 @@ extern int CDECL wrap_ldap_search_ext(void *, const char *, int, const char *, c
LDAPControlU **, struct timevalU *, int, ULONG *) DECLSPEC_HIDDEN;
extern int CDECL wrap_ldap_search_ext_s(void *, const char *, int, const char *, char **, int, LDAPControlU **,
LDAPControlU **, struct timevalU *, int, void **) DECLSPEC_HIDDEN;
+extern int CDECL wrap_ldap_set_option(void *, int, const void *) DECLSPEC_HIDDEN;
+extern int CDECL wrap_ldap_start_tls_s(void *, LDAPControlU **, LDAPControlU **) DECLSPEC_HIDDEN;
extern int CDECL wrap_ldap_unbind_ext(void *, LDAPControlU **, LDAPControlU **) DECLSPEC_HIDDEN;
extern int CDECL wrap_ldap_unbind_ext_s(void *, LDAPControlU **, LDAPControlU **) DECLSPEC_HIDDEN;
extern void CDECL wrap_ldap_value_free_len(struct bervalU **) DECLSPEC_HIDDEN;
@@ -181,6 +184,7 @@ struct ldap_funcs
int (CDECL *ldap_extended_operation_s)(void *, const char *, struct bervalU *, LDAPControlU **,
LDAPControlU **, char **, struct bervalU **);
char * (CDECL *ldap_get_dn)(void *, void *);
+ int (CDECL *ldap_initialize)(void **, const char *);
char * (CDECL *ldap_first_attribute)(void *, void *, void **);
void * (CDECL *ldap_first_entry)(void *, void *);
void * (CDECL *ldap_first_reference)(void *, void *);
@@ -202,6 +206,8 @@ struct ldap_funcs
LDAPControlU **, struct timevalU *, int, ULONG *);
int (CDECL *ldap_search_ext_s)(void *, const char *, int, const char *, char **, int, LDAPControlU **,
LDAPControlU **, struct timevalU *, int, void **);
+ int (CDECL *ldap_set_option)(void *, int, const void *);
+ int (CDECL *ldap_start_tls_s)(void *, LDAPControlU **, LDAPControlU **);
int (CDECL *ldap_unbind_ext)(void *, LDAPControlU **, LDAPControlU **);
int (CDECL *ldap_unbind_ext_s)(void *, LDAPControlU **, LDAPControlU **);
void (CDECL *ldap_value_free_len)(struct bervalU **);
diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h
index 20fc676c7e2..7ac7e5a3f41 100644
--- a/dlls/wldap32/winldap_private.h
+++ b/dlls/wldap32/winldap_private.h
@@ -29,6 +29,10 @@
#define WLDAP32_LBER_ERROR (~0L)
+#define WLDAP32_LDAP_VERSION1 1
+#define WLDAP32_LDAP_VERSION2 2
+#define WLDAP32_LDAP_VERSION3 3
+
typedef enum {
WLDAP32_LDAP_SUCCESS = 0x00,
WLDAP32_LDAP_UNWILLING_TO_PERFORM = 0x35,
--
2.30.2
More information about the wine-devel
mailing list