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
27 #include "wine/debug.h"
28 #include "winldap_private.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(wldap32
);
32 /***********************************************************************
33 * ber_alloc_t (WLDAP32.@)
35 WLDAP32_BerElement
* CDECL
WLDAP32_ber_alloc_t( int options
)
37 WLDAP32_BerElement
*ret
;
39 TRACE( "%d\n", options
);
41 if (options
!= WLDAP32_LBER_USE_DER
|| !(ret
= malloc( sizeof(*ret
) ))) return NULL
;
42 if ((ret
->opaque
= (char *)ber_alloc_t( options
))) return ret
;
47 /***********************************************************************
48 * ber_bvdup (WLDAP32.@)
50 BERVAL
* CDECL
WLDAP32_ber_bvdup( BERVAL
*berval
)
52 TRACE( "%p\n", berval
);
53 return bervalWtoW( berval
);
56 /***********************************************************************
57 * ber_bvecfree (WLDAP32.@)
59 void CDECL
WLDAP32_ber_bvecfree( BERVAL
**berval
)
61 TRACE( "%p\n", berval
);
62 bvarrayfreeW( berval
);
65 /***********************************************************************
66 * ber_bvfree (WLDAP32.@)
68 void CDECL
WLDAP32_ber_bvfree( BERVAL
*berval
)
74 /***********************************************************************
75 * ber_first_element (WLDAP32.@)
77 ULONG CDECL
WLDAP32_ber_first_element( WLDAP32_BerElement
*ber
, ULONG
*len
, char **opaque
)
79 TRACE( "%p, %p, %p\n", ber
, len
, opaque
);
80 return ber_first_element( BER(ber
), len
, opaque
);
83 /***********************************************************************
84 * ber_flatten (WLDAP32.@)
86 int CDECL
WLDAP32_ber_flatten( WLDAP32_BerElement
*ber
, BERVAL
**berval
)
88 struct berval
*bervalU
;
89 struct WLDAP32_berval
*bervalW
;
91 TRACE( "%p, %p\n", ber
, berval
);
93 if (ber_flatten( BER(ber
), &bervalU
)) return WLDAP32_LBER_ERROR
;
95 bervalW
= bervalUtoW( bervalU
);
96 ber_bvfree( bervalU
);
98 return WLDAP32_LBER_ERROR
;
104 /***********************************************************************
105 * ber_free (WLDAP32.@)
107 void CDECL
WLDAP32_ber_free( WLDAP32_BerElement
*ber
, int freebuf
)
109 TRACE( "%p, %d\n", ber
, freebuf
);
110 ber_free( BER(ber
), freebuf
);
114 /***********************************************************************
115 * ber_init (WLDAP32.@)
117 WLDAP32_BerElement
* CDECL
WLDAP32_ber_init( BERVAL
*berval
)
119 struct berval
*bervalU
;
120 WLDAP32_BerElement
*ret
;
123 TRACE( "%p\n", berval
);
125 if (!(ret
= malloc( sizeof(*ret
) ))) return NULL
;
126 if (!(bervalU
= bervalWtoU( berval
)))
132 ber
= ber_init( bervalU
);
134 if ((ret
->opaque
= (char *)ber
)) return ret
;
139 /***********************************************************************
140 * ber_next_element (WLDAP32.@)
142 ULONG CDECL
WLDAP32_ber_next_element( WLDAP32_BerElement
*ber
, ULONG
*len
, char *opaque
)
144 TRACE( "%p, %p, %p\n", ber
, len
, opaque
);
145 return ber_next_element( BER(ber
), len
, opaque
);
148 /***********************************************************************
149 * ber_peek_tag (WLDAP32.@)
151 ULONG CDECL
WLDAP32_ber_peek_tag( WLDAP32_BerElement
*ber
, ULONG
*len
)
153 TRACE( "%p, %p\n", ber
, len
);
154 return ber_peek_tag( BER(ber
), len
);
157 /***********************************************************************
158 * ber_skip_tag (WLDAP32.@)
160 ULONG CDECL
WLDAP32_ber_skip_tag( WLDAP32_BerElement
*ber
, ULONG
*len
)
162 TRACE( "%p, %p\n", ber
, len
);
163 return ber_skip_tag( BER(ber
), len
);
166 /***********************************************************************
167 * ber_printf (WLDAP32.@)
169 int WINAPIV
WLDAP32_ber_printf( WLDAP32_BerElement
*ber
, char *fmt
, ... )
175 TRACE( "%p(%p), %s\n", ber
, ber
->opaque
, fmt
);
178 va_start( list
, fmt
);
188 int arg
= va_arg( list
, int );
189 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
195 char *arg
= va_arg( list
, char * );
196 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
201 unsigned int arg
= va_arg( list
, unsigned int );
202 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
207 char **arg
= va_arg( list
, char ** );
208 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
213 struct WLDAP32_berval
**array
= va_arg( list
, struct WLDAP32_berval
** );
214 struct berval
**arrayU
;
215 if (!(arrayU
= bvarrayWtoU( array
)))
220 ret
= ber_printf( BER(ber
), new_fmt
, arrayU
);
221 bvarrayfreeU( arrayU
);
226 char *arg
= va_arg( list
, char * );
227 int arg2
= va_arg( list
, int );
228 new_fmt
[0] = 'B'; /* 'X' is deprecated */
229 ret
= ber_printf( BER(ber
), new_fmt
, arg
, arg2
);
237 ret
= ber_printf( BER(ber
), new_fmt
);
241 FIXME( "Unknown format '%c'\n", new_fmt
[0] );
245 if (ret
== -1) break;
251 /***********************************************************************
252 * ber_scanf (WLDAP32.@)
254 ULONG WINAPIV
WLDAP32_ber_scanf( WLDAP32_BerElement
*ber
, char *fmt
, ... )
260 TRACE( "%p, %s\n", ber
, fmt
);
263 va_start( list
, fmt
);
271 char *str
, **ptr
= va_arg( list
, char ** );
272 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &str
)) == -1) break;
273 *ptr
= strdup( str
);
281 int *arg
= va_arg( list
, int * );
282 ret
= ber_scanf( BER(ber
), new_fmt
, arg
);
287 unsigned int *arg
= va_arg( list
, unsigned int * );
288 ret
= ber_scanf( BER(ber
), new_fmt
, arg
);
293 char *str
, **arrayU
, **ptr
, ***array
= va_arg( list
, char *** );
294 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &arrayU
)) == -1) break;
295 *array
= strarrayUtoU( arrayU
);
302 ldap_memfree( arrayU
);
307 char *strU
, **str
= va_arg( list
, char ** );
308 int *len
= va_arg( list
, int * );
309 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &strU
, len
)) == -1) break;
310 *str
= malloc( *len
);
311 memcpy( *str
, strU
, *len
);
312 ldap_memfree( strU
);
317 struct WLDAP32_berval
**berval
= va_arg( list
, struct WLDAP32_berval
** );
318 struct berval
*bervalU
;
319 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &bervalU
)) == -1) break;
320 *berval
= bervalUtoW( bervalU
);
321 ber_bvfree( bervalU
);
326 struct WLDAP32_berval
***array
= va_arg( list
, struct WLDAP32_berval
*** );
327 struct berval
**arrayU
;
328 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &arrayU
)) == -1) break;
329 *array
= bvarrayUtoW( arrayU
);
330 ber_bvecfree( arrayU
);
339 ret
= ber_scanf( BER(ber
), new_fmt
);
343 FIXME( "Unknown format '%c'\n", new_fmt
[0] );
347 if (ret
== -1) break;