/* oc.c - object class routines */
/* $OpenLDAP$ */
/*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
ObjectClass *oc,
int set_flags )
{
+ /*
+ * set_flags should only be true if oc is one of operational
+ * object classes which we support objectClass flags for
+ * (e.g., referral, alias, ...). See <slap.h>.
+ */
+
Attribute *attr;
struct berval *bv;
AttributeDescription *objectClass = slap_schema.si_ad_objectClass;
+
assert(!( e == NULL || oc == NULL ));
if( e == NULL || oc == NULL ) {
}
if( set_flags && ( e->e_ocflags & SLAP_OC__END )) {
- return (e->e_ocflags & oc->soc_flags) ? 1 : 0;
+ /* flags are set, use them */
+ return e->e_ocflags & oc->soc_flags & SLAP_OC__MASK;
}
/*
* find objectClass attribute
*/
attr = attr_find(e->e_attrs, objectClass);
-
if( attr == NULL ) {
/* no objectClass attribute */
#ifdef NEW_LOGGING
for( bv=attr->a_vals; bv->bv_val; bv++ ) {
ObjectClass *objectClass = oc_bvfind( bv );
- if ( objectClass == oc && !set_flags ) {
+ if ( !set_flags && objectClass == oc ) {
return 1;
}
e->e_ocflags |= objectClass->soc_flags;
}
}
- e->e_ocflags |= SLAP_OC__END; /* We've finished this */
- return (e->e_ocflags & oc->soc_flags);
+ /* mark flags as set */
+ e->e_ocflags |= SLAP_OC__END;
+
+ return e->e_ocflags & oc->soc_flags & SLAP_OC__MASK;
}
static int
oc_index_cmp(
- struct oindexrec *oir1,
- struct oindexrec *oir2 )
+ const void *v_oir1,
+ const void *v_oir2 )
{
+ const struct oindexrec *oir1 = v_oir1, *oir2 = v_oir2;
int i = oir1->oir_name.bv_len - oir2->oir_name.bv_len;
if (i)
return i;
static int
oc_index_name_cmp(
- struct berval *name,
- struct oindexrec *oir )
+ const void *v_name,
+ const void *v_oir )
{
+ const struct berval *name = v_name;
+ const struct oindexrec *oir = v_oir;
int i = name->bv_len - oir->oir_name.bv_len;
if (i)
return i;
{
struct oindexrec *oir;
- oir = (struct oindexrec *) avl_find( oc_index, ocname,
- (AVL_CMP) oc_index_name_cmp );
+ oir = avl_find( oc_index, ocname, oc_index_name_cmp );
if ( oir != NULL ) {
return( oir->oir_oc );
return SLAP_SCHERR_CLASS_BAD_SUP;
}
+ if( soc1->soc_obsolete && !soc->soc_obsolete ) {
+ *err = *sups1;
+ return SLAP_SCHERR_CLASS_BAD_SUP;
+ }
+
if( soc->soc_flags & SLAP_OC_OPERATIONAL ) (*op)++;
if ( add_sups ) {
assert( oir->oir_oc );
if ( avl_insert( &oc_index, (caddr_t) oir,
- (AVL_CMP) oc_index_cmp,
- (AVL_DUP) avl_dup_error ) )
+ oc_index_cmp, avl_dup_error ) )
{
*err = soc->soc_oid;
ldap_memfree(oir);
assert( oir->oir_oc );
if ( avl_insert( &oc_index, (caddr_t) oir,
- (AVL_CMP) oc_index_cmp,
- (AVL_DUP) avl_dup_error ) )
+ oc_index_cmp, avl_dup_error ) )
{
*err = *names;
ldap_memfree(oir);
Debug( LDAP_DEBUG_TRACE, "Merging oc [%ld] %s\n",
(long) vals[0].bv_len, vals[0].bv_val, 0 );
#endif
- attr_merge( e, ad_objectClasses, vals );
+ if( attr_merge( e, ad_objectClasses, vals ) )
+ return -1;
ldap_memfree( vals[0].bv_val );
}
return 0;