/* schema.c - routines to enforce schema definitions */
+/*
+ * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
#include "portable.h"
static char *oc_operational_attrs[] = {
/*
- * these are operational attributes that *could* be
- * modified by users if we supported such.
+ * these are operational attributes
+ * most could be user modifiable
*/
"objectClasses",
"attributeTypes",
"supportedControl",
"supportedSASLMechanisms",
"supportedLDAPversion",
+ "subschemaSubentry", /* NO USER MOD */
NULL
};
static char *oc_no_usermod_attrs[] = {
/*
* Operational and 'no user modification' attributes
+ * which are STORED in the directory server.
*/
/* RFC2252, 3.2.1 */
"createTimestamp",
"modifiersName",
"modifyTimestamp",
- "subschemaSubentry",
NULL
};
if ( res ) {
fprintf( stderr, "schema_init: Error registering syntax %s\n",
syntax_defs[i].sd_desc );
- exit( 1 );
+ exit( EXIT_FAILURE );
}
}
for ( i=0; mrule_defs[i].mrd_desc != NULL; i++ ) {
if ( res ) {
fprintf( stderr, "schema_init: Error registering matching rule %s\n",
mrule_defs[i].mrd_desc );
- exit( 1 );
+ exit( EXIT_FAILURE );
}
}
schema_init_done = 1;
(void) dn_normalize_case( e->e_ndn );
e->e_private = NULL;
- val.bv_val = ch_strdup( "top" );
- val.bv_len = strlen( val.bv_val );
- attr_merge( e, "objectClass", vals );
- ldap_memfree( val.bv_val );
+ {
+ char *rdn = ch_strdup( SLAPD_SCHEMA_DN );
+ val.bv_val = strchr( rdn, '=' );
- val.bv_val = ch_strdup( "subschema" );
- val.bv_len = strlen( val.bv_val );
- attr_merge( e, "objectClass", vals );
- ldap_memfree( val.bv_val );
+ if( val.bv_val != NULL ) {
+ *val.bv_val = '\0';
+ val.bv_len = strlen( ++val.bv_val );
+
+ attr_merge( e, rdn, vals );
+ }
+
+ free( rdn );
+ }
if ( syn_schema_info( e ) ) {
/* Out of memory, do something about it */
return;
}
+ val.bv_val = "top";
+ val.bv_len = sizeof("top")-1;
+ attr_merge( e, "objectClass", vals );
+
+ val.bv_val = "subschema";
+ val.bv_len = sizeof("subschema")-1;
+ attr_merge( e, "objectClass", vals );
+
+ val.bv_val = "extensibleObject";
+ val.bv_len = sizeof("extensibleObject")-1;
+ attr_merge( e, "objectClass", vals );
+
send_search_entry( &backends[0], conn, op,
- e, attrs, attrsonly, 0, NULL );
+ e, attrs, attrsonly, NULL );
send_search_result( conn, op, LDAP_SUCCESS,
NULL, NULL, NULL, NULL, 1 );