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
22 #include "wine/port.h"
33 #include "winldap_private.h"
35 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(wldap32
);
40 static LDAPMod
*nullattrs
[] = { NULL
};
43 /***********************************************************************
44 * ldap_addA (WLDAP32.@)
48 ULONG CDECL
ldap_addA( WLDAP32_LDAP
*ld
, PCHAR dn
, LDAPModA
*attrs
[] )
50 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
53 LDAPModW
**attrsW
= NULL
;
55 ret
= WLDAP32_LDAP_NO_MEMORY
;
57 TRACE( "(%p, %s, %p)\n", ld
, debugstr_a(dn
), attrs
);
66 attrsW
= modarrayAtoW( attrs
);
67 if (!attrsW
) goto exit
;
70 ret
= ldap_addW( ld
, dnW
, attrsW
);
74 modarrayfreeW( attrsW
);
80 /***********************************************************************
81 * ldap_addW (WLDAP32.@)
83 * Add an entry to a directory tree (asynchronous operation).
86 * ld [I] Pointer to an LDAP context.
87 * dn [I] DN of the entry to add.
88 * attrs [I] Pointer to an array of LDAPModW structures, each
89 * specifying an attribute and its values to add.
92 * Success: Message ID of the add operation.
93 * Failure: An LDAP error code.
96 * Call ldap_result with the message ID to get the result of
97 * the operation. Cancel the operation by calling ldap_abandon
98 * with the message ID.
100 ULONG CDECL
ldap_addW( WLDAP32_LDAP
*ld
, PWCHAR dn
, LDAPModW
*attrs
[] )
102 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
105 LDAPMod
**attrsU
= NULL
;
108 ret
= WLDAP32_LDAP_NO_MEMORY
;
110 TRACE( "(%p, %s, %p)\n", ld
, debugstr_w(dn
), attrs
);
112 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
119 attrsU
= modarrayWtoU( attrs
);
120 if (!attrsU
) goto exit
;
123 ret
= ldap_add_ext( ld
->ld
, dn
? dnU
: "", attrs
? attrsU
: nullattrs
, NULL
, NULL
, &msg
);
125 if (ret
== LDAP_SUCCESS
)
132 modarrayfreeU( attrsU
);
138 /***********************************************************************
139 * ldap_add_extA (WLDAP32.@)
143 ULONG CDECL
ldap_add_extA( WLDAP32_LDAP
*ld
, PCHAR dn
, LDAPModA
*attrs
[],
144 PLDAPControlA
*serverctrls
, PLDAPControlA
*clientctrls
, ULONG
*message
)
146 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
149 LDAPModW
**attrsW
= NULL
;
150 LDAPControlW
**serverctrlsW
= NULL
, **clientctrlsW
= NULL
;
152 ret
= WLDAP32_LDAP_NO_MEMORY
;
154 TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld
, debugstr_a(dn
), attrs
,
155 serverctrls
, clientctrls
, message
);
157 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
164 attrsW
= modarrayAtoW( attrs
);
165 if (!attrsW
) goto exit
;
168 serverctrlsW
= controlarrayAtoW( serverctrls
);
169 if (!serverctrlsW
) goto exit
;
172 clientctrlsW
= controlarrayAtoW( clientctrls
);
173 if (!clientctrlsW
) goto exit
;
176 ret
= ldap_add_extW( ld
, dnW
, attrsW
, serverctrlsW
, clientctrlsW
, message
);
180 modarrayfreeW( attrsW
);
181 controlarrayfreeW( serverctrlsW
);
182 controlarrayfreeW( clientctrlsW
);
188 /***********************************************************************
189 * ldap_add_extW (WLDAP32.@)
191 * Add an entry to a directory tree (asynchronous operation).
194 * ld [I] Pointer to an LDAP context.
195 * dn [I] DN of the entry to add.
196 * attrs [I] Pointer to an array of LDAPModW structures, each
197 * specifying an attribute and its values to add.
198 * serverctrls [I] Array of LDAP server controls.
199 * clientctrls [I] Array of LDAP client controls.
200 * message [O] Message ID of the add operation.
203 * Success: LDAP_SUCCESS
204 * Failure: An LDAP error code.
207 * Call ldap_result with the message ID to get the result of
208 * the operation. The serverctrls and clientctrls parameters are
209 * optional and should be set to NULL if not used.
211 ULONG CDECL
ldap_add_extW( WLDAP32_LDAP
*ld
, PWCHAR dn
, LDAPModW
*attrs
[],
212 PLDAPControlW
*serverctrls
, PLDAPControlW
*clientctrls
, ULONG
*message
)
214 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
217 LDAPMod
**attrsU
= NULL
;
218 LDAPControl
**serverctrlsU
= NULL
, **clientctrlsU
= NULL
;
221 ret
= WLDAP32_LDAP_NO_MEMORY
;
223 TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld
, debugstr_w(dn
), attrs
,
224 serverctrls
, clientctrls
, message
);
226 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
233 attrsU
= modarrayWtoU( attrs
);
234 if (!attrsU
) goto exit
;
237 serverctrlsU
= controlarrayWtoU( serverctrls
);
238 if (!serverctrlsU
) goto exit
;
241 clientctrlsU
= controlarrayWtoU( clientctrls
);
242 if (!clientctrlsU
) goto exit
;
245 ret
= map_error( ldap_add_ext( ld
->ld
, dn
? dnU
: "", attrs
? attrsU
: nullattrs
, serverctrlsU
,
246 clientctrlsU
, message
? (int *)message
: &dummy
));
250 modarrayfreeU( attrsU
);
251 controlarrayfreeU( serverctrlsU
);
252 controlarrayfreeU( clientctrlsU
);
258 /***********************************************************************
259 * ldap_add_ext_sA (WLDAP32.@)
261 * See ldap_add_ext_sW.
263 ULONG CDECL
ldap_add_ext_sA( WLDAP32_LDAP
*ld
, PCHAR dn
, LDAPModA
*attrs
[],
264 PLDAPControlA
*serverctrls
, PLDAPControlA
*clientctrls
)
266 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
269 LDAPModW
**attrsW
= NULL
;
270 LDAPControlW
**serverctrlsW
= NULL
, **clientctrlsW
= NULL
;
272 ret
= WLDAP32_LDAP_NO_MEMORY
;
274 TRACE( "(%p, %s, %p, %p, %p)\n", ld
, debugstr_a(dn
), attrs
,
275 serverctrls
, clientctrls
);
277 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
284 attrsW
= modarrayAtoW( attrs
);
285 if (!attrsW
) goto exit
;
288 serverctrlsW
= controlarrayAtoW( serverctrls
);
289 if (!serverctrlsW
) goto exit
;
292 clientctrlsW
= controlarrayAtoW( clientctrls
);
293 if (!clientctrlsW
) goto exit
;
296 ret
= ldap_add_ext_sW( ld
, dnW
, attrsW
, serverctrlsW
, clientctrlsW
);
300 modarrayfreeW( attrsW
);
301 controlarrayfreeW( serverctrlsW
);
302 controlarrayfreeW( clientctrlsW
);
308 /***********************************************************************
309 * ldap_add_ext_sW (WLDAP32.@)
311 * Add an entry to a directory tree (synchronous operation).
314 * ld [I] Pointer to an LDAP context.
315 * dn [I] DN of the entry to add.
316 * attrs [I] Pointer to an array of LDAPModW structures, each
317 * specifying an attribute and its values to add.
318 * serverctrls [I] Array of LDAP server controls.
319 * clientctrls [I] Array of LDAP client controls.
322 * Success: LDAP_SUCCESS
323 * Failure: An LDAP error code.
326 * The serverctrls and clientctrls parameters are optional and
327 * should be set to NULL if not used.
329 ULONG CDECL
ldap_add_ext_sW( WLDAP32_LDAP
*ld
, PWCHAR dn
, LDAPModW
*attrs
[],
330 PLDAPControlW
*serverctrls
, PLDAPControlW
*clientctrls
)
332 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
335 LDAPMod
**attrsU
= NULL
;
336 LDAPControl
**serverctrlsU
= NULL
, **clientctrlsU
= NULL
;
338 ret
= WLDAP32_LDAP_NO_MEMORY
;
340 TRACE( "(%p, %s, %p, %p, %p)\n", ld
, debugstr_w(dn
), attrs
,
341 serverctrls
, clientctrls
);
343 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
350 attrsU
= modarrayWtoU( attrs
);
351 if (!attrsU
) goto exit
;
354 serverctrlsU
= controlarrayWtoU( serverctrls
);
355 if (!serverctrlsU
) goto exit
;
358 clientctrlsU
= controlarrayWtoU( clientctrls
);
359 if (!clientctrlsU
) goto exit
;
362 ret
= map_error( ldap_add_ext_s( ld
->ld
, dn
? dnU
: "", attrs
? attrsU
: nullattrs
,
363 serverctrlsU
, clientctrlsU
));
367 modarrayfreeU( attrsU
);
368 controlarrayfreeU( serverctrlsU
);
369 controlarrayfreeU( clientctrlsU
);
375 /***********************************************************************
376 * ldap_add_sA (WLDAP32.@)
380 ULONG CDECL
ldap_add_sA( WLDAP32_LDAP
*ld
, PCHAR dn
, LDAPModA
*attrs
[] )
382 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
385 LDAPModW
**attrsW
= NULL
;
387 ret
= WLDAP32_LDAP_NO_MEMORY
;
389 TRACE( "(%p, %s, %p)\n", ld
, debugstr_a(dn
), attrs
);
391 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
398 attrsW
= modarrayAtoW( attrs
);
399 if (!attrsW
) goto exit
;
402 ret
= ldap_add_sW( ld
, dnW
, attrsW
);
406 modarrayfreeW( attrsW
);
412 /***********************************************************************
413 * ldap_add_sW (WLDAP32.@)
415 * Add an entry to a directory tree (synchronous operation).
418 * ld [I] Pointer to an LDAP context.
419 * dn [I] DN of the entry to add.
420 * attrs [I] Pointer to an array of LDAPModW structures, each
421 * specifying an attribute and its values to add.
424 * Success: LDAP_SUCCESS
425 * Failure: An LDAP error code.
427 ULONG CDECL
ldap_add_sW( WLDAP32_LDAP
*ld
, PWCHAR dn
, LDAPModW
*attrs
[] )
429 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
432 LDAPMod
**attrsU
= NULL
;
434 ret
= WLDAP32_LDAP_NO_MEMORY
;
436 TRACE( "(%p, %s, %p)\n", ld
, debugstr_w(dn
), attrs
);
438 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
445 attrsU
= modarrayWtoU( attrs
);
446 if (!attrsU
) goto exit
;
449 ret
= map_error( ldap_add_ext_s( ld
->ld
, dn
? dnU
: "", attrs
? attrsU
: nullattrs
, NULL
, NULL
));
453 modarrayfreeU( attrsU
);