X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmr.c;h=52a1301b95541008fc517c8977a09f8f523a0d93;hb=1bae6d28e5d764ce52a2ba62838534420a0a3fa3;hp=76ee500442ce2d694ba978da68259d62f5118f37;hpb=04c71ce9b2d0ae6bde84b76d9b0fc735218ca591;p=openldap diff --git a/servers/slapd/mr.c b/servers/slapd/mr.c index 76ee500442..52a1301b95 100644 --- a/servers/slapd/mr.c +++ b/servers/slapd/mr.c @@ -1,7 +1,7 @@ /* mr.c - routines to manage matching rule definitions */ /* $OpenLDAP$ */ /* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -22,15 +22,19 @@ struct mindexrec { }; static Avlnode *mr_index = NULL; -static MatchingRule *mr_list = NULL; -static MatchingRuleUse *mru_list = NULL; +static LDAP_SLIST_HEAD(MRList, slap_matching_rule) mr_list + = LDAP_SLIST_HEAD_INITIALIZER(&mr_list); +static LDAP_SLIST_HEAD(MRUList, slap_matching_rule_use) mru_list + = LDAP_SLIST_HEAD_INITIALIZER(&mru_list); static int mr_index_cmp( - struct mindexrec *mir1, - struct mindexrec *mir2 + const void *v_mir1, + const void *v_mir2 ) { + const struct mindexrec *mir1 = v_mir1; + const struct mindexrec *mir2 = v_mir2; int i = mir1->mir_name.bv_len - mir2->mir_name.bv_len; if (i) return i; return (strcmp( mir1->mir_name.bv_val, mir2->mir_name.bv_val )); @@ -38,10 +42,12 @@ mr_index_cmp( static int mr_index_name_cmp( - struct berval *name, - struct mindexrec *mir + const void *v_name, + const void *v_mir ) { + const struct berval *name = v_name; + const struct mindexrec *mir = v_mir; int i = name->bv_len - mir->mir_name.bv_len; if (i) return i; return (strncmp( name->bv_val, mir->mir_name.bv_val, name->bv_len )); @@ -62,8 +68,7 @@ mr_bvfind( struct berval *mrname ) { struct mindexrec *mir = NULL; - if ( (mir = (struct mindexrec *) avl_find( mr_index, mrname, - (AVL_CMP) mr_index_name_cmp )) != NULL ) { + if ( (mir = avl_find( mr_index, mrname, mr_index_name_cmp )) != NULL ) { return( mir->mir_mr ); } return( NULL ); @@ -72,12 +77,14 @@ mr_bvfind( struct berval *mrname ) void mr_destroy( void ) { - MatchingRule *m, *n; + MatchingRule *m; avl_free(mr_index, ldap_memfree); - for (m=mr_list; m; m=n) { - n = m->smr_next; + while( !LDAP_SLIST_EMPTY(&mr_list) ) { + 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); } } @@ -88,15 +95,11 @@ mr_insert( const char **err ) { - MatchingRule **mrp; struct mindexrec *mir; char **names; - mrp = &mr_list; - while ( *mrp != NULL ) { - mrp = &(*mrp)->smr_next; - } - *mrp = smr; + LDAP_SLIST_NEXT( smr, smr_next ) = NULL; + LDAP_SLIST_INSERT_HEAD(&mr_list, smr, smr_next); if ( smr->smr_oid ) { mir = (struct mindexrec *) @@ -105,8 +108,7 @@ mr_insert( mir->mir_name.bv_len = strlen( smr->smr_oid ); mir->mir_mr = smr; if ( avl_insert( &mr_index, (caddr_t) mir, - (AVL_CMP) mr_index_cmp, - (AVL_DUP) avl_dup_error ) ) { + mr_index_cmp, avl_dup_error ) ) { *err = smr->smr_oid; ldap_memfree(mir); return SLAP_SCHERR_MR_DUP; @@ -122,8 +124,7 @@ mr_insert( mir->mir_name.bv_len = strlen( *names ); mir->mir_mr = smr; if ( avl_insert( &mr_index, (caddr_t) mir, - (AVL_CMP) mr_index_cmp, - (AVL_DUP) avl_dup_error ) ) { + mr_index_cmp, avl_dup_error ) ) { *err = *names; ldap_memfree(mir); return SLAP_SCHERR_MR_DUP; @@ -146,8 +147,27 @@ mr_add( { MatchingRule *smr; Syntax *syn; + Syntax **compat_syn = NULL; int code; + if( def->mrd_compat_syntaxes ) { + int i; + for( i=0; def->mrd_compat_syntaxes[i]; i++ ) { + /* just count em */ + } + + compat_syn = ch_malloc( sizeof(Syntax *) * (i+1) ); + + for( i=0; def->mrd_compat_syntaxes[i]; i++ ) { + compat_syn[i] = syn_find( def->mrd_compat_syntaxes[i] ); + if( compat_syn[i] == NULL ) { + return SLAP_SCHERR_SYN_NOT_FOUND; + } + } + + compat_syn[i] = NULL; + } + smr = (MatchingRule *) ch_calloc( 1, sizeof(MatchingRule) ); AC_MEMCPY( &smr->smr_mrule, mr, sizeof(LDAPMatchingRule)); @@ -158,7 +178,7 @@ mr_add( smr->smr_bvoid.bv_val = smr->smr_mrule.mr_oid; smr->smr_oidlen = strlen( mr->mr_oid ); smr->smr_usage = def->mrd_usage; - smr->smr_convert = def->mrd_convert; + smr->smr_compat_syntaxes = compat_syn; smr->smr_normalize = def->mrd_normalize; smr->smr_match = def->mrd_match; smr->smr_indexer = def->mrd_indexer; @@ -189,7 +209,9 @@ register_matching_rule( int code; const char *err; - if( def->mrd_usage == SLAP_MR_NONE ) { + if( def->mrd_usage == SLAP_MR_NONE && + def->mrd_compat_syntaxes == NULL ) + { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ERR, "register_matching_rule: %s not usable\n", def->mrd_desc, 0, 0 ); @@ -211,7 +233,8 @@ register_matching_rule( #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ERR, "register_matching_rule: could not locate associated " - "matching rule %s for %s\n", def->mrd_associated, def->mrd_desc, 0 ); + "matching rule %s for %s\n", + def->mrd_associated, def->mrd_desc, 0 ); #else Debug( LDAP_DEBUG_ANY, "register_matching_rule: could not locate " "associated matching rule %s for %s\n", @@ -221,17 +244,18 @@ register_matching_rule( return -1; } #endif - } - mr = ldap_str2matchingrule( def->mrd_desc, &code, &err, LDAP_SCHEMA_ALLOW_ALL); + mr = ldap_str2matchingrule( def->mrd_desc, &code, &err, + LDAP_SCHEMA_ALLOW_ALL ); if ( !mr ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ERR, "register_matching_rule: %s before %s in %s.\n", ldap_scherr2str(code), err, def->mrd_desc ); #else - Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n", + Debug( LDAP_DEBUG_ANY, + "Error in register_matching_rule: %s before %s in %s\n", ldap_scherr2str(code), err, def->mrd_desc ); #endif @@ -248,7 +272,8 @@ register_matching_rule( "register_matching_rule: %s for %s in %s.\n", scherr2str(code), err, def->mrd_desc ); #else - Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s for %s in %s\n", + Debug( LDAP_DEBUG_ANY, + "Error in register_matching_rule: %s for %s in %s\n", scherr2str(code), err, def->mrd_desc ); #endif @@ -261,10 +286,12 @@ register_matching_rule( void mru_destroy( void ) { - MatchingRuleUse *m, *n; + MatchingRuleUse *m; + + while( !LDAP_SLIST_EMPTY(&mru_list) ) { + m = LDAP_SLIST_FIRST(&mru_list); + LDAP_SLIST_REMOVE_HEAD(&mru_list, smru_next); - for (m=mru_list; m; m=n) { - n = m->smru_next; if ( m->smru_str.bv_val ) { ch_free( m->smru_str.bv_val ); } @@ -283,17 +310,7 @@ int matching_rule_use_init( void ) { MatchingRule *mr; - MatchingRuleUse **mru_ptr = &mru_list; - -#define MR_TYPE_MASK ( SLAP_MR_TYPE_MASK & ~SLAP_MR_EXT ) -#define MR_TYPE_SUBTYPE_MASK ( MR_TYPE_MASK | SLAP_MR_SUBTYPE_MASK ) -#if 0 /* all types regardless of EXT */ -#define MR_TYPE(x) ( (x) & MR_TYPE_MASK ) -#define MR_TYPE_SUBTYPE(x) ( (x) & MR_TYPE_SUBTYPE_MASK ) -#else /* only those marked as EXT (as per RFC 2252) */ -#define MR_TYPE(x) ( ( (x) & SLAP_MR_EXT ) ? ( (x) & MR_TYPE_MASK ) : SLAP_MR_NONE ) -#define MR_TYPE_SUBTYPE(x) ( ( (x) & SLAP_MR_EXT ) ? ( (x) & MR_TYPE_SUBTYPE_MASK ) : SLAP_MR_NONE ) -#endif + MatchingRuleUse **mru_ptr = &LDAP_SLIST_FIRST(&mru_list); #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "matching_rule_use_init\n", 0, 0, 0 ); @@ -301,12 +318,9 @@ matching_rule_use_init( void ) Debug( LDAP_DEBUG_TRACE, "matching_rule_use_init\n", 0, 0, 0 ); #endif - for ( mr = mr_list; mr; mr = mr->smr_next ) { - slap_mask_t um = MR_TYPE( mr->smr_usage ); - slap_mask_t usm = MR_TYPE_SUBTYPE( mr->smr_usage ); - + LDAP_SLIST_FOREACH( mr, &mr_list, smr_next ) { AttributeType *at; - MatchingRuleUse _mru, *mru = &_mru; + MatchingRuleUse mru_storage, *mru = &mru_storage; char **applies_oids = NULL; @@ -325,7 +339,9 @@ matching_rule_use_init( void ) * Framework doesn't support this (yet). */ - if (!( mr->smr_usage & SLAP_MR_EXT )) { + if (!( ( mr->smr_usage & SLAP_MR_EXT ) + || mr->smr_compat_syntaxes ) ) + { continue; } @@ -338,7 +354,7 @@ matching_rule_use_init( void ) mru->smru_mr = mr; mru->smru_obsolete = mr->smr_obsolete; mru->smru_applies_oids = NULL; - mru->smru_next = NULL; + LDAP_SLIST_NEXT(mru, smru_next) = NULL; mru->smru_oid = mr->smr_oid; mru->smru_names = mr->smr_names; mru->smru_desc = mr->smr_desc; @@ -355,10 +371,9 @@ matching_rule_use_init( void ) at = NULL; for ( at_start( &at ); at; at_next( &at ) ) { - if( mr->smr_syntax == at->sat_syntax || - mr == at->sat_equality || - mr == at->sat_approx ) - { + if( at->sat_flags & SLAP_AT_HIDE ) continue; + + if( mr_usable_with_at( mr, at )) { ldap_charray_add( &applies_oids, at->sat_cname.bv_val ); } } @@ -372,13 +387,13 @@ matching_rule_use_init( void ) mru->smru_applies_oids = applies_oids; #ifdef NEW_LOGGING { - char *str = ldap_matchingruleuse2str( &mru->smru_mruleuse ); + char *str = ldap_matchingruleuse2str( &mru->smru_mruleuse ); LDAP_LOG( OPERATION, INFO, "matchingRuleUse: %s\n", str, 0, 0 ); ldap_memfree( str ); } #else { - char *str = ldap_matchingruleuse2str( &mru->smru_mruleuse ); + char *str = ldap_matchingruleuse2str( &mru->smru_mruleuse ); Debug( LDAP_DEBUG_TRACE, "matchingRuleUse: %s\n", str, 0, 0 ); ldap_memfree( str ); } @@ -388,27 +403,46 @@ matching_rule_use_init( void ) /* call-forward from MatchingRule to MatchingRuleUse */ mr->smr_mru = mru; /* copy static data to newly allocated struct */ - *mru = _mru; + *mru = mru_storage; /* append the struct pointer to the end of the list */ *mru_ptr = mru; /* update the list head pointer */ - mru_ptr = &mru->smru_next; + mru_ptr = &LDAP_SLIST_NEXT(mru,smru_next); } } return( 0 ); } +int mr_usable_with_at( + MatchingRule *mr, + AttributeType *at ) +{ + if( mr->smr_usage & SLAP_MR_EXT && ( + mr->smr_syntax == at->sat_syntax || + mr == at->sat_equality || mr == at->sat_approx ) ) + { + return 1; + } -#if defined( SLAPD_SCHEMA_DN ) + if ( mr->smr_compat_syntaxes ) { + int i; + for( i=0; mr->smr_compat_syntaxes[i]; i++ ) { + if( at->sat_syntax == mr->smr_compat_syntaxes[i] ) { + return 1; + } + } + } + return 0; +} int mr_schema_info( Entry *e ) { - MatchingRule *mr; - AttributeDescription *ad_matchingRules = slap_schema.si_ad_matchingRules; + MatchingRule *mr; + struct berval nval; - for ( mr = mr_list; mr; mr = mr->smr_next ) { + LDAP_SLIST_FOREACH(mr, &mr_list, smr_next ) { if ( mr->smr_usage & SLAP_MR_HIDE ) { /* skip hidden rules */ continue; @@ -428,19 +462,24 @@ 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 - attr_merge_one( e, ad_matchingRules, &mr->smr_str ); + 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; + } } return 0; } int mru_schema_info( Entry *e ) { - MatchingRuleUse *mru; - AttributeDescription *ad_matchingRuleUse = slap_schema.si_ad_matchingRuleUse; + MatchingRuleUse *mru; + struct berval nval; - for ( mru = mru_list; mru; mru = mru->smru_next ) { + LDAP_SLIST_FOREACH( mru, &mru_list, smru_next ) { assert( !( mru->smru_usage & SLAP_MR_HIDE ) ); @@ -455,9 +494,12 @@ 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 - attr_merge_one( e, ad_matchingRuleUse, &mru->smru_str ); + 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; + } } return 0; } - -#endif