]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema.c
Add LDAPsubentry (without OID).
[openldap] / servers / slapd / schema.c
index e2e2294d56093413c6d85a73b8ca5a6f34f5737d..44c86656d8bc2ddbf87eae3596e314a35f6a0590 100644 (file)
@@ -1,4 +1,8 @@
 /* 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"
 
@@ -14,6 +18,7 @@
 static char *  oc_check_required(Entry *e, char *ocname);
 static int             oc_check_allowed(char *type, struct berval **ocl);
 
+
 /*
  * oc_check - check that entry e conforms to the schema required by
  * its object class(es). returns 0 if so, non-zero otherwise.
@@ -133,8 +138,8 @@ static char *oc_usermod_attrs[] = {
 
 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",
@@ -144,6 +149,12 @@ static char *oc_operational_attrs[] = {
        "dITContentRules",
        "nameForms",
        "ldapSyntaxes",
+       "namingContexts",
+       "supportedExtension",
+       "supportedControl",
+       "supportedSASLMechanisms",
+       "supportedLDAPversion",
+       "subschemaSubentry",            /* NO USER MOD */
        NULL
 
 };
@@ -152,6 +163,7 @@ static char *oc_operational_attrs[] = {
 static char *oc_no_usermod_attrs[] = {
        /*
         * Operational and 'no user modification' attributes
+        * which are STORED in the directory server.
         */
 
        /* RFC2252, 3.2.1 */
@@ -159,7 +171,6 @@ static char *oc_no_usermod_attrs[] = {
        "createTimestamp",
        "modifiersName",
        "modifyTimestamp",
-       "subschemaSubentry",
 
        NULL
 };
@@ -999,7 +1010,7 @@ schema_init( void )
                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++ ) {
@@ -1011,7 +1022,7 @@ schema_init( void )
                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;
@@ -1109,18 +1120,23 @@ schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
 
        e->e_attrs = NULL;
        e->e_dn = ch_strdup( SLAPD_SCHEMA_DN );
-       e->e_ndn = dn_normalize_case( ch_strdup( SLAPD_SCHEMA_DN ));
+       e->e_ndn = ch_strdup( SLAPD_SCHEMA_DN );
+       (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 */
@@ -1143,8 +1159,20 @@ schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
                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 );
 
@@ -1212,4 +1240,4 @@ int is_entry_objectclass(
        }
 
        return 1;
-}
\ No newline at end of file
+}