X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmr.c;h=5f6e496f55c4c63449faeb55a33982d2c303dfa6;hb=ed471a4d53b9bcd2cc89410743ffb4bd58b5fc05;hp=5168cba256af688d6064b6ea7c2314642aa69b22;hpb=e9a71156cc963a4ea206e36437e0a10145dfa38d;p=openldap diff --git a/servers/slapd/mr.c b/servers/slapd/mr.c index 5168cba256..5f6e496f55 100644 --- a/servers/slapd/mr.c +++ b/servers/slapd/mr.c @@ -27,10 +27,12 @@ static MatchingRuleUse *mru_list = NULL; 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 +40,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 +66,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 ); @@ -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; @@ -310,16 +311,6 @@ 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 - #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "matching_rule_use_init\n", 0, 0, 0 ); #else @@ -327,9 +318,6 @@ matching_rule_use_init( void ) #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 ); - AttributeType *at; MatchingRuleUse _mru, *mru = &_mru; @@ -382,21 +370,10 @@ matching_rule_use_init( void ) at = NULL; for ( at_start( &at ); at; at_next( &at ) ) { - if( mr->smr_usage & SLAP_MR_EXT && ( - mr->smr_syntax == at->sat_syntax || - mr == at->sat_equality || - mr == at->sat_approx ) ) - { - ldap_charray_add( &applies_oids, at->sat_cname.bv_val ); + if( at->sat_flags & SLAP_AT_HIDE ) continue; - } else 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] ) { - ldap_charray_add( &applies_oids, at->sat_cname.bv_val ); - break; - } - } + if( mr_usable_with_at( mr, at )) { + ldap_charray_add( &applies_oids, at->sat_cname.bv_val ); } } @@ -436,8 +413,27 @@ matching_rule_use_init( void ) 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 ) { @@ -465,7 +461,8 @@ 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 ); + if( attr_merge_one( e, ad_matchingRules, &mr->smr_str ) ) + return -1; } return 0; } @@ -492,9 +489,8 @@ 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 ); + if( attr_merge_one( e, ad_matchingRuleUse, &mru->smru_str ) ) + return -1; } return 0; } - -#endif