-
-static int
-oc_add_sups(
- ObjectClass *soc,
- char **sups,
- char **err
-)
-{
- int code;
- ObjectClass *soc1;
- int nsups;
- char **sups1;
- int add_sups = 0;
-
- if ( sups ) {
- if ( !soc->soc_sups ) {
- /* We are at the first recursive level */
- add_sups = 1;
- nsups = 0;
- sups1 = sups;
- while ( *sups1 ) {
- nsups++;
- sups1++;
- }
- nsups++;
- soc->soc_sups = (ObjectClass **)ch_calloc(1,
- nsups*sizeof(ObjectClass *));
- }
- nsups = 0;
- sups1 = sups;
- while ( *sups1 ) {
- soc1 = oc_find(*sups1);
- if ( !soc1 ) {
- *err = *sups1;
- return SLAP_SCHERR_CLASS_NOT_FOUND;
- }
-
- if ( add_sups )
- soc->soc_sups[nsups] = soc1;
-
- code = oc_add_sups(soc,soc1->soc_oclass.oc_sup_oids,
- err);
- if ( code )
- return code;
-
- if ( code = oc_create_required(soc,
- soc1->soc_oclass.oc_at_oids_must,err) )
- return code;
- if ( code = oc_create_allowed(soc,
- soc1->soc_oclass.oc_at_oids_may,err) )
- return code;
- nsups++;
- sups1++;
- }
- }
- return 0;
-}
-
-static int
-oc_insert(
- ObjectClass *soc,
- char **err
-)
-{
- ObjectClass **ocp;
- struct oindexrec *oir;
- char **names;
-
- ocp = &global_oc;
- while ( *ocp != NULL ) {
- ocp = &(*ocp)->soc_next;
- }
- *ocp = soc;
-
- if ( soc->soc_oclass.oc_oid ) {
- oir = (struct oindexrec *)
- ch_calloc( 1, sizeof(struct oindexrec) );
- oir->oir_name = soc->soc_oclass.oc_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_oclass.oc_oid;
- ldap_memfree(oir);
- return SLAP_SCHERR_DUP_CLASS;
- }
- /* FIX: temporal consistency check */
- oc_find(oir->oir_name);
- }
- if ( (names = soc->soc_oclass.oc_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,
- 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_oclass.oc_sup_oids,err) )
- return code;
- if ( code = oc_create_required(soc,soc->soc_oclass.oc_at_oids_must,err) )
- return code;
- if ( code = oc_create_allowed(soc,soc->soc_oclass.oc_at_oids_may,err) )
- return code;
- code = oc_insert(soc,err);
- return code;
-}
-
-#ifdef LDAP_DEBUG
-
-static void
-oc_print( ObjectClass *oc )
-{
- int i;
-
- if ( oc->soc_oclass.oc_names && oc->soc_oclass.oc_names[0] ) {
- printf( "objectclass %s\n", oc->soc_oclass.oc_names[0] );
- } else {
- printf( "objectclass %s\n", oc->soc_oclass.oc_oid );
- }
- if ( oc->soc_required != NULL ) {
- printf( "\trequires %s", oc->soc_required[0] );
- for ( i = 1; oc->soc_required[i] != NULL; i++ ) {
- printf( ",%s", oc->soc_required[i] );
- }
- printf( "\n" );
- }
- if ( oc->soc_allowed != NULL ) {
- printf( "\tallows %s", oc->soc_allowed[0] );
- for ( i = 1; oc->soc_allowed[i] != NULL; i++ ) {
- printf( ",%s", oc->soc_allowed[i] );
- }
- printf( "\n" );
- }
-}
-