{
int i;
+ if( sub == NULL || sup == NULL ) return 0;
+
+#if 0
+ Debug( LDAP_DEBUG_TRACE, "is_object_subclass(%s,%s) %d\n",
+ sub->soc_oid, sup->soc_oid, sup == sub );
+#endif
+
if( sup == sub ) {
return 1;
}
}
for( i=0; sup->soc_sups[i] != NULL; i++ ) {
- if( is_object_subclass( sup->soc_sups[i], sup ) ) {
+ if( is_object_subclass( sub, sup->soc_sups[i] ) ) {
return 1;
}
}
int is_entry_objectclass(
Entry* e,
- ObjectClass *oc
-)
+ ObjectClass *oc )
{
Attribute *attr;
int i;
}
-
-
struct oindexrec {
char *oir_name;
ObjectClass *oir_oc;
static int
oc_index_cmp(
struct oindexrec *oir1,
- struct oindexrec *oir2
-)
+ struct oindexrec *oir2 )
{
assert( oir1->oir_name );
assert( oir1->oir_oc );
static int
oc_index_name_cmp(
char *name,
- struct oindexrec *oir
-)
+ struct oindexrec *oir )
{
assert( oir->oir_name );
assert( oir->oir_oc );
oc_create_required(
ObjectClass *soc,
char **attrs,
- const char **err
-)
+ const char **err )
{
char **attrs1;
AttributeType *sat;
oc_create_allowed(
ObjectClass *soc,
char **attrs,
- const char **err
-)
+ const char **err )
{
char **attrs1;
AttributeType *sat;
static int
oc_add_sups(
ObjectClass *soc,
- char **sups,
- const char **err
-)
+ char **sups,
+ const char **err )
{
int code;
ObjectClass *soc1;
if ( add_sups )
soc->soc_sups[nsups] = soc1;
- code = oc_add_sups(soc,soc1->soc_sup_oids, err);
- if ( code )
- return code;
+ code = oc_add_sups( soc, soc1->soc_sup_oids, err );
+ if ( code ) return code;
- code = oc_create_required(soc,soc1->soc_at_oids_must,err);
- if ( code )
- return code;
- code = oc_create_allowed(soc,soc1->soc_at_oids_may,err);
- if ( code )
- return code;
+ code = oc_create_required( soc, soc1->soc_at_oids_must, err );
+ if ( code ) return code;
+
+ code = oc_create_allowed( soc, soc1->soc_at_oids_may, err );
+ if ( code ) return code;
nsups++;
sups1++;
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;
+ memcpy( &soc->soc_oclass, oc, sizeof(LDAP_OBJECT_CLASS) );
+
+ if( soc->soc_sup_oids == NULL &&
+ soc->soc_kind == LDAP_SCHEMA_STRUCTURAL )
+ {
+ /* structural object classes implicitly inherit from 'top' */
+ static char *top_oids[] = { SLAPD_TOP_OID, NULL };
+ code = oc_add_sups( soc, top_oids, err );
+ } else {
+ code = oc_add_sups( soc, soc->soc_sup_oids, err );
+ }
+ if ( code != 0 ) return code;
+
+ code = oc_create_required( soc, soc->soc_at_oids_must, err );
+ if ( code != 0 ) return code;
+
+ code = oc_create_allowed( soc, soc->soc_at_oids_may, err );
+ if ( code != 0 ) return code;
+
code = oc_insert(soc,err);
return code;
}