#include "slap.h"
#include "ldap_pvt.h"
+int is_object_subclass(
+ ObjectClass *sub,
+ ObjectClass *sup )
+{
+ int i;
+
+ if( sup == sub ) {
+ return 1;
+ }
+
+ if( sup->soc_sups == NULL ) {
+ return 0;
+ }
+
+ for( i=0; sup->soc_sups[i] != NULL; i++ ) {
+ if( is_object_subclass( sup->soc_sups[i], sup ) ) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
int is_entry_objectclass(
Entry* e,
#ifdef SLAPD_SCHEMA_NOT_COMPAT
* which slapd supports modification of.
*
* Currently none.
- * Likely candidate, "aci"
+ * Likely candidate, "OpenLDAPaci"
*/
NULL
};
"supportedControl",
"supportedSASLMechanisms",
"supportedLDAPversion",
- "supportedACIMechanisms",
"subschemaSubentry", /* NO USER MOD */
NULL
struct oindexrec *oir2
)
{
+ assert( oir1->oir_name );
+ assert( oir1->oir_oc );
+ assert( oir2->oir_name );
+ assert( oir2->oir_oc );
+
return (strcasecmp( oir1->oir_name, oir2->oir_name ));
}
struct oindexrec *oir
)
{
+ assert( oir->oir_name );
+ assert( oir->oir_oc );
+
return (strcasecmp( name, oir->oir_name ));
}
ObjectClass *
oc_find( const char *ocname )
{
- struct oindexrec *oir = NULL;
+ struct oindexrec *oir;
+
+ oir = (struct oindexrec *) avl_find( oc_index, ocname,
+ (AVL_CMP) oc_index_name_cmp );
+
+ if ( oir != NULL ) {
+ assert( oir->oir_name );
+ assert( oir->oir_oc );
- if ( (oir = (struct oindexrec *) avl_find( oc_index, ocname,
- (AVL_CMP) oc_index_name_cmp )) != NULL ) {
return( oir->oir_oc );
}
+
return( NULL );
}
ch_calloc( 1, sizeof(struct oindexrec) );
oir->oir_name = soc->soc_oid;
oir->oir_oc = soc;
+
+ assert( oir->oir_name );
+ assert( oir->oir_oc );
+
if ( avl_insert( &oc_index, (caddr_t) oir,
(AVL_CMP) oc_index_cmp,
- (AVL_DUP) avl_dup_error ) ) {
+ (AVL_DUP) avl_dup_error ) )
+ {
*err = soc->soc_oid;
+ ldap_memfree(oir->oir_name);
ldap_memfree(oir);
return SLAP_SCHERR_DUP_CLASS;
}
+
/* FIX: temporal consistency check */
- oc_find(oir->oir_name);
+ assert( oc_find(oir->oir_name) != NULL );
}
+
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;
+
+ assert( oir->oir_name );
+ assert( oir->oir_oc );
+
if ( avl_insert( &oc_index, (caddr_t) oir,
(AVL_CMP) oc_index_cmp,
- (AVL_DUP) avl_dup_error ) ) {
+ (AVL_DUP) avl_dup_error ) )
+ {
*err = *names;
+ ldap_memfree(oir->oir_name);
ldap_memfree(oir);
return SLAP_SCHERR_DUP_CLASS;
}
+
/* FIX: temporal consistency check */
- oc_find(oir->oir_name);
+ assert( oc_find(oir->oir_name) != NULL );
+
names++;
}
}
+
return 0;
}