[PATCH v2 1/5] wldap32: Implement ldap_search_init_pageW.
Dmitry Timoshkov
dmitry at baikal.ru
Thu Apr 16 04:01:43 CDT 2020
v2: Fix compilation without LDAP.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/wldap32/page.c | 64 ++++++++++++++++++++++++++++++++--
dlls/wldap32/winldap_private.h | 13 +++++++
2 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/dlls/wldap32/page.c b/dlls/wldap32/page.c
index 7cf7d93245..f9b3de77b3 100644
--- a/dlls/wldap32/page.c
+++ b/dlls/wldap32/page.c
@@ -277,11 +277,69 @@ PLDAPSearch CDECL ldap_search_init_pageA( WLDAP32_LDAP *ld, PCHAR dn, ULONG scop
return NULL;
}
-PLDAPSearch CDECL ldap_search_init_pageW( WLDAP32_LDAP *ld, PWCHAR dn, ULONG scope,
+PLDAPSearch CDECL ldap_search_init_pageW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope,
PWCHAR filter, PWCHAR attrs[], ULONG attrsonly, PLDAPControlW *serverctrls,
PLDAPControlW *clientctrls, ULONG timelimit, ULONG sizelimit, PLDAPSortKeyW *sortkeys )
{
- FIXME( "(%p, %s, 0x%08x, %s, %p, 0x%08x)\n", ld, debugstr_w(dn),
- scope, debugstr_w(filter), attrs, attrsonly );
+#ifdef HAVE_LDAP
+ LDAPSearch *search;
+ DWORD i, len;
+
+ TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p, 0x%08x, 0x%08x, %p)\n",
+ ld, debugstr_w(base), scope, debugstr_w(filter), attrs, attrsonly,
+ serverctrls, clientctrls, timelimit, sizelimit, sortkeys );
+
+ search = heap_alloc_zero( sizeof(*search) );
+ if (!search)
+ {
+ ld->ld_errno = WLDAP32_LDAP_NO_MEMORY;
+ return NULL;
+ }
+
+ if (base)
+ {
+ search->base = strWtoU( base );
+ if (!search->base) goto fail;
+ }
+ if (filter)
+ {
+ search->filter = strWtoU( filter );
+ if (!search->filter) goto fail;
+ }
+ if (attrs)
+ {
+ search->attrs = strarrayWtoU( attrs );
+ if (!search->attrs) goto fail;
+ }
+
+ len = serverctrls ? controlarraylenW( serverctrls ) : 0;
+ search->serverctrls = heap_alloc( sizeof(LDAPControl *) * (len + 2) );
+ if (!search->serverctrls) goto fail;
+ search->serverctrls[0] = NULL; /* reserve 0 for page control */
+ for (i = 0; i < len; i++)
+ {
+ search->serverctrls[i + 1] = controlWtoU( serverctrls[i] );
+ if (!search->serverctrls[i + 1]) goto fail;
+ }
+ search->serverctrls[len + 1] = NULL;
+
+ if (clientctrls)
+ {
+ search->clientctrls = controlarrayWtoU( clientctrls );
+ if (!search->clientctrls) goto fail;
+ }
+
+ search->scope = scope;
+ search->attrsonly = attrsonly;
+ search->timeout.tv_sec = timelimit;
+ search->timeout.tv_usec = 0;
+ search->sizelimit = sizelimit;
+ search->cookie = NULL;
+
+ return search;
+
+fail:
+ ldap_search_abandon_page( ld, search );
+#endif
return NULL;
}
diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h
index 30c12a909c..442b4a884a 100644
--- a/dlls/wldap32/winldap_private.h
+++ b/dlls/wldap32/winldap_private.h
@@ -234,7 +234,20 @@ typedef struct WLDAP32_ldapvlvinfo
VOID *ldvlv_extradata;
} WLDAP32_LDAPVLVInfo, *WLDAP32_PLDAPVLVInfo;
+#ifdef HAVE_LDAP
+typedef struct ldapsearch
+{
+ char *base, *filter, **attrs;
+ ULONG scope, attrsonly;
+ LDAPControl **serverctrls;
+ LDAPControl **clientctrls;
+ struct timeval timeout;
+ ULONG sizelimit;
+ struct berval *cookie;
+} LDAPSearch, *PLDAPSearch;
+#else
typedef struct ldapsearch LDAPSearch, *PLDAPSearch;
+#endif
typedef struct ldapsortkeyA
{
--
2.25.2
More information about the wine-devel
mailing list