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
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
)
40 TRACE( "(%p, 0x%08x, %p)\n", ld
, option
, value
);
42 if (!ld
|| !value
) return WLDAP32_LDAP_PARAM_ERROR
;
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
);
63 case WLDAP32_LDAP_OPT_API_INFO
:
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
);
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
;
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.
156 * ld [I] Pointer to an LDAP context.
157 * option [I] Option to get values for.
158 * value [O] Pointer to option values.
161 * Success: LDAP_SUCCESS
162 * Failure: An LDAP error code.
164 ULONG CDECL
ldap_get_optionW( WLDAP32_LDAP
*ld
, int option
, void *value
)
168 TRACE( "(%p, 0x%08x, %p)\n", ld
, option
, value
);
170 if (!ld
|| !value
) return WLDAP32_LDAP_PARAM_ERROR
;
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
);
191 case WLDAP32_LDAP_OPT_API_INFO
:
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
);
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
;
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
)
287 TRACE( "(%p, 0x%08x, %p)\n", ld
, option
, value
);
289 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
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
);
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
;
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
};
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
);
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
))
414 return supported
== user_count
;
417 /***********************************************************************
418 * ldap_set_optionW (WLDAP32.@)
420 * Set option values for a given LDAP context.
423 * ld [I] Pointer to an LDAP context.
424 * option [I] Option to set values for.
425 * value [I] Pointer to option values.
428 * Success: LDAP_SUCCESS
429 * Failure: An LDAP error code.
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
)
438 TRACE( "(%p, 0x%08x, %p)\n", ld
, option
, value
);
440 if (!ld
) return WLDAP32_LDAP_PARAM_ERROR
;
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
;
453 ret
= map_error( ldap_funcs
->ldap_set_option( ld
->ld
, option
, ctrlsU
) );
454 controlarrayfreeU( ctrlsU
);
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
;
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
) );
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
;
522 FIXME( "Unknown option: 0x%02x\n", option
);
523 return WLDAP32_LDAP_LOCAL_ERROR
;