/*********************************************************************** * ldap_bind_sW (WLDAP32.@) * * Authenticate with an LDAP server (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to bind as. * cred [I] Credentials (e.g. password string). * method [I] Authentication method. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. */ ULONG CDECL ldap_bind_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR cred, ULONG method ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *credU = NULL; struct berval pwd = { 0, NULL }; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p, 0x%08x)\n", ld, debugstr_w(dn), cred, method ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (method != LDAP_AUTH_SIMPLE) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (cred) { credU = strWtoU( cred ); if (!credU) goto exit; pwd.bv_len = strlen( credU ); pwd.bv_val = credU; } ret = map_error( ldap_sasl_bind_s( ld, dnU, LDAP_SASL_SIMPLE, &pwd, NULL, NULL, NULL )); exit: strfreeU( dnU ); strfreeU( credU ); #endif return ret; }
/*********************************************************************** * ldap_simple_bind_sW (WLDAP32.@) * * Authenticate with an LDAP server (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to bind as. * passwd [I] Password string. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Set dn and passwd to NULL to bind as an anonymous user. */ ULONG CDECL ldap_simple_bind_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR passwd ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *passwdU = NULL; struct berval pwd = { 0, NULL }; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), passwd ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (passwd) { passwdU = strWtoU( passwd ); if (!passwdU) goto exit; pwd.bv_len = strlen( passwdU ); pwd.bv_val = passwdU; } ret = map_error( ldap_sasl_bind_s( ld, dnU, LDAP_SASL_SIMPLE, &pwd, NULL, NULL, NULL )); exit: strfreeU( dnU ); strfreeU( passwdU ); #endif return ret; }
/*********************************************************************** * ldap_modrdnW (WLDAP32.@) * * Change the RDN of a directory entry (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to change. * newdn [I] New DN for the entry. * * RETURNS * Success: Message ID of the modrdn operation. * Failure: An LDAP error code. * * NOTES * Call ldap_result with the message ID to get the result of * the operation. Cancel the operation by calling ldap_abandon * with the message ID. */ ULONG CDECL ldap_modrdnW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newdn ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *newdnU = NULL; int msg; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %s)\n", ld, debugstr_w(dn), debugstr_w(newdn) ); if (!ld || !newdn) return ~0u; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } newdnU = strWtoU( newdn ); if (!newdnU) goto exit; ret = ldap_rename( ld, dn ? dnU : "", newdnU, NULL, 1, NULL, NULL, &msg ); if (ret == LDAP_SUCCESS) ret = msg; else ret = ~0u; exit: strfreeU( dnU ); strfreeU( newdnU ); #endif return ret; }
/*********************************************************************** * ldap_search_extW (WLDAP32.@) * * Search a directory tree (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * base [I] Starting point for the search. * scope [I] Search scope. One of LDAP_SCOPE_BASE, * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE. * filter [I] Search filter. * attrs [I] Attributes to return. * attrsonly [I] Return no values, only attributes. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * timelimit [I] Timeout in seconds. * sizelimit [I] Maximum number of entries to return. Zero means unlimited. * message [O] Message ID of the search operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Call ldap_result with the message ID to get the result of * the operation. Cancel the operation by calling ldap_abandon * with the message ID. */ ULONG CDECL ldap_search_extW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter, PWCHAR attrs[], ULONG attrsonly, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG timelimit, ULONG sizelimit, ULONG *message ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *baseU = NULL, *filterU = NULL, **attrsU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; struct timeval tv, *tvp = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p, 0x%08x, 0x%08x, %p)\n", ld, debugstr_w(base), scope, debugstr_w(filter), attrs, attrsonly, serverctrls, clientctrls, timelimit, sizelimit, message ); if (!ld) return ~0u; if (base) { baseU = strWtoU( base ); if (!baseU) goto exit; } if (filter) { filterU = strWtoU( filter ); if (!filterU) goto exit; } if (attrs) { attrsU = strarrayWtoU( attrs ); if (!attrsU) goto exit; } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } if (timelimit) { tv.tv_sec = timelimit; tv.tv_usec = 0; tvp = &tv; } ret = map_error( ldap_search_ext( ld, baseU, scope, filterU, attrsU, attrsonly, serverctrlsU, clientctrlsU, tvp, sizelimit, (int *)message )); exit: strfreeU( baseU ); strfreeU( filterU ); strarrayfreeU( attrsU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_compare_extW (WLDAP32.@) * * Check if an attribute has a certain value (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to compare value for. * attr [I] Attribute to compare value for. * value [I] string encoded value to compare. * data [I] berval encoded value to compare. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * message [O] Message ID of the compare operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Set value to compare strings or data to compare binary values. If * both are non-NULL, data will be used. The serverctrls and clientctrls * parameters are optional and should be set to NULL if not used. */ ULONG CDECL ldap_compare_extW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR attr, PWCHAR value, struct WLDAP32_berval *data, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *attrU = NULL, *valueU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; struct berval val = { 0, NULL }; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %s, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn), debugstr_w(attr), debugstr_w(value), data, serverctrls, clientctrls, message ); if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; if (!attr) return WLDAP32_LDAP_NO_MEMORY; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } attrU = strWtoU( attr ); if (!attrU) goto exit; if (!data) { if (value) { valueU = strWtoU( value ); if (!valueU) goto exit; val.bv_len = strlen( valueU ); val.bv_val = valueU; } } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = ldap_compare_ext( ld, dn ? dnU : "", attrU, data ? (struct berval *)data : &val, serverctrlsU, clientctrlsU, (int *)message ); exit: strfreeU( dnU ); strfreeU( attrU ); strfreeU( valueU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_search_ext_sW (WLDAP32.@) * * Search a directory tree (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * base [I] Starting point for the search. * scope [I] Search scope. One of LDAP_SCOPE_BASE, * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE. * filter [I] Search filter. * attrs [I] Attributes to return. * attrsonly [I] Return no values, only attributes. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * timeout [I] Timeout in seconds. * sizelimit [I] Maximum number of entries to return. Zero means unlimited. * res [O] Results of the search operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Call ldap_msgfree to free the results. */ ULONG CDECL ldap_search_ext_sW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter, PWCHAR attrs[], ULONG attrsonly, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, struct l_timeval* timeout, ULONG sizelimit, WLDAP32_LDAPMessage **res ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *baseU = NULL, *filterU = NULL, **attrsU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p, %p, 0x%08x, %p)\n", ld, debugstr_w(base), scope, debugstr_w(filter), attrs, attrsonly, serverctrls, clientctrls, timeout, sizelimit, res ); if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR; if (base) { baseU = strWtoU( base ); if (!baseU) goto exit; } if (filter) { filterU = strWtoU( filter ); if (!filterU) goto exit; } if (attrs) { attrsU = strarrayWtoU( attrs ); if (!attrsU) goto exit; } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = map_error( ldap_search_ext_s( ld, baseU, scope, filterU, attrsU, attrsonly, serverctrlsU, clientctrlsU, (struct timeval *)timeout, sizelimit, res )); exit: strfreeU( baseU ); strfreeU( filterU ); strarrayfreeU( attrsU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_sasl_bind_sW (WLDAP32.@) * * Authenticate with an LDAP server using SASL (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to bind as. * mechanism [I] Authentication method. * cred [I] Credentials. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * serverdata [O] Authentication response from the server. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * The serverctrls and clientctrls parameters are optional and should * be set to NULL if not used. */ ULONG CDECL ldap_sasl_bind_sW( WLDAP32_LDAP *ld, const PWCHAR dn, const PWCHAR mechanism, const BERVAL *cred, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, PBERVAL *serverdata ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU, *mechanismU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; struct berval credU; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn), debugstr_w(mechanism), cred, serverctrls, clientctrls, serverdata ); if (!ld || !dn || !mechanism || !cred || !serverdata) return WLDAP32_LDAP_PARAM_ERROR; dnU = strWtoU( dn ); if (!dnU) goto exit; mechanismU = strWtoU( mechanism ); if (!mechanismU) goto exit; if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } credU.bv_len = cred->bv_len; credU.bv_val = cred->bv_val; ret = map_error( ldap_sasl_bind_s( ld, dnU, mechanismU, &credU, serverctrlsU, clientctrlsU, (struct berval **)serverdata )); exit: strfreeU( dnU ); strfreeU( mechanismU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_modify_sW (WLDAP32.@) * * Change an entry in a directory tree (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to change. * attrs [I] Pointer to an array of LDAPModW structures, each * specifying an attribute and its values to change. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. */ ULONG CDECL ldap_modify_sW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[] ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; LDAPMod **modsU = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), mods ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (mods) { modsU = modarrayWtoU( mods ); if (!modsU) goto exit; } ret = ldap_modify_ext_s( ld, dn ? dnU : "", mods ? modsU : nullmods, NULL, NULL ); exit: strfreeU( dnU ); modarrayfreeU( modsU ); #endif return ret; }
/*********************************************************************** * ldap_add_sW (WLDAP32.@) * * Add an entry to a directory tree (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to add. * attrs [I] Pointer to an array of LDAPModW structures, each * specifying an attribute and its values to add. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. */ ULONG CDECL ldap_add_sW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *attrs[] ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; LDAPMod **attrsU = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), attrs ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (attrs) { attrsU = modarrayWtoU( attrs ); if (!attrsU) goto exit; } ret = map_error( ldap_add_ext_s( ld, dn ? dnU : "", attrs ? attrsU : nullattrs, NULL, NULL )); exit: strfreeU( dnU ); modarrayfreeU( attrsU ); #endif return ret; }
/*********************************************************************** * ldap_get_valuesW (WLDAP32.@) * * Retrieve string values for a given attribute. * * PARAMS * ld [I] Pointer to an LDAP context. * entry [I] Entry to retrieve values from. * attr [I] Attribute to retrieve values for. * * RETURNS * Success: Pointer to a character array holding the values. * Failure: NULL * * NOTES * Call ldap_get_valuesW with the result of a call to * ldap_first_entry or ldap_next_entry. Free the returned * array with a call to ldap_value_freeW. */ PWCHAR * CDECL ldap_get_valuesW( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *entry, PWCHAR attr ) { PWCHAR *ret = NULL; #ifdef HAVE_LDAP char *attrU = NULL, **retU; struct berval **bv; TRACE( "(%p, %p, %s)\n", ld, entry, debugstr_w(attr) ); if (!ld || !entry || !attr) return NULL; attrU = strWtoU( attr ); if (!attrU) return NULL; bv = ldap_get_values_len( ld, entry, attrU ); retU = bv2str_array( bv ); ret = strarrayUtoW( retU ); ldap_value_free_len( bv ); strarrayfreeU( retU ); strfreeU( attrU ); #endif return ret; }
/*********************************************************************** * ldap_deleteW (WLDAP32.@) * * Delete an entry from a directory tree (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to delete. * * RETURNS * Success: Message ID of the add operation. * Failure: An LDAP error code. * * NOTES * Call ldap_result with the message ID to get the result of * the operation. Cancel the operation by calling ldap_abandon * with the message ID. */ ULONG CDECL ldap_deleteW( WLDAP32_LDAP *ld, PWCHAR dn ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; int msg; TRACE( "(%p, %s)\n", ld, debugstr_w(dn) ); if (!ld) return ~0u; if (dn) { dnU = strWtoU( dn ); if (!dnU) return WLDAP32_LDAP_NO_MEMORY; } ret = ldap_delete_ext( ld, dn ? dnU : "", NULL, NULL, &msg ); if (ret == LDAP_SUCCESS) ret = msg; else ret = ~0u; strfreeU( dnU ); #endif return ret; }
/*********************************************************************** * ldap_ufn2dnW (WLDAP32.@) * * Convert a user-friendly name to a DN. * * PARAMS * ufn [I] User-friendly name to convert. * dn [O] Receives a pointer to a string containing the DN. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Free the string with ldap_memfree. */ ULONG CDECL ldap_ufn2dnW( PWCHAR ufn, PWCHAR *dn ) { ULONG ret = WLDAP32_LDAP_SUCCESS; #ifdef HAVE_LDAP char *ufnU = NULL; TRACE( "(%s, %p)\n", debugstr_w(ufn), dn ); if (!dn) return WLDAP32_LDAP_PARAM_ERROR; *dn = NULL; if (ufn) { ufnU = strWtoU( ufn ); if (!ufnU) return WLDAP32_LDAP_NO_MEMORY; /* FIXME: do more than just a copy */ *dn = strUtoW( ufnU ); if (!*dn) ret = WLDAP32_LDAP_NO_MEMORY; } strfreeU( ufnU ); #endif return ret; }
/*********************************************************************** * ldap_compareW (WLDAP32.@) * * Check if an attribute has a certain value (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to compare value for. * attr [I] Attribute to compare value for. * value [I] Value to compare. * * RETURNS * Success: Message ID of the compare operation. * Failure: An LDAP error code. */ ULONG CDECL ldap_compareW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR attr, PWCHAR value ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *attrU = NULL, *valueU = NULL; struct berval val = { 0, NULL }; int msg; ret = ~0UL; TRACE( "(%p, %s, %s, %s)\n", ld, debugstr_w(dn), debugstr_w(attr), debugstr_w(value) ); if (!ld || !attr) return ~0UL; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } attrU = strWtoU( attr ); if (!attrU) goto exit; if (value) { valueU = strWtoU( value ); if (!valueU) goto exit; val.bv_len = strlen( valueU ); val.bv_val = valueU; } ret = ldap_compare_ext( ld, dn ? dnU : "", attrU, &val, NULL, NULL, &msg ); if (ret == LDAP_SUCCESS) ret = msg; else ret = ~0UL; exit: strfreeU( dnU ); strfreeU( attrU ); strfreeU( valueU ); #endif return ret; }
/*********************************************************************** * ldap_searchW (WLDAP32.@) * * Search a directory tree (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * base [I] Starting point for the search. * scope [I] Search scope. One of LDAP_SCOPE_BASE, * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE. * filter [I] Search filter. * attrs [I] Attributes to return. * attrsonly [I] Return no values, only attributes. * * RETURNS * Success: Message ID of the search operation. * Failure: ~0u * * NOTES * Call ldap_result with the message ID to get the result of * the operation. Cancel the operation by calling ldap_abandon * with the message ID. */ ULONG CDECL ldap_searchW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter, PWCHAR attrs[], ULONG attrsonly ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *baseU = NULL, *filterU = NULL, **attrsU = NULL; int msg; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x)\n", ld, debugstr_w(base), scope, debugstr_w(filter), attrs, attrsonly ); if (!ld) return ~0u; if (base) { baseU = strWtoU( base ); if (!baseU) goto exit; } if (filter) { filterU = strWtoU( filter ); if (!filterU) goto exit; } if (attrs) { attrsU = strarrayWtoU( attrs ); if (!attrsU) goto exit; } ret = ldap_search_ext( ld, baseU, scope, filterU, attrsU, attrsonly, NULL, NULL, NULL, 0, &msg ); if (ret == LDAP_SUCCESS) ret = msg; else ret = ~0u; exit: strfreeU( baseU ); strfreeU( filterU ); strarrayfreeU( attrsU ); #endif return ret; }
/*********************************************************************** * ldap_sasl_bindW (WLDAP32.@) * * Authenticate with an LDAP server using SASL (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to bind as. * mechanism [I] Authentication method. * cred [I] Credentials. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * message [O] Message ID of the bind operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * The serverctrls and clientctrls parameters are optional and should * be set to NULL if not used. */ ULONG CDECL ldap_sasl_bindW( WLDAP32_LDAP *ld, const PWCHAR dn, const PWCHAR mechanism, const BERVAL *cred, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, int *message ) { ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU, *mechanismU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn), debugstr_w(mechanism), cred, serverctrls, clientctrls, message ); if (!ld || !dn || !mechanism || !cred || !message) return WLDAP32_LDAP_PARAM_ERROR; dnU = strWtoU( dn ); if (!dnU) goto exit; mechanismU = strWtoU( mechanism ); if (!mechanismU) goto exit; if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = ldap_sasl_bind( ld, dnU, mechanismU, (struct berval *)cred, serverctrlsU, clientctrlsU, message ); exit: strfreeU( dnU ); strfreeU( mechanismU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_compare_sW (WLDAP32.@) * * Check if an attribute has a certain value (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to compare value for. * attr [I] Attribute to compare value for. * value [I] Value to compare. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. */ ULONG CDECL ldap_compare_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR attr, PWCHAR value ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *attrU = NULL, *valueU = NULL; struct berval val = { 0, NULL }; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %s, %s)\n", ld, debugstr_w(dn), debugstr_w(attr), debugstr_w(value) ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (attr) { attrU = strWtoU( attr ); if (!attrU) goto exit; } if (value) { valueU = strWtoU( value ); if (!valueU) goto exit; val.bv_len = strlen( valueU ); val.bv_val = valueU; } ret = ldap_compare_ext_s( ld, dn ? dnU : "", attr ? attrU : "", &val, NULL, NULL ); exit: strfreeU( dnU ); strfreeU( attrU ); strfreeU( valueU ); #endif return ret; }
/*********************************************************************** * ldap_simple_bindW (WLDAP32.@) * * Authenticate with an LDAP server (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of entry to bind as. * passwd [I] Password string. * * RETURNS * Success: Message ID of the bind operation. * Failure: An LDAP error code. * * NOTES * Set dn and passwd to NULL to bind as an anonymous user. */ ULONG CDECL ldap_simple_bindW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR passwd ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *passwdU = NULL; struct berval pwd = { 0, NULL }; int msg; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), passwd ); if (!ld) return ~0u; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (passwd) { passwdU = strWtoU( passwd ); if (!passwdU) goto exit; pwd.bv_len = strlen( passwdU ); pwd.bv_val = passwdU; } ret = ldap_sasl_bind( ld, dnU, LDAP_SASL_SIMPLE, &pwd, NULL, NULL, &msg ); if (ret == LDAP_SUCCESS) ret = msg; else ret = ~0u; exit: strfreeU( dnU ); strfreeU( passwdU ); #endif return ret; }
/*********************************************************************** * ldap_search_stW (WLDAP32.@) * * Search a directory tree (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * base [I] Starting point for the search. * scope [I] Search scope. One of LDAP_SCOPE_BASE, * LDAP_SCOPE_ONELEVEL and LDAP_SCOPE_SUBTREE. * filter [I] Search filter. * attrs [I] Attributes to return. * attrsonly [I] Return no values, only attributes. * timeout [I] Timeout in seconds. * res [O] Results of the search operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Call ldap_msgfree to free the results. */ ULONG CDECL ldap_search_stW( WLDAP32_LDAP *ld, const PWCHAR base, ULONG scope, const PWCHAR filter, PWCHAR attrs[], ULONG attrsonly, struct l_timeval *timeout, WLDAP32_LDAPMessage **res ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *baseU = NULL, *filterU = NULL, **attrsU = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, 0x%08x, %s, %p, 0x%08x, %p, %p)\n", ld, debugstr_w(base), scope, debugstr_w(filter), attrs, attrsonly, timeout, res ); if (!ld || !res) return WLDAP32_LDAP_PARAM_ERROR; if (base) { baseU = strWtoU( base ); if (!baseU) goto exit; } if (filter) { filterU = strWtoU( filter ); if (!filterU) goto exit; } if (attrs) { attrsU = strarrayWtoU( attrs ); if (!attrsU) goto exit; } ret = map_error( ldap_search_ext_s( ld, baseU, scope, filterU, attrsU, attrsonly, NULL, NULL, (struct timeval *)timeout, 0, res )); exit: strfreeU( baseU ); strfreeU( filterU ); strarrayfreeU( attrsU ); #endif return ret; }
/*********************************************************************** * ldap_add_extW (WLDAP32.@) * * Add an entry to a directory tree (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to add. * attrs [I] Pointer to an array of LDAPModW structures, each * specifying an attribute and its values to add. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * message [O] Message ID of the add operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Call ldap_result with the message ID to get the result of * the operation. The serverctrls and clientctrls parameters are * optional and should be set to NULL if not used. */ ULONG CDECL ldap_add_extW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *attrs[], PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; LDAPMod **attrsU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; int dummy; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn), attrs, serverctrls, clientctrls, message ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (attrs) { attrsU = modarrayWtoU( attrs ); if (!attrsU) goto exit; } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = map_error( ldap_add_ext( ld, dn ? dnU : "", attrs ? attrsU : nullattrs, serverctrlsU, clientctrlsU, message ? (int *)message : &dummy )); exit: strfreeU( dnU ); modarrayfreeU( attrsU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_extended_operation_sW (WLDAP32.@) * * Perform an extended operation (synchronous mode). * * PARAMS * ld [I] Pointer to an LDAP context. * oid [I] OID of the extended operation. * data [I] Data needed by the operation. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * retoid [O] OID of the server response message. * retdata [O] Data returned by the server. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * The data parameter should be set to NULL if the operation * requires no data. The serverctrls, clientctrls, retoid and * and retdata parameters are also optional. Set to NULL if not * used. Free retoid and retdata after use with ldap_memfree. */ ULONG CDECL ldap_extended_operation_sW( WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, PWCHAR *retoid, struct WLDAP32_berval **retdata ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *oidU = NULL, *retoidU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls, clientctrls, retoid, retdata ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (oid) { oidU = strWtoU( oid ); if (!oidU) goto exit; } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = map_error( ldap_extended_operation_s( ld, oid ? oidU : "", (struct berval *)data, serverctrlsU, clientctrlsU, &retoidU, (struct berval **)retdata )); if (retoid && retoidU) { *retoid = strUtoW( retoidU ); if (!*retoid) ret = WLDAP32_LDAP_NO_MEMORY; ldap_memfree( retoidU ); } exit: strfreeU( oidU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_modify_extW (WLDAP32.@) * * Change an entry in a directory tree (asynchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to change. * mods [I] Pointer to an array of LDAPModW structures, each * specifying an attribute and its values to change. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * message [O] Message ID of the modify operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * Call ldap_result with the message ID to get the result of * the operation. The serverctrls and clientctrls parameters are * optional and should be set to NULL if not used. */ ULONG CDECL ldap_modify_extW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[], PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; LDAPMod **modsU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; int dummy; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn), mods, serverctrls, clientctrls, message ); if (!ld) return ~0UL; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (mods) { modsU = modarrayWtoU( mods ); if (!modsU) goto exit; } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = ldap_modify_ext( ld, dn ? dnU : "", mods ? modsU : nullmods, serverctrlsU, clientctrlsU, message ? (int *)message : &dummy ); exit: strfreeU( dnU ); modarrayfreeU( modsU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_dn2ufnW (WLDAP32.@) * * Convert a DN to a user-friendly name. * * PARAMS * dn [I] DN to convert. * * RETURNS * Success: Pointer to a string containing the user-friendly name. * Failure: NULL * * NOTES * Free the string with ldap_memfree. */ PWCHAR CDECL ldap_dn2ufnW( PWCHAR dn ) { PWCHAR ret = NULL; #ifdef HAVE_LDAP char *dnU, *retU; TRACE( "(%s)\n", debugstr_w(dn) ); dnU = strWtoU( dn ); if (!dnU) return NULL; retU = ldap_dn2ufn( dnU ); ret = strUtoW( retU ); strfreeU( dnU ); ldap_memfree( retU ); #endif return ret; }
/*********************************************************************** * ldap_explode_dnW (WLDAP32.@) * * Break up a DN into its components. * * PARAMS * dn [I] DN to break up. * notypes [I] Remove attribute type information from the components. * * RETURNS * Success: Pointer to a NULL-terminated array that contains the DN * components. * Failure: NULL * * NOTES * Free the string array with ldap_value_free. */ PWCHAR * CDECL ldap_explode_dnW( PWCHAR dn, ULONG notypes ) { PWCHAR *ret = NULL; #ifdef HAVE_LDAP char *dnU, **retU; TRACE( "(%s, 0x%08x)\n", debugstr_w(dn), notypes ); dnU = strWtoU( dn ); if (!dnU) return NULL; retU = ldap_explode_dn( dnU, notypes ); ret = strarrayUtoW( retU ); strfreeU( dnU ); ldap_memvfree( (void **)retU ); #endif return ret; }
/*********************************************************************** * ldap_delete_sW (WLDAP32.@) * * Delete an entry from a directory tree (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to delete. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. */ ULONG CDECL ldap_delete_sW( WLDAP32_LDAP *ld, PWCHAR dn ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; TRACE( "(%p, %s)\n", ld, debugstr_w(dn) ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) return WLDAP32_LDAP_NO_MEMORY; } ret = map_error( ldap_delete_ext_s( ld, dn ? dnU : "", NULL, NULL )); strfreeU( dnU ); #endif return ret; }
/*********************************************************************** * ldap_extended_operationW (WLDAP32.@) * * Perform an extended operation (asynchronous mode). * * PARAMS * ld [I] Pointer to an LDAP context. * oid [I] OID of the extended operation. * data [I] Data needed by the operation. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * message [O] Message ID of the extended operation. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * The data parameter should be set to NULL if the operation * requires no data. Call ldap_result with the message ID to * get the result of the operation or ldap_abandon to cancel * the operation. The serverctrls and clientctrls parameters * are optional and should be set to NULL if not used. Call * ldap_close_extended_op to close the operation. */ ULONG CDECL ldap_extended_operationW( WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *oidU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; ret = WLDAP32_LDAP_NO_MEMORY; TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls, clientctrls, message ); if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; if (oid) { oidU = strWtoU( oid ); if (!oidU) goto exit; } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = map_error( ldap_extended_operation( ld, oid ? oidU : "", (struct berval *)data, serverctrlsU, clientctrlsU, (int *)message )); exit: strfreeU( oidU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_get_values_lenW (WLDAP32.@) * * Retrieve binary values for a given attribute. * * PARAMS * ld [I] Pointer to an LDAP context. * message [I] Entry to retrieve values from. * attr [I] Attribute to retrieve values for. * * RETURNS * Success: Pointer to a berval array holding the values. * Failure: NULL * * NOTES * Call ldap_get_values_lenW with the result of a call to * ldap_first_entry or ldap_next_entry. Free the returned * array with a call to ldap_value_free_len. */ struct WLDAP32_berval ** CDECL ldap_get_values_lenW( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *message, PWCHAR attr ) { #ifdef HAVE_LDAP char *attrU = NULL; struct berval **ret; TRACE( "(%p, %p, %s)\n", ld, message, debugstr_w(attr) ); if (!ld || !message || !attr) return NULL; attrU = strWtoU( attr ); if (!attrU) return NULL; ret = ldap_get_values_len( ld, message, attrU ); strfreeU( attrU ); return (struct WLDAP32_berval **)ret; #else return NULL; #endif }
/*********************************************************************** * ldap_delete_ext_sW (WLDAP32.@) * * Delete an entry from a directory tree (synchronous operation). * * PARAMS * ld [I] Pointer to an LDAP context. * dn [I] DN of the entry to delete. * serverctrls [I] Array of LDAP server controls. * clientctrls [I] Array of LDAP client controls. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. * * NOTES * The serverctrls and clientctrls parameters are optional and * should be set to NULL if not used. */ ULONG CDECL ldap_delete_ext_sW( WLDAP32_LDAP *ld, PWCHAR dn, PLDAPControlW *serverctrls, PLDAPControlW *clientctrls ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; TRACE( "(%p, %s, %p, %p)\n", ld, debugstr_w(dn), serverctrls, clientctrls ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (dn) { dnU = strWtoU( dn ); if (!dnU) goto exit; } if (serverctrls) { serverctrlsU = controlarrayWtoU( serverctrls ); if (!serverctrlsU) goto exit; } if (clientctrls) { clientctrlsU = controlarrayWtoU( clientctrls ); if (!clientctrlsU) goto exit; } ret = map_error( ldap_delete_ext_s( ld, dn ? dnU : "", serverctrlsU, clientctrlsU )); exit: strfreeU( dnU ); controlarrayfreeU( serverctrlsU ); controlarrayfreeU( clientctrlsU ); #endif return ret; }
/*********************************************************************** * ldap_get_optionW (WLDAP32.@) * * Retrieve option values for a given LDAP context. * * PARAMS * ld [I] Pointer to an LDAP context. * option [I] Option to get values for. * value [O] Pointer to option values. * * RETURNS * Success: LDAP_SUCCESS * Failure: An LDAP error code. */ ULONG CDECL ldap_get_optionW( WLDAP32_LDAP *ld, int option, void *value ) { ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP TRACE( "(%p, 0x%08x, %p)\n", ld, option, value ); if (!ld || !value) return WLDAP32_LDAP_PARAM_ERROR; switch (option) { case WLDAP32_LDAP_OPT_API_FEATURE_INFO: { LDAPAPIFeatureInfo featureU; LDAPAPIFeatureInfoW *featureW = value; if (!featureW->ldapaif_name) return WLDAP32_LDAP_PARAM_ERROR; featureU.ldapaif_info_version = featureW->ldapaif_info_version; featureU.ldapaif_name = strWtoU( featureW->ldapaif_name ); featureU.ldapaif_version = 0; if (!featureU.ldapaif_name) return WLDAP32_LDAP_NO_MEMORY; ret = map_error( ldap_get_option( ld, option, &featureU )); featureW->ldapaif_version = featureU.ldapaif_version; strfreeU( featureU.ldapaif_name ); return ret; } case WLDAP32_LDAP_OPT_API_INFO: { LDAPAPIInfo infoU; LDAPAPIInfoW *infoW = value; memset( &infoU, 0, sizeof(LDAPAPIInfo) ); infoU.ldapai_info_version = infoW->ldapai_info_version; ret = map_error( ldap_get_option( ld, option, &infoU )); infoW->ldapai_api_version = infoU.ldapai_api_version; infoW->ldapai_protocol_version = infoU.ldapai_protocol_version; if (infoU.ldapai_extensions) { infoW->ldapai_extensions = strarrayUtoW( infoU.ldapai_extensions ); if (!infoW->ldapai_extensions) return WLDAP32_LDAP_NO_MEMORY; } if (infoU.ldapai_vendor_name) { infoW->ldapai_vendor_name = strUtoW( infoU.ldapai_vendor_name ); if (!infoW->ldapai_vendor_name) { ldap_memvfree( (void **)infoU.ldapai_extensions ); return WLDAP32_LDAP_NO_MEMORY; } } infoW->ldapai_vendor_version = infoU.ldapai_vendor_version; ldap_memvfree( (void **)infoU.ldapai_extensions ); ldap_memfree( infoU.ldapai_vendor_name ); return ret; } case WLDAP32_LDAP_OPT_DEREF: case WLDAP32_LDAP_OPT_DESC: case WLDAP32_LDAP_OPT_ERROR_NUMBER: case WLDAP32_LDAP_OPT_PROTOCOL_VERSION: case WLDAP32_LDAP_OPT_REFERRALS: case WLDAP32_LDAP_OPT_SIZELIMIT: case WLDAP32_LDAP_OPT_TIMELIMIT: return map_error( ldap_get_option( ld, option, value )); case WLDAP32_LDAP_OPT_CACHE_ENABLE: case WLDAP32_LDAP_OPT_CACHE_FN_PTRS: case WLDAP32_LDAP_OPT_CACHE_STRATEGY: case WLDAP32_LDAP_OPT_IO_FN_PTRS: case WLDAP32_LDAP_OPT_REBIND_ARG: case WLDAP32_LDAP_OPT_REBIND_FN: case WLDAP32_LDAP_OPT_RESTART: case WLDAP32_LDAP_OPT_THREAD_FN_PTRS: return WLDAP32_LDAP_LOCAL_ERROR; case WLDAP32_LDAP_OPT_AREC_EXCLUSIVE: case WLDAP32_LDAP_OPT_AUTO_RECONNECT: case WLDAP32_LDAP_OPT_CLIENT_CERTIFICATE: case WLDAP32_LDAP_OPT_DNSDOMAIN_NAME: case WLDAP32_LDAP_OPT_ENCRYPT: case WLDAP32_LDAP_OPT_ERROR_STRING: case WLDAP32_LDAP_OPT_FAST_CONCURRENT_BIND: case WLDAP32_LDAP_OPT_GETDSNAME_FLAGS: case WLDAP32_LDAP_OPT_HOST_NAME: case WLDAP32_LDAP_OPT_HOST_REACHABLE: case WLDAP32_LDAP_OPT_PING_KEEP_ALIVE: case WLDAP32_LDAP_OPT_PING_LIMIT: case WLDAP32_LDAP_OPT_PING_WAIT_TIME: case WLDAP32_LDAP_OPT_PROMPT_CREDENTIALS: case WLDAP32_LDAP_OPT_REF_DEREF_CONN_PER_MSG: case WLDAP32_LDAP_OPT_REFERRAL_CALLBACK: case WLDAP32_LDAP_OPT_REFERRAL_HOP_LIMIT: case WLDAP32_LDAP_OPT_ROOTDSE_CACHE: case WLDAP32_LDAP_OPT_SASL_METHOD: case WLDAP32_LDAP_OPT_SECURITY_CONTEXT: case WLDAP32_LDAP_OPT_SEND_TIMEOUT: case WLDAP32_LDAP_OPT_SERVER_CERTIFICATE: case WLDAP32_LDAP_OPT_SERVER_CONTROLS: case WLDAP32_LDAP_OPT_SERVER_ERROR: case WLDAP32_LDAP_OPT_SERVER_EXT_ERROR: case WLDAP32_LDAP_OPT_SIGN: case WLDAP32_LDAP_OPT_SSL: case WLDAP32_LDAP_OPT_SSL_INFO: case WLDAP32_LDAP_OPT_SSPI_FLAGS: case WLDAP32_LDAP_OPT_TCP_KEEPALIVE: FIXME( "Unsupported option: 0x%02x\n", option ); return WLDAP32_LDAP_NOT_SUPPORTED; default: FIXME( "Unknown option: 0x%02x\n", option ); return WLDAP32_LDAP_LOCAL_ERROR; } #endif return ret; }