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
27 #define LDAP_NEEDS_PROTOTYPES
31 #define WLDAP32_LBER_ERROR (~0l)
34 WLDAP32_LDAP_SUCCESS
= 0x00,
35 WLDAP32_LDAP_OPERATIONS_ERROR
= 0x01,
36 WLDAP32_LDAP_PROTOCOL_ERROR
= 0x02,
37 WLDAP32_LDAP_TIMELIMIT_EXCEEDED
= 0x03,
38 WLDAP32_LDAP_SIZELIMIT_EXCEEDED
= 0x04,
39 WLDAP32_LDAP_COMPARE_FALSE
= 0x05,
40 WLDAP32_LDAP_COMPARE_TRUE
= 0x06,
41 WLDAP32_LDAP_AUTH_METHOD_NOT_SUPPORTED
= 0x07,
42 WLDAP32_LDAP_STRONG_AUTH_REQUIRED
= 0x08,
43 WLDAP32_LDAP_REFERRAL_V2
= 0x09,
44 WLDAP32_LDAP_PARTIAL_RESULTS
= 0x09,
45 WLDAP32_LDAP_REFERRAL
= 0x0a,
46 WLDAP32_LDAP_ADMIN_LIMIT_EXCEEDED
= 0x0b,
47 WLDAP32_LDAP_UNAVAILABLE_CRIT_EXTENSION
= 0x0c,
48 WLDAP32_LDAP_CONFIDENTIALITY_REQUIRED
= 0x0d,
49 WLDAP32_LDAP_SASL_BIND_IN_PROGRESS
= 0x0e,
51 WLDAP32_LDAP_NO_SUCH_ATTRIBUTE
= 0x10,
52 WLDAP32_LDAP_UNDEFINED_TYPE
= 0x11,
53 WLDAP32_LDAP_INAPPROPRIATE_MATCHING
= 0x12,
54 WLDAP32_LDAP_CONSTRAINT_VIOLATION
= 0x13,
55 WLDAP32_LDAP_ATTRIBUTE_OR_VALUE_EXISTS
= 0x14,
56 WLDAP32_LDAP_INVALID_SYNTAX
= 0x15,
58 WLDAP32_LDAP_NO_SUCH_OBJECT
= 0x20,
59 WLDAP32_LDAP_ALIAS_PROBLEM
= 0x21,
60 WLDAP32_LDAP_INVALID_DN_SYNTAX
= 0x22,
61 WLDAP32_LDAP_IS_LEAF
= 0x23,
62 WLDAP32_LDAP_ALIAS_DEREF_PROBLEM
= 0x24,
64 WLDAP32_LDAP_INAPPROPRIATE_AUTH
= 0x30,
65 WLDAP32_LDAP_INVALID_CREDENTIALS
= 0x31,
66 WLDAP32_LDAP_INSUFFICIENT_RIGHTS
= 0x32,
67 WLDAP32_LDAP_BUSY
= 0x33,
68 WLDAP32_LDAP_UNAVAILABLE
= 0x34,
69 WLDAP32_LDAP_UNWILLING_TO_PERFORM
= 0x35,
70 WLDAP32_LDAP_LOOP_DETECT
= 0x36,
71 WLDAP32_LDAP_SORT_CONTROL_MISSING
= 0x3C,
72 WLDAP32_LDAP_OFFSET_RANGE_ERROR
= 0x3D,
74 WLDAP32_LDAP_NAMING_VIOLATION
= 0x40,
75 WLDAP32_LDAP_OBJECT_CLASS_VIOLATION
= 0x41,
76 WLDAP32_LDAP_NOT_ALLOWED_ON_NONLEAF
= 0x42,
77 WLDAP32_LDAP_NOT_ALLOWED_ON_RDN
= 0x43,
78 WLDAP32_LDAP_ALREADY_EXISTS
= 0x44,
79 WLDAP32_LDAP_NO_OBJECT_CLASS_MODS
= 0x45,
80 WLDAP32_LDAP_RESULTS_TOO_LARGE
= 0x46,
81 WLDAP32_LDAP_AFFECTS_MULTIPLE_DSAS
= 0x47,
83 WLDAP32_LDAP_VIRTUAL_LIST_VIEW_ERROR
= 0x4c,
85 WLDAP32_LDAP_OTHER
= 0x50,
86 WLDAP32_LDAP_SERVER_DOWN
= 0x51,
87 WLDAP32_LDAP_LOCAL_ERROR
= 0x52,
88 WLDAP32_LDAP_ENCODING_ERROR
= 0x53,
89 WLDAP32_LDAP_DECODING_ERROR
= 0x54,
90 WLDAP32_LDAP_TIMEOUT
= 0x55,
91 WLDAP32_LDAP_AUTH_UNKNOWN
= 0x56,
92 WLDAP32_LDAP_FILTER_ERROR
= 0x57,
93 WLDAP32_LDAP_USER_CANCELLED
= 0x58,
94 WLDAP32_LDAP_PARAM_ERROR
= 0x59,
95 WLDAP32_LDAP_NO_MEMORY
= 0x5a,
96 WLDAP32_LDAP_CONNECT_ERROR
= 0x5b,
97 WLDAP32_LDAP_NOT_SUPPORTED
= 0x5c,
98 WLDAP32_LDAP_CONTROL_NOT_FOUND
= 0x5d,
99 WLDAP32_LDAP_NO_RESULTS_RETURNED
= 0x5e,
100 WLDAP32_LDAP_MORE_RESULTS_TO_RETURN
= 0x5f,
102 WLDAP32_LDAP_CLIENT_LOOP
= 0x60,
103 WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED
= 0x61
104 } WLDAP32_LDAP_RETCODE
;
106 #define WLDAP32_LDAP_SCOPE_BASE 0x00
107 #define WLDAP32_LDAP_SCOPE_ONELEVEL 0x01
108 #define WLDAP32_LDAP_SCOPE_SUBTREE 0x02
110 #define WLDAP32_LBER_USE_DER 0x01
112 #define WLDAP32_LDAP_OPT_API_INFO 0x00
113 #define WLDAP32_LDAP_OPT_DESC 0x01
114 #define WLDAP32_LDAP_OPT_DEREF 0x02
115 #define WLDAP32_LDAP_OPT_SIZELIMIT 0x03
116 #define WLDAP32_LDAP_OPT_TIMELIMIT 0x04
117 #define WLDAP32_LDAP_OPT_THREAD_FN_PTRS 0x05
118 #define WLDAP32_LDAP_OPT_REBIND_FN 0x06
119 #define WLDAP32_LDAP_OPT_REBIND_ARG 0x07
120 #define WLDAP32_LDAP_OPT_REFERRALS 0x08
121 #define WLDAP32_LDAP_OPT_RESTART 0x09
122 #define WLDAP32_LDAP_OPT_SSL 0x0a
123 #define WLDAP32_LDAP_OPT_IO_FN_PTRS 0x0b
124 #define WLDAP32_LDAP_OPT_CACHE_FN_PTRS 0x0d
125 #define WLDAP32_LDAP_OPT_CACHE_STRATEGY 0x0e
126 #define WLDAP32_LDAP_OPT_CACHE_ENABLE 0x0f
127 #define WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT 0x10
128 #define WLDAP32_LDAP_OPT_PROTOCOL_VERSION 0x11
129 #define WLDAP32_LDAP_OPT_VERSION 0x11
130 #define WLDAP32_LDAP_OPT_SERVER_CONTROLS 0x12
131 #define WLDAP32_LDAP_OPT_API_FEATURE_INFO 0x15
132 #define WLDAP32_LDAP_OPT_HOST_NAME 0x30
133 #define WLDAP32_LDAP_OPT_ERROR_NUMBER 0x31
134 #define WLDAP32_LDAP_OPT_ERROR_STRING 0x32
135 #define WLDAP32_LDAP_OPT_SERVER_ERROR 0x33
136 #define WLDAP32_LDAP_OPT_SERVER_EXT_ERROR 0x34
137 #define WLDAP32_LDAP_OPT_PING_KEEP_ALIVE 0x36
138 #define WLDAP32_LDAP_OPT_PING_WAIT_TIME 0x37
139 #define WLDAP32_LDAP_OPT_PING_LIMIT 0x38
140 #define WLDAP32_LDAP_OPT_DNSDOMAIN_NAME 0x3b
141 #define WLDAP32_LDAP_OPT_GETDSNAME_FLAGS 0x3d
142 #define WLDAP32_LDAP_OPT_HOST_REACHABLE 0x3e
143 #define WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS 0x3f
144 #define WLDAP32_LDAP_OPT_TCP_KEEPALIVE 0x40
145 #define WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND 0x41
146 #define WLDAP32_LDAP_OPT_SEND_TIMEOUT 0x42
147 #define WLDAP32_LDAP_OPT_REFERRAL_CALLBACK 0x70
148 #define WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE 0x80
149 #define WLDAP32_LDAP_OPT_SERVER_CERTIFICATE 0x81
150 #define WLDAP32_LDAP_OPT_AUTO_RECONNECT 0x91
151 #define WLDAP32_LDAP_OPT_SSPI_FLAGS 0x92
152 #define WLDAP32_LDAP_OPT_SSL_INFO 0x93
153 #define WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG 0x94
154 #define WLDAP32_LDAP_OPT_TLS LDAP_OPT_SSL
155 #define WLDAP32_LDAP_OPT_TLS_INFO LDAP_OPT_SSL_INFO
156 #define WLDAP32_LDAP_OPT_SIGN 0x95
157 #define WLDAP32_LDAP_OPT_ENCRYPT 0x96
158 #define WLDAP32_LDAP_OPT_SASL_METHOD 0x97
159 #define WLDAP32_LDAP_OPT_AREC_EXCLUSIVE 0x98
160 #define WLDAP32_LDAP_OPT_SECURITY_CONTEXT 0x99
161 #define WLDAP32_LDAP_OPT_ROOTDSE_CACHE 0x9a
163 #define WLDAP32_LDAP_OPT_ON ((void *)1)
164 #define WLDAP32_LDAP_OPT_OFF ((void *)0)
166 #define WLDAP32_LDAP_VERSION1 1
167 #define WLDAP32_LDAP_VERSION2 2
168 #define WLDAP32_LDAP_VERSION3 3
169 #define WLDAP32_LDAP_VERSION WLDAP32_LDAP_VERSION2
171 #define LDAP_CHASE_SUBORDINATE_REFERRALS 0x20
172 #define LDAP_CHASE_EXTERNAL_REFERRALS 0x40
174 #define WLDAP32_LDAP_AUTH_SIMPLE 0x80
175 #define WLDAP32_LDAP_AUTH_SASL 0x83
176 #define WLDAP32_LDAP_AUTH_OTHERKIND 0x86
178 #define WLDAP32_LDAP_AUTH_EXTERNAL (WLDAP32_LDAP_AUTH_OTHERKIND | 0x0020)
179 #define WLDAP32_LDAP_AUTH_SICILY (WLDAP32_LDAP_AUTH_OTHERKIND | 0x0200)
180 #define WLDAP32_LDAP_AUTH_NEGOTIATE (WLDAP32_LDAP_AUTH_OTHERKIND | 0x0400)
181 #define WLDAP32_LDAP_AUTH_MSN (WLDAP32_LDAP_AUTH_OTHERKIND | 0x0800)
182 #define WLDAP32_LDAP_AUTH_NTLM (WLDAP32_LDAP_AUTH_OTHERKIND | 0x1000)
183 #define WLDAP32_LDAP_AUTH_DPA (WLDAP32_LDAP_AUTH_OTHERKIND | 0x2000)
184 #define WLDAP32_LDAP_AUTH_DIGEST (WLDAP32_LDAP_AUTH_OTHERKIND | 0x4000)
186 typedef struct WLDAP32_berval
190 } LDAP_BERVAL
, *PLDAP_BERVAL
, BERVAL
, *PBERVAL
;
192 typedef struct WLDAP32_berelement
195 } WLDAP32_BerElement
;
210 UCHAR ld_lberoptions
;
220 ULONG ld_cldaptimeout
;
221 ULONG ld_refhoplimit
;
225 typedef BOOLEAN (CDECL VERIFYSERVERCERT
)(LDAP
*, const CERT_CONTEXT
**);
230 struct berval
**server_ctrls
;
231 VERIFYSERVERCERT
*cert_callback
;
234 C_ASSERT(sizeof(struct private_data
) < FIELD_OFFSET(struct ld_sb
, sb_naddr
) - FIELD_OFFSET(struct ld_sb
, Reserved1
));
236 #define CTX(ld) (((struct private_data *)ld->ld_sb.Reserved1)->ctx)
237 #define SERVER_CTRLS(ld) (((struct private_data *)ld->ld_sb.Reserved1)->server_ctrls)
238 #define CERT_CALLBACK(ld) (((struct private_data *)ld->ld_sb.Reserved1)->cert_callback)
239 #define CONNECTED(ld) (((struct private_data *)ld->ld_sb.Reserved1)->connected)
241 #define MSG(entry) (entry->Request)
242 #define BER(ber) ((BerElement *)((ber)->opaque))
244 typedef struct l_timeval
248 } LDAP_TIMEVAL
, *PLDAP_TIMEVAL
;
250 #define LDAP_PAGED_RESULT_OID_STRING "1.2.840.113556.1.4.319"
251 #define LDAP_SERVER_RESP_SORT_OID "1.2.840.113556.1.4.474"
252 #define LDAP_CONTROL_VLVRESPONSE "2.16.840.1.113730.3.4.10"
254 #define LDAP_PAGED_RESULT_OID_STRING_W L"1.2.840.113556.1.4.319"
255 #define LDAP_SERVER_RESP_SORT_OID_W L"1.2.840.113556.1.4.474"
256 #define LDAP_CONTROL_VLVRESPONSE_W L"2.16.840.1.113730.3.4.10"
258 typedef struct ldapcontrolA
261 struct WLDAP32_berval ldctl_value
;
262 BOOLEAN ldctl_iscritical
;
263 } LDAPControlA
, *PLDAPControlA
;
265 typedef struct ldapcontrolW
268 struct WLDAP32_berval ldctl_value
;
269 BOOLEAN ldctl_iscritical
;
270 } LDAPControlW
, *PLDAPControlW
;
272 typedef struct ldapmodA
{
277 struct WLDAP32_berval
**modv_bvals
;
279 } LDAPModA
, *PLDAPModA
;
281 typedef struct ldapmodW
{
285 WCHAR
**modv_strvals
;
286 struct WLDAP32_berval
**modv_bvals
;
288 } LDAPModW
, *PLDAPModW
;
290 typedef struct ldapsortkeyA
293 char *sk_matchruleoid
;
294 BOOLEAN sk_reverseorder
;
295 } LDAPSortKeyA
, *PLDAPSortKeyA
;
297 typedef struct ldapsortkeyW
300 WCHAR
*sk_matchruleoid
;
301 BOOLEAN sk_reverseorder
;
302 } LDAPSortKeyW
, *PLDAPSortKeyW
;
304 typedef struct WLDAP32_ldapvlvinfo
307 ULONG ldvlv_before_count
;
308 ULONG ldvlv_after_count
;
311 BERVAL
*ldvlv_attrvalue
;
312 BERVAL
*ldvlv_context
;
313 void *ldvlv_extradata
;
314 } WLDAP32_LDAPVLVInfo
, *WLDAP32_PLDAPVLVInfo
;
316 typedef struct ldapmsg
321 struct ldapmsg
*lm_chain
;
322 struct ldapmsg
*lm_next
;
331 BOOLEAN ConnectionReferenced
;
332 } WLDAP32_LDAPMessage
, *WLDAP32_PLDAPMessage
;
334 typedef struct ldap_version_info
339 } LDAP_VERSION_INFO
, *PLDAP_VERSION_INFO
;
341 typedef struct ldap_apifeature_infoA
343 int ldapaif_info_version
;
346 } LDAPAPIFeatureInfoA
;
348 typedef struct ldap_apifeature_infoW
350 int ldapaif_info_version
;
353 } LDAPAPIFeatureInfoW
;
355 typedef struct ldapapiinfoA
357 int ldapai_info_version
;
358 int ldapai_api_version
;
359 int ldapai_protocol_version
;
360 char **ldapai_extensions
;
361 char *ldapai_vendor_name
;
362 int ldapai_vendor_version
;
365 typedef struct ldapapiinfoW
367 int ldapai_info_version
;
368 int ldapai_api_version
;
369 int ldapai_protocol_version
;
370 WCHAR
**ldapai_extensions
;
371 WCHAR
*ldapai_vendor_name
;
372 int ldapai_vendor_version
;
375 typedef struct ldapsearch
382 LDAPControlW
**serverctrls
;
383 LDAPControlW
**clientctrls
;
384 struct l_timeval timeout
;
386 struct WLDAP32_berval
*cookie
;
389 void CDECL
WLDAP32_ber_bvecfree( BERVAL
** );
390 void CDECL
WLDAP32_ber_bvfree( BERVAL
* );
391 void CDECL
WLDAP32_ber_free( WLDAP32_BerElement
*, int );
392 WLDAP32_BerElement
* CDECL
WLDAP32_ber_alloc_t( int ) __WINE_DEALLOC(WLDAP32_ber_free
);
393 BERVAL
* CDECL
WLDAP32_ber_bvdup( BERVAL
* ) __WINE_DEALLOC(WLDAP32_ber_bvfree
);
394 ULONG CDECL
WLDAP32_ber_first_element( WLDAP32_BerElement
*, ULONG
*, char ** );
395 int CDECL
WLDAP32_ber_flatten( WLDAP32_BerElement
*, BERVAL
** );
396 WLDAP32_BerElement
* CDECL
WLDAP32_ber_init( BERVAL
* ) __WINE_DEALLOC(WLDAP32_ber_free
);
397 ULONG CDECL
WLDAP32_ber_next_element( WLDAP32_BerElement
*, ULONG
*, char * );
398 ULONG CDECL
WLDAP32_ber_peek_tag( WLDAP32_BerElement
*, ULONG
* );
399 ULONG CDECL
WLDAP32_ber_skip_tag( WLDAP32_BerElement
*, ULONG
* );
400 int WINAPIV
WLDAP32_ber_printf( WLDAP32_BerElement
*, char *, ... );
401 ULONG WINAPIV
WLDAP32_ber_scanf( WLDAP32_BerElement
*, char *, ... );
403 void CDECL
ldap_memfreeA( char * );
404 void CDECL
ldap_memfreeW( WCHAR
* );
405 ULONG CDECL
ldap_value_freeA( char ** );
406 ULONG CDECL
ldap_value_freeW( WCHAR
** );
407 ULONG CDECL
WLDAP32_ldap_msgfree( WLDAP32_LDAPMessage
* );
408 ULONG CDECL
WLDAP32_ldap_value_free_len(struct WLDAP32_berval
**);
409 ULONG CDECL
ldap_addA( LDAP
*, char *, LDAPModA
** );
410 ULONG CDECL
ldap_addW( LDAP
*, WCHAR
*, LDAPModW
** );
411 ULONG CDECL
ldap_add_extA( LDAP
*, char *, LDAPModA
**, LDAPControlA
**, LDAPControlA
**, ULONG
* );
412 ULONG CDECL
ldap_add_extW( LDAP
*, WCHAR
*, LDAPModW
**, LDAPControlW
**, LDAPControlW
**, ULONG
* );
413 ULONG CDECL
ldap_add_ext_sA( LDAP
*, char *, LDAPModA
**, LDAPControlA
**, LDAPControlA
** );
414 ULONG CDECL
ldap_add_ext_sW( LDAP
*, WCHAR
*, LDAPModW
**, LDAPControlW
**, LDAPControlW
** );
415 ULONG CDECL
ldap_add_sA( LDAP
*, char *, LDAPModA
** );
416 ULONG CDECL
ldap_add_sW( LDAP
*, WCHAR
*, LDAPModW
** );
417 ULONG CDECL
ldap_bindA( LDAP
*, char *, char *, ULONG
);
418 ULONG CDECL
ldap_bindW( LDAP
*, WCHAR
*, WCHAR
*, ULONG
);
419 ULONG CDECL
ldap_bind_sA( LDAP
*, char *, char *, ULONG
);
420 ULONG CDECL
ldap_bind_sW( LDAP
*, WCHAR
*, WCHAR
*, ULONG
);
421 ULONG CDECL
ldap_sasl_bindA( LDAP
*, const PCHAR
, const PCHAR
, const BERVAL
*, LDAPControlA
**,
422 LDAPControlA
**, int * );
423 ULONG CDECL
ldap_sasl_bindW( LDAP
*, const PWCHAR
, const PWCHAR
, const BERVAL
*, LDAPControlW
**,
424 LDAPControlW
**, int * );
425 ULONG CDECL
ldap_sasl_bind_sA( LDAP
*,const PCHAR
, const PCHAR
, const BERVAL
*, LDAPControlA
**,
426 LDAPControlA
**, BERVAL
** );
427 ULONG CDECL
ldap_sasl_bind_sW( LDAP
*,const PWCHAR
, const PWCHAR
,const BERVAL
*, LDAPControlW
**,
428 LDAPControlW
**, BERVAL
** );
429 ULONG CDECL
ldap_simple_bindA( LDAP
*, char *, char * );
430 ULONG CDECL
ldap_simple_bindW( LDAP
*, WCHAR
*, WCHAR
* );
431 ULONG CDECL
ldap_simple_bind_sA( LDAP
*, char *, char * );
432 ULONG CDECL
ldap_simple_bind_sW( LDAP
*, WCHAR
*, WCHAR
* );
433 ULONG CDECL
ldap_compareA( LDAP
*, char *, char *, char * );
434 ULONG CDECL
ldap_compareW( LDAP
*, WCHAR
*, WCHAR
*, WCHAR
* );
435 ULONG CDECL
ldap_compare_extA( LDAP
*, char *, char *, char *, struct WLDAP32_berval
*, LDAPControlA
**,
436 LDAPControlA
**, ULONG
* );
437 ULONG CDECL
ldap_compare_extW( LDAP
*, WCHAR
*, WCHAR
*, WCHAR
*, struct WLDAP32_berval
*, LDAPControlW
**,
438 LDAPControlW
**, ULONG
* );
439 ULONG CDECL
ldap_compare_ext_sA( LDAP
*, char *, char *, char *, struct WLDAP32_berval
*, LDAPControlA
**,
441 ULONG CDECL
ldap_compare_ext_sW( LDAP
*, WCHAR
*, WCHAR
*, WCHAR
*, struct WLDAP32_berval
*, LDAPControlW
**,
443 ULONG CDECL
ldap_compare_sA( LDAP
*, char *, char *, char * );
444 ULONG CDECL
ldap_compare_sW( LDAP
*, WCHAR
*, WCHAR
*, WCHAR
* );
445 ULONG CDECL
WLDAP32_ldap_connect( LDAP
*, struct l_timeval
* );
446 ULONG CDECL
ldap_create_sort_controlA( LDAP
*, LDAPSortKeyA
**, UCHAR
, LDAPControlA
** );
447 ULONG CDECL
ldap_create_sort_controlW( LDAP
*, LDAPSortKeyW
**, UCHAR
, LDAPControlW
** );
448 int CDECL
ldap_create_vlv_controlA( LDAP
*, WLDAP32_LDAPVLVInfo
*, UCHAR
, LDAPControlA
** );
449 int CDECL
ldap_create_vlv_controlW( LDAP
*, WLDAP32_LDAPVLVInfo
*, UCHAR
, LDAPControlW
** );
450 ULONG CDECL
ldap_deleteA( LDAP
*, char * );
451 ULONG CDECL
ldap_deleteW( LDAP
*, WCHAR
* );
452 ULONG CDECL
ldap_delete_extA( LDAP
*, char *, LDAPControlA
**, LDAPControlA
**, ULONG
* );
453 ULONG CDECL
ldap_delete_extW( LDAP
*, WCHAR
*, LDAPControlW
**, LDAPControlW
**, ULONG
* );
454 ULONG CDECL
ldap_delete_ext_sA( LDAP
*, char *, LDAPControlA
**, LDAPControlA
** );
455 ULONG CDECL
ldap_delete_ext_sW( LDAP
*, WCHAR
*, LDAPControlW
**, LDAPControlW
** );
456 ULONG CDECL
ldap_delete_sA( LDAP
*, char * );
457 ULONG CDECL
ldap_delete_sW( LDAP
*, WCHAR
* );
458 char * CDECL
ldap_dn2ufnA( char * ) __WINE_DEALLOC(ldap_memfreeA
) __WINE_MALLOC
;
459 WCHAR
* CDECL
ldap_dn2ufnW( WCHAR
* ) __WINE_DEALLOC(ldap_memfreeW
) __WINE_MALLOC
;
460 char ** CDECL
ldap_explode_dnA( char *, ULONG
) __WINE_DEALLOC(ldap_value_freeA
);
461 WCHAR
** CDECL
ldap_explode_dnW( WCHAR
*, ULONG
) __WINE_DEALLOC(ldap_value_freeW
);
462 char * CDECL
ldap_get_dnA( LDAP
*, WLDAP32_LDAPMessage
* ) __WINE_DEALLOC(ldap_memfreeA
) __WINE_MALLOC
;
463 WCHAR
* CDECL
ldap_get_dnW( LDAP
*, WLDAP32_LDAPMessage
* ) __WINE_DEALLOC(ldap_memfreeW
) __WINE_MALLOC
;
464 ULONG CDECL
ldap_ufn2dnA( char *, char ** );
465 ULONG CDECL
ldap_ufn2dnW( WCHAR
*, WCHAR
** );
466 ULONG CDECL
ldap_extended_operationA( LDAP
*, char *, struct WLDAP32_berval
*, LDAPControlA
**, LDAPControlA
**,
468 ULONG CDECL
ldap_extended_operationW( LDAP
*, WCHAR
*, struct WLDAP32_berval
*, LDAPControlW
**, LDAPControlW
**,
470 ULONG CDECL
ldap_extended_operation_sA( LDAP
*, char *, struct WLDAP32_berval
*, LDAPControlA
**, LDAPControlA
**,
471 char **, struct WLDAP32_berval
** );
472 ULONG CDECL
ldap_extended_operation_sW( LDAP
*, WCHAR
*, struct WLDAP32_berval
*, LDAPControlW
**, LDAPControlW
**,
473 WCHAR
**, struct WLDAP32_berval
** );
474 LDAP
* CDECL
cldap_openA( char *, ULONG
);
475 LDAP
* CDECL
cldap_openW( WCHAR
*, ULONG
);
476 LDAP
* CDECL
ldap_initA( const PCHAR
, ULONG
);
477 LDAP
* CDECL
ldap_initW( const PWCHAR
, ULONG
);
478 LDAP
* CDECL
ldap_openA( char *, ULONG
);
479 LDAP
* CDECL
ldap_openW( WCHAR
*, ULONG
);
480 LDAP
* CDECL
ldap_sslinitA( char *, ULONG
, int );
481 LDAP
* CDECL
ldap_sslinitW( WCHAR
*, ULONG
, int );
482 ULONG CDECL
ldap_start_tls_sA( LDAP
*, ULONG
*, WLDAP32_LDAPMessage
**, LDAPControlA
**, LDAPControlA
** );
483 ULONG CDECL
ldap_start_tls_sW( LDAP
*, ULONG
*, WLDAP32_LDAPMessage
**, LDAPControlW
**, LDAPControlW
** );
484 ULONG CDECL
ldap_check_filterA( LDAP
*, char * );
485 ULONG CDECL
ldap_check_filterW( LDAP
*, WCHAR
* );
486 char * CDECL
ldap_first_attributeA( LDAP
*, WLDAP32_LDAPMessage
*,
487 WLDAP32_BerElement
** ) __WINE_DEALLOC(ldap_memfreeA
) __WINE_MALLOC
;
488 WCHAR
* CDECL
ldap_first_attributeW( LDAP
*, WLDAP32_LDAPMessage
*,
489 WLDAP32_BerElement
** ) __WINE_DEALLOC(ldap_memfreeW
) __WINE_MALLOC
;
490 char * CDECL
ldap_next_attributeA( LDAP
*, WLDAP32_LDAPMessage
*,
491 WLDAP32_BerElement
* ) __WINE_DEALLOC(ldap_memfreeA
) __WINE_MALLOC
;
492 WCHAR
* CDECL
ldap_next_attributeW( LDAP
*, WLDAP32_LDAPMessage
*,
493 WLDAP32_BerElement
* ) __WINE_DEALLOC(ldap_memfreeW
) __WINE_MALLOC
;
494 ULONG CDECL
WLDAP32_ldap_result( LDAP
*, ULONG
, ULONG
, struct l_timeval
*, WLDAP32_LDAPMessage
** );
495 ULONG CDECL
ldap_modifyA( LDAP
*, char *, LDAPModA
** );
496 ULONG CDECL
ldap_modifyW( LDAP
*, WCHAR
*, LDAPModW
** );
497 ULONG CDECL
ldap_modify_extA( LDAP
*, char *, LDAPModA
**, LDAPControlA
**, LDAPControlA
**, ULONG
* );
498 ULONG CDECL
ldap_modify_extW( LDAP
*, WCHAR
*, LDAPModW
**, LDAPControlW
**, LDAPControlW
**, ULONG
* );
499 ULONG CDECL
ldap_modify_ext_sA( LDAP
*, char *, LDAPModA
**, LDAPControlA
**, LDAPControlA
** );
500 ULONG CDECL
ldap_modify_ext_sW( LDAP
*, WCHAR
*, LDAPModW
**, LDAPControlW
**, LDAPControlW
** );
501 ULONG CDECL
ldap_modify_sA( LDAP
*, char *, LDAPModA
** );
502 ULONG CDECL
ldap_modify_sW( LDAP
*, WCHAR
*, LDAPModW
** );
503 ULONG CDECL
ldap_modrdnA( LDAP
*, char *, char * );
504 ULONG CDECL
ldap_modrdnW( LDAP
*, WCHAR
*, WCHAR
* );
505 ULONG CDECL
ldap_modrdn2A( LDAP
*, char *, char *, int );
506 ULONG CDECL
ldap_modrdn2W( LDAP
*, WCHAR
*, WCHAR
*, int );
507 ULONG CDECL
ldap_modrdn2_sA( LDAP
*, char *, char *, int );
508 ULONG CDECL
ldap_modrdn2_sW( LDAP
*, WCHAR
*, WCHAR
*, int );
509 ULONG CDECL
ldap_modrdn_sA( LDAP
*, char *, char * );
510 ULONG CDECL
ldap_modrdn_sW( LDAP
*, WCHAR
*, WCHAR
* );
511 ULONG CDECL
ldap_get_optionA( LDAP
*, int, void * );
512 ULONG CDECL
ldap_get_optionW( LDAP
*, int, void * );
513 ULONG CDECL
ldap_set_optionA( LDAP
*, int, void * );
514 ULONG CDECL
ldap_set_optionW( LDAP
*, int, void * );
515 ULONG CDECL
ldap_create_page_controlA( LDAP
*, ULONG
, struct WLDAP32_berval
*, UCHAR
, LDAPControlA
** );
516 ULONG CDECL
ldap_create_page_controlW( LDAP
*, ULONG
, struct WLDAP32_berval
*, UCHAR
, LDAPControlW
** );
517 ULONG CDECL
ldap_control_freeA( LDAPControlA
* );
518 ULONG CDECL
ldap_control_freeW( LDAPControlW
* );
519 ULONG CDECL
ldap_search_ext_sA( LDAP
*, char *, ULONG
, char *, char **, ULONG
, LDAPControlA
**, LDAPControlA
**,
520 struct l_timeval
*, ULONG
, WLDAP32_LDAPMessage
** );
521 ULONG CDECL
ldap_search_ext_sW( LDAP
*, WCHAR
*, ULONG
, WCHAR
*, WCHAR
**, ULONG
, LDAPControlW
**, LDAPControlW
**,
522 struct l_timeval
*, ULONG
, WLDAP32_LDAPMessage
** );
523 ULONG CDECL
ldap_get_paged_count( LDAP
*, LDAPSearch
*, ULONG
*, WLDAP32_LDAPMessage
* );
524 ULONG CDECL
ldap_parse_resultA( LDAP
*, WLDAP32_LDAPMessage
*, ULONG
*, char **, char **, char ***,
525 LDAPControlA
***, BOOLEAN
);
526 ULONG CDECL
ldap_parse_resultW( LDAP
*, WLDAP32_LDAPMessage
*, ULONG
*, WCHAR
**, WCHAR
**, WCHAR
***,
527 LDAPControlW
***, BOOLEAN
);
528 ULONG CDECL
ldap_parse_page_controlA( LDAP
*, LDAPControlA
**, ULONG
*, struct WLDAP32_berval
** );
529 ULONG CDECL
ldap_parse_page_controlW( LDAP
*, LDAPControlW
**, ULONG
*, struct WLDAP32_berval
** );
530 ULONG CDECL
ldap_controls_freeA( LDAPControlA
** );
531 ULONG CDECL
ldap_controls_freeW( LDAPControlW
** );
532 ULONG CDECL
ldap_parse_extended_resultA( LDAP
*, WLDAP32_LDAPMessage
*, char **, struct WLDAP32_berval
**, BOOLEAN
);
533 ULONG CDECL
ldap_parse_extended_resultW( LDAP
*, WLDAP32_LDAPMessage
*, WCHAR
**, struct WLDAP32_berval
**, BOOLEAN
);
534 ULONG CDECL
ldap_parse_referenceA( LDAP
*, WLDAP32_LDAPMessage
*, char *** );
535 ULONG CDECL
ldap_parse_referenceW( LDAP
*, WLDAP32_LDAPMessage
*, WCHAR
*** );
536 ULONG CDECL
ldap_parse_sort_controlA( LDAP
*, LDAPControlA
**, ULONG
*, char ** );
537 ULONG CDECL
ldap_parse_sort_controlW( LDAP
*, LDAPControlW
**, ULONG
*, WCHAR
** );
538 int CDECL
ldap_parse_vlv_controlA( LDAP
*, LDAPControlA
**, ULONG
*, ULONG
*, struct WLDAP32_berval
**, int * );
539 int CDECL
ldap_parse_vlv_controlW( LDAP
*, LDAPControlW
**, ULONG
*, ULONG
*, struct WLDAP32_berval
**, int * );
540 ULONG CDECL
ldap_rename_extA( LDAP
*, char *, char *, char *, int, LDAPControlA
**, LDAPControlA
**, ULONG
* );
541 ULONG CDECL
ldap_rename_extW( LDAP
*, WCHAR
*, WCHAR
*, WCHAR
*, int, LDAPControlW
**, LDAPControlW
**, ULONG
* );
542 ULONG CDECL
ldap_rename_ext_sA( LDAP
*, char *, char *, char *, int, LDAPControlA
**, LDAPControlA
** );
543 ULONG CDECL
ldap_rename_ext_sW( LDAP
*, WCHAR
*, WCHAR
*, WCHAR
*, int, LDAPControlW
**, LDAPControlW
** );
544 ULONG CDECL
ldap_searchA( LDAP
*, char *, ULONG
, char *, char **, ULONG
);
545 ULONG CDECL
ldap_searchW( LDAP
*, WCHAR
*, ULONG
, WCHAR
*, WCHAR
**, ULONG
);
546 ULONG CDECL
ldap_search_extA( LDAP
*, char *, ULONG
, char *, char **, ULONG
, LDAPControlA
**, LDAPControlA
**,
547 ULONG
, ULONG
, ULONG
* );
548 ULONG CDECL
ldap_search_extW( LDAP
*, PWCHAR
, ULONG
, PWCHAR
, PWCHAR
[], ULONG
, LDAPControlW
**, LDAPControlW
**,
549 ULONG
, ULONG
, ULONG
* );
550 ULONG CDECL
ldap_search_sA( LDAP
*, char *, ULONG
, char *, char **, ULONG
, WLDAP32_LDAPMessage
** );
551 ULONG CDECL
ldap_search_sW( LDAP
*, WCHAR
*, ULONG
, WCHAR
*, WCHAR
**, ULONG
, WLDAP32_LDAPMessage
** );
552 ULONG CDECL
ldap_search_stA( LDAP
*, const PCHAR
, ULONG
, const PCHAR
, char **, ULONG
, struct l_timeval
*,
553 WLDAP32_LDAPMessage
** );
554 ULONG CDECL
ldap_search_stW( LDAP
*, const PWCHAR
, ULONG
, const PWCHAR
, WCHAR
**, ULONG
, struct l_timeval
*,
555 WLDAP32_LDAPMessage
** );
556 char ** CDECL
ldap_get_valuesA( LDAP
*, WLDAP32_LDAPMessage
*, char * ) __WINE_DEALLOC(ldap_value_freeA
);
557 WCHAR
** CDECL
ldap_get_valuesW( LDAP
*, WLDAP32_LDAPMessage
*, WCHAR
* ) __WINE_DEALLOC(ldap_value_freeW
);
558 struct WLDAP32_berval
** CDECL
ldap_get_values_lenA( LDAP
*, LDAPMessage
*,
559 char * ) __WINE_DEALLOC(WLDAP32_ldap_value_free_len
);
560 struct WLDAP32_berval
** CDECL
ldap_get_values_lenW( LDAP
*, LDAPMessage
*,
561 WCHAR
* ) __WINE_DEALLOC(WLDAP32_ldap_value_free_len
);
563 ULONG
map_error( int );
565 static inline char *strWtoU( const WCHAR
*str
)
570 int len
= WideCharToMultiByte( CP_UTF8
, 0, str
, -1, NULL
, 0, NULL
, NULL
);
571 if ((ret
= malloc( len
))) WideCharToMultiByte( CP_UTF8
, 0, str
, -1, ret
, len
, NULL
, NULL
);
576 static inline char *strnWtoU( const WCHAR
*str
, DWORD in_len
, DWORD
*out_len
)
582 DWORD len
= WideCharToMultiByte( CP_UTF8
, 0, str
, in_len
, NULL
, 0, NULL
, NULL
);
583 if ((ret
= malloc( len
+ 1 )))
585 WideCharToMultiByte( CP_UTF8
, 0, str
, in_len
, ret
, len
, NULL
, NULL
);
593 static inline WCHAR
*strAtoW( const char *str
)
598 DWORD len
= MultiByteToWideChar( CP_ACP
, 0, str
, -1, NULL
, 0 );
599 if ((ret
= malloc( len
* sizeof(WCHAR
) ))) MultiByteToWideChar( CP_ACP
, 0, str
, -1, ret
, len
);
604 static inline WCHAR
*strnAtoW( const char *str
, DWORD in_len
, DWORD
*out_len
)
610 DWORD len
= MultiByteToWideChar( CP_ACP
, 0, str
, in_len
, NULL
, 0 );
611 if ((ret
= malloc( (len
+ 1) * sizeof(WCHAR
) )))
613 MultiByteToWideChar( CP_ACP
, 0, str
, in_len
, ret
, len
);
621 static inline char *strreplace( const char *s
, const char *before
, const char *after
)
623 char *ret
= malloc( strlen( s
) + strlen( after
) / strlen( before
) + 1 );
624 char *cur
, *prev
= ret
;
628 for (cur
= strstr( s
, before
); cur
; cur
= strstr( prev
, before
))
630 strncat( ret
, prev
, cur
- prev
);
631 strcat( ret
, after
);
632 prev
= cur
+ strlen( before
);
634 strncat( ret
, prev
, cur
- prev
);
639 static inline DWORD
bvarraylenW( struct WLDAP32_berval
**bv
)
641 struct WLDAP32_berval
**p
= bv
;
646 static inline DWORD
strarraylenW( WCHAR
**strarray
)
648 WCHAR
**p
= strarray
;
653 static inline char **strarrayWtoU( WCHAR
**strarray
)
660 size
= sizeof(char *) * (strarraylenW( strarray
) + 1);
661 if ((ret
= malloc( size
)))
663 WCHAR
**p
= strarray
;
666 while (*p
) *q
++ = strWtoU( *p
++ );
673 static inline WCHAR
**strarraydupW( WCHAR
**strarray
)
680 size
= sizeof(WCHAR
*) * (strarraylenW( strarray
) + 1);
681 if ((ret
= malloc( size
)))
683 WCHAR
**p
= strarray
, **q
= ret
;
685 while (*p
) *q
++ = wcsdup( *p
++ );
692 static inline char *strWtoA( const WCHAR
*str
)
697 DWORD len
= WideCharToMultiByte( CP_ACP
, 0, str
, -1, NULL
, 0, NULL
, NULL
);
698 if ((ret
= malloc( len
))) WideCharToMultiByte( CP_ACP
, 0, str
, -1, ret
, len
, NULL
, NULL
);
703 static inline char **strarrayWtoA( WCHAR
**strarray
)
710 size
= sizeof(char *) * (strarraylenW( strarray
) + 1);
711 if ((ret
= malloc( size
)))
713 WCHAR
**p
= strarray
;
716 while (*p
) *q
++ = strWtoA( *p
++ );
723 static inline DWORD
modarraylenW( LDAPModW
**modarray
)
725 LDAPModW
**p
= modarray
;
730 static inline struct berval
*bervalWtoU( const struct WLDAP32_berval
*bv
)
733 DWORD size
= sizeof(*ret
) + bv
->bv_len
;
735 if ((ret
= malloc( size
)))
737 char *val
= (char *)(ret
+ 1);
739 ret
->bv_len
= bv
->bv_len
;
741 memcpy( val
, bv
->bv_val
, bv
->bv_len
);
746 static inline DWORD
bvarraylenU( struct berval
**bv
)
748 struct berval
**p
= bv
;
753 static inline struct WLDAP32_berval
*bervalUtoW( const struct berval
*bv
)
755 struct WLDAP32_berval
*ret
;
756 DWORD size
= sizeof(*ret
) + bv
->bv_len
;
758 assert( bv
->bv_len
<= ~0u );
760 if ((ret
= malloc( size
)))
762 char *val
= (char *)(ret
+ 1);
764 ret
->bv_len
= bv
->bv_len
;
766 memcpy( val
, bv
->bv_val
, bv
->bv_len
);
771 static inline struct WLDAP32_berval
**bvarrayUtoW( struct berval
**bv
)
773 struct WLDAP32_berval
**ret
= NULL
;
778 size
= sizeof(*ret
) * (bvarraylenU( bv
) + 1);
779 if ((ret
= malloc( size
)))
781 struct berval
**p
= bv
;
782 struct WLDAP32_berval
**q
= ret
;
784 while (*p
) *q
++ = bervalUtoW( *p
++ );
791 static inline struct berval
**bvarrayWtoU( struct WLDAP32_berval
**bv
)
793 struct berval
**ret
= NULL
;
798 size
= sizeof(*ret
) * (bvarraylenW( bv
) + 1);
799 if ((ret
= malloc( size
)))
801 struct WLDAP32_berval
**p
= bv
;
802 struct berval
**q
= ret
;
804 while (*p
) *q
++ = bervalWtoU( *p
++ );
811 static inline LDAPMod
*modWtoU( const LDAPModW
*mod
)
815 if ((ret
= malloc( sizeof(*ret
) )))
817 ret
->mod_op
= mod
->mod_op
;
818 ret
->mod_type
= strWtoU( mod
->mod_type
);
820 if (mod
->mod_op
& LDAP_MOD_BVALUES
)
821 ret
->mod_vals
.modv_bvals
= bvarrayWtoU( mod
->mod_vals
.modv_bvals
);
823 ret
->mod_vals
.modv_strvals
= strarrayWtoU( mod
->mod_vals
.modv_strvals
);
828 static inline LDAPMod
**modarrayWtoU( LDAPModW
**modarray
)
830 LDAPMod
**ret
= NULL
;
835 size
= sizeof(*ret
) * (modarraylenW( modarray
) + 1);
836 if ((ret
= malloc( size
)))
838 LDAPModW
**p
= modarray
;
841 while (*p
) *q
++ = modWtoU( *p
++ );
848 static inline void bvarrayfreeU( struct berval
**bv
)
850 struct berval
**p
= bv
;
851 while (*p
) free( *p
++ );
855 static inline void strarrayfreeU( char **strarray
)
860 while (*p
) free( *p
++ );
865 static inline void modfreeU( LDAPMod
*mod
)
867 if (mod
->mod_op
& LDAP_MOD_BVALUES
)
868 bvarrayfreeU( mod
->mod_vals
.modv_bvals
);
870 strarrayfreeU( mod
->mod_vals
.modv_strvals
);
874 static inline void modarrayfreeU( LDAPMod
**modarray
)
878 LDAPMod
**p
= modarray
;
879 while (*p
) modfreeU( *p
++ );
884 static inline DWORD
modarraylenA( LDAPModA
**modarray
)
886 LDAPModA
**p
= modarray
;
891 static inline struct WLDAP32_berval
*bervalWtoW( const struct WLDAP32_berval
*bv
)
893 struct WLDAP32_berval
*ret
;
894 DWORD size
= sizeof(*ret
) + bv
->bv_len
;
896 if ((ret
= malloc( size
)))
898 char *val
= (char *)(ret
+ 1);
900 ret
->bv_len
= bv
->bv_len
;
902 memcpy( val
, bv
->bv_val
, bv
->bv_len
);
907 static inline struct WLDAP32_berval
**bvarrayWtoW( struct WLDAP32_berval
**bv
)
909 struct WLDAP32_berval
**ret
= NULL
;
914 size
= sizeof(*ret
) * (bvarraylenW( bv
) + 1);
915 if ((ret
= malloc( size
)))
917 struct WLDAP32_berval
**p
= bv
, **q
= ret
;
919 while (*p
) *q
++ = bervalWtoW( *p
++ );
926 static inline DWORD
strarraylenA( char **strarray
)
933 static inline WCHAR
**strarrayAtoW( char **strarray
)
940 size
= sizeof(*ret
) * (strarraylenA( strarray
) + 1);
941 if ((ret
= malloc( size
)))
946 while (*p
) *q
++ = strAtoW( *p
++ );
953 static inline LDAPModW
*modAtoW( const LDAPModA
*mod
)
957 if ((ret
= malloc( sizeof(*ret
) )))
959 ret
->mod_op
= mod
->mod_op
;
960 ret
->mod_type
= strAtoW( mod
->mod_type
);
962 if (mod
->mod_op
& LDAP_MOD_BVALUES
)
963 ret
->mod_vals
.modv_bvals
= bvarrayWtoW( mod
->mod_vals
.modv_bvals
);
965 ret
->mod_vals
.modv_strvals
= strarrayAtoW( mod
->mod_vals
.modv_strvals
);
970 static inline LDAPModW
**modarrayAtoW( LDAPModA
**modarray
)
972 LDAPModW
**ret
= NULL
;
977 size
= sizeof(*ret
) * (modarraylenA( modarray
) + 1);
978 if ((ret
= malloc( size
)))
980 LDAPModA
**p
= modarray
;
983 while (*p
) *q
++ = modAtoW( *p
++ );
990 static inline void bvarrayfreeW( struct WLDAP32_berval
**bv
)
992 struct WLDAP32_berval
**p
= bv
;
993 while (*p
) free( *p
++ );
997 static inline void strarrayfreeW( WCHAR
**strarray
)
1001 WCHAR
**p
= strarray
;
1002 while (*p
) free( *p
++ );
1007 static inline void modfreeW( LDAPModW
*mod
)
1009 if (mod
->mod_op
& LDAP_MOD_BVALUES
)
1010 bvarrayfreeW( mod
->mod_vals
.modv_bvals
);
1012 strarrayfreeW( mod
->mod_vals
.modv_strvals
);
1016 static inline void modarrayfreeW( LDAPModW
**modarray
)
1020 LDAPModW
**p
= modarray
;
1021 while (*p
) modfreeW( *p
++ );
1026 static inline DWORD
controlarraylenA( LDAPControlA
**controlarray
)
1028 LDAPControlA
**p
= controlarray
;
1030 return p
- controlarray
;
1033 static inline LDAPControlW
*controlAtoW( const LDAPControlA
*control
)
1036 DWORD len
= control
->ldctl_value
.bv_len
;
1039 if (control
->ldctl_value
.bv_val
)
1041 if (!(val
= malloc( len
))) return NULL
;
1042 memcpy( val
, control
->ldctl_value
.bv_val
, len
);
1045 if (!(ret
= malloc( sizeof(*ret
) )))
1051 ret
->ldctl_oid
= strAtoW( control
->ldctl_oid
);
1052 ret
->ldctl_value
.bv_len
= len
;
1053 ret
->ldctl_value
.bv_val
= val
;
1054 ret
->ldctl_iscritical
= control
->ldctl_iscritical
;
1059 static inline LDAPControlW
**controlarrayAtoW( LDAPControlA
**controlarray
)
1061 LDAPControlW
**ret
= NULL
;
1066 size
= sizeof(*ret
) * (controlarraylenA( controlarray
) + 1);
1067 if ((ret
= malloc( size
)))
1069 LDAPControlA
**p
= controlarray
;
1070 LDAPControlW
**q
= ret
;
1072 while (*p
) *q
++ = controlAtoW( *p
++ );
1079 static inline void controlfreeW( LDAPControlW
*control
)
1083 free( control
->ldctl_oid
);
1084 free( control
->ldctl_value
.bv_val
);
1089 static inline void controlarrayfreeW( LDAPControlW
**controlarray
)
1093 LDAPControlW
**p
= controlarray
;
1094 while (*p
) controlfreeW( *p
++ );
1095 free( controlarray
);
1099 static inline DWORD
controlarraylenW( LDAPControlW
**controlarray
)
1101 LDAPControlW
**p
= controlarray
;
1103 return p
- controlarray
;
1106 static inline LDAPControlA
*controlWtoA( const LDAPControlW
*control
)
1109 DWORD len
= control
->ldctl_value
.bv_len
;
1112 if (control
->ldctl_value
.bv_val
)
1114 if (!(val
= malloc( len
))) return NULL
;
1115 memcpy( val
, control
->ldctl_value
.bv_val
, len
);
1118 if (!(ret
= malloc( sizeof(*ret
) )))
1124 ret
->ldctl_oid
= strWtoA( control
->ldctl_oid
);
1125 ret
->ldctl_value
.bv_len
= len
;
1126 ret
->ldctl_value
.bv_val
= val
;
1127 ret
->ldctl_iscritical
= control
->ldctl_iscritical
;
1132 static inline void strarrayfreeA( char **strarray
)
1136 char **p
= strarray
;
1137 while (*p
) free( *p
++ );
1142 static inline void controlfreeA( LDAPControlA
*control
)
1146 free( control
->ldctl_oid
);
1147 free( control
->ldctl_value
.bv_val
);
1152 static inline void controlarrayfreeA( LDAPControlA
**controlarray
)
1156 LDAPControlA
**p
= controlarray
;
1157 while (*p
) controlfreeA( *p
++ );
1158 free( controlarray
);
1162 static inline LDAPControl
*controlWtoU( const LDAPControlW
*control
)
1165 DWORD len
= control
->ldctl_value
.bv_len
;
1168 if (control
->ldctl_value
.bv_val
)
1170 if (!(val
= malloc( len
))) return NULL
;
1171 memcpy( val
, control
->ldctl_value
.bv_val
, len
);
1174 if (!(ret
= malloc( sizeof(*ret
) )))
1180 ret
->ldctl_oid
= strWtoU( control
->ldctl_oid
);
1181 ret
->ldctl_value
.bv_len
= len
;
1182 ret
->ldctl_value
.bv_val
= val
;
1183 ret
->ldctl_iscritical
= control
->ldctl_iscritical
;
1188 static inline LDAPControl
**controlarrayWtoU( LDAPControlW
**controlarray
)
1190 LDAPControl
**ret
= NULL
;
1195 size
= sizeof(*ret
) * (controlarraylenW( controlarray
) + 1);
1196 if ((ret
= malloc( size
)))
1198 LDAPControlW
**p
= controlarray
;
1199 LDAPControl
**q
= ret
;
1201 while (*p
) *q
++ = controlWtoU( *p
++ );
1208 static inline void controlfreeU( LDAPControl
*control
)
1212 free( control
->ldctl_oid
);
1213 free( control
->ldctl_value
.bv_val
);
1218 static inline void controlarrayfreeU( LDAPControl
**controlarray
)
1222 LDAPControl
**p
= controlarray
;
1223 while (*p
) controlfreeU( *p
++ );
1224 free( controlarray
);
1228 static inline DWORD
controlarraylenU( LDAPControl
**controlarray
)
1230 LDAPControl
**p
= controlarray
;
1232 return p
- controlarray
;
1235 static inline LDAPControlW
*controldupW( LDAPControlW
*control
)
1238 DWORD len
= control
->ldctl_value
.bv_len
;
1241 if (control
->ldctl_value
.bv_val
)
1243 if (!(val
= malloc( len
))) return NULL
;
1244 memcpy( val
, control
->ldctl_value
.bv_val
, len
);
1247 if (!(ret
= malloc( sizeof(*ret
) )))
1253 ret
->ldctl_oid
= wcsdup( control
->ldctl_oid
);
1254 ret
->ldctl_value
.bv_len
= len
;
1255 ret
->ldctl_value
.bv_val
= val
;
1256 ret
->ldctl_iscritical
= control
->ldctl_iscritical
;
1261 static inline LDAPControlW
**controlarraydupW( LDAPControlW
**controlarray
)
1263 LDAPControlW
**ret
= NULL
;
1268 size
= sizeof(*ret
) * (controlarraylenW( controlarray
) + 1);
1269 if ((ret
= malloc( size
)))
1271 LDAPControlW
**p
= controlarray
, **q
= ret
;
1273 while (*p
) *q
++ = controldupW( *p
++ );
1280 static inline LDAPControlA
**controlarrayWtoA( LDAPControlW
**controlarray
)
1282 LDAPControlA
**ret
= NULL
;
1287 size
= sizeof(*ret
) * (controlarraylenW( controlarray
) + 1);
1288 if ((ret
= malloc( size
)))
1290 LDAPControlW
**p
= controlarray
;
1291 LDAPControlA
**q
= ret
;
1293 while (*p
) *q
++ = controlWtoA( *p
++ );
1300 static inline WCHAR
*strUtoW( const char *str
)
1305 DWORD len
= MultiByteToWideChar( CP_UTF8
, 0, str
, -1, NULL
, 0 );
1306 if ((ret
= malloc( len
* sizeof(WCHAR
) ))) MultiByteToWideChar( CP_UTF8
, 0, str
, -1, ret
, len
);
1311 static inline DWORD
strarraylenU( char **strarray
)
1313 char **p
= strarray
;
1315 return p
- strarray
;
1318 static inline WCHAR
**strarrayUtoW( char **strarray
)
1325 size
= sizeof(*ret
) * (strarraylenU( strarray
) + 1);
1326 if ((ret
= malloc( size
)))
1328 char **p
= strarray
;
1331 while (*p
) *q
++ = strUtoW( *p
++ );
1338 static inline char **strarrayUtoU( char **strarray
)
1345 size
= sizeof(*ret
) * (strarraylenU( strarray
) + 1);
1346 if ((ret
= malloc( size
)))
1348 char **p
= strarray
, **q
= ret
;
1350 while (*p
) *q
++ = strdup( *p
++ );
1357 static inline LDAPControlW
*controlUtoW( const LDAPControl
*control
)
1360 DWORD len
= control
->ldctl_value
.bv_len
;
1363 if (control
->ldctl_value
.bv_val
)
1365 if (!(val
= malloc( len
))) return NULL
;
1366 memcpy( val
, control
->ldctl_value
.bv_val
, len
);
1369 if (!(ret
= malloc( sizeof(*ret
) )))
1375 ret
->ldctl_oid
= strUtoW( control
->ldctl_oid
);
1376 ret
->ldctl_value
.bv_len
= len
;
1377 ret
->ldctl_value
.bv_val
= val
;
1378 ret
->ldctl_iscritical
= control
->ldctl_iscritical
;
1383 static inline LDAPControlW
**controlarrayUtoW( LDAPControl
**controlarray
)
1385 LDAPControlW
**ret
= NULL
;
1390 size
= sizeof(*ret
) * (controlarraylenU( controlarray
) + 1);
1391 if ((ret
= malloc( size
)))
1393 LDAPControl
**p
= controlarray
;
1394 LDAPControlW
**q
= ret
;
1396 while (*p
) *q
++ = controlUtoW( *p
++ );
1403 static inline DWORD
sortkeyarraylenA( LDAPSortKeyA
**sortkeyarray
)
1405 LDAPSortKeyA
**p
= sortkeyarray
;
1407 return p
- sortkeyarray
;
1410 static inline LDAPSortKeyW
*sortkeyAtoW( const LDAPSortKeyA
*sortkey
)
1414 if ((ret
= malloc( sizeof(*ret
) )))
1416 ret
->sk_attrtype
= strAtoW( sortkey
->sk_attrtype
);
1417 ret
->sk_matchruleoid
= strAtoW( sortkey
->sk_matchruleoid
);
1418 ret
->sk_reverseorder
= sortkey
->sk_reverseorder
;
1423 static inline LDAPSortKeyW
**sortkeyarrayAtoW( LDAPSortKeyA
**sortkeyarray
)
1425 LDAPSortKeyW
**ret
= NULL
;
1430 size
= sizeof(*ret
) * (sortkeyarraylenA( sortkeyarray
) + 1);
1431 if ((ret
= malloc( size
)))
1433 LDAPSortKeyA
**p
= sortkeyarray
;
1434 LDAPSortKeyW
**q
= ret
;
1436 while (*p
) *q
++ = sortkeyAtoW( *p
++ );
1443 static inline void sortkeyfreeW( LDAPSortKeyW
*sortkey
)
1447 free( sortkey
->sk_attrtype
);
1448 free( sortkey
->sk_matchruleoid
);
1453 static inline void sortkeyarrayfreeW( LDAPSortKeyW
**sortkeyarray
)
1457 LDAPSortKeyW
**p
= sortkeyarray
;
1458 while (*p
) sortkeyfreeW( *p
++ );
1459 free( sortkeyarray
);
1463 static inline DWORD
sortkeyarraylenW( LDAPSortKeyW
**sortkeyarray
)
1465 LDAPSortKeyW
**p
= sortkeyarray
;
1467 return p
- sortkeyarray
;
1470 static inline LDAPSortKey
*sortkeyWtoU( const LDAPSortKeyW
*sortkey
)
1474 if ((ret
= malloc( sizeof(*ret
) )))
1476 ret
->attributeType
= strWtoU( sortkey
->sk_attrtype
);
1477 ret
->orderingRule
= strWtoU( sortkey
->sk_matchruleoid
);
1478 ret
->reverseOrder
= sortkey
->sk_reverseorder
;
1483 static inline LDAPSortKey
**sortkeyarrayWtoU( LDAPSortKeyW
**sortkeyarray
)
1485 LDAPSortKey
**ret
= NULL
;
1490 size
= sizeof(*ret
) * (sortkeyarraylenW( sortkeyarray
) + 1);
1491 if ((ret
= malloc( size
)))
1493 LDAPSortKeyW
**p
= sortkeyarray
;
1494 LDAPSortKey
**q
= ret
;
1496 while (*p
) *q
++ = sortkeyWtoU( *p
++ );
1503 static inline void sortkeyfreeU( LDAPSortKey
*sortkey
)
1507 free( sortkey
->attributeType
);
1508 free( sortkey
->orderingRule
);
1513 static inline void sortkeyarrayfreeU( LDAPSortKey
**sortkeyarray
)
1517 LDAPSortKey
**p
= sortkeyarray
;
1518 while (*p
) sortkeyfreeU( *p
++ );
1519 free( sortkeyarray
);
1523 static inline LDAPVLVInfo
*vlvinfoWtoU( const WLDAP32_LDAPVLVInfo
*info
)
1527 if ((ret
= malloc( sizeof(*ret
) )))
1529 ret
->ldvlv_version
= info
->ldvlv_version
;
1530 ret
->ldvlv_before_count
= info
->ldvlv_before_count
;
1531 ret
->ldvlv_after_count
= info
->ldvlv_after_count
;
1532 ret
->ldvlv_offset
= info
->ldvlv_offset
;
1533 ret
->ldvlv_count
= info
->ldvlv_count
;
1534 if (!(ret
->ldvlv_attrvalue
= bervalWtoU( info
->ldvlv_attrvalue
)))
1539 if (!(ret
->ldvlv_context
= bervalWtoU( info
->ldvlv_context
)))
1541 free( ret
->ldvlv_attrvalue
);
1545 ret
->ldvlv_extradata
= info
->ldvlv_extradata
;
1550 static inline void vlvinfofreeU( LDAPVLVInfo
*info
)
1552 free( info
->ldvlv_attrvalue
);
1553 free( info
->ldvlv_context
);