ReactOS 0.4.15-dev-7906-g1b85a5f
extended.c
Go to the documentation of this file.
1/*
2 * WLDAP32 - LDAP support for Wine
3 *
4 * Copyright 2005 Hans Leidekker
5 *
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.
10 *
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.
15 *
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
19 */
20
21#include "config.h"
22#include "wine/port.h"
23
24#include <stdarg.h>
25#ifdef HAVE_LDAP_H
26#include <ldap.h>
27#endif
28
29#include "windef.h"
30#include "winbase.h"
31#include "winnls.h"
32
33#include "winldap_private.h"
34#include "wldap32.h"
35#include "wine/debug.h"
36
38
39/***********************************************************************
40 * ldap_close_extended_op (WLDAP32.@)
41 *
42 * Close an extended operation.
43 *
44 * PARAMS
45 * ld [I] Pointer to an LDAP context.
46 * msgid [I] Message ID of the operation to be closed.
47 *
48 * RETURNS
49 * Success: LDAP_SUCCESS
50 * Failure: An LDAP error code.
51 *
52 * NOTES
53 * Contrary to native, OpenLDAP does not require us to close
54 * extended operations, so this is a no-op.
55 */
57{
58 TRACE( "(%p, 0x%08x)\n", ld, msgid );
59
60 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
62}
63
64/***********************************************************************
65 * ldap_extended_operationA (WLDAP32.@)
66 *
67 * See ldap_extended_operationW.
68 */
70 PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message )
71{
73#ifdef HAVE_LDAP
74 WCHAR *oidW = NULL;
75 LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
76
78
79 TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_a(oid), data, serverctrls,
80 clientctrls, message );
81
82 if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
83
84 if (oid) {
85 oidW = strAtoW( oid );
86 if (!oidW) goto exit;
87 }
88 if (serverctrls) {
89 serverctrlsW = controlarrayAtoW( serverctrls );
90 if (!serverctrlsW) goto exit;
91 }
92 if (clientctrls) {
93 clientctrlsW = controlarrayAtoW( clientctrls );
94 if (!clientctrlsW) goto exit;
95 }
96
97 ret = ldap_extended_operationW( ld, oidW, data, serverctrlsW, clientctrlsW, message );
98
99exit:
100 strfreeW( oidW );
101 controlarrayfreeW( serverctrlsW );
102 controlarrayfreeW( clientctrlsW );
103
104#endif
105 return ret;
106}
107
108/***********************************************************************
109 * ldap_extended_operationW (WLDAP32.@)
110 *
111 * Perform an extended operation (asynchronous mode).
112 *
113 * PARAMS
114 * ld [I] Pointer to an LDAP context.
115 * oid [I] OID of the extended operation.
116 * data [I] Data needed by the operation.
117 * serverctrls [I] Array of LDAP server controls.
118 * clientctrls [I] Array of LDAP client controls.
119 * message [O] Message ID of the extended operation.
120 *
121 * RETURNS
122 * Success: LDAP_SUCCESS
123 * Failure: An LDAP error code.
124 *
125 * NOTES
126 * The data parameter should be set to NULL if the operation
127 * requires no data. Call ldap_result with the message ID to
128 * get the result of the operation or ldap_abandon to cancel
129 * the operation. The serverctrls and clientctrls parameters
130 * are optional and should be set to NULL if not used. Call
131 * ldap_close_extended_op to close the operation.
132 */
134 PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message )
135{
137#ifdef HAVE_LDAP
138 char *oidU = NULL;
139 LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
140
142
143 TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls,
144 clientctrls, message );
145
146 if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
147
148 if (oid) {
149 oidU = strWtoU( oid );
150 if (!oidU) goto exit;
151 }
152 if (serverctrls) {
153 serverctrlsU = controlarrayWtoU( serverctrls );
154 if (!serverctrlsU) goto exit;
155 }
156 if (clientctrls) {
157 clientctrlsU = controlarrayWtoU( clientctrls );
158 if (!clientctrlsU) goto exit;
159 }
160
161 ret = map_error( ldap_extended_operation( ld, oid ? oidU : "", (struct berval *)data,
162 serverctrlsU, clientctrlsU, (int *)message ));
163
164exit:
165 strfreeU( oidU );
166 controlarrayfreeU( serverctrlsU );
167 controlarrayfreeU( clientctrlsU );
168
169#endif
170 return ret;
171}
172
173/***********************************************************************
174 * ldap_extended_operation_sA (WLDAP32.@)
175 *
176 * See ldap_extended_operation_sW.
177 */
179 PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, PCHAR *retoid,
180 struct WLDAP32_berval **retdata )
181{
183#ifdef HAVE_LDAP
184 WCHAR *oidW = NULL, *retoidW = NULL;
185 LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
186
188
189 TRACE( "(%p, %s, %p, %p, %p, %p, %p)\n", ld, debugstr_a(oid), data, serverctrls,
190 clientctrls, retoid, retdata );
191
192 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
193
194 if (oid) {
195 oidW = strAtoW( oid );
196 if (!oidW) goto exit;
197 }
198 if (serverctrls) {
199 serverctrlsW = controlarrayAtoW( serverctrls );
200 if (!serverctrlsW) goto exit;
201 }
202 if (clientctrls) {
203 clientctrlsW = controlarrayAtoW( clientctrls );
204 if (!clientctrlsW) goto exit;
205 }
206
207 ret = ldap_extended_operation_sW( ld, oidW, data, serverctrlsW, clientctrlsW,
208 &retoidW, retdata );
209
210 if (retoid && retoidW) {
211 *retoid = strWtoA( retoidW );
212 if (!*retoid) ret = WLDAP32_LDAP_NO_MEMORY;
213 ldap_memfreeW( retoidW );
214 }
215
216exit:
217 strfreeW( oidW );
218 controlarrayfreeW( serverctrlsW );
219 controlarrayfreeW( clientctrlsW );
220
221#endif
222 return ret;
223}
224
225/***********************************************************************
226 * ldap_extended_operation_sW (WLDAP32.@)
227 *
228 * Perform an extended operation (synchronous mode).
229 *
230 * PARAMS
231 * ld [I] Pointer to an LDAP context.
232 * oid [I] OID of the extended operation.
233 * data [I] Data needed by the operation.
234 * serverctrls [I] Array of LDAP server controls.
235 * clientctrls [I] Array of LDAP client controls.
236 * retoid [O] OID of the server response message.
237 * retdata [O] Data returned by the server.
238 *
239 * RETURNS
240 * Success: LDAP_SUCCESS
241 * Failure: An LDAP error code.
242 *
243 * NOTES
244 * The data parameter should be set to NULL if the operation
245 * requires no data. The serverctrls, clientctrls, retoid and
246 * and retdata parameters are also optional. Set to NULL if not
247 * used. Free retoid and retdata after use with ldap_memfree.
248 */
250 PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, PWCHAR *retoid,
251 struct WLDAP32_berval **retdata )
252{
254#ifdef HAVE_LDAP
255 char *oidU = NULL, *retoidU = NULL;
256 LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
257
259
260 TRACE( "(%p, %s, %p, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls,
261 clientctrls, retoid, retdata );
262
263 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
264
265 if (oid) {
266 oidU = strWtoU( oid );
267 if (!oidU) goto exit;
268 }
269 if (serverctrls) {
270 serverctrlsU = controlarrayWtoU( serverctrls );
271 if (!serverctrlsU) goto exit;
272 }
273 if (clientctrls) {
274 clientctrlsU = controlarrayWtoU( clientctrls );
275 if (!clientctrlsU) goto exit;
276 }
277
278 ret = map_error( ldap_extended_operation_s( ld, oid ? oidU : "", (struct berval *)data, serverctrlsU,
279 clientctrlsU, &retoidU, (struct berval **)retdata ));
280
281 if (retoid && retoidU) {
282 *retoid = strUtoW( retoidU );
283 if (!*retoid) ret = WLDAP32_LDAP_NO_MEMORY;
284 ldap_memfree( retoidU );
285 }
286
287exit:
288 strfreeU( oidU );
289 controlarrayfreeU( serverctrlsU );
290 controlarrayfreeU( clientctrlsU );
291
292#endif
293 return ret;
294}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define NULL
Definition: types.h:112
#define CDECL
Definition: compat.h:29
static UINT map_error(DWORD error)
Definition: service.c:35
void CDECL ldap_memfreeW(PWCHAR block)
Definition: misc.c:421
ULONG CDECL ldap_extended_operationA(WLDAP32_LDAP *ld, PCHAR oid, struct WLDAP32_berval *data, PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message)
Definition: extended.c:69
ULONG CDECL ldap_extended_operation_sA(WLDAP32_LDAP *ld, PCHAR oid, struct WLDAP32_berval *data, PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, PCHAR *retoid, struct WLDAP32_berval **retdata)
Definition: extended.c:178
ULONG CDECL ldap_extended_operationW(WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message)
Definition: extended.c:133
ULONG CDECL ldap_close_extended_op(WLDAP32_LDAP *ld, ULONG msgid)
Definition: extended.c:56
ULONG CDECL ldap_extended_operation_sW(WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, PWCHAR *retoid, struct WLDAP32_berval **retdata)
Definition: extended.c:249
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
static LPWSTR strAtoW(const char *str)
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
#define exit(n)
Definition: config.h:202
#define TRACE(s)
Definition: solgame.cpp:4
Definition: winber.h:32
Definition: tftpd.h:60
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
int ret
#define LDAPControl
Definition: winldap.h:620
#define ldap_memfree
Definition: winldap.h:688
#define ldap_extended_operation
Definition: winldap.h:656
#define ldap_extended_operation_s
Definition: winldap.h:655
@ WLDAP32_LDAP_PARAM_ERROR
@ WLDAP32_LDAP_NOT_SUPPORTED
@ WLDAP32_LDAP_SUCCESS
@ WLDAP32_LDAP_NO_MEMORY
static LPSTR strWtoA(LPCWSTR str)
Definition: wldap32.h:62
static void strfreeU(char *str)
Definition: wldap32.h:108
static void strfreeW(LPWSTR str)
Definition: wldap32.h:103
static char * strWtoU(LPCWSTR str)
Definition: wldap32.h:74
static LPWSTR strUtoW(char *str)
Definition: wldap32.h:86
__wchar_t WCHAR
Definition: xmlstorage.h:180