-DN_Normalize( LDAPDN *dn )
-{
- int iRDN;
- int rc;
-
- assert( dn );
-
- for ( iRDN = 0; dn[ iRDN ]; iRDN++ ) {
- LDAPRDN *rdn = dn[ iRDN ][ 0 ];
- int iAVA;
-
- for ( iAVA = 0; rdn[ iAVA ]; iAVA++ ) {
- LDAPAVA *ava = rdn[ iAVA ][ 0 ];
- AttributeDescription *ad = NULL;
- const char *text = NULL;
- slap_syntax_transform_func *nf = NULL;
- struct berval *bv = NULL;
-
- rc = slap_bv2ad( ava->la_attr, &ad, &text );
- if ( rc != LDAP_SUCCESS ) {
- return( LDAP_INVALID_SYNTAX );
- }
-
- /*
- * FIXME: is this required?
- */
- ber_bvfree( ava->la_attr );
- ava->la_attr = ber_bvdup( &ad->ad_cname );
-
- /*
- * FIXME: What is this intended for?
- */
- nf = ad->ad_type->sat_syntax->ssyn_normalize;
- if ( !nf ) {
- break;
- }
-
- rc = ( *nf )( ad->ad_type->sat_syntax,
- ava->la_value, &bv );
-
- if ( rc != LDAP_SUCCESS ) {
- return( LDAP_INVALID_SYNTAX );
- }
-
- /*
- * FIXME: shouldn't this happen inside
- * ssyn_normalize if the syntax is case
- * insensitive?
- */
- if ( !( ava->la_flags & LDAP_AVA_BINARY ) ) {
- struct berval *s = bv;
-
- bv = ber_bvstr( UTF8normalize( bv,
- UTF8_CASEFOLD ) );
- ber_bvfree( s );
- }
-
- ber_bvfree( ava->la_value );
- ava->la_value = bv;
-
- AVA_Sort( rdn, iAVA );
- }
- }
-
- return( LDAP_SUCCESS );
-}
-
-int
-dnNormalize(
- Syntax *syntax,
- struct berval *val,
- struct berval **normalized )
-{
- struct berval *out = NULL;
-
- Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: %s\n", val->bv_val, 0, 0 );
-
- if ( val->bv_len != 0 ) {
- LDAPDN *dn = NULL;
- char *dn_out = NULL;
- int rc;
-
- /*
- * Go to structural representation
- */
- rc = ldap_str2dn( val->bv_val, &dn, LDAP_DN_FORMAT_LDAPV3 );
- if ( rc != LDAP_SUCCESS ) {
- return( LDAP_INVALID_SYNTAX );
- }
-
- /*
- * Add schema-aware normalization stuff
- */
- if ( DN_Normalize( dn ) != LDAP_SUCCESS ) {
- goto error_return;
- }
-
- /*
- * Back to string representation
- */
- rc = ldap_dn2str( dn, &dn_out, LDAP_DN_FORMAT_LDAPV3 );
-
- if ( rc != LDAP_SUCCESS ) {
-error_return:;
- ldapava_free_dn( dn );
- return( LDAP_INVALID_SYNTAX );
- }
-
- ldapava_free_dn( dn );
-
- out = ber_bvstr( dn_out );
-
- } else {
- out = ber_bvdup( val );
- }
-
- Debug( LDAP_DEBUG_TRACE, "<<< dnNormalize: %s\n", out->bv_val, 0, 0 );
-
- *normalized = out;
-
- return( LDAP_SUCCESS );
-}
-
-int
-dnPretty(
- Syntax *syntax,
- struct berval *val,
- struct berval **normalized)
-{
- struct berval *out = NULL;
-
- if ( val->bv_len != 0 ) {
- LDAPDN *dn = NULL;
- char *dn_out = NULL;
- int rc;
-
- /* FIXME: should be liberal in what we accept */
- rc = ldap_str2dn( val->bv_val, &dn, LDAP_DN_FORMAT_LDAPV3 );
- if ( rc != LDAP_SUCCESS ) {
- return( LDAP_INVALID_SYNTAX );
- }
-
- /* Add LDAPDN pretty code here
- * pretty'ing MUST preserve values
- * but MAY use alternative representation of value.
- *
- * That is, in addition to changes made by the
- * str->LDAPDN->str processing, this code can
- * convert values from BER to LDAP string representation
- * (or other direction if appropriate)
- * "pretty" values
- * normalize attribute descriptions
- * reorder AVAs in RDNs
- */
-
- /* FIXME: not sure why the default isn't pretty */
- rc = ldap_dn2str( dn, &dn_out,
- LDAP_DN_FORMAT_LDAPV3 | LDAP_DN_PRETTY );
- ldapava_free_dn( dn );
-
- if ( rc != LDAP_SUCCESS ) {
- return( LDAP_INVALID_SYNTAX );
- }
-
- out = ber_bvstr( dn_out );
-
- } else {
- out = ber_bvdup( val );
- }
-
- *normalized = out;
-
- return( LDAP_SUCCESS );
-}
-
-int
-dnMatch(
- int *matchp,
- slap_mask_t flags,