2 * WLDAP32 - LDAP support for Wine
4 * Copyright 2005 Hans Leidekker
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/port.h"
24 #include "wine/debug.h"
36 #include "winldap_private.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
41 /***********************************************************************
42 * ldap_searchA (WLDAP32.@)
46 ULONG CDECL ldap_searchA( WLDAP32_LDAP *ld, PCHAR base, ULONG scope, PCHAR filter,
47 PCHAR attrs[], ULONG attrsonly )
49 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
51 WCHAR *baseW = NULL, *filterW = NULL, **attrsW = NULL;
53 ret = WLDAP32_LDAP_NO_MEMORY;
55 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x)\n", ld, debugstr_a(base),
56 scope, debugstr_a(filter), attrs, attrsonly );
61 baseW = strAtoW( base );
62 if (!baseW) goto exit;
65 filterW = strAtoW( filter );
66 if (!filterW) goto exit;
69 attrsW = strarrayAtoW( attrs );
70 if (!attrsW) goto exit;
73 ret = ldap_searchW( ld, baseW, scope, filterW, attrsW, attrsonly );
78 strarrayfreeW( attrsW );
84 /***********************************************************************
85 * ldap_searchW (WLDAP32.@)
87 * Search a directory tree (asynchronous operation).
90 * ld [I] Pointer to an LDAP context.
91 * base [I] Starting point for the search.
92 * scope [I] Search scope. One of LDAP_SCOPE_BASE,
93 * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE.
94 * filter [I] Search filter.
95 * attrs [I] Attributes to return.
96 * attrsonly [I] Return no values, only attributes.
99 * Success: Message ID of the search operation.
103 * Call ldap_result with the message ID to get the result of
104 * the operation. Cancel the operation by calling ldap_abandon
105 * with the message ID.
107 ULONG CDECL ldap_searchW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter,
108 PWCHAR attrs[], ULONG attrsonly )
110 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
112 char *baseU = NULL, *filterU = NULL, **attrsU = NULL;
115 ret = WLDAP32_LDAP_NO_MEMORY;
117 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x)\n", ld, debugstr_w(base),
118 scope, debugstr_w(filter), attrs, attrsonly );
120 if (!ld) return ~0UL;
123 baseU = strWtoU( base );
124 if (!baseU) goto exit;
127 filterU = strWtoU( filter );
128 if (!filterU) goto exit;
131 attrsU = strarrayWtoU( attrs );
132 if (!attrsU) goto exit;
135 ret = ldap_search_ext( ld, baseU, scope, filterU, attrsU, attrsonly,
136 NULL, NULL, NULL, 0, &msg );
138 if (ret == LDAP_SUCCESS)
146 strarrayfreeU( attrsU );
152 /***********************************************************************
153 * ldap_search_extA (WLDAP32.@)
155 * See ldap_search_extW.
157 ULONG CDECL ldap_search_extA( WLDAP32_LDAP *ld, PCHAR base, ULONG scope,
158 PCHAR filter, PCHAR attrs[], ULONG attrsonly, PLDAPControlA *serverctrls,
159 PLDAPControlA *clientctrls, ULONG timelimit, ULONG sizelimit, ULONG *message )
161 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
163 WCHAR *baseW = NULL, *filterW = NULL, **attrsW = NULL;
164 LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
166 ret = WLDAP32_LDAP_NO_MEMORY;
168 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p, 0x%08x, 0x%08x, %p)\n",
169 ld, debugstr_a(base), scope, debugstr_a(filter), attrs, attrsonly,
170 serverctrls, clientctrls, timelimit, sizelimit, message );
172 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
175 baseW = strAtoW( base );
176 if (!baseW) goto exit;
180 filterW = strAtoW( filter );
181 if (!filterW) goto exit;
184 attrsW = strarrayAtoW( attrs );
185 if (!attrsW) goto exit;
188 serverctrlsW = controlarrayAtoW( serverctrls );
189 if (!serverctrlsW) goto exit;
192 clientctrlsW = controlarrayAtoW( clientctrls );
193 if (!clientctrlsW) goto exit;
196 ret = ldap_search_extW( ld, baseW, scope, filterW, attrsW, attrsonly,
197 serverctrlsW, clientctrlsW, timelimit, sizelimit, message );
202 strarrayfreeW( attrsW );
203 controlarrayfreeW( serverctrlsW );
204 controlarrayfreeW( clientctrlsW );
210 /***********************************************************************
211 * ldap_search_extW (WLDAP32.@)
213 * Search a directory tree (asynchronous operation).
216 * ld [I] Pointer to an LDAP context.
217 * base [I] Starting point for the search.
218 * scope [I] Search scope. One of LDAP_SCOPE_BASE,
219 * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE.
220 * filter [I] Search filter.
221 * attrs [I] Attributes to return.
222 * attrsonly [I] Return no values, only attributes.
223 * serverctrls [I] Array of LDAP server controls.
224 * clientctrls [I] Array of LDAP client controls.
225 * timelimit [I] Timeout in seconds.
226 * sizelimit [I] Maximum number of entries to return. Zero means unlimited.
227 * message [O] Message ID of the search operation.
230 * Success: LDAP_SUCCESS
231 * Failure: An LDAP error code.
234 * Call ldap_result with the message ID to get the result of
235 * the operation. Cancel the operation by calling ldap_abandon
236 * with the message ID.
238 ULONG CDECL ldap_search_extW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope,
239 PWCHAR filter, PWCHAR attrs[], ULONG attrsonly, PLDAPControlW *serverctrls,
240 PLDAPControlW *clientctrls, ULONG timelimit, ULONG sizelimit, ULONG *message )
242 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
244 char *baseU = NULL, *filterU = NULL, **attrsU = NULL;
245 LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
248 ret = WLDAP32_LDAP_NO_MEMORY;
250 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p, 0x%08x, 0x%08x, %p)\n",
251 ld, debugstr_w(base), scope, debugstr_w(filter), attrs, attrsonly,
252 serverctrls, clientctrls, timelimit, sizelimit, message );
254 if (!ld) return ~0UL;
257 baseU = strWtoU( base );
258 if (!baseU) goto exit;
261 filterU = strWtoU( filter );
262 if (!filterU) goto exit;
265 attrsU = strarrayWtoU( attrs );
266 if (!attrsU) goto exit;
269 serverctrlsU = controlarrayWtoU( serverctrls );
270 if (!serverctrlsU) goto exit;
273 clientctrlsU = controlarrayWtoU( clientctrls );
274 if (!clientctrlsU) goto exit;
277 tv.tv_sec = timelimit;
280 ret = ldap_search_ext( ld, baseU, scope, filterU, attrsU, attrsonly,
281 serverctrlsU, clientctrlsU, &tv, sizelimit, (int *)message );
286 strarrayfreeU( attrsU );
287 controlarrayfreeU( serverctrlsU );
288 controlarrayfreeU( clientctrlsU );
294 /***********************************************************************
295 * ldap_search_ext_sA (WLDAP32.@)
297 * See ldap_search_ext_sW.
299 ULONG CDECL ldap_search_ext_sA( WLDAP32_LDAP *ld, PCHAR base, ULONG scope,
300 PCHAR filter, PCHAR attrs[], ULONG attrsonly, PLDAPControlA *serverctrls,
301 PLDAPControlA *clientctrls, struct l_timeval* timeout, ULONG sizelimit, WLDAP32_LDAPMessage **res )
303 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
305 WCHAR *baseW = NULL, *filterW = NULL, **attrsW = NULL;
306 LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
308 ret = WLDAP32_LDAP_NO_MEMORY;
310 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p, %p, 0x%08x, %p)\n",
311 ld, debugstr_a(base), scope, debugstr_a(filter), attrs, attrsonly,
312 serverctrls, clientctrls, timeout, sizelimit, res );
314 if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR;
317 baseW = strAtoW( base );
318 if (!baseW) goto exit;
321 filterW = strAtoW( filter );
322 if (!filterW) goto exit;
325 attrsW = strarrayAtoW( attrs );
326 if (!attrsW) goto exit;
329 serverctrlsW = controlarrayAtoW( serverctrls );
330 if (!serverctrlsW) goto exit;
333 clientctrlsW = controlarrayAtoW( clientctrls );
334 if (!clientctrlsW) goto exit;
337 ret = ldap_search_ext_sW( ld, baseW, scope, filterW, attrsW, attrsonly,
338 serverctrlsW, clientctrlsW, timeout, sizelimit, res );
343 strarrayfreeW( attrsW );
344 controlarrayfreeW( serverctrlsW );
345 controlarrayfreeW( clientctrlsW );
351 /***********************************************************************
352 * ldap_search_ext_sW (WLDAP32.@)
354 * Search a directory tree (synchronous operation).
357 * ld [I] Pointer to an LDAP context.
358 * base [I] Starting point for the search.
359 * scope [I] Search scope. One of LDAP_SCOPE_BASE,
360 * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE.
361 * filter [I] Search filter.
362 * attrs [I] Attributes to return.
363 * attrsonly [I] Return no values, only attributes.
364 * serverctrls [I] Array of LDAP server controls.
365 * clientctrls [I] Array of LDAP client controls.
366 * timeout [I] Timeout in seconds.
367 * sizelimit [I] Maximum number of entries to return. Zero means unlimited.
368 * res [O] Results of the search operation.
371 * Success: LDAP_SUCCESS
372 * Failure: An LDAP error code.
375 * Call ldap_msgfree to free the results.
377 ULONG CDECL ldap_search_ext_sW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope,
378 PWCHAR filter, PWCHAR attrs[], ULONG attrsonly, PLDAPControlW *serverctrls,
379 PLDAPControlW *clientctrls, struct l_timeval* timeout, ULONG sizelimit, WLDAP32_LDAPMessage **res )
381 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
383 char *baseU = NULL, *filterU = NULL, **attrsU = NULL;
384 LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
386 ret = WLDAP32_LDAP_NO_MEMORY;
388 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p, %p, 0x%08x, %p)\n",
389 ld, debugstr_w(base), scope, debugstr_w(filter), attrs, attrsonly,
390 serverctrls, clientctrls, timeout, sizelimit, res );
392 if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR;
395 baseU = strWtoU( base );
396 if (!baseU) goto exit;
399 filterU = strWtoU( filter );
400 if (!filterU) goto exit;
403 attrsU = strarrayWtoU( attrs );
404 if (!attrsU) goto exit;
407 serverctrlsU = controlarrayWtoU( serverctrls );
408 if (!serverctrlsU) goto exit;
411 clientctrlsU = controlarrayWtoU( clientctrls );
412 if (!clientctrlsU) goto exit;
415 ret = ldap_search_ext_s( ld, baseU, scope, filterU, attrsU, attrsonly,
416 serverctrlsU, clientctrlsU, (struct timeval *)timeout, sizelimit, res );
421 strarrayfreeU( attrsU );
422 controlarrayfreeU( serverctrlsU );
423 controlarrayfreeU( clientctrlsU );
429 /***********************************************************************
430 * ldap_search_sA (WLDAP32.@)
432 * See ldap_search_sW.
434 ULONG CDECL ldap_search_sA( WLDAP32_LDAP *ld, PCHAR base, ULONG scope, PCHAR filter,
435 PCHAR attrs[], ULONG attrsonly, WLDAP32_LDAPMessage **res )
437 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
439 WCHAR *baseW = NULL, *filterW = NULL, **attrsW = NULL;
441 ret = WLDAP32_LDAP_NO_MEMORY;
443 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p)\n", ld, debugstr_a(base),
444 scope, debugstr_a(filter), attrs, attrsonly, res );
446 if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR;
449 baseW = strAtoW( base );
450 if (!baseW) goto exit;
453 filterW = strAtoW( filter );
454 if (!filterW) goto exit;
457 attrsW = strarrayAtoW( attrs );
458 if (!attrsW) goto exit;
461 ret = ldap_search_sW( ld, baseW, scope, filterW, attrsW, attrsonly, res );
466 strarrayfreeW( attrsW );
472 /***********************************************************************
473 * ldap_search_sW (WLDAP32.@)
475 * Search a directory tree (synchronous operation).
478 * ld [I] Pointer to an LDAP context.
479 * base [I] Starting point for the search.
480 * scope [I] Search scope. One of LDAP_SCOPE_BASE,
481 * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE.
482 * filter [I] Search filter.
483 * attrs [I] Attributes to return.
484 * attrsonly [I] Return no values, only attributes.
485 * res [O] Results of the search operation.
488 * Success: LDAP_SUCCESS
489 * Failure: An LDAP error code.
492 * Call ldap_msgfree to free the results.
494 ULONG CDECL ldap_search_sW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter,
495 PWCHAR attrs[], ULONG attrsonly, WLDAP32_LDAPMessage **res )
497 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
499 char *baseU = NULL, *filterU = NULL, **attrsU = NULL;
501 ret = WLDAP32_LDAP_NO_MEMORY;
503 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p)\n", ld, debugstr_w(base),
504 scope, debugstr_w(filter), attrs, attrsonly, res );
506 if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR;
509 baseU = strWtoU( base );
510 if (!baseU) goto exit;
513 filterU = strWtoU( filter );
514 if (!filterU) goto exit;
517 attrsU = strarrayWtoU( attrs );
518 if (!attrsU) goto exit;
521 ret = ldap_search_ext_s( ld, baseU, scope, filterU, attrsU, attrsonly,
522 NULL, NULL, NULL, 0, res );
527 strarrayfreeU( attrsU );
533 /***********************************************************************
534 * ldap_search_stA (WLDAP32.@)
536 * See ldap_search_stW.
538 ULONG CDECL ldap_search_stA( WLDAP32_LDAP *ld, const PCHAR base, ULONG scope,
539 const PCHAR filter, PCHAR attrs[], ULONG attrsonly,
540 struct l_timeval *timeout, WLDAP32_LDAPMessage **res )
542 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
544 WCHAR *baseW = NULL, *filterW = NULL, **attrsW = NULL;
546 ret = WLDAP32_LDAP_NO_MEMORY;
548 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p)\n", ld,
549 debugstr_a(base), scope, debugstr_a(filter), attrs,
550 attrsonly, timeout, res );
552 if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR;
555 baseW = strAtoW( base );
556 if (!baseW) goto exit;
559 filterW = strAtoW( filter );
560 if (!filterW) goto exit;
563 attrsW = strarrayAtoW( attrs );
564 if (!attrsW) goto exit;
567 ret = ldap_search_stW( ld, baseW, scope, filterW, attrsW, attrsonly,
573 strarrayfreeW( attrsW );
579 /***********************************************************************
580 * ldap_search_stW (WLDAP32.@)
582 * Search a directory tree (synchronous operation).
585 * ld [I] Pointer to an LDAP context.
586 * base [I] Starting point for the search.
587 * scope [I] Search scope. One of LDAP_SCOPE_BASE,
588 * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE.
589 * filter [I] Search filter.
590 * attrs [I] Attributes to return.
591 * attrsonly [I] Return no values, only attributes.
592 * timeout [I] Timeout in seconds.
593 * res [O] Results of the search operation.
596 * Success: LDAP_SUCCESS
597 * Failure: An LDAP error code.
600 * Call ldap_msgfree to free the results.
602 ULONG CDECL ldap_search_stW( WLDAP32_LDAP *ld, const PWCHAR base, ULONG scope,
603 const PWCHAR filter, PWCHAR attrs[], ULONG attrsonly,
604 struct l_timeval *timeout, WLDAP32_LDAPMessage **res )
606 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
608 char *baseU = NULL, *filterU = NULL, **attrsU = NULL;
610 ret = WLDAP32_LDAP_NO_MEMORY;
612 TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p)\n", ld,
613 debugstr_w(base), scope, debugstr_w(filter), attrs,
614 attrsonly, timeout, res );
616 if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR;
619 baseU = strWtoU( base );
620 if (!baseU) goto exit;
623 filterU = strWtoU( filter );
624 if (!filterU) goto exit;
627 attrsU = strarrayWtoU( attrs );
628 if (!attrsU) goto exit;
631 ret = ldap_search_ext_s( ld, baseU, scope, filterU, attrsU, attrsonly,
632 NULL, NULL, (struct timeval *)timeout, 0, res );
637 strarrayfreeU( attrsU );