]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema.c
Add ldap_*2name() in <include,libldap>/schema, use them in slapd/schema
[openldap] / servers / slapd / schema.c
index 8c5b5f749366082d3ea8ea30a551c71355be5cf1..ad022a60bbfa062a185d49523edc49e0a59850a2 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"
 
@@ -1006,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++ ) {
@@ -1018,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;
@@ -1120,15 +1124,19 @@ schema_info( Connection *conn, Operation *op, char **attrs, int attrsonly )
        (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 */
@@ -1151,8 +1159,24 @@ 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 = "LDAPsubentry";
+       val.bv_len = sizeof("LDAPsubentry")-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 );
 
@@ -1166,24 +1190,21 @@ static void
 oc_print( ObjectClass *oc )
 {
        int     i;
+       const char *mid;
 
-       if ( oc->soc_names && oc->soc_names[0] ) {
-               printf( "objectclass %s\n", oc->soc_names[0] );
-       } else {
-               printf( "objectclass %s\n", oc->soc_oid );
-       }
+       printf( "objectclass %s\n", ldap_objectclass2name( &oc->soc_oclass ) );
        if ( oc->soc_required != NULL ) {
-               printf( "\trequires %s", oc->soc_required[0] );
-               for ( i = 1; oc->soc_required[i] != NULL; i++ ) {
-                       printf( ",%s", oc->soc_required[i] );
-               }
+               mid = "\trequires ";
+               for ( i = 0; oc->soc_required[i] != NULL; i++, mid = "," )
+                       printf( "%s%s", mid,
+                               ldap_attributetype2name( &oc->soc_required[i]->sat_atype ) );
                printf( "\n" );
        }
        if ( oc->soc_allowed != NULL ) {
-               printf( "\tallows %s", oc->soc_allowed[0] );
-               for ( i = 1; oc->soc_allowed[i] != NULL; i++ ) {
-                       printf( ",%s", oc->soc_allowed[i] );
-               }
+               mid = "\tallows ";
+               for ( i = 0; oc->soc_allowed[i] != NULL; i++, mid = "," )
+                       printf( "%s%s", mid,
+                               ldap_attributetype2name( &oc->soc_allowed[i]->sat_atype ) );
                printf( "\n" );
        }
 }