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
;
94 if (!(bervalW
= bervalUtoW( bervalU
))) return WLDAP32_LBER_ERROR
;
95 ber_bvfree( bervalU
);
100 /***********************************************************************
101 * ber_free (WLDAP32.@)
103 void CDECL
WLDAP32_ber_free( WLDAP32_BerElement
*ber
, int freebuf
)
105 TRACE( "%p, %d\n", ber
, freebuf
);
106 ber_free( BER(ber
), freebuf
);
110 /***********************************************************************
111 * ber_init (WLDAP32.@)
113 WLDAP32_BerElement
* CDECL
WLDAP32_ber_init( BERVAL
*berval
)
115 struct berval
*bervalU
;
116 WLDAP32_BerElement
*ret
;
119 TRACE( "%p\n", berval
);
121 if (!(ret
= malloc( sizeof(*ret
) ))) return NULL
;
122 if (!(bervalU
= bervalWtoU( berval
)))
128 ber
= ber_init( bervalU
);
130 if ((ret
->opaque
= (char *)ber
)) return ret
;
135 /***********************************************************************
136 * ber_next_element (WLDAP32.@)
138 ULONG CDECL
WLDAP32_ber_next_element( WLDAP32_BerElement
*ber
, ULONG
*len
, char *opaque
)
140 TRACE( "%p, %p, %p\n", ber
, len
, opaque
);
141 return ber_next_element( BER(ber
), len
, opaque
);
144 /***********************************************************************
145 * ber_peek_tag (WLDAP32.@)
147 ULONG CDECL
WLDAP32_ber_peek_tag( WLDAP32_BerElement
*ber
, ULONG
*len
)
149 TRACE( "%p, %p\n", ber
, len
);
150 return ber_peek_tag( BER(ber
), len
);
153 /***********************************************************************
154 * ber_skip_tag (WLDAP32.@)
156 ULONG CDECL
WLDAP32_ber_skip_tag( WLDAP32_BerElement
*ber
, ULONG
*len
)
158 TRACE( "%p, %p\n", ber
, len
);
159 return ber_skip_tag( BER(ber
), len
);
162 /***********************************************************************
163 * ber_printf (WLDAP32.@)
165 int WINAPIV
WLDAP32_ber_printf( WLDAP32_BerElement
*ber
, char *fmt
, ... )
171 TRACE( "%p(%p), %s\n", ber
, ber
->opaque
, fmt
);
174 va_start( list
, fmt
);
184 int arg
= va_arg( list
, int );
185 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
191 char *arg
= va_arg( list
, char * );
192 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
197 unsigned int arg
= va_arg( list
, unsigned int );
198 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
203 char **arg
= va_arg( list
, char ** );
204 ret
= ber_printf( BER(ber
), new_fmt
, arg
);
209 struct WLDAP32_berval
**array
= va_arg( list
, struct WLDAP32_berval
** );
210 struct berval
**arrayU
;
211 if (!(arrayU
= bvarrayWtoU( array
)))
216 ret
= ber_printf( BER(ber
), new_fmt
, arrayU
);
217 bvarrayfreeU( arrayU
);
222 char *arg
= va_arg( list
, char * );
223 int arg2
= va_arg( list
, int );
224 new_fmt
[0] = 'B'; /* 'X' is deprecated */
225 ret
= ber_printf( BER(ber
), new_fmt
, arg
, arg2
);
233 ret
= ber_printf( BER(ber
), new_fmt
);
237 FIXME( "Unknown format '%c'\n", new_fmt
[0] );
241 if (ret
== -1) break;
247 /***********************************************************************
248 * ber_scanf (WLDAP32.@)
250 ULONG WINAPIV
WLDAP32_ber_scanf( WLDAP32_BerElement
*ber
, char *fmt
, ... )
256 TRACE( "%p, %s\n", ber
, fmt
);
259 va_start( list
, fmt
);
267 char *str
, **ptr
= va_arg( list
, char ** );
268 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &str
)) == -1) break;
269 *ptr
= strdup( str
);
277 int *arg
= va_arg( list
, int * );
278 ret
= ber_scanf( BER(ber
), new_fmt
, arg
);
283 unsigned int *arg
= va_arg( list
, unsigned int * );
284 ret
= ber_scanf( BER(ber
), new_fmt
, arg
);
289 char *str
, **arrayU
, **ptr
, ***array
= va_arg( list
, char *** );
290 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &arrayU
)) == -1) break;
291 *array
= strarrayUtoU( arrayU
);
298 ldap_memfree( arrayU
);
303 char *strU
, **str
= va_arg( list
, char ** );
304 int *len
= va_arg( list
, int * );
305 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &strU
, len
)) == -1) break;
306 *str
= malloc( *len
);
307 memcpy( *str
, strU
, *len
);
308 ldap_memfree( strU
);
313 struct WLDAP32_berval
**berval
= va_arg( list
, struct WLDAP32_berval
** );
314 struct berval
*bervalU
;
315 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &bervalU
)) == -1) break;
316 *berval
= bervalUtoW( bervalU
);
317 ber_bvfree( bervalU
);
322 struct WLDAP32_berval
***array
= va_arg( list
, struct WLDAP32_berval
*** );
323 struct berval
**arrayU
;
324 if ((ret
= ber_scanf( BER(ber
), new_fmt
, &arrayU
)) == -1) break;
325 *array
= bvarrayUtoW( arrayU
);
326 ber_bvecfree( arrayU
);
335 ret
= ber_scanf( BER(ber
), new_fmt
);
339 FIXME( "Unknown format '%c'\n", new_fmt
[0] );
343 if (ret
== -1) break;