1 /* mr.c - routines to manage matching rule definitions */
4 * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/string.h>
14 #include <ac/socket.h>
20 struct berval mir_name;
24 static Avlnode *mr_index = NULL;
25 static MatchingRule *mr_list = NULL;
29 struct mindexrec *mir1,
30 struct mindexrec *mir2
33 int i = mir1->mir_name.bv_len - mir2->mir_name.bv_len;
35 return (strcmp( mir1->mir_name.bv_val, mir2->mir_name.bv_val ));
44 int i = name->bv_len - mir->mir_name.bv_len;
46 return (strncmp( name->bv_val, mir->mir_name.bv_val, name->bv_len ));
50 mr_find( const char *mrname )
54 bv.bv_val = (char *)mrname;
55 bv.bv_len = strlen( mrname );
56 return mr_bvfind( &bv );
60 mr_bvfind( struct berval *mrname )
62 struct mindexrec *mir = NULL;
64 if ( (mir = (struct mindexrec *) avl_find( mr_index, mrname,
65 (AVL_CMP) mr_index_name_cmp )) != NULL ) {
66 return( mir->mir_mr );
76 avl_free(mr_index, ldap_memfree);
77 for (m=mr_list; m; m=n) {
79 ldap_matchingrule_free((LDAPMatchingRule *)m);
90 struct mindexrec *mir;
94 while ( *mrp != NULL ) {
95 mrp = &(*mrp)->smr_next;
100 mir = (struct mindexrec *)
101 ch_calloc( 1, sizeof(struct mindexrec) );
102 mir->mir_name.bv_val = smr->smr_oid;
103 mir->mir_name.bv_len = strlen( smr->smr_oid );
105 if ( avl_insert( &mr_index, (caddr_t) mir,
106 (AVL_CMP) mr_index_cmp,
107 (AVL_DUP) avl_dup_error ) ) {
110 return SLAP_SCHERR_MR_DUP;
112 /* FIX: temporal consistency check */
113 mr_bvfind(&mir->mir_name);
115 if ( (names = smr->smr_names) ) {
117 mir = (struct mindexrec *)
118 ch_calloc( 1, sizeof(struct mindexrec) );
119 mir->mir_name.bv_val = *names;
120 mir->mir_name.bv_len = strlen( *names );
122 if ( avl_insert( &mr_index, (caddr_t) mir,
123 (AVL_CMP) mr_index_cmp,
124 (AVL_DUP) avl_dup_error ) ) {
127 return SLAP_SCHERR_MR_DUP;
129 /* FIX: temporal consistency check */
130 mr_bvfind(&mir->mir_name);
139 LDAPMatchingRule *mr,
140 slap_mrule_defs_rec *def,
149 smr = (MatchingRule *) ch_calloc( 1, sizeof(MatchingRule) );
150 AC_MEMCPY( &smr->smr_mrule, mr, sizeof(LDAPMatchingRule));
152 smr->smr_oidlen = strlen( mr->mr_oid );
153 smr->smr_usage = def->mrd_usage;
154 smr->smr_convert = def->mrd_convert;
155 smr->smr_normalize = def->mrd_normalize;
156 smr->smr_match = def->mrd_match;
157 smr->smr_indexer = def->mrd_indexer;
158 smr->smr_filter = def->mrd_filter;
159 smr->smr_associated = amr;
161 if ( smr->smr_syntax_oid ) {
162 if ( (syn = syn_find(smr->smr_syntax_oid)) ) {
163 smr->smr_syntax = syn;
165 *err = smr->smr_syntax_oid;
166 return SLAP_SCHERR_SYN_NOT_FOUND;
170 return SLAP_SCHERR_MR_INCOMPLETE;
172 code = mr_insert(smr,err);
178 register_matching_rule(
179 slap_mrule_defs_rec *def )
181 LDAPMatchingRule *mr;
182 MatchingRule *amr = NULL;
186 if( def->mrd_usage == SLAP_MR_NONE ) {
188 LDAP_LOG( OPERATION, ERR,
189 "register_matching_rule: %s not usable\n", def->mrd_desc, 0, 0 );
191 Debug( LDAP_DEBUG_ANY, "register_matching_rule: not usable %s\n",
192 def->mrd_desc, 0, 0 );
198 if( def->mrd_associated != NULL ) {
199 amr = mr_find( def->mrd_associated );
206 LDAP_LOG( OPERATION, ERR,
207 "register_matching_rule: could not locate associated "
208 "matching rule %s for %s\n", def->mrd_associated, def->mrd_desc, 0 );
210 Debug( LDAP_DEBUG_ANY, "register_matching_rule: could not locate "
211 "associated matching rule %s for %s\n",
212 def->mrd_associated, def->mrd_desc, 0 );
221 mr = ldap_str2matchingrule( def->mrd_desc, &code, &err, LDAP_SCHEMA_ALLOW_ALL);
224 LDAP_LOG( OPERATION, ERR,
225 "register_matching_rule: %s before %s in %s.\n",
226 ldap_scherr2str(code), err, def->mrd_desc );
228 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n",
229 ldap_scherr2str(code), err, def->mrd_desc );
235 code = mr_add( mr, def, amr, &err );
241 LDAP_LOG( OPERATION, ERR,
242 "register_matching_rule: %s for %s in %s.\n",
243 scherr2str(code), err, def->mrd_desc );
245 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s for %s in %s\n",
246 scherr2str(code), err, def->mrd_desc );
256 #if defined( SLAPD_SCHEMA_DN )
258 int mr_schema_info( Entry *e )
260 struct berval vals[2];
263 AttributeDescription *ad_matchingRules = slap_schema.si_ad_matchingRules;
265 vals[1].bv_val = NULL;
267 for ( mr = mr_list; mr; mr = mr->smr_next ) {
268 if ( mr->smr_usage & SLAP_MR_HIDE ) {
269 /* skip hidden rules */
273 if ( ! mr->smr_match ) {
274 /* skip rules without matching functions */
278 if ( ldap_matchingrule2bv( &mr->smr_mrule, vals ) == NULL ) {
282 Debug( LDAP_DEBUG_TRACE, "Merging mr [%ld] %s\n",
283 (long) vals[0].bv_len, vals[0].bv_val, 0 );
285 attr_merge( e, ad_matchingRules, vals );
286 ldap_memfree( vals[0].bv_val );
291 int mru_schema_info( Entry *e )