1 /* mr.c - routines to manage matching rule definitions */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/string.h>
14 #include <ac/socket.h>
25 static Avlnode *mr_index = NULL;
26 static MatchingRule *mr_list = NULL;
30 struct mindexrec *mir1,
31 struct mindexrec *mir2
34 return (strcmp( mir1->mir_name, mir2->mir_name ));
43 return (strcmp( name, mir->mir_name ));
47 mr_find( const char *mrname )
49 struct mindexrec *mir = NULL;
51 if ( (mir = (struct mindexrec *) avl_find( mr_index, mrname,
52 (AVL_CMP) mr_index_name_cmp )) != NULL ) {
53 return( mir->mir_mr );
65 struct mindexrec *mir;
69 while ( *mrp != NULL ) {
70 mrp = &(*mrp)->smr_next;
75 mir = (struct mindexrec *)
76 ch_calloc( 1, sizeof(struct mindexrec) );
77 mir->mir_name = smr->smr_oid;
79 if ( avl_insert( &mr_index, (caddr_t) mir,
80 (AVL_CMP) mr_index_cmp,
81 (AVL_DUP) avl_dup_error ) ) {
84 return SLAP_SCHERR_DUP_RULE;
86 /* FIX: temporal consistency check */
87 mr_find(mir->mir_name);
89 if ( (names = smr->smr_names) ) {
91 mir = (struct mindexrec *)
92 ch_calloc( 1, sizeof(struct mindexrec) );
93 mir->mir_name = ch_strdup(*names);
95 if ( avl_insert( &mr_index, (caddr_t) mir,
96 (AVL_CMP) mr_index_cmp,
97 (AVL_DUP) avl_dup_error ) ) {
100 return SLAP_SCHERR_DUP_RULE;
102 /* FIX: temporal consistency check */
103 mr_find(mir->mir_name);
112 LDAPMatchingRule *mr,
114 slap_mr_convert_func *convert,
115 slap_mr_normalize_func *normalize,
116 slap_mr_match_func *match,
117 slap_mr_indexer_func *indexer,
118 slap_mr_filter_func *filter,
127 smr = (MatchingRule *) ch_calloc( 1, sizeof(MatchingRule) );
128 AC_MEMCPY( &smr->smr_mrule, mr, sizeof(LDAPMatchingRule));
130 smr->smr_usage = usage;
131 smr->smr_convert = convert;
132 smr->smr_normalize = normalize;
133 smr->smr_match = match;
134 smr->smr_indexer = indexer;
135 smr->smr_filter = filter;
136 smr->smr_associated = amr;
138 if ( smr->smr_syntax_oid ) {
139 if ( (syn = syn_find(smr->smr_syntax_oid)) ) {
140 smr->smr_syntax = syn;
142 *err = smr->smr_syntax_oid;
143 return SLAP_SCHERR_SYN_NOT_FOUND;
147 return SLAP_SCHERR_MR_INCOMPLETE;
149 code = mr_insert(smr,err);
155 register_matching_rule(
158 slap_mr_convert_func *convert,
159 slap_mr_normalize_func *normalize,
160 slap_mr_match_func *match,
161 slap_mr_indexer_func *indexer,
162 slap_mr_filter_func *filter,
163 const char* associated )
165 LDAPMatchingRule *mr;
166 MatchingRule *amr = NULL;
170 if( usage == SLAP_MR_NONE ) {
171 Debug( LDAP_DEBUG_ANY, "register_matching_rule: not usable %s\n",
176 if( associated != NULL ) {
177 amr = mr_find( associated );
183 Debug( LDAP_DEBUG_ANY, "register_matching_rule: could not locate "
184 "associated matching rule %s for %s\n",
185 associated, desc, 0 );
192 mr = ldap_str2matchingrule( desc, &code, &err, LDAP_SCHEMA_ALLOW_ALL);
194 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n",
195 ldap_scherr2str(code), err, desc );
199 code = mr_add( mr, usage,
200 convert, normalize, match, indexer, filter, amr,
206 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s for %s in %s\n",
207 scherr2str(code), err, desc );
215 #if defined( SLAPD_SCHEMA_DN )
217 int mr_schema_info( Entry *e )
220 struct berval *vals[2];
223 AttributeDescription *ad_matchingRules = slap_schema.si_ad_matchingRules;
228 for ( mr = mr_list; mr; mr = mr->smr_next ) {
229 if ( ! mr->smr_match ) {
230 /* skip rules without matching functions */
234 val.bv_val = ldap_matchingrule2str( &mr->smr_mrule );
236 if ( val.bv_val == NULL ) {
240 val.bv_len = strlen( val.bv_val );
242 Debug( LDAP_DEBUG_TRACE, "Merging mr [%ld] %s\n",
243 (long) val.bv_len, val.bv_val, 0 );
245 attr_merge( e, ad_matchingRules, vals );
246 ldap_memfree( val.bv_val );