X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmr.c;h=88a07c7064a97280d6a4e198574f126d3c22360f;hb=9777dc21148eaba94326aa41d851d558d8869b0e;hp=b401aa3e9acfecbc65bb7522ef52d2c1156416bb;hpb=8502301b006e170acbc4ae9ee7aa6871f9fc79f4;p=openldap diff --git a/servers/slapd/mr.c b/servers/slapd/mr.c index b401aa3e9a..88a07c7064 100644 --- a/servers/slapd/mr.c +++ b/servers/slapd/mr.c @@ -1,8 +1,17 @@ /* mr.c - routines to manage matching rule definitions */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2003 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -84,6 +93,7 @@ mr_destroy( void ) m = LDAP_SLIST_FIRST(&mr_list); LDAP_SLIST_REMOVE_HEAD(&mr_list, smr_next); ch_free( m->smr_str.bv_val ); + ch_free( m->smr_compat_syntaxes ); ldap_matchingrule_free((LDAPMatchingRule *)m); } } @@ -97,6 +107,7 @@ mr_insert( struct mindexrec *mir; char **names; + LDAP_SLIST_NEXT( smr, smr_next ) = NULL; LDAP_SLIST_INSERT_HEAD(&mr_list, smr, smr_next); if ( smr->smr_oid ) { @@ -177,7 +188,6 @@ mr_add( smr->smr_oidlen = strlen( mr->mr_oid ); smr->smr_usage = def->mrd_usage; smr->smr_compat_syntaxes = compat_syn; - smr->smr_convert = def->mrd_convert; smr->smr_normalize = def->mrd_normalize; smr->smr_match = def->mrd_match; smr->smr_indexer = def->mrd_indexer; @@ -225,9 +235,6 @@ register_matching_rule( if( def->mrd_associated != NULL ) { amr = mr_find( def->mrd_associated ); -#if 0 - /* ignore for now */ - if( amr == NULL ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ERR, @@ -242,7 +249,41 @@ register_matching_rule( return -1; } + + if (( def->mrd_usage & SLAP_MR_EQUALITY ) && + (( def->mrd_usage & SLAP_MR_SUBTYPE_MASK ) == SLAP_MR_NONE )) + { + if (( def->mrd_usage & SLAP_MR_EQUALITY ) && + (( def->mrd_usage & SLAP_MR_SUBTYPE_MASK ) != SLAP_MR_NONE )) + { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, ERR, + "register_matching_rule: inappropriate (approx) association " + "%s for %s\n", + def->mrd_associated, def->mrd_desc, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "register_matching_rule: inappropriate (approx) association " + "%s for %s\n", + def->mrd_associated, def->mrd_desc, 0 ); +#endif + return -1; + } + + } else if (!( amr->smr_usage & SLAP_MR_EQUALITY )) { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, ERR, + "register_matching_rule: inappropriate (equalilty) association " + "%s for %s\n", + def->mrd_associated, def->mrd_desc, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "register_matching_rule: inappropriate (equalilty) association " + "%s for %s\n", + def->mrd_associated, def->mrd_desc, 0 ); #endif + return -1; + } } mr = ldap_str2matchingrule( def->mrd_desc, &code, &err, @@ -258,9 +299,10 @@ register_matching_rule( ldap_scherr2str(code), err, def->mrd_desc ); #endif - return( -1 ); + return -1; } + code = mr_add( mr, def, amr, &err ); ldap_memfree( mr ); @@ -276,10 +318,10 @@ register_matching_rule( scherr2str(code), err, def->mrd_desc ); #endif - return( -1 ); + return -1; } - return( 0 ); + return 0; } void @@ -293,14 +335,14 @@ mru_destroy( void ) if ( m->smru_str.bv_val ) { ch_free( m->smru_str.bv_val ); + m->smru_str.bv_val = NULL; } /* memory borrowed from m->smru_mr */ m->smru_oid = NULL; m->smru_names = NULL; m->smru_desc = NULL; - /* free what's left (basically - * smru_mruleuse.mru_applies_oids) */ + /* free what's left (basically smru_mruleuse.mru_applies_oids) */ ldap_matchingruleuse_free((LDAPMatchingRuleUse *)m); } } @@ -437,9 +479,9 @@ int mr_usable_with_at( int mr_schema_info( Entry *e ) { - MatchingRule *mr; - AttributeDescription *ad_matchingRules = slap_schema.si_ad_matchingRules; + MatchingRule *mr; + struct berval nval; LDAP_SLIST_FOREACH(mr, &mr_list, smr_next ) { if ( mr->smr_usage & SLAP_MR_HIDE ) { @@ -461,12 +503,10 @@ int mr_schema_info( Entry *e ) Debug( LDAP_DEBUG_TRACE, "Merging mr [%lu] %s\n", mr->smr_str.bv_len, mr->smr_str.bv_val, 0 ); #endif -#ifdef SLAP_NVALUES - if( attr_merge_one( e, ad_matchingRules, &mr->smr_str, NULL /* FIXME */ ) ) -#else - if( attr_merge_one( e, ad_matchingRules, &mr->smr_str ) ) -#endif - { + + nval.bv_val = mr->smr_oid; + nval.bv_len = strlen(mr->smr_oid); + if( attr_merge_one( e, ad_matchingRules, &mr->smr_str, &nval ) ) { return -1; } } @@ -475,13 +515,12 @@ int mr_schema_info( Entry *e ) int mru_schema_info( Entry *e ) { - MatchingRuleUse *mru; - AttributeDescription *ad_matchingRuleUse = slap_schema.si_ad_matchingRuleUse; + MatchingRuleUse *mru; + struct berval nval; LDAP_SLIST_FOREACH( mru, &mru_list, smru_next ) { - assert( !( mru->smru_usage & SLAP_MR_HIDE ) ); if ( mru->smru_str.bv_val == NULL ) { @@ -495,12 +534,10 @@ int mru_schema_info( Entry *e ) Debug( LDAP_DEBUG_TRACE, "Merging mru [%lu] %s\n", mru->smru_str.bv_len, mru->smru_str.bv_val, 0 ); #endif -#ifdef SLAP_NVALUES - if( attr_merge_one( e, ad_matchingRuleUse, &mru->smru_str, NULL /* FIXME */ ) ) -#else - if( attr_merge_one( e, ad_matchingRuleUse, &mru->smru_str ) ) -#endif - { + + nval.bv_val = mru->smru_oid; + nval.bv_len = strlen(mru->smru_oid); + if( attr_merge_one( e, ad_matchingRuleUse, &mru->smru_str, &nval ) ) { return -1; } }