mfmediaengine: Remove vertical flipping of video frames.
[wine.git] / dlls / wldap32 / libldap.c
blob592e526ecdc0fcc7f904ed0a8d4024d4bcd965e9
1 /*
2 * Unix interface for libldap
4 * Copyright 2021 Hans Leidekker for CodeWeavers
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
21 #if 0
22 #pragma makedep unix
23 #endif
25 #include "config.h"
27 #ifdef HAVE_LDAP
28 #include <assert.h>
29 #include <stdarg.h>
30 #include <sys/time.h>
31 #ifdef HAVE_LDAP_H
32 # include <ldap.h>
33 #endif
34 #ifdef HAVE_SASL_SASL_H
35 # include <sasl/sasl.h>
36 #endif
38 #include "ntstatus.h"
39 #define WIN32_NO_STATUS
40 #include "windef.h"
41 #include "winternl.h"
42 #include "winbase.h"
44 #include "wine/debug.h"
45 #include "libldap.h"
47 WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
49 C_ASSERT( sizeof(BerValueU) == sizeof(BerValue) );
50 C_ASSERT( sizeof(LDAPModU) == sizeof(LDAPMod) );
51 C_ASSERT( sizeof(LDAPControlU) == sizeof(LDAPControl) );
52 C_ASSERT( sizeof(LDAPSortKeyU) == sizeof(LDAPSortKey) );
53 C_ASSERT( sizeof(LDAPVLVInfoU) == sizeof(LDAPVLVInfo) );
54 C_ASSERT( sizeof(LDAPAPIInfoU) == sizeof(LDAPAPIInfo) );
55 C_ASSERT( sizeof(LDAPAPIFeatureInfoU) == sizeof(LDAPAPIFeatureInfo) );
57 static struct timeval *convert_timeval(const struct timevalU *tvu, struct timeval *tv)
59 if (!tvu) return NULL;
60 tv->tv_sec = tvu->tv_sec;
61 tv->tv_usec = tvu->tv_usec;
62 return tv;
65 #define WLDAP32_LBER_ERROR (~0l)
67 static LDAPMod *nullmods[] = { NULL };
69 static NTSTATUS wrap_ber_alloc_t( void *args )
71 struct ber_alloc_t_params *params = args;
72 *params->ret = ber_alloc_t( params->options );
73 return *params->ret ? LDAP_SUCCESS : WLDAP32_LBER_ERROR;
76 static NTSTATUS wrap_ber_bvecfree( void *args )
78 ber_bvecfree( args );
79 return STATUS_SUCCESS;
82 static NTSTATUS wrap_ber_bvfree( void *args )
84 ber_bvfree( args );
85 return STATUS_SUCCESS;
88 static NTSTATUS wrap_ber_first_element( void *args )
90 struct ber_first_element_params *params = args;
91 ber_len_t len;
92 ber_tag_t ret;
94 if ((ret = ber_first_element( params->ber, &len, params->last )) == LBER_ERROR)
95 return WLDAP32_LBER_ERROR;
96 if (ret > ~0u)
98 ERR( "ret too large\n" );
99 return WLDAP32_LBER_ERROR;
101 if (len > ~0u)
103 ERR( "len too large\n" );
104 return WLDAP32_LBER_ERROR;
107 *params->ret_len = len;
108 return ret;
111 static NTSTATUS wrap_ber_flatten( void *args )
113 struct ber_flatten_params *params = args;
114 return ber_flatten( params->ber, (struct berval **)params->berval );
117 static NTSTATUS wrap_ber_free( void *args )
119 struct ber_free_params *params = args;
121 ber_free( params->ber, params->freebuf );
122 return STATUS_SUCCESS;
125 static NTSTATUS wrap_ber_init( void *args )
127 struct ber_init_params *params = args;
128 *params->ret = ber_init( (struct berval *)params->berval );
129 return *params->ret ? LDAP_SUCCESS : WLDAP32_LBER_ERROR;
132 static NTSTATUS wrap_ber_next_element( void *args )
134 struct ber_next_element_params *params = args;
135 ber_len_t len;
136 ber_tag_t ret;
138 if ((ret = ber_next_element( params->ber, &len, params->last )) == LBER_ERROR)
139 return WLDAP32_LBER_ERROR;
140 if (ret > ~0u)
142 ERR( "ret too large\n" );
143 return WLDAP32_LBER_ERROR;
145 if (len > ~0u)
147 ERR( "len too large\n" );
148 return WLDAP32_LBER_ERROR;
151 *params->ret_len = len;
152 return ret;
155 static NTSTATUS wrap_ber_peek_tag( void *args )
157 struct ber_peek_tag_params *params = args;
158 ber_len_t len;
159 ber_tag_t ret;
161 if ((ret = ber_peek_tag( params->ber, &len )) == LBER_ERROR) return WLDAP32_LBER_ERROR;
162 if (len > ~0u)
164 ERR( "len too large\n" );
165 return WLDAP32_LBER_ERROR;
168 *params->ret_len = len;
169 return ret;
172 static NTSTATUS wrap_ber_skip_tag( void *args )
174 struct ber_skip_tag_params *params = args;
175 ber_len_t len;
176 ber_tag_t ret;
178 if ((ret = ber_skip_tag( params->ber, &len )) == LBER_ERROR) return WLDAP32_LBER_ERROR;
179 if (len > ~0u)
181 ERR( "len too large\n" );
182 return WLDAP32_LBER_ERROR;
185 *params->ret_len = len;
186 return ret;
189 static NTSTATUS wrap_ber_printf( void *args )
191 struct ber_printf_params *params = args;
193 assert( strlen(params->fmt) == 1 );
195 return ber_printf( params->ber, params->fmt, params->arg1, params->arg2 );
198 static NTSTATUS wrap_ber_scanf( void *args )
200 struct ber_scanf_params *params = args;
202 assert( strlen(params->fmt) == 1 );
204 return ber_scanf( params->ber, params->fmt, params->arg1, params->arg2 );
207 static NTSTATUS wrap_ldap_abandon_ext( void *args )
209 struct ldap_abandon_ext_params *params = args;
210 return ldap_abandon_ext( params->ld, params->msgid, (LDAPControl **)params->serverctrls,
211 (LDAPControl **)params->clientctrls );
214 static NTSTATUS wrap_ldap_add_ext( void *args )
216 struct ldap_add_ext_params *params = args;
217 int dummy;
218 return ldap_add_ext( params->ld, params->dn ? params->dn : "",
219 params->attrs ? (LDAPMod **)params->attrs : nullmods,
220 (LDAPControl **)params->serverctrls, (LDAPControl **)params->clientctrls,
221 params->msg ? (int *)params->msg : &dummy );
224 static NTSTATUS wrap_ldap_add_ext_s( void *args )
226 struct ldap_add_ext_s_params *params = args;
227 return ldap_add_ext_s( params->ld, params->dn ? params->dn : "",
228 params->attrs ? (LDAPMod **)params->attrs : nullmods,
229 (LDAPControl **)params->serverctrls, (LDAPControl **)params->clientctrls );
232 static NTSTATUS wrap_ldap_compare_ext( void *args )
234 struct ldap_compare_ext_params *params = args;
235 int dummy;
236 return ldap_compare_ext( params->ld, params->dn ? params->dn : "", params->attrs ? params->attrs : "",
237 (struct berval *)params->value, (LDAPControl **)params->serverctrls,
238 (LDAPControl **)params->clientctrls, params->msg ? (int *)params->msg : &dummy );
241 static NTSTATUS wrap_ldap_compare_ext_s( void *args )
243 struct ldap_compare_ext_s_params *params = args;
244 return ldap_compare_ext_s( params->ld, params->dn ? params->dn : "", params->attrs ? params->attrs : "",
245 (struct berval *)params->value, (LDAPControl **)params->serverctrls,
246 (LDAPControl **)params->clientctrls );
249 static NTSTATUS wrap_ldap_control_free( void *args )
251 ldap_control_free( args );
252 return STATUS_SUCCESS;
255 static NTSTATUS wrap_ldap_controls_free( void *args )
257 ldap_controls_free( args );
258 return STATUS_SUCCESS;
261 static NTSTATUS wrap_ldap_count_entries( void *args )
263 struct ldap_count_entries_params *params = args;
264 return ldap_count_entries( params->ld, params->chain );
267 static NTSTATUS wrap_ldap_count_references( void *args )
269 struct ldap_count_references_params *params = args;
270 return ldap_count_references( params->ld, params->chain );
273 static NTSTATUS wrap_ldap_count_values_len( void *args )
275 return ldap_count_values_len( args );
278 static NTSTATUS wrap_ldap_create_sort_control( void *args )
280 struct ldap_create_sort_control_params *params = args;
281 return ldap_create_sort_control( params->ld, (LDAPSortKey **)params->keylist, params->critical,
282 (LDAPControl **)params->control );
285 static NTSTATUS wrap_ldap_create_vlv_control( void *args )
287 struct ldap_create_vlv_control_params *params = args;
288 return ldap_create_vlv_control( params->ld, (LDAPVLVInfo *)params->info,
289 (LDAPControl **)params->control );
292 static NTSTATUS wrap_ldap_delete_ext( void *args )
294 struct ldap_delete_ext_params *params = args;
295 int dummy;
296 return ldap_delete_ext( params->ld, params->dn ? params->dn : "", (LDAPControl **)params->serverctrls,
297 (LDAPControl **)params->clientctrls, params->msg ? (int *)params->msg : &dummy );
300 static NTSTATUS wrap_ldap_delete_ext_s( void *args )
302 struct ldap_delete_ext_s_params *params = args;
303 return ldap_delete_ext_s( params->ld, params->dn ? params->dn : "", (LDAPControl **)params->serverctrls,
304 (LDAPControl **)params->clientctrls );
307 static NTSTATUS wrap_ldap_dn2ufn( void *args )
309 struct ldap_dn2ufn_params *params = args;
310 *params->ret = ldap_dn2ufn( params->dn );
311 return *params->ret ? 0 : -1;
314 static NTSTATUS wrap_ldap_explode_dn( void *args )
316 struct ldap_explode_dn_params *params = args;
317 *params->ret = ldap_explode_dn( params->dn, params->notypes );
318 return *params->ret ? 0 : -1;
321 static NTSTATUS wrap_ldap_extended_operation( void *args )
323 struct ldap_extended_operation_params *params = args;
324 int dummy;
325 return ldap_extended_operation( params->ld, params->oid ? params->oid : "",
326 (struct berval *)params->data, (LDAPControl **)params->serverctrls,
327 (LDAPControl **)params->clientctrls,
328 params->msg ? (int *)params->msg : &dummy );
331 static NTSTATUS wrap_ldap_extended_operation_s( void *args )
333 struct ldap_extended_operation_s_params *params = args;
334 return ldap_extended_operation_s( params->ld, params->oid ? params->oid : "",
335 (struct berval *)params->data, (LDAPControl **)params->serverctrls,
336 (LDAPControl **)params->clientctrls, params->retoid,
337 (struct berval **)params->retdata );
340 static NTSTATUS wrap_ldap_get_dn( void *args )
342 struct ldap_get_dn_params *params = args;
343 *params->ret = ldap_get_dn( params->ld, params->entry );
344 return *params->ret ? 0 : -1;
347 static NTSTATUS wrap_ldap_first_attribute( void *args )
349 struct ldap_first_attribute_params *params = args;
350 *params->ret = ldap_first_attribute( params->ld, params->entry, (BerElement **)params->ber );
351 return *params->ret ? 0 : -1;
354 static NTSTATUS wrap_ldap_first_entry( void *args )
356 struct ldap_first_entry_params *params = args;
357 *params->ret = ldap_first_entry( params->ld, params->chain );
358 return *params->ret ? 0 : -1;
361 static NTSTATUS wrap_ldap_first_reference( void *args )
363 struct ldap_first_reference_params *params = args;
364 *params->ret = ldap_first_reference( params->ld, params->chain );
365 return *params->ret ? 0 : -1;
368 static NTSTATUS wrap_ldap_get_option( void *args )
370 struct ldap_get_option_params *params = args;
371 return ldap_get_option( params->ld, params->option, params->value );
374 static NTSTATUS wrap_ldap_get_values_len( void *args )
376 struct ldap_get_values_len_params *params = args;
377 *params->ret = (struct bervalU **)ldap_get_values_len( params->ld, params->entry, params->attr );
378 return *params->ret ? 0 : -1;
381 static NTSTATUS wrap_ldap_initialize( void *args )
383 struct ldap_initialize_params *params = args;
384 return ldap_initialize( (LDAP **)params->ld, params->url );
387 static NTSTATUS wrap_ldap_memfree( void *args )
389 ldap_memfree( args );
390 return STATUS_SUCCESS;
393 static NTSTATUS wrap_ldap_memvfree( void *args )
395 ldap_memvfree( args );
396 return STATUS_SUCCESS;
399 static NTSTATUS wrap_ldap_modify_ext( void *args )
401 struct ldap_modify_ext_params *params = args;
402 int dummy;
403 return ldap_modify_ext( params->ld, params->dn ? params->dn : "",
404 params->mods ? (LDAPMod **)params->mods : nullmods,
405 (LDAPControl **)params->serverctrls, (LDAPControl **)params->clientctrls,
406 params->msg ? (int *)params->msg : &dummy );
409 static NTSTATUS wrap_ldap_modify_ext_s( void *args )
411 struct ldap_modify_ext_s_params *params = args;
412 return ldap_modify_ext_s( params->ld, params->dn ? params->dn : "",
413 params->mods ? (LDAPMod **)params->mods : nullmods,
414 (LDAPControl **)params->serverctrls, (LDAPControl **)params->clientctrls );
417 static NTSTATUS wrap_ldap_msgfree( void *args )
419 return ldap_msgfree( args );
422 static NTSTATUS wrap_ldap_next_attribute( void *args )
424 struct ldap_next_attribute_params *params = args;
425 *params->ret = ldap_next_attribute( params->ld, params->entry, params->ber );
426 return *params->ret ? 0 : -1;
429 static NTSTATUS wrap_ldap_next_entry( void *args )
431 struct ldap_next_entry_params *params = args;
432 *params->ret = ldap_next_entry( params->ld, params->entry );
433 return *params->ret ? 0 : -1;
436 static NTSTATUS wrap_ldap_next_reference( void *args )
438 struct ldap_next_reference_params *params = args;
439 *params->ret = ldap_next_reference( params->ld, params->entry );
440 return *params->ret ? 0 : -1;
443 static NTSTATUS wrap_ldap_parse_extended_result( void *args )
445 struct ldap_parse_extended_result_params *params = args;
446 return ldap_parse_extended_result( params->ld, params->result, params->retoid,
447 (struct berval **)params->retdata, params->free );
450 static NTSTATUS wrap_ldap_parse_reference( void *args )
452 struct ldap_parse_reference_params *params = args;
453 return ldap_parse_reference( params->ld, params->ref, params->referrals,
454 (LDAPControl ***)params->serverctrls, params->free );
457 static NTSTATUS wrap_ldap_parse_result( void *args )
459 struct ldap_parse_result_params *params = args;
460 return ldap_parse_result( params->ld, params->res, params->errcode, params->matcheddn, params->errmsg,
461 params->referrals, (LDAPControl ***)params->serverctrls, params->free );
464 static NTSTATUS wrap_ldap_parse_sortresponse_control( void *args )
466 struct ldap_parse_sortresponse_control_params *params = args;
467 return ldap_parse_sortresponse_control( params->ld, (LDAPControl *)params->ctrl,
468 params->result, params->attr );
471 static NTSTATUS wrap_ldap_parse_vlvresponse_control( void *args )
473 struct ldap_parse_vlvresponse_control_params *params = args;
474 return ldap_parse_vlvresponse_control( params->ld, (LDAPControl *)params->ctrls, params->target_pos,
475 params->list_count, (struct berval **)params->ctx,
476 params->errcode );
479 static NTSTATUS wrap_ldap_rename( void *args )
481 struct ldap_rename_params *params = args;
482 return ldap_rename( params->ld, params->dn ? params->dn : "", params->newrdn, params->newparent,
483 params->delete, (LDAPControl **)params->clientctrls,
484 (LDAPControl **)params->serverctrls, (int *)params->msg );
487 static NTSTATUS wrap_ldap_rename_s( void *args )
489 struct ldap_rename_s_params *params = args;
490 return ldap_rename_s( params->ld, params->dn ? params->dn : "", params->newrdn, params->newparent,
491 params->delete, (LDAPControl **)params->clientctrls,
492 (LDAPControl **)params->serverctrls );
495 static NTSTATUS wrap_ldap_result( void *args )
497 struct ldap_result_params *params = args;
498 struct timeval tv;
499 return ldap_result( params->ld, params->msgid, params->all,
500 convert_timeval(params->timeout, &tv), (LDAPMessage **)params->result );
503 static NTSTATUS wrap_ldap_sasl_bind( void *args )
505 struct ldap_sasl_bind_params *params = args;
506 return ldap_sasl_bind( params->ld, params->dn, params->mech, (struct berval *)params->cred,
507 (LDAPControl **)params->serverctrls, (LDAPControl **)params->clientctrls,
508 params->msgid );
511 static NTSTATUS wrap_ldap_sasl_bind_s( void *args )
513 struct ldap_sasl_bind_s_params *params = args;
514 return ldap_sasl_bind_s( params->ld, params->dn, params->mech, (struct berval *)params->cred,
515 (LDAPControl **)params->serverctrls, (LDAPControl **)params->clientctrls,
516 (struct berval **)params->servercred );
519 static int wrap_sasl_interact( LDAP *ld, unsigned int flags, void *defaults, void *interact )
521 #ifdef HAVE_SASL_SASL_H
522 struct sasl_interactive_bind_id *id = defaults;
523 struct sasl_interact *sasl = interact;
525 TRACE( "(%p, 0x%08x, %p, %p)\n", ld, flags, defaults, interact );
527 while (sasl->id != SASL_CB_LIST_END)
529 TRACE( "sasl->id = %04lx\n", sasl->id );
531 if (sasl->id == SASL_CB_GETREALM)
533 sasl->result = id->domain;
534 sasl->len = id->domain_len;
536 else if (sasl->id == SASL_CB_USER)
538 sasl->result = id->user;
539 sasl->len = id->user_len;
541 else if (sasl->id == SASL_CB_PASS)
543 sasl->result = id->password;
544 sasl->len = id->password_len;
546 sasl++;
549 return LDAP_SUCCESS;
550 #endif
551 return -1;
554 static NTSTATUS wrap_ldap_sasl_interactive_bind_s( void *args )
556 struct ldap_sasl_interactive_bind_s_params *params = args;
557 return ldap_sasl_interactive_bind_s( params->ld, params->dn, params->mech,
558 (LDAPControl **)params->serverctrls,
559 (LDAPControl **)params->clientctrls, params->flags,
560 wrap_sasl_interact, params->defaults );
563 static NTSTATUS wrap_ldap_search_ext( void *args )
565 struct ldap_search_ext_params *params = args;
566 struct timeval tv;
567 return ldap_search_ext( params->ld, params->base, params->scope, params->filter, params->attrs,
568 params->attrsonly, (LDAPControl **)params->serverctrls,
569 (LDAPControl **)params->clientctrls, convert_timeval(params->timeout, &tv),
570 params->sizelimit, (int *)params->msg );
573 static NTSTATUS wrap_ldap_search_ext_s( void *args )
575 struct ldap_search_ext_s_params *params = args;
576 struct timeval tv;
577 return ldap_search_ext_s( params->ld, params->base, params->scope, params->filter, params->attrs,
578 params->attrsonly, (LDAPControl **)params->serverctrls,
579 (LDAPControl **)params->clientctrls, convert_timeval(params->timeout, &tv),
580 params->sizelimit, (LDAPMessage **)params->result );
583 static NTSTATUS wrap_ldap_set_option( void *args )
585 struct ldap_set_option_params *params = args;
586 return ldap_set_option( params->ld, params->option, params->value );
589 static NTSTATUS wrap_ldap_start_tls_s( void *args )
591 struct ldap_start_tls_s_params *params = args;
592 return ldap_start_tls_s( params->ld, (LDAPControl **)params->serverctrls,
593 (LDAPControl **)params->clientctrls );
596 static NTSTATUS wrap_ldap_unbind_ext( void *args )
598 struct ldap_unbind_ext_params *params = args;
599 return ldap_unbind_ext( params->ld, (LDAPControl **)params->serverctrls,
600 (LDAPControl **)params->clientctrls );
603 static NTSTATUS wrap_ldap_unbind_ext_s( void *args )
605 struct ldap_unbind_ext_s_params *params = args;
606 return ldap_unbind_ext_s( params->ld, (LDAPControl **)params->serverctrls,
607 (LDAPControl **)params->clientctrls );
610 static NTSTATUS wrap_ldap_value_free_len( void *args )
612 ldap_value_free_len( args );
613 return STATUS_SUCCESS;
616 unixlib_entry_t __wine_unix_call_funcs[] =
618 wrap_ber_alloc_t,
619 wrap_ber_bvecfree,
620 wrap_ber_bvfree,
621 wrap_ber_first_element,
622 wrap_ber_flatten,
623 wrap_ber_free,
624 wrap_ber_init,
625 wrap_ber_next_element,
626 wrap_ber_peek_tag,
627 wrap_ber_printf,
628 wrap_ber_scanf,
629 wrap_ber_skip_tag,
630 wrap_ldap_abandon_ext,
631 wrap_ldap_add_ext,
632 wrap_ldap_add_ext_s,
633 wrap_ldap_compare_ext,
634 wrap_ldap_compare_ext_s,
635 wrap_ldap_control_free,
636 wrap_ldap_controls_free,
637 wrap_ldap_count_entries,
638 wrap_ldap_count_references,
639 wrap_ldap_count_values_len,
640 wrap_ldap_create_sort_control,
641 wrap_ldap_create_vlv_control,
642 wrap_ldap_delete_ext,
643 wrap_ldap_delete_ext_s,
644 wrap_ldap_dn2ufn,
645 wrap_ldap_explode_dn,
646 wrap_ldap_extended_operation,
647 wrap_ldap_extended_operation_s,
648 wrap_ldap_first_attribute,
649 wrap_ldap_first_entry,
650 wrap_ldap_first_reference,
651 wrap_ldap_get_dn,
652 wrap_ldap_get_option,
653 wrap_ldap_get_values_len,
654 wrap_ldap_initialize,
655 wrap_ldap_memfree,
656 wrap_ldap_memvfree,
657 wrap_ldap_modify_ext,
658 wrap_ldap_modify_ext_s,
659 wrap_ldap_msgfree,
660 wrap_ldap_next_attribute,
661 wrap_ldap_next_entry,
662 wrap_ldap_next_reference,
663 wrap_ldap_parse_extended_result,
664 wrap_ldap_parse_reference,
665 wrap_ldap_parse_result,
666 wrap_ldap_parse_sortresponse_control,
667 wrap_ldap_parse_vlvresponse_control,
668 wrap_ldap_rename,
669 wrap_ldap_rename_s,
670 wrap_ldap_result,
671 wrap_ldap_sasl_bind,
672 wrap_ldap_sasl_bind_s,
673 wrap_ldap_sasl_interactive_bind_s,
674 wrap_ldap_search_ext,
675 wrap_ldap_search_ext_s,
676 wrap_ldap_set_option,
677 wrap_ldap_start_tls_s,
678 wrap_ldap_unbind_ext,
679 wrap_ldap_unbind_ext_s,
680 wrap_ldap_value_free_len,
683 #endif /* HAVE_LDAP */