1 /* 2 * WLDAP32 - LDAP support for Wine 3 * 4 * Copyright 2005 Hans Leidekker 5 * 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. 10 * 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. 15 * 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 19 */ 20 21 #include "config.h" 22 #include "wine/port.h" 23 24 #include <stdarg.h> 25 #ifdef HAVE_LDAP_H 26 #include <ldap.h> 27 #endif 28 29 #include "windef.h" 30 #include "winbase.h" 31 #include "winnls.h" 32 33 #include "winldap_private.h" 34 #include "wldap32.h" 35 #include "wine/debug.h" 36 37 WINE_DEFAULT_DEBUG_CHANNEL(wldap32); 38 39 /*********************************************************************** 40 * ldap_get_optionA (WLDAP32.@) 41 * 42 * See ldap_get_optionW. 43 */ 44 ULONG CDECL ldap_get_optionA( WLDAP32_LDAP *ld, int option, void *value ) 45 { 46 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; 47 #ifdef HAVE_LDAP 48 49 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value ); 50 51 if (!ld || !value) return WLDAP32_LDAP_PARAM_ERROR; 52 53 switch (option) 54 { 55 case WLDAP32_LDAP_OPT_API_FEATURE_INFO: 56 { 57 LDAPAPIFeatureInfoW featureW; 58 LDAPAPIFeatureInfoA *featureA = value; 59 60 if (!featureA->ldapaif_name) return WLDAP32_LDAP_PARAM_ERROR; 61 62 featureW.ldapaif_info_version = featureA->ldapaif_info_version; 63 featureW.ldapaif_name = strAtoW( featureA->ldapaif_name ); 64 featureW.ldapaif_version = 0; 65 66 if (!featureW.ldapaif_name) return WLDAP32_LDAP_NO_MEMORY; 67 68 ret = ldap_get_optionW( ld, option, &featureW ); 69 70 featureA->ldapaif_version = featureW.ldapaif_version; 71 strfreeW( featureW.ldapaif_name ); 72 return ret; 73 } 74 case WLDAP32_LDAP_OPT_API_INFO: 75 { 76 LDAPAPIInfoW infoW; 77 LDAPAPIInfoA *infoA = value; 78 79 memset( &infoW, 0, sizeof(LDAPAPIInfoW) ); 80 infoW.ldapai_info_version = infoA->ldapai_info_version; 81 82 ret = ldap_get_optionW( ld, option, &infoW ); 83 84 infoA->ldapai_api_version = infoW.ldapai_api_version; 85 infoA->ldapai_protocol_version = infoW.ldapai_protocol_version; 86 87 if (infoW.ldapai_extensions) 88 { 89 infoA->ldapai_extensions = strarrayWtoA( infoW.ldapai_extensions ); 90 if (!infoA->ldapai_extensions) return WLDAP32_LDAP_NO_MEMORY; 91 } 92 if (infoW.ldapai_vendor_name) 93 { 94 infoA->ldapai_vendor_name = strWtoA( infoW.ldapai_vendor_name ); 95 if (!infoA->ldapai_vendor_name) 96 { 97 ldap_value_freeW( infoW.ldapai_extensions ); 98 return WLDAP32_LDAP_NO_MEMORY; 99 } 100 } 101 infoA->ldapai_vendor_version = infoW.ldapai_vendor_version; 102 103 ldap_value_freeW( infoW.ldapai_extensions ); 104 ldap_memfreeW( infoW.ldapai_vendor_name ); 105 return ret; 106 } 107 108 case WLDAP32_LDAP_OPT_DEREF: 109 case WLDAP32_LDAP_OPT_DESC: 110 case WLDAP32_LDAP_OPT_ERROR_NUMBER: 111 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION: 112 case WLDAP32_LDAP_OPT_REFERRALS: 113 case WLDAP32_LDAP_OPT_SIZELIMIT: 114 case WLDAP32_LDAP_OPT_TIMELIMIT: 115 return ldap_get_optionW( ld, option, value ); 116 117 case WLDAP32_LDAP_OPT_CACHE_ENABLE: 118 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS: 119 case WLDAP32_LDAP_OPT_CACHE_STRATEGY: 120 case WLDAP32_LDAP_OPT_IO_FN_PTRS: 121 case WLDAP32_LDAP_OPT_REBIND_ARG: 122 case WLDAP32_LDAP_OPT_REBIND_FN: 123 case WLDAP32_LDAP_OPT_RESTART: 124 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS: 125 return LDAP_LOCAL_ERROR; 126 127 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE: 128 case WLDAP32_LDAP_OPT_AUTO_RECONNECT: 129 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE: 130 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME: 131 case WLDAP32_LDAP_OPT_ENCRYPT: 132 case WLDAP32_LDAP_OPT_ERROR_STRING: 133 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND: 134 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS: 135 case WLDAP32_LDAP_OPT_HOST_NAME: 136 case WLDAP32_LDAP_OPT_HOST_REACHABLE: 137 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE: 138 case WLDAP32_LDAP_OPT_PING_LIMIT: 139 case WLDAP32_LDAP_OPT_PING_WAIT_TIME: 140 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS: 141 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG: 142 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK: 143 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: 144 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE: 145 case WLDAP32_LDAP_OPT_SASL_METHOD: 146 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT: 147 case WLDAP32_LDAP_OPT_SEND_TIMEOUT: 148 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE: 149 case WLDAP32_LDAP_OPT_SERVER_CONTROLS: 150 case WLDAP32_LDAP_OPT_SERVER_ERROR: 151 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR: 152 case WLDAP32_LDAP_OPT_SIGN: 153 case WLDAP32_LDAP_OPT_SSL: 154 case WLDAP32_LDAP_OPT_SSL_INFO: 155 case WLDAP32_LDAP_OPT_SSPI_FLAGS: 156 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE: 157 FIXME( "Unsupported option: 0x%02x\n", option ); 158 return WLDAP32_LDAP_NOT_SUPPORTED; 159 160 default: 161 FIXME( "Unknown option: 0x%02x\n", option ); 162 return WLDAP32_LDAP_LOCAL_ERROR; 163 } 164 165 #endif 166 return ret; 167 } 168 169 /*********************************************************************** 170 * ldap_get_optionW (WLDAP32.@) 171 * 172 * Retrieve option values for a given LDAP context. 173 * 174 * PARAMS 175 * ld [I] Pointer to an LDAP context. 176 * option [I] Option to get values for. 177 * value [O] Pointer to option values. 178 * 179 * RETURNS 180 * Success: LDAP_SUCCESS 181 * Failure: An LDAP error code. 182 */ 183 ULONG CDECL ldap_get_optionW( WLDAP32_LDAP *ld, int option, void *value ) 184 { 185 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; 186 #ifdef HAVE_LDAP 187 188 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value ); 189 190 if (!ld || !value) return WLDAP32_LDAP_PARAM_ERROR; 191 192 switch (option) 193 { 194 case WLDAP32_LDAP_OPT_API_FEATURE_INFO: 195 { 196 LDAPAPIFeatureInfo featureU; 197 LDAPAPIFeatureInfoW *featureW = value; 198 199 if (!featureW->ldapaif_name) return WLDAP32_LDAP_PARAM_ERROR; 200 201 featureU.ldapaif_info_version = featureW->ldapaif_info_version; 202 featureU.ldapaif_name = strWtoU( featureW->ldapaif_name ); 203 featureU.ldapaif_version = 0; 204 205 if (!featureU.ldapaif_name) return WLDAP32_LDAP_NO_MEMORY; 206 207 ret = map_error( ldap_get_option( ld, option, &featureU )); 208 209 featureW->ldapaif_version = featureU.ldapaif_version; 210 strfreeU( featureU.ldapaif_name ); 211 return ret; 212 } 213 case WLDAP32_LDAP_OPT_API_INFO: 214 { 215 LDAPAPIInfo infoU; 216 LDAPAPIInfoW *infoW = value; 217 218 memset( &infoU, 0, sizeof(LDAPAPIInfo) ); 219 infoU.ldapai_info_version = infoW->ldapai_info_version; 220 221 ret = map_error( ldap_get_option( ld, option, &infoU )); 222 223 infoW->ldapai_api_version = infoU.ldapai_api_version; 224 infoW->ldapai_protocol_version = infoU.ldapai_protocol_version; 225 226 if (infoU.ldapai_extensions) 227 { 228 infoW->ldapai_extensions = strarrayUtoW( infoU.ldapai_extensions ); 229 if (!infoW->ldapai_extensions) return WLDAP32_LDAP_NO_MEMORY; 230 } 231 if (infoU.ldapai_vendor_name) 232 { 233 infoW->ldapai_vendor_name = strUtoW( infoU.ldapai_vendor_name ); 234 if (!infoW->ldapai_vendor_name) 235 { 236 ldap_memvfree( (void **)infoU.ldapai_extensions ); 237 return WLDAP32_LDAP_NO_MEMORY; 238 } 239 } 240 infoW->ldapai_vendor_version = infoU.ldapai_vendor_version; 241 242 ldap_memvfree( (void **)infoU.ldapai_extensions ); 243 ldap_memfree( infoU.ldapai_vendor_name ); 244 return ret; 245 } 246 247 case WLDAP32_LDAP_OPT_DEREF: 248 case WLDAP32_LDAP_OPT_DESC: 249 case WLDAP32_LDAP_OPT_ERROR_NUMBER: 250 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION: 251 case WLDAP32_LDAP_OPT_REFERRALS: 252 case WLDAP32_LDAP_OPT_SIZELIMIT: 253 case WLDAP32_LDAP_OPT_TIMELIMIT: 254 return map_error( ldap_get_option( ld, option, value )); 255 256 case WLDAP32_LDAP_OPT_CACHE_ENABLE: 257 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS: 258 case WLDAP32_LDAP_OPT_CACHE_STRATEGY: 259 case WLDAP32_LDAP_OPT_IO_FN_PTRS: 260 case WLDAP32_LDAP_OPT_REBIND_ARG: 261 case WLDAP32_LDAP_OPT_REBIND_FN: 262 case WLDAP32_LDAP_OPT_RESTART: 263 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS: 264 return WLDAP32_LDAP_LOCAL_ERROR; 265 266 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE: 267 case WLDAP32_LDAP_OPT_AUTO_RECONNECT: 268 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE: 269 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME: 270 case WLDAP32_LDAP_OPT_ENCRYPT: 271 case WLDAP32_LDAP_OPT_ERROR_STRING: 272 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND: 273 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS: 274 case WLDAP32_LDAP_OPT_HOST_NAME: 275 case WLDAP32_LDAP_OPT_HOST_REACHABLE: 276 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE: 277 case WLDAP32_LDAP_OPT_PING_LIMIT: 278 case WLDAP32_LDAP_OPT_PING_WAIT_TIME: 279 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS: 280 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG: 281 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK: 282 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: 283 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE: 284 case WLDAP32_LDAP_OPT_SASL_METHOD: 285 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT: 286 case WLDAP32_LDAP_OPT_SEND_TIMEOUT: 287 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE: 288 case WLDAP32_LDAP_OPT_SERVER_CONTROLS: 289 case WLDAP32_LDAP_OPT_SERVER_ERROR: 290 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR: 291 case WLDAP32_LDAP_OPT_SIGN: 292 case WLDAP32_LDAP_OPT_SSL: 293 case WLDAP32_LDAP_OPT_SSL_INFO: 294 case WLDAP32_LDAP_OPT_SSPI_FLAGS: 295 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE: 296 FIXME( "Unsupported option: 0x%02x\n", option ); 297 return WLDAP32_LDAP_NOT_SUPPORTED; 298 299 default: 300 FIXME( "Unknown option: 0x%02x\n", option ); 301 return WLDAP32_LDAP_LOCAL_ERROR; 302 } 303 304 #endif 305 return ret; 306 } 307 308 /*********************************************************************** 309 * ldap_set_optionA (WLDAP32.@) 310 * 311 * See ldap_set_optionW. 312 */ 313 ULONG CDECL ldap_set_optionA( WLDAP32_LDAP *ld, int option, void *value ) 314 { 315 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; 316 #ifdef HAVE_LDAP 317 318 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value ); 319 320 if (!ld) return WLDAP32_LDAP_PARAM_ERROR; 321 322 switch (option) 323 { 324 case WLDAP32_LDAP_OPT_SERVER_CONTROLS: 325 { 326 LDAPControlW **ctrlsW; 327 328 ctrlsW = controlarrayAtoW( value ); 329 if (!ctrlsW) return WLDAP32_LDAP_NO_MEMORY; 330 331 ret = ldap_set_optionW( ld, option, ctrlsW ); 332 controlarrayfreeW( ctrlsW ); 333 return ret; 334 } 335 case WLDAP32_LDAP_OPT_DEREF: 336 case WLDAP32_LDAP_OPT_DESC: 337 case WLDAP32_LDAP_OPT_ERROR_NUMBER: 338 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION: 339 case WLDAP32_LDAP_OPT_REFERRALS: 340 case WLDAP32_LDAP_OPT_SIZELIMIT: 341 case WLDAP32_LDAP_OPT_TIMELIMIT: 342 return ldap_set_optionW( ld, option, value ); 343 344 case WLDAP32_LDAP_OPT_CACHE_ENABLE: 345 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS: 346 case WLDAP32_LDAP_OPT_CACHE_STRATEGY: 347 case WLDAP32_LDAP_OPT_IO_FN_PTRS: 348 case WLDAP32_LDAP_OPT_REBIND_ARG: 349 case WLDAP32_LDAP_OPT_REBIND_FN: 350 case WLDAP32_LDAP_OPT_RESTART: 351 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS: 352 return WLDAP32_LDAP_LOCAL_ERROR; 353 354 case WLDAP32_LDAP_OPT_API_FEATURE_INFO: 355 case WLDAP32_LDAP_OPT_API_INFO: 356 return WLDAP32_LDAP_UNWILLING_TO_PERFORM; 357 358 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE: 359 case WLDAP32_LDAP_OPT_AUTO_RECONNECT: 360 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE: 361 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME: 362 case WLDAP32_LDAP_OPT_ENCRYPT: 363 case WLDAP32_LDAP_OPT_ERROR_STRING: 364 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND: 365 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS: 366 case WLDAP32_LDAP_OPT_HOST_NAME: 367 case WLDAP32_LDAP_OPT_HOST_REACHABLE: 368 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE: 369 case WLDAP32_LDAP_OPT_PING_LIMIT: 370 case WLDAP32_LDAP_OPT_PING_WAIT_TIME: 371 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS: 372 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG: 373 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK: 374 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: 375 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE: 376 case WLDAP32_LDAP_OPT_SASL_METHOD: 377 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT: 378 case WLDAP32_LDAP_OPT_SEND_TIMEOUT: 379 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE: 380 case WLDAP32_LDAP_OPT_SERVER_ERROR: 381 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR: 382 case WLDAP32_LDAP_OPT_SIGN: 383 case WLDAP32_LDAP_OPT_SSL: 384 case WLDAP32_LDAP_OPT_SSL_INFO: 385 case WLDAP32_LDAP_OPT_SSPI_FLAGS: 386 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE: 387 FIXME( "Unsupported option: 0x%02x\n", option ); 388 return WLDAP32_LDAP_NOT_SUPPORTED; 389 390 default: 391 FIXME( "Unknown option: 0x%02x\n", option ); 392 return WLDAP32_LDAP_LOCAL_ERROR; 393 } 394 395 #endif 396 return ret; 397 } 398 399 /*********************************************************************** 400 * ldap_set_optionW (WLDAP32.@) 401 * 402 * Set option values for a given LDAP context. 403 * 404 * PARAMS 405 * ld [I] Pointer to an LDAP context. 406 * option [I] Option to set values for. 407 * value [I] Pointer to option values. 408 * 409 * RETURNS 410 * Success: LDAP_SUCCESS 411 * Failure: An LDAP error code. 412 * 413 * NOTES 414 * Set value to LDAP_OPT_ON or LDAP_OPT_OFF for on/off options. 415 */ 416 ULONG CDECL ldap_set_optionW( WLDAP32_LDAP *ld, int option, void *value ) 417 { 418 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; 419 #ifdef HAVE_LDAP 420 421 TRACE( "(%p, 0x%08x, %p)\n", ld, option, value ); 422 423 if (!ld) return WLDAP32_LDAP_PARAM_ERROR; 424 425 switch (option) 426 { 427 case WLDAP32_LDAP_OPT_SERVER_CONTROLS: 428 { 429 LDAPControl **ctrlsU; 430 431 ctrlsU = controlarrayWtoU( value ); 432 if (!ctrlsU) return WLDAP32_LDAP_NO_MEMORY; 433 434 ret = map_error( ldap_set_option( ld, option, ctrlsU )); 435 controlarrayfreeU( ctrlsU ); 436 return ret; 437 } 438 case WLDAP32_LDAP_OPT_DEREF: 439 case WLDAP32_LDAP_OPT_DESC: 440 case WLDAP32_LDAP_OPT_ERROR_NUMBER: 441 case WLDAP32_LDAP_OPT_PROTOCOL_VERSION: 442 case WLDAP32_LDAP_OPT_REFERRALS: 443 case WLDAP32_LDAP_OPT_SIZELIMIT: 444 case WLDAP32_LDAP_OPT_TIMELIMIT: 445 return map_error( ldap_set_option( ld, option, value )); 446 447 case WLDAP32_LDAP_OPT_CACHE_ENABLE: 448 case WLDAP32_LDAP_OPT_CACHE_FN_PTRS: 449 case WLDAP32_LDAP_OPT_CACHE_STRATEGY: 450 case WLDAP32_LDAP_OPT_IO_FN_PTRS: 451 case WLDAP32_LDAP_OPT_REBIND_ARG: 452 case WLDAP32_LDAP_OPT_REBIND_FN: 453 case WLDAP32_LDAP_OPT_RESTART: 454 case WLDAP32_LDAP_OPT_THREAD_FN_PTRS: 455 return WLDAP32_LDAP_LOCAL_ERROR; 456 457 case WLDAP32_LDAP_OPT_API_FEATURE_INFO: 458 case WLDAP32_LDAP_OPT_API_INFO: 459 return WLDAP32_LDAP_UNWILLING_TO_PERFORM; 460 461 case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE: 462 case WLDAP32_LDAP_OPT_AUTO_RECONNECT: 463 case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE: 464 case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME: 465 case WLDAP32_LDAP_OPT_ENCRYPT: 466 case WLDAP32_LDAP_OPT_ERROR_STRING: 467 case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND: 468 case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS: 469 case WLDAP32_LDAP_OPT_HOST_NAME: 470 case WLDAP32_LDAP_OPT_HOST_REACHABLE: 471 case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE: 472 case WLDAP32_LDAP_OPT_PING_LIMIT: 473 case WLDAP32_LDAP_OPT_PING_WAIT_TIME: 474 case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS: 475 case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG: 476 case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK: 477 case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: 478 case WLDAP32_LDAP_OPT_ROOTDSE_CACHE: 479 case WLDAP32_LDAP_OPT_SASL_METHOD: 480 case WLDAP32_LDAP_OPT_SECURITY_CONTEXT: 481 case WLDAP32_LDAP_OPT_SEND_TIMEOUT: 482 case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE: 483 case WLDAP32_LDAP_OPT_SERVER_ERROR: 484 case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR: 485 case WLDAP32_LDAP_OPT_SIGN: 486 case WLDAP32_LDAP_OPT_SSL: 487 case WLDAP32_LDAP_OPT_SSL_INFO: 488 case WLDAP32_LDAP_OPT_SSPI_FLAGS: 489 case WLDAP32_LDAP_OPT_TCP_KEEPALIVE: 490 FIXME( "Unsupported option: 0x%02x\n", option ); 491 return WLDAP32_LDAP_NOT_SUPPORTED; 492 493 default: 494 FIXME( "Unknown option: 0x%02x\n", option ); 495 return WLDAP32_LDAP_LOCAL_ERROR; 496 } 497 498 #endif 499 return ret; 500 } 501