ReactOS  0.4.14-dev-342-gdc047f9
add.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 #ifdef HAVE_LDAP
40 static LDAPMod *nullattrs[] = { NULL };
41 #endif
42 
43 /***********************************************************************
44  * ldap_addA (WLDAP32.@)
45  *
46  * See ldap_addW.
47  */
49 {
51 #ifdef HAVE_LDAP
52  WCHAR *dnW = NULL;
53  LDAPModW **attrsW = NULL;
54 
56 
57  TRACE( "(%p, %s, %p)\n", ld, debugstr_a(dn), attrs );
58 
59  if (!ld) return ~0u;
60 
61  if (dn) {
62  dnW = strAtoW( dn );
63  if (!dnW) goto exit;
64  }
65  if (attrs) {
66  attrsW = modarrayAtoW( attrs );
67  if (!attrsW) goto exit;
68  }
69 
70  ret = ldap_addW( ld, dnW, attrsW );
71 
72 exit:
73  strfreeW( dnW );
74  modarrayfreeW( attrsW );
75 
76 #endif
77  return ret;
78 }
79 
80 /***********************************************************************
81  * ldap_addW (WLDAP32.@)
82  *
83  * Add an entry to a directory tree (asynchronous operation).
84  *
85  * PARAMS
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.
90  *
91  * RETURNS
92  * Success: Message ID of the add operation.
93  * Failure: An LDAP error code.
94  *
95  * NOTES
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.
99  */
101 {
103 #ifdef HAVE_LDAP
104  char *dnU = NULL;
105  LDAPMod **attrsU = NULL;
106  int msg;
107 
109 
110  TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), attrs );
111 
112  if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
113 
114  if (dn) {
115  dnU = strWtoU( dn );
116  if (!dnU) goto exit;
117  }
118  if (attrs) {
119  attrsU = modarrayWtoU( attrs );
120  if (!attrsU) goto exit;
121  }
122 
123  ret = ldap_add_ext( ld, dn ? dnU : "", attrs ? attrsU : nullattrs, NULL, NULL, &msg );
124 
125  if (ret == LDAP_SUCCESS)
126  ret = msg;
127  else
128  ret = ~0u;
129 
130 exit:
131  strfreeU( dnU );
132  modarrayfreeU( attrsU );
133 
134 #endif
135  return ret;
136 }
137 
138 /***********************************************************************
139  * ldap_add_extA (WLDAP32.@)
140  *
141  * See ldap_add_extW.
142  */
144  PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message )
145 {
147 #ifdef HAVE_LDAP
148  WCHAR *dnW = NULL;
149  LDAPModW **attrsW = NULL;
150  LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
151 
153 
154  TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_a(dn), attrs,
155  serverctrls, clientctrls, message );
156 
157  if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
158 
159  if (dn) {
160  dnW = strAtoW( dn );
161  if (!dnW) goto exit;
162  }
163  if (attrs) {
164  attrsW = modarrayAtoW( attrs );
165  if (!attrsW) goto exit;
166  }
167  if (serverctrls) {
168  serverctrlsW = controlarrayAtoW( serverctrls );
169  if (!serverctrlsW) goto exit;
170  }
171  if (clientctrls) {
172  clientctrlsW = controlarrayAtoW( clientctrls );
173  if (!clientctrlsW) goto exit;
174  }
175 
176  ret = ldap_add_extW( ld, dnW, attrsW, serverctrlsW, clientctrlsW, message );
177 
178 exit:
179  strfreeW( dnW );
180  modarrayfreeW( attrsW );
181  controlarrayfreeW( serverctrlsW );
182  controlarrayfreeW( clientctrlsW );
183 
184 #endif
185  return ret;
186 }
187 
188 /***********************************************************************
189  * ldap_add_extW (WLDAP32.@)
190  *
191  * Add an entry to a directory tree (asynchronous operation).
192  *
193  * PARAMS
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.
201  *
202  * RETURNS
203  * Success: LDAP_SUCCESS
204  * Failure: An LDAP error code.
205  *
206  * NOTES
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.
210  */
212  PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message )
213 {
215 #ifdef HAVE_LDAP
216  char *dnU = NULL;
217  LDAPMod **attrsU = NULL;
218  LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
219  int dummy;
220 
222 
223  TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn), attrs,
224  serverctrls, clientctrls, message );
225 
226  if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
227 
228  if (dn) {
229  dnU = strWtoU( dn );
230  if (!dnU) goto exit;
231  }
232  if (attrs) {
233  attrsU = modarrayWtoU( attrs );
234  if (!attrsU) goto exit;
235  }
236  if (serverctrls) {
237  serverctrlsU = controlarrayWtoU( serverctrls );
238  if (!serverctrlsU) goto exit;
239  }
240  if (clientctrls) {
241  clientctrlsU = controlarrayWtoU( clientctrls );
242  if (!clientctrlsU) goto exit;
243  }
244 
245  ret = map_error( ldap_add_ext( ld, dn ? dnU : "", attrs ? attrsU : nullattrs, serverctrlsU,
246  clientctrlsU, message ? (int *)message : &dummy ));
247 
248 exit:
249  strfreeU( dnU );
250  modarrayfreeU( attrsU );
251  controlarrayfreeU( serverctrlsU );
252  controlarrayfreeU( clientctrlsU );
253 
254 #endif
255  return ret;
256 }
257 
258 /***********************************************************************
259  * ldap_add_ext_sA (WLDAP32.@)
260  *
261  * See ldap_add_ext_sW.
262  */
264  PLDAPControlA *serverctrls, PLDAPControlA *clientctrls )
265 {
267 #ifdef HAVE_LDAP
268  WCHAR *dnW = NULL;
269  LDAPModW **attrsW = NULL;
270  LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
271 
273 
274  TRACE( "(%p, %s, %p, %p, %p)\n", ld, debugstr_a(dn), attrs,
275  serverctrls, clientctrls );
276 
277  if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
278 
279  if (dn) {
280  dnW = strAtoW( dn );
281  if (!dnW) goto exit;
282  }
283  if (attrs) {
284  attrsW = modarrayAtoW( attrs );
285  if (!attrsW) goto exit;
286  }
287  if (serverctrls) {
288  serverctrlsW = controlarrayAtoW( serverctrls );
289  if (!serverctrlsW) goto exit;
290  }
291  if (clientctrls) {
292  clientctrlsW = controlarrayAtoW( clientctrls );
293  if (!clientctrlsW) goto exit;
294  }
295 
296  ret = ldap_add_ext_sW( ld, dnW, attrsW, serverctrlsW, clientctrlsW );
297 
298 exit:
299  strfreeW( dnW );
300  modarrayfreeW( attrsW );
301  controlarrayfreeW( serverctrlsW );
302  controlarrayfreeW( clientctrlsW );
303 
304 #endif
305  return ret;
306 }
307 
308 /***********************************************************************
309  * ldap_add_ext_sW (WLDAP32.@)
310  *
311  * Add an entry to a directory tree (synchronous operation).
312  *
313  * PARAMS
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.
320  *
321  * RETURNS
322  * Success: LDAP_SUCCESS
323  * Failure: An LDAP error code.
324  *
325  * NOTES
326  * The serverctrls and clientctrls parameters are optional and
327  * should be set to NULL if not used.
328  */
330  PLDAPControlW *serverctrls, PLDAPControlW *clientctrls )
331 {
333 #ifdef HAVE_LDAP
334  char *dnU = NULL;
335  LDAPMod **attrsU = NULL;
336  LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
337 
339 
340  TRACE( "(%p, %s, %p, %p, %p)\n", ld, debugstr_w(dn), attrs,
341  serverctrls, clientctrls );
342 
343  if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
344 
345  if (dn) {
346  dnU = strWtoU( dn );
347  if (!dnU) goto exit;
348  }
349  if (attrs) {
350  attrsU = modarrayWtoU( attrs );
351  if (!attrsU) goto exit;
352  }
353  if (serverctrls) {
354  serverctrlsU = controlarrayWtoU( serverctrls );
355  if (!serverctrlsU) goto exit;
356  }
357  if (clientctrls) {
358  clientctrlsU = controlarrayWtoU( clientctrls );
359  if (!clientctrlsU) goto exit;
360  }
361 
362  ret = map_error( ldap_add_ext_s( ld, dn ? dnU : "", attrs ? attrsU : nullattrs,
363  serverctrlsU, clientctrlsU ));
364 
365 exit:
366  strfreeU( dnU );
367  modarrayfreeU( attrsU );
368  controlarrayfreeU( serverctrlsU );
369  controlarrayfreeU( clientctrlsU );
370 
371 #endif
372  return ret;
373 }
374 
375 /***********************************************************************
376  * ldap_add_sA (WLDAP32.@)
377  *
378  * See ldap_add_sW.
379  */
381 {
383 #ifdef HAVE_LDAP
384  WCHAR *dnW = NULL;
385  LDAPModW **attrsW = NULL;
386 
388 
389  TRACE( "(%p, %s, %p)\n", ld, debugstr_a(dn), attrs );
390 
391  if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
392 
393  if (dn) {
394  dnW = strAtoW( dn );
395  if (!dnW) goto exit;
396  }
397  if (attrs) {
398  attrsW = modarrayAtoW( attrs );
399  if (!attrsW) goto exit;
400  }
401 
402  ret = ldap_add_sW( ld, dnW, attrsW );
403 
404 exit:
405  strfreeW( dnW );
406  modarrayfreeW( attrsW );
407 
408 #endif
409  return ret;
410 }
411 
412 /***********************************************************************
413  * ldap_add_sW (WLDAP32.@)
414  *
415  * Add an entry to a directory tree (synchronous operation).
416  *
417  * PARAMS
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.
422  *
423  * RETURNS
424  * Success: LDAP_SUCCESS
425  * Failure: An LDAP error code.
426  */
428 {
430 #ifdef HAVE_LDAP
431  char *dnU = NULL;
432  LDAPMod **attrsU = NULL;
433 
435 
436  TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), attrs );
437 
438  if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
439 
440  if (dn) {
441  dnU = strWtoU( dn );
442  if (!dnU) goto exit;
443  }
444  if (attrs) {
445  attrsU = modarrayWtoU( attrs );
446  if (!attrsU) goto exit;
447  }
448 
449  ret = map_error( ldap_add_ext_s( ld, dn ? dnU : "", attrs ? attrsU : nullattrs, NULL, NULL ));
450 
451 exit:
452  strfreeU( dnU );
453  modarrayfreeU( attrsU );
454 
455 #endif
456  return ret;
457 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
signed char * PCHAR
Definition: retypes.h:7
Definition: tftpd.h:59
static char * strWtoU(LPCWSTR str)
Definition: wldap32.h:74
ULONG CDECL ldap_add_ext_sA(WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *attrs[], PLDAPControlA *serverctrls, PLDAPControlA *clientctrls)
Definition: add.c:263
static void strfreeU(char *str)
Definition: wldap32.h:108
static void strfreeW(LPWSTR str)
Definition: wldap32.h:103
#define LDAPControl
Definition: winldap.h:620
#define ldap_add_ext_s
Definition: winldap.h:646
ULONG CDECL ldap_add_ext_sW(WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *attrs[], PLDAPControlW *serverctrls, PLDAPControlW *clientctrls)
Definition: add.c:329
uint16_t * PWCHAR
Definition: typedefs.h:54
ULONG CDECL ldap_addA(WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *attrs[])
Definition: add.c:48
#define debugstr_w
Definition: kernel32.h:32
smooth NULL
Definition: ftsmooth.c:416
ULONG CDECL ldap_addW(WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *attrs[])
Definition: add.c:100
ULONG CDECL ldap_add_extA(WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *attrs[], PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message)
Definition: add.c:143
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define debugstr_a
Definition: kernel32.h:31
ULONG CDECL ldap_add_sW(WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *attrs[])
Definition: add.c:427
#define ldap_add_ext
Definition: winldap.h:644
int ret
static LPWSTR strAtoW(const char *str)
ULONG CDECL ldap_add_extW(WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *attrs[], PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message)
Definition: add.c:211
#define CDECL
Definition: compat.h:21
unsigned char dummy
Definition: maze.c:118
#define LDAP_SUCCESS
Definition: winldap.h:59
#define msg(x)
Definition: auth_time.c:54
WINE_DEFAULT_DEBUG_CHANNEL(wldap32)
unsigned int ULONG
Definition: retypes.h:1
static UINT map_error(DWORD error)
Definition: service.c:36
void exit(int exitcode)
Definition: _exit.c:33
ULONG CDECL ldap_add_sA(WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *attrs[])
Definition: add.c:380
#define LDAPMod
Definition: winldap.h:622