ULONG CDECL ldap_parse_resultW( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *result, ULONG *retcode, PWCHAR *matched, PWCHAR *error, PWCHAR **referrals, PLDAPControlW **serverctrls, BOOLEAN free ) { ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char **matchedU = NULL, **errorU = NULL, **referralsU = NULL; LDAPControl **serverctrlsU = NULL; TRACE( "(%p, %p, %p, %p, %p, %p, %p, 0x%02x)\n", ld, result, retcode, matched, error, referrals, serverctrls, free ); if (!ld) return ~0UL; ret = ldap_parse_result( ld, result, (int *)retcode, matchedU, errorU, &referralsU, &serverctrlsU, free ); matched = strarrayUtoW( matchedU ); error = strarrayUtoW( errorU ); *referrals = strarrayUtoW( referralsU ); *serverctrls = controlarrayUtoW( serverctrlsU ); ldap_memfree( matchedU ); ldap_memfree( errorU ); ldap_memfree( referralsU ); ldap_controls_free( serverctrlsU ); #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; }
ULONG CDECL ldap_parse_referenceW( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *message, PWCHAR **referrals ) { ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP_PARSE_REFERENCE char **referralsU = NULL; TRACE( "(%p, %p, %p)\n", ld, message, referrals ); if (!ld) return ~0UL; ret = ldap_parse_reference( ld, message, &referralsU, NULL, 0 ); *referrals = strarrayUtoW( referralsU ); ldap_memfree( referralsU ); #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_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; }