if( attr == NULL ) {
/* no objectClass attribute */
+#ifdef NEW_LOGGING
+ LDAP_LOG(( "operation", LDAP_LEVEL_ERR, "is_entry_objectclass: "
+ "dn(%s), oid (%s), no objectClass attribute.\n",
+ e->e_dn == NULL ? "" : e->e_dn,
+ oc->soc_oclass.oc_oid ));
+#else
Debug( LDAP_DEBUG_ANY, "is_entry_objectclass(\"%s\", \"%s\") "
"no objectClass attribute\n",
e->e_dn == NULL ? "" : e->e_dn,
oc->soc_oclass.oc_oid, 0 );
+#endif
return 0;
}
assert( oir2->oir_name );
assert( oir2->oir_oc );
- return (strcasecmp( oir1->oir_name, oir2->oir_name ));
+ return strcasecmp( oir1->oir_name, oir2->oir_name );
}
static int
int code;
ObjectClass *soc1;
int nsups;
- char **sups1;
+ char **sups1;
int add_sups = 0;
if ( sups ) {
if ( !soc->soc_sups ) {
/* We are at the first recursive level */
add_sups = 1;
- nsups = 0;
+ nsups = 1;
sups1 = sups;
while ( *sups1 ) {
nsups++;
sups1++;
}
- nsups++;
soc->soc_sups = (ObjectClass **)ch_calloc(nsups,
sizeof(ObjectClass *));
}
+
nsups = 0;
sups1 = sups;
while ( *sups1 ) {
return SLAP_SCHERR_CLASS_NOT_FOUND;
}
+ /* check object class usage
+ * abstract classes can only sup abstract classes
+ * structural classes can not sup auxiliary classes
+ * auxiliary classes can not sup structural classes
+ */
+ if( soc->soc_kind != soc1->soc_kind
+ && soc1->soc_kind != LDAP_SCHEMA_ABSTRACT )
+ {
+ *err = *sups1;
+ return SLAP_SCHERR_CLASS_BAD_USAGE;
+ }
+
if ( add_sups )
soc->soc_sups[nsups] = soc1;
sups1++;
}
}
+
return 0;
}
+void
+oc_destroy( void )
+{
+ ObjectClass *o, *n;
+
+ avl_free(oc_index, ldap_memfree);
+ for (o=oc_list; o; o=n)
+ {
+ n = o->soc_next;
+ ldap_memfree(o->soc_sups);
+ ldap_memfree(o->soc_required);
+ ldap_memfree(o->soc_allowed);
+ ldap_objectclass_free((LDAPObjectClass *)o);
+ }
+}
+
static int
oc_insert(
ObjectClass *soc,
(AVL_DUP) avl_dup_error ) )
{
*err = soc->soc_oid;
- ldap_memfree(oir->oir_name);
ldap_memfree(oir);
return SLAP_SCHERR_DUP_CLASS;
}
while ( *names ) {
oir = (struct oindexrec *)
ch_calloc( 1, sizeof(struct oindexrec) );
- oir->oir_name = ch_strdup(*names);
+ oir->oir_name = *names;
oir->oir_oc = soc;
assert( oir->oir_name );
(AVL_DUP) avl_dup_error ) )
{
*err = *names;
- ldap_memfree(oir->oir_name);
ldap_memfree(oir);
return SLAP_SCHERR_DUP_CLASS;
}
int
oc_add(
- LDAP_OBJECT_CLASS *oc,
+ LDAPObjectClass *oc,
const char **err
)
{
ObjectClass *soc;
int code;
+ if ( oc->oc_names != NULL ) {
+ int i;
+
+ for( i=0; oc->oc_names[i]; i++ ) {
+ if( !slap_valid_descr( oc->oc_names[i] ) ) {
+ return SLAP_SCHERR_BAD_DESCR;
+ }
+ }
+ }
+
soc = (ObjectClass *) ch_calloc( 1, sizeof(ObjectClass) );
- memcpy( &soc->soc_oclass, oc, sizeof(LDAP_OBJECT_CLASS) );
+ AC_MEMCPY( &soc->soc_oclass, oc, sizeof(LDAPObjectClass) );
if( soc->soc_sup_oids == NULL &&
soc->soc_kind == LDAP_SCHEMA_STRUCTURAL )
} 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 );