ReactOS  0.4.15-dev-1197-g8081ba9
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;
61  return WLDAP32_LDAP_SUCCESS;
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 
99 exit:
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 
164 exit:
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 
216 exit:
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 
287 exit:
288  strfreeU( oidU );
289  controlarrayfreeU( serverctrlsU );
290  controlarrayfreeU( clientctrlsU );
291 
292 #endif
293  return ret;
294 }
signed char * PCHAR
Definition: retypes.h:7
Definition: tftpd.h:59
static char * strWtoU(LPCWSTR str)
Definition: wldap32.h:74
ULONG CDECL ldap_extended_operationA(WLDAP32_LDAP *ld, PCHAR oid, struct WLDAP32_berval *data, PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message)
Definition: extended.c:69
static void strfreeU(char *str)
Definition: wldap32.h:108
static void strfreeW(LPWSTR str)
Definition: wldap32.h:103
#define LDAPControl
Definition: winldap.h:620
ULONG CDECL ldap_extended_operationW(WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message)
Definition: extended.c:133
#define ldap_memfree
Definition: winldap.h:688
uint16_t * PWCHAR
Definition: typedefs.h:56
Definition: winber.h:32
static LPWSTR strUtoW(char *str)
Definition: wldap32.h:86
#define ldap_extended_operation_s
Definition: winldap.h:655
#define debugstr_w
Definition: kernel32.h:32
static LPSTR strWtoA(LPCWSTR str)
Definition: wldap32.h:62
smooth NULL
Definition: ftsmooth.c:416
WINE_DEFAULT_DEBUG_CHANNEL(wldap32)
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define debugstr_a
Definition: kernel32.h:31
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
int ret
static LPWSTR strAtoW(const char *str)
ULONG CDECL ldap_close_extended_op(WLDAP32_LDAP *ld, ULONG msgid)
Definition: extended.c:56
#define ldap_extended_operation
Definition: winldap.h:656
#define CDECL
Definition: compat.h:29
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
unsigned int ULONG
Definition: retypes.h:1
void CDECL ldap_memfreeW(PWCHAR block)
Definition: misc.c:421
static UINT map_error(DWORD error)
Definition: service.c:35
void exit(int exitcode)
Definition: _exit.c:33