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 ));
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 ));
{
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 );
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;
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;
{
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));
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_compat_syntaxes = compat_syn;
smr->smr_convert = def->mrd_convert;
smr->smr_normalize = def->mrd_normalize;
smr->smr_match = def->mrd_match;
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 );
#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",
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
"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
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
#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;
* 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;
}
at = NULL;
for ( at_start( &at ); at; at_next( &at ) ) {
- if( mr->smr_syntax == at->sat_syntax ||
- mr == at->sat_equality )
- {
+ 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 );
}
}
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 );
}
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 )
{
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;
}
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