wldap32: Use CRT memory allocators.
[wine.git] / dlls / wldap32 / option.c
blobf307837d83a4ce1d52e744229c6753477c40d546
1 /*
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
21 #include <stdarg.h>
22 #include "windef.h"
23 #include "winbase.h"
24 #include "winnls.h"
26 #include "wine/debug.h"
27 #include "winldap_private.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
31 /***********************************************************************
32 * ldap_get_optionA (WLDAP32.@)
34 * See ldap_get_optionW.
36 ULONG CDECL ldap_get_optionA( WLDAP32_LDAP *ld, int option, void *value )
38 ULONG ret;
40 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value );
42 if (!ld || !value) return WLDAP32_LDAP_PARAM_ERROR;
44 switch (option)
46 case WLDAP32_LDAP_OPT_API_FEATURE_INFO:
48 LDAPAPIFeatureInfoW featureW;
49 LDAPAPIFeatureInfoA *featureA = value;
51 if (!featureA->ldapaif_name) return WLDAP32_LDAP_PARAM_ERROR;
53 featureW.ldapaif_info_version = featureA->ldapaif_info_version;
54 if (!(featureW.ldapaif_name = strAtoW( featureA->ldapaif_name ))) return WLDAP32_LDAP_NO_MEMORY;
55 featureW.ldapaif_version = 0;
57 ret = ldap_get_optionW( ld, option, &featureW );
59 if (ret == WLDAP32_LDAP_SUCCESS) featureA->ldapaif_version = featureW.ldapaif_version;
60 free( featureW.ldapaif_name );
61 return ret;
63 case WLDAP32_LDAP_OPT_API_INFO:
65 LDAPAPIInfoW infoW;
66 LDAPAPIInfoA *infoA = value;
68 memset( &infoW, 0, sizeof(infoW) );
69 infoW.ldapai_info_version = infoA->ldapai_info_version;
71 ret = ldap_get_optionW( ld, option, &infoW );
72 if (ret == WLDAP32_LDAP_SUCCESS)
74 infoA->ldapai_api_version = infoW.ldapai_api_version;
75 infoA->ldapai_protocol_version = infoW.ldapai_protocol_version;
77 if (infoW.ldapai_extensions && !(infoA->ldapai_extensions = strarrayWtoA( infoW.ldapai_extensions )))
78 return WLDAP32_LDAP_NO_MEMORY;
79 if (infoW.ldapai_vendor_name && !(infoA->ldapai_vendor_name = strWtoA( infoW.ldapai_vendor_name )))
81 ldap_value_freeW( infoW.ldapai_extensions );
82 return WLDAP32_LDAP_NO_MEMORY;
84 infoA->ldapai_vendor_version = infoW.ldapai_vendor_version;
86 ldap_value_freeW( infoW.ldapai_extensions );
87 ldap_memfreeW( infoW.ldapai_vendor_name );
89 return ret;
92 case WLDAP32_LDAP_OPT_DEREF:
93 case WLDAP32_LDAP_OPT_DESC:
94 case WLDAP32_LDAP_OPT_ERROR_NUMBER:
95 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION:
96 case WLDAP32_LDAP_OPT_REFERRALS:
97 case WLDAP32_LDAP_OPT_SIZELIMIT:
98 case WLDAP32_LDAP_OPT_TIMELIMIT:
99 return ldap_get_optionW( ld, option, value );
101 case WLDAP32_LDAP_OPT_CACHE_ENABLE:
102 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS:
103 case WLDAP32_LDAP_OPT_CACHE_STRATEGY:
104 case WLDAP32_LDAP_OPT_IO_FN_PTRS:
105 case WLDAP32_LDAP_OPT_REBIND_ARG:
106 case WLDAP32_LDAP_OPT_REBIND_FN:
107 case WLDAP32_LDAP_OPT_RESTART:
108 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS:
109 return WLDAP32_LDAP_LOCAL_ERROR;
111 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE:
112 case WLDAP32_LDAP_OPT_AUTO_RECONNECT:
113 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE:
114 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME:
115 case WLDAP32_LDAP_OPT_ENCRYPT:
116 case WLDAP32_LDAP_OPT_ERROR_STRING:
117 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND:
118 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS:
119 case WLDAP32_LDAP_OPT_HOST_NAME:
120 case WLDAP32_LDAP_OPT_HOST_REACHABLE:
121 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE:
122 case WLDAP32_LDAP_OPT_PING_LIMIT:
123 case WLDAP32_LDAP_OPT_PING_WAIT_TIME:
124 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS:
125 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG:
126 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK:
127 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT:
128 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE:
129 case WLDAP32_LDAP_OPT_SASL_METHOD:
130 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT:
131 case WLDAP32_LDAP_OPT_SEND_TIMEOUT:
132 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE:
133 case WLDAP32_LDAP_OPT_SERVER_CONTROLS:
134 case WLDAP32_LDAP_OPT_SERVER_ERROR:
135 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR:
136 case WLDAP32_LDAP_OPT_SIGN:
137 case WLDAP32_LDAP_OPT_SSL:
138 case WLDAP32_LDAP_OPT_SSL_INFO:
139 case WLDAP32_LDAP_OPT_SSPI_FLAGS:
140 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE:
141 FIXME( "Unsupported option: 0x%02x\n", option );
142 return WLDAP32_LDAP_NOT_SUPPORTED;
144 default:
145 FIXME( "Unknown option: 0x%02x\n", option );
146 return WLDAP32_LDAP_LOCAL_ERROR;
150 /***********************************************************************
151 * ldap_get_optionW (WLDAP32.@)
153 * Retrieve option values for a given LDAP context.
155 * PARAMS
156 * ld [I] Pointer to an LDAP context.
157 * option [I] Option to get values for.
158 * value [O] Pointer to option values.
160 * RETURNS
161 * Success: LDAP_SUCCESS
162 * Failure: An LDAP error code.
164 ULONG CDECL ldap_get_optionW( WLDAP32_LDAP *ld, int option, void *value )
166 ULONG ret;
168 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value );
170 if (!ld || !value) return WLDAP32_LDAP_PARAM_ERROR;
172 switch (option)
174 case WLDAP32_LDAP_OPT_API_FEATURE_INFO:
176 LDAPAPIFeatureInfoU featureU;
177 LDAPAPIFeatureInfoW *featureW = value;
179 if (!featureW->ldapaif_name) return WLDAP32_LDAP_PARAM_ERROR;
181 featureU.ldapaif_info_version = featureW->ldapaif_info_version;
182 if (!(featureU.ldapaif_name = strWtoU( featureW->ldapaif_name ))) return WLDAP32_LDAP_NO_MEMORY;
183 featureU.ldapaif_version = 0;
185 ret = map_error( ldap_funcs->ldap_get_option( ld->ld, option, &featureU ) );
187 if (ret == WLDAP32_LDAP_SUCCESS) featureW->ldapaif_version = featureU.ldapaif_version;
188 free( featureU.ldapaif_name );
189 return ret;
191 case WLDAP32_LDAP_OPT_API_INFO:
193 LDAPAPIInfoU infoU;
194 LDAPAPIInfoW *infoW = value;
196 memset( &infoU, 0, sizeof(infoU) );
197 infoU.ldapai_info_version = infoW->ldapai_info_version;
199 ret = map_error( ldap_funcs->ldap_get_option( ld->ld, option, &infoU ) );
200 if (ret == WLDAP32_LDAP_SUCCESS)
202 infoW->ldapai_api_version = infoU.ldapai_api_version;
203 infoW->ldapai_protocol_version = infoU.ldapai_protocol_version;
205 if (infoU.ldapai_extensions && !(infoW->ldapai_extensions = strarrayUtoW( infoU.ldapai_extensions )))
206 return WLDAP32_LDAP_NO_MEMORY;
207 if (infoU.ldapai_vendor_name && !(infoW->ldapai_vendor_name = strUtoW( infoU.ldapai_vendor_name )))
209 ldap_funcs->ldap_memvfree( (void **)infoU.ldapai_extensions );
210 return WLDAP32_LDAP_NO_MEMORY;
212 infoW->ldapai_vendor_version = infoU.ldapai_vendor_version;
214 ldap_funcs->ldap_memvfree( (void **)infoU.ldapai_extensions );
215 ldap_funcs->ldap_memfree( infoU.ldapai_vendor_name );
217 return ret;
220 case WLDAP32_LDAP_OPT_DEREF:
221 case WLDAP32_LDAP_OPT_DESC:
222 case WLDAP32_LDAP_OPT_ERROR_NUMBER:
223 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION:
224 case WLDAP32_LDAP_OPT_REFERRALS:
225 case WLDAP32_LDAP_OPT_SIZELIMIT:
226 case WLDAP32_LDAP_OPT_TIMELIMIT:
227 return map_error( ldap_funcs->ldap_get_option( ld->ld, option, value ));
229 case WLDAP32_LDAP_OPT_CACHE_ENABLE:
230 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS:
231 case WLDAP32_LDAP_OPT_CACHE_STRATEGY:
232 case WLDAP32_LDAP_OPT_IO_FN_PTRS:
233 case WLDAP32_LDAP_OPT_REBIND_ARG:
234 case WLDAP32_LDAP_OPT_REBIND_FN:
235 case WLDAP32_LDAP_OPT_RESTART:
236 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS:
237 return WLDAP32_LDAP_LOCAL_ERROR;
239 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE:
240 case WLDAP32_LDAP_OPT_AUTO_RECONNECT:
241 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE:
242 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME:
243 case WLDAP32_LDAP_OPT_ENCRYPT:
244 case WLDAP32_LDAP_OPT_ERROR_STRING:
245 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND:
246 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS:
247 case WLDAP32_LDAP_OPT_HOST_NAME:
248 case WLDAP32_LDAP_OPT_HOST_REACHABLE:
249 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE:
250 case WLDAP32_LDAP_OPT_PING_LIMIT:
251 case WLDAP32_LDAP_OPT_PING_WAIT_TIME:
252 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS:
253 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG:
254 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK:
255 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT:
256 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE:
257 case WLDAP32_LDAP_OPT_SASL_METHOD:
258 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT:
259 case WLDAP32_LDAP_OPT_SEND_TIMEOUT:
260 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE:
261 case WLDAP32_LDAP_OPT_SERVER_CONTROLS:
262 case WLDAP32_LDAP_OPT_SERVER_ERROR:
263 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR:
264 case WLDAP32_LDAP_OPT_SIGN:
265 case WLDAP32_LDAP_OPT_SSL:
266 case WLDAP32_LDAP_OPT_SSL_INFO:
267 case WLDAP32_LDAP_OPT_SSPI_FLAGS:
268 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE:
269 FIXME( "Unsupported option: 0x%02x\n", option );
270 return WLDAP32_LDAP_NOT_SUPPORTED;
272 default:
273 FIXME( "Unknown option: 0x%02x\n", option );
274 return WLDAP32_LDAP_LOCAL_ERROR;
278 /***********************************************************************
279 * ldap_set_optionA (WLDAP32.@)
281 * See ldap_set_optionW.
283 ULONG CDECL ldap_set_optionA( WLDAP32_LDAP *ld, int option, void *value )
285 ULONG ret;
287 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value );
289 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
291 switch (option)
293 case WLDAP32_LDAP_OPT_SERVER_CONTROLS:
295 LDAPControlW **ctrlsW;
296 if (!(ctrlsW = controlarrayAtoW( value ))) return WLDAP32_LDAP_NO_MEMORY;
297 ret = ldap_set_optionW( ld, option, ctrlsW );
298 controlarrayfreeW( ctrlsW );
299 return ret;
301 case WLDAP32_LDAP_OPT_DEREF:
302 case WLDAP32_LDAP_OPT_DESC:
303 case WLDAP32_LDAP_OPT_ERROR_NUMBER:
304 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION:
305 case WLDAP32_LDAP_OPT_REFERRALS:
306 case WLDAP32_LDAP_OPT_SIZELIMIT:
307 case WLDAP32_LDAP_OPT_TIMELIMIT:
308 return ldap_set_optionW( ld, option, value );
310 case WLDAP32_LDAP_OPT_CACHE_ENABLE:
311 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS:
312 case WLDAP32_LDAP_OPT_CACHE_STRATEGY:
313 case WLDAP32_LDAP_OPT_IO_FN_PTRS:
314 case WLDAP32_LDAP_OPT_REBIND_ARG:
315 case WLDAP32_LDAP_OPT_REBIND_FN:
316 case WLDAP32_LDAP_OPT_RESTART:
317 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS:
318 return WLDAP32_LDAP_LOCAL_ERROR;
320 case WLDAP32_LDAP_OPT_API_FEATURE_INFO:
321 case WLDAP32_LDAP_OPT_API_INFO:
322 return WLDAP32_LDAP_UNWILLING_TO_PERFORM;
324 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE:
325 case WLDAP32_LDAP_OPT_AUTO_RECONNECT:
326 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE:
327 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME:
328 case WLDAP32_LDAP_OPT_ENCRYPT:
329 case WLDAP32_LDAP_OPT_ERROR_STRING:
330 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND:
331 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS:
332 case WLDAP32_LDAP_OPT_HOST_NAME:
333 case WLDAP32_LDAP_OPT_HOST_REACHABLE:
334 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE:
335 case WLDAP32_LDAP_OPT_PING_LIMIT:
336 case WLDAP32_LDAP_OPT_PING_WAIT_TIME:
337 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS:
338 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG:
339 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK:
340 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT:
341 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE:
342 case WLDAP32_LDAP_OPT_SASL_METHOD:
343 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT:
344 case WLDAP32_LDAP_OPT_SEND_TIMEOUT:
345 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE:
346 case WLDAP32_LDAP_OPT_SERVER_ERROR:
347 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR:
348 case WLDAP32_LDAP_OPT_SIGN:
349 case WLDAP32_LDAP_OPT_SSL:
350 case WLDAP32_LDAP_OPT_SSL_INFO:
351 case WLDAP32_LDAP_OPT_SSPI_FLAGS:
352 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE:
353 FIXME( "Unsupported option: 0x%02x\n", option );
354 return WLDAP32_LDAP_NOT_SUPPORTED;
356 default:
357 FIXME( "Unknown option: 0x%02x\n", option );
358 return WLDAP32_LDAP_LOCAL_ERROR;
362 static BOOL query_supported_server_ctrls( WLDAP32_LDAP *ld )
364 char *attrs[] = { (char *)"supportedControl", NULL };
365 void *res, *entry;
366 ULONG ret;
368 if (ld->ld_server_ctrls) return TRUE;
370 ret = map_error( ldap_funcs->ldap_search_ext_s( ld->ld, (char *)"", WLDAP32_LDAP_SCOPE_BASE,
371 (char *)"(objectClass=*)", attrs, FALSE, NULL, NULL, NULL, 0, &res ) );
372 if (ret != WLDAP32_LDAP_SUCCESS) return FALSE;
374 entry = ldap_funcs->ldap_first_entry( ld->ld, res );
375 if (entry)
377 ULONG count, i;
379 ld->ld_server_ctrls = ldap_funcs->ldap_get_values_len( ld->ld, entry, attrs[0] );
380 count = ldap_funcs->ldap_count_values_len( ld->ld_server_ctrls );
381 for (i = 0; i < count; i++)
382 TRACE("%u: %s\n", i, debugstr_an( ld->ld_server_ctrls[i]->bv_val, ld->ld_server_ctrls[i]->bv_len ));
385 ldap_funcs->ldap_msgfree( res );
387 return ld->ld_server_ctrls != NULL;
390 static BOOL is_supported_server_ctrls( WLDAP32_LDAP *ld, LDAPControlU **ctrls )
392 ULONG user_count, server_count, i, n, supported = 0;
394 if (!query_supported_server_ctrls( ld ))
395 return TRUE; /* can't verify, let the server handle it on next query */
397 user_count = controlarraylenU( ctrls );
398 server_count = ldap_funcs->ldap_count_values_len( ld->ld_server_ctrls );
400 for (n = 0; n < user_count; n++)
402 TRACE("looking for %s\n", debugstr_a(ctrls[n]->ldctl_oid));
404 for (i = 0; i < server_count; i++)
406 if (!strncmp( ctrls[n]->ldctl_oid, ld->ld_server_ctrls[i]->bv_val, ld->ld_server_ctrls[i]->bv_len))
408 supported++;
409 break;
414 return supported == user_count;
417 /***********************************************************************
418 * ldap_set_optionW (WLDAP32.@)
420 * Set option values for a given LDAP context.
422 * PARAMS
423 * ld [I] Pointer to an LDAP context.
424 * option [I] Option to set values for.
425 * value [I] Pointer to option values.
427 * RETURNS
428 * Success: LDAP_SUCCESS
429 * Failure: An LDAP error code.
431 * NOTES
432 * Set value to LDAP_OPT_ON or LDAP_OPT_OFF for on/off options.
434 ULONG CDECL ldap_set_optionW( WLDAP32_LDAP *ld, int option, void *value )
436 ULONG ret;
438 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value );
440 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
442 switch (option)
444 case WLDAP32_LDAP_OPT_SERVER_CONTROLS:
446 LDAPControlU **ctrlsU;
448 if (!(ctrlsU = controlarrayWtoU( value ))) return WLDAP32_LDAP_NO_MEMORY;
450 if (!is_supported_server_ctrls( ld, ctrlsU ))
451 ret = WLDAP32_LDAP_PARAM_ERROR;
452 else
453 ret = map_error( ldap_funcs->ldap_set_option( ld->ld, option, ctrlsU ) );
454 controlarrayfreeU( ctrlsU );
455 return ret;
457 case WLDAP32_LDAP_OPT_REFERRALS:
459 void *openldap_referral = WLDAP32_LDAP_OPT_ON;
460 if (value == WLDAP32_LDAP_OPT_OFF)
461 openldap_referral = WLDAP32_LDAP_OPT_OFF;
462 else
463 FIXME("upgrading referral value %p to LDAP_OPT_ON (OpenLDAP lacks sufficient granularity)\n", value);
464 return map_error( ldap_funcs->ldap_set_option( ld->ld, option, openldap_referral ) );
465 break;
467 case WLDAP32_LDAP_OPT_DEREF:
468 case WLDAP32_LDAP_OPT_DESC:
469 case WLDAP32_LDAP_OPT_ERROR_NUMBER:
470 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION:
471 case WLDAP32_LDAP_OPT_SIZELIMIT:
472 case WLDAP32_LDAP_OPT_TIMELIMIT:
473 return map_error( ldap_funcs->ldap_set_option( ld->ld, option, value ));
475 case WLDAP32_LDAP_OPT_CACHE_ENABLE:
476 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS:
477 case WLDAP32_LDAP_OPT_CACHE_STRATEGY:
478 case WLDAP32_LDAP_OPT_IO_FN_PTRS:
479 case WLDAP32_LDAP_OPT_REBIND_ARG:
480 case WLDAP32_LDAP_OPT_REBIND_FN:
481 case WLDAP32_LDAP_OPT_RESTART:
482 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS:
483 return WLDAP32_LDAP_LOCAL_ERROR;
485 case WLDAP32_LDAP_OPT_API_FEATURE_INFO:
486 case WLDAP32_LDAP_OPT_API_INFO:
487 return WLDAP32_LDAP_UNWILLING_TO_PERFORM;
489 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE:
490 case WLDAP32_LDAP_OPT_AUTO_RECONNECT:
491 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE:
492 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME:
493 case WLDAP32_LDAP_OPT_ENCRYPT:
494 case WLDAP32_LDAP_OPT_ERROR_STRING:
495 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND:
496 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS:
497 case WLDAP32_LDAP_OPT_HOST_NAME:
498 case WLDAP32_LDAP_OPT_HOST_REACHABLE:
499 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE:
500 case WLDAP32_LDAP_OPT_PING_LIMIT:
501 case WLDAP32_LDAP_OPT_PING_WAIT_TIME:
502 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS:
503 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG:
504 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK:
505 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT:
506 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE:
507 case WLDAP32_LDAP_OPT_SASL_METHOD:
508 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT:
509 case WLDAP32_LDAP_OPT_SEND_TIMEOUT:
510 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE:
511 case WLDAP32_LDAP_OPT_SERVER_ERROR:
512 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR:
513 case WLDAP32_LDAP_OPT_SIGN:
514 case WLDAP32_LDAP_OPT_SSL:
515 case WLDAP32_LDAP_OPT_SSL_INFO:
516 case WLDAP32_LDAP_OPT_SSPI_FLAGS:
517 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE:
518 FIXME( "Unsupported option: 0x%02x\n", option );
519 return WLDAP32_LDAP_NOT_SUPPORTED;
521 default:
522 FIXME( "Unknown option: 0x%02x\n", option );
523 return WLDAP32_LDAP_LOCAL_ERROR;