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
29 #include <wine/debug.h>
30 WINE_DEFAULT_DEBUG_CHANNEL(wldap32
);
33 # define LBER_ERROR (~0U)
36 /***********************************************************************
37 * ber_alloc_t (WLDAP32.@)
39 * Allocate a berelement structure.
42 * options [I] Must be LBER_USE_DER.
45 * Success: Pointer to an allocated berelement structure.
49 * Free the berelement structure with ber_free.
51 BerElement
* CDECL
WLDAP32_ber_alloc_t( INT options
)
54 return ber_alloc_t( options
);
61 /***********************************************************************
62 * ber_bvdup (WLDAP32.@)
64 * Copy a berval structure.
67 * berval [I] Pointer to the berval structure to be copied.
70 * Success: Pointer to a copy of the berval structure.
74 * Free the copy with ber_bvfree.
76 BERVAL
* CDECL
WLDAP32_ber_bvdup( BERVAL
*berval
)
79 return ber_bvdup( berval
);
86 /***********************************************************************
87 * ber_bvecfree (WLDAP32.@)
89 * Free an array of berval structures.
92 * berval [I] Pointer to an array of berval structures.
98 * Use this function only to free an array of berval structures
99 * returned by a call to ber_scanf with a 'V' in the format string.
101 void CDECL
WLDAP32_ber_bvecfree( PBERVAL
*berval
)
104 ber_bvecfree( berval
);
109 /***********************************************************************
110 * ber_bvfree (WLDAP32.@)
112 * Free a berval structure.
115 * berval [I] Pointer to a berval structure.
121 * Use this function only to free berval structures allocated by
124 void CDECL
WLDAP32_ber_bvfree( BERVAL
*berval
)
127 ber_bvfree( berval
);
132 /***********************************************************************
133 * ber_first_element (WLDAP32.@)
135 * Return the tag of the first element in a set or sequence.
138 * berelement [I] Pointer to a berelement structure.
139 * len [O] Receives the length of the first element.
140 * opaque [O] Receives a pointer to a cookie.
143 * Success: Tag of the first element.
144 * Failure: LBER_DEFAULT (no more data).
147 * len and cookie should be passed to ber_next_element.
149 ULONG CDECL
WLDAP32_ber_first_element( BerElement
*berelement
, ULONG
*len
, CHAR
**opaque
)
152 return ber_first_element( berelement
, len
, opaque
);
159 /***********************************************************************
160 * ber_flatten (WLDAP32.@)
162 * Flatten a berelement structure into a berval structure.
165 * berelement [I] Pointer to a berelement structure.
166 * berval [O] Pointer to a berval structure.
170 * Failure: LBER_ERROR
173 * Free the berval structure with ber_bvfree.
175 INT CDECL
WLDAP32_ber_flatten( BerElement
*berelement
, PBERVAL
*berval
)
178 return ber_flatten( berelement
, berval
);
185 /***********************************************************************
186 * ber_free (WLDAP32.@)
188 * Free a berelement structure.
191 * berelement [I] Pointer to the berelement structure to be freed.
198 * Set buf to 0 if the berelement was allocated with ldap_first_attribute
199 * or ldap_next_attribute, otherwise set it to 1.
201 void CDECL
WLDAP32_ber_free( BerElement
*berelement
, INT buf
)
204 ber_free( berelement
, buf
);
209 /***********************************************************************
210 * ber_init (WLDAP32.@)
212 * Initialise a berelement structure from a berval structure.
215 * berval [I] Pointer to a berval structure.
218 * Success: Pointer to a berelement structure.
222 * Call ber_free to free the returned berelement structure.
224 BerElement
* CDECL
WLDAP32_ber_init( BERVAL
*berval
)
227 return ber_init( berval
);
234 /***********************************************************************
235 * ber_next_element (WLDAP32.@)
237 * Return the tag of the next element in a set or sequence.
240 * berelement [I] Pointer to a berelement structure.
241 * len [I/O] Receives the length of the next element.
242 * opaque [I/O] Pointer to a cookie.
245 * Success: Tag of the next element.
246 * Failure: LBER_DEFAULT (no more data).
249 * len and cookie are initialized by ber_first_element and should
250 * be passed on in subsequent calls to ber_next_element.
252 ULONG CDECL
WLDAP32_ber_next_element( BerElement
*berelement
, ULONG
*len
, CHAR
*opaque
)
255 return ber_next_element( berelement
, len
, opaque
);
262 /***********************************************************************
263 * ber_peek_tag (WLDAP32.@)
265 * Return the tag of the next element.
268 * berelement [I] Pointer to a berelement structure.
269 * len [O] Receives the length of the next element.
272 * Success: Tag of the next element.
273 * Failure: LBER_DEFAULT (no more data).
275 ULONG CDECL
WLDAP32_ber_peek_tag( BerElement
*berelement
, ULONG
*len
)
278 return ber_peek_tag( berelement
, len
);
285 /***********************************************************************
286 * ber_skip_tag (WLDAP32.@)
288 * Skip the current tag and return the tag of the next element.
291 * berelement [I] Pointer to a berelement structure.
292 * len [O] Receives the length of the skipped element.
295 * Success: Tag of the next element.
296 * Failure: LBER_DEFAULT (no more data).
298 ULONG CDECL
WLDAP32_ber_skip_tag( BerElement
*berelement
, ULONG
*len
)
301 return ber_skip_tag( berelement
, len
);
308 /***********************************************************************
309 * ber_printf (WLDAP32.@)
311 * Encode a berelement structure.
314 * berelement [I/O] Pointer to a berelement structure.
315 * fmt [I] Format string.
316 * ... [I] Values to encode.
319 * Success: Non-negative number.
320 * Failure: LBER_ERROR
323 * berelement must have been allocated with ber_alloc_t. This function
324 * can be called multiple times to append data.
326 INT CDECL
WLDAP32_ber_printf( BerElement
*berelement
, PCHAR fmt
, ... )
334 __ms_va_start( list
, fmt
);
344 int i
= va_arg( list
, int );
345 ret
= ber_printf( berelement
, new_fmt
, i
);
351 char *str
= va_arg( list
, char * );
352 ret
= ber_printf( berelement
, new_fmt
, str
);
357 unsigned int tag
= va_arg( list
, unsigned int );
358 ret
= ber_printf( berelement
, new_fmt
, tag
);
363 char **array
= va_arg( list
, char ** );
364 ret
= ber_printf( berelement
, new_fmt
, array
);
369 struct berval
**array
= va_arg( list
, struct berval
** );
370 ret
= ber_printf( berelement
, new_fmt
, array
);
375 char *str
= va_arg( list
, char * );
376 int len
= va_arg( list
, int );
377 new_fmt
[0] = 'B'; /* 'X' is deprecated */
378 ret
= ber_printf( berelement
, new_fmt
, str
, len
);
386 ret
= ber_printf( berelement
, new_fmt
);
389 FIXME( "Unknown format '%c'\n", new_fmt
[0] );
393 if (ret
== -1) break;
403 /***********************************************************************
404 * ber_scanf (WLDAP32.@)
406 * Decode a berelement structure.
409 * berelement [I/O] Pointer to a berelement structure.
410 * fmt [I] Format string.
411 * ... [I] Pointers to values to be decoded.
414 * Success: Non-negative number.
415 * Failure: LBER_ERROR
418 * berelement must have been allocated with ber_init. This function
419 * can be called multiple times to decode data.
421 INT CDECL
WLDAP32_ber_scanf( BerElement
*berelement
, PCHAR fmt
, ... )
429 __ms_va_start( list
, fmt
);
437 char **ptr
= va_arg( list
, char ** );
438 ret
= ber_scanf( berelement
, new_fmt
, ptr
);
445 int *i
= va_arg( list
, int * );
446 ret
= ber_scanf( berelement
, new_fmt
, i
);
451 unsigned int *tag
= va_arg( list
, unsigned int * );
452 ret
= ber_scanf( berelement
, new_fmt
, tag
);
457 char ***array
= va_arg( list
, char *** );
458 ret
= ber_scanf( berelement
, new_fmt
, array
);
463 char **str
= va_arg( list
, char ** );
464 int *len
= va_arg( list
, int * );
465 ret
= ber_scanf( berelement
, new_fmt
, str
, len
);
470 struct berval
**ptr
= va_arg( list
, struct berval
** );
471 ret
= ber_scanf( berelement
, new_fmt
, ptr
);
476 struct berval
***array
= va_arg( list
, struct berval
*** );
477 ret
= ber_scanf( berelement
, new_fmt
, array
);
486 ret
= ber_scanf( berelement
, new_fmt
);
489 FIXME( "Unknown format '%c'\n", new_fmt
[0] );
493 if (ret
== -1) break;