X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschema.c;h=44c86656d8bc2ddbf87eae3596e314a35f6a0590;hb=740f1b422edc48c9eeed8346c45872a63b683370;hp=4c6fe9307e8899f74aa01e8267a3c49464cceb0b;hpb=6ba22723213fabbe51abc7ef1a2fc06b90d31e4d;p=openldap diff --git a/servers/slapd/schema.c b/servers/slapd/schema.c index 4c6fe9307e..44c86656d8 100644 --- a/servers/slapd/schema.c +++ b/servers/slapd/schema.c @@ -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" @@ -134,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", @@ -150,6 +154,7 @@ static char *oc_operational_attrs[] = { "supportedControl", "supportedSASLMechanisms", "supportedLDAPversion", + "subschemaSubentry", /* NO USER MOD */ NULL }; @@ -158,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 */ @@ -165,7 +171,6 @@ static char *oc_no_usermod_attrs[] = { "createTimestamp", "modifiersName", "modifyTimestamp", - "subschemaSubentry", NULL }; @@ -1005,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++ ) { @@ -1017,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; @@ -1119,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 */ @@ -1150,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 );