- if ( soc->soc_oid ) {
- oir = (struct oindexrec *)
- ch_calloc( 1, sizeof(struct oindexrec) );
- oir->oir_name = soc->soc_oid;
- oir->oir_oc = soc;
- if ( avl_insert( &oc_index, (caddr_t) oir,
- (AVL_CMP) oc_index_cmp,
- (AVL_DUP) avl_dup_error ) ) {
- *err = soc->soc_oid;
- ldap_memfree(oir);
- return SLAP_SCHERR_DUP_CLASS;
- }
- /* FIX: temporal consistency check */
- oc_find(oir->oir_name);
- }
- if ( (names = soc->soc_names) ) {
- while ( *names ) {
- oir = (struct oindexrec *)
- ch_calloc( 1, sizeof(struct oindexrec) );
- oir->oir_name = ch_strdup(*names);
- oir->oir_oc = soc;
- if ( avl_insert( &oc_index, (caddr_t) oir,
- (AVL_CMP) oc_index_cmp,
- (AVL_DUP) avl_dup_error ) ) {
- *err = *names;
- ldap_memfree(oir);
- return SLAP_SCHERR_DUP_CLASS;
- }
- /* FIX: temporal consistency check */
- oc_find(oir->oir_name);
- names++;
- }
- }
- return 0;
-}
-
-int
-oc_add(
- LDAP_OBJECT_CLASS *oc,
- const char **err
-)
-{
- ObjectClass *soc;
- int code;
-
- soc = (ObjectClass *) ch_calloc( 1, sizeof(ObjectClass) );
- memcpy( &soc->soc_oclass, oc, sizeof(LDAP_OBJECT_CLASS));
- if ( (code = oc_add_sups(soc,soc->soc_sup_oids,err)) != 0 )
- return code;
- if ( (code = oc_create_required(soc,soc->soc_at_oids_must,err)) != 0 )
- return code;
- if ( (code = oc_create_allowed(soc,soc->soc_at_oids_may,err)) != 0 )
- return code;
- code = oc_insert(soc,err);
- return code;
-}
-
-struct sindexrec {
- char *sir_name;
- Syntax *sir_syn;
-};
-
-static Avlnode *syn_index = NULL;
-static Syntax *syn_list = NULL;
-
-static int
-syn_index_cmp(
- struct sindexrec *sir1,
- struct sindexrec *sir2
-)
-{
- return (strcmp( sir1->sir_name, sir2->sir_name ));
-}
-
-static int
-syn_index_name_cmp(
- char *name,
- struct sindexrec *sir
-)
-{
- return (strcmp( name, sir->sir_name ));
-}
-
-Syntax *
-syn_find( const char *synname )
-{
- struct sindexrec *sir = NULL;
-
- if ( (sir = (struct sindexrec *) avl_find( syn_index, synname,
- (AVL_CMP) syn_index_name_cmp )) != NULL ) {
- return( sir->sir_syn );
- }
- return( NULL );
-}
-
-Syntax *
-syn_find_desc( const char *syndesc, int *len )
-{
- Syntax *synp;
-
- for (synp = syn_list; synp; synp = synp->ssyn_next)
- if ((*len = dscompare( synp->ssyn_syn.syn_desc, syndesc, '{')))
- return synp;
- return( NULL );
-}
-
-static int
-syn_insert(
- Syntax *ssyn,
- const char **err
-)
-{
- Syntax **synp;
- struct sindexrec *sir;
-
- synp = &syn_list;
- while ( *synp != NULL ) {
- synp = &(*synp)->ssyn_next;
- }
- *synp = ssyn;
-
- if ( ssyn->ssyn_oid ) {
- sir = (struct sindexrec *)
- ch_calloc( 1, sizeof(struct sindexrec) );
- sir->sir_name = ssyn->ssyn_oid;
- sir->sir_syn = ssyn;
- if ( avl_insert( &syn_index, (caddr_t) sir,
- (AVL_CMP) syn_index_cmp,
- (AVL_DUP) avl_dup_error ) ) {
- *err = ssyn->ssyn_oid;
- ldap_memfree(sir);
- return SLAP_SCHERR_DUP_SYNTAX;
- }
- /* FIX: temporal consistency check */
- syn_find(sir->sir_name);
- }
- return 0;
-}
-
-int
-syn_add(
- LDAP_SYNTAX *syn,
- int flags,
- slap_syntax_validate_func *validate,
- slap_syntax_transform_func *ber2str,
- slap_syntax_transform_func *str2ber,
- const char **err
-)
-{
- Syntax *ssyn;
- int code;
-
- ssyn = (Syntax *) ch_calloc( 1, sizeof(Syntax) );
- memcpy( &ssyn->ssyn_syn, syn, sizeof(LDAP_SYNTAX));
-
- ssyn->ssyn_flags = flags;
- ssyn->ssyn_validate = validate;
- ssyn->ssyn_ber2str = ber2str;
- ssyn->ssyn_str2ber = str2ber;
-
- code = syn_insert(ssyn,err);
- return code;
-}
-
-struct mindexrec {
- char *mir_name;
- MatchingRule *mir_mr;
-};
-
-static Avlnode *mr_index = NULL;
-static MatchingRule *mr_list = NULL;
-
-static int
-mr_index_cmp(
- struct mindexrec *mir1,
- struct mindexrec *mir2
-)
-{
- return (strcmp( mir1->mir_name, mir2->mir_name ));
-}
-
-static int
-mr_index_name_cmp(
- char *name,
- struct mindexrec *mir
-)
-{
- return (strcmp( name, mir->mir_name ));
-}
-
-MatchingRule *
-mr_find( const char *mrname )
-{
- struct mindexrec *mir = NULL;
-
- if ( (mir = (struct mindexrec *) avl_find( mr_index, mrname,
- (AVL_CMP) mr_index_name_cmp )) != NULL ) {
- return( mir->mir_mr );
- }
- return( NULL );
-}
-
-static int
-mr_insert(
- MatchingRule *smr,
- const char **err
-)
-{
- MatchingRule **mrp;
- struct mindexrec *mir;
- char **names;
-
- mrp = &mr_list;
- while ( *mrp != NULL ) {
- mrp = &(*mrp)->smr_next;
- }
- *mrp = smr;
-
- if ( smr->smr_oid ) {
- mir = (struct mindexrec *)
- ch_calloc( 1, sizeof(struct mindexrec) );
- mir->mir_name = 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 ) ) {
- *err = smr->smr_oid;
- ldap_memfree(mir);
- return SLAP_SCHERR_DUP_RULE;
- }
- /* FIX: temporal consistency check */
- mr_find(mir->mir_name);
- }
- if ( (names = smr->smr_names) ) {
- while ( *names ) {
- mir = (struct mindexrec *)
- ch_calloc( 1, sizeof(struct mindexrec) );
- mir->mir_name = ch_strdup(*names);
- mir->mir_mr = smr;
- if ( avl_insert( &mr_index, (caddr_t) mir,
- (AVL_CMP) mr_index_cmp,
- (AVL_DUP) avl_dup_error ) ) {
- *err = *names;
- ldap_memfree(mir);
- return SLAP_SCHERR_DUP_RULE;
- }
- /* FIX: temporal consistency check */
- mr_find(mir->mir_name);
- names++;
- }
- }
- return 0;
-}
-
-int
-mr_add(
- LDAP_MATCHING_RULE *mr,
- slap_mr_convert_func *convert,
- slap_mr_normalize_func *normalize,
- slap_mr_match_func *match,
- slap_mr_indexer_func *indexer,
- slap_mr_filter_func *filter,
- const char **err
-)
-{
- MatchingRule *smr;
- Syntax *syn;
- int code;
-
- smr = (MatchingRule *) ch_calloc( 1, sizeof(MatchingRule) );
- memcpy( &smr->smr_mrule, mr, sizeof(LDAP_MATCHING_RULE));
-
- smr->smr_convert = convert;
- smr->smr_normalize = normalize;
- smr->smr_match = match;
- smr->smr_indexer = indexer;
- smr->smr_filter = filter;
-
- if ( smr->smr_syntax_oid ) {
- if ( (syn = syn_find(smr->smr_syntax_oid)) ) {
- smr->smr_syntax = syn;
- } else {
- *err = smr->smr_syntax_oid;
- return SLAP_SCHERR_SYN_NOT_FOUND;
- }
- } else {
- *err = "";
- return SLAP_SCHERR_MR_INCOMPLETE;
- }
- code = mr_insert(smr,err);
- return code;
-}
-
-int
-register_syntax(
- char * desc, int flags,
- slap_syntax_validate_func *validate,
- slap_syntax_transform_func *ber2str,
- slap_syntax_transform_func *str2ber )
-{
- LDAP_SYNTAX *syn;
- int code;
- const char *err;
-
- syn = ldap_str2syntax( desc, &code, &err);
- if ( !syn ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s before %s in %s\n",
- ldap_scherr2str(code), err, desc );
- return( -1 );
- }
-
- code = syn_add( syn, flags, validate, ber2str, str2ber, &err );
- if ( code ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s %s in %s\n",
- scherr2str(code), err, desc );
- return( -1 );
- }
-
- return( 0 );
-}
-
-int
-register_matching_rule(
- char * desc,
- slap_mr_convert_func *convert,
- slap_mr_normalize_func *normalize,
- slap_mr_match_func *match,
- slap_mr_indexer_func *indexer,
- slap_mr_filter_func *filter )
-{
- LDAP_MATCHING_RULE *mr;
- int code;
- const char *err;
-
- mr = ldap_str2matchingrule( desc, &code, &err);
- if ( !mr ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n",
- ldap_scherr2str(code), err, desc );
- return( -1 );
- }
-
- code = mr_add( mr, convert, normalize, match, indexer, filter, &err );
- if ( code ) {
- Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s for %s in %s\n",
- scherr2str(code), err, desc );
- return( -1 );
- }
- return( 0 );
-}