From 40ab90fa9cb443fea3e9b4346967e3f6daba324b Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Mon, 15 May 2000 21:05:25 +0000 Subject: [PATCH] SLAPD_SCHEMA_NOT_COMPAT: Rework caching of internal schema --- servers/slapd/attr.c | 4 +++ servers/slapd/proto-slap.h | 10 +++--- servers/slapd/result.c | 2 +- servers/slapd/root_dse.c | 18 +++++------ servers/slapd/schema_init.c | 62 ++++++++++++++++++++++++++++++------- servers/slapd/slap.h | 40 ++++++++++++++++++++++++ 6 files changed, 110 insertions(+), 26 deletions(-) diff --git a/servers/slapd/attr.c b/servers/slapd/attr.c index dd36a7ea0f..0b19c8b3ea 100644 --- a/servers/slapd/attr.c +++ b/servers/slapd/attr.c @@ -178,7 +178,11 @@ attr_merge_fast( int attr_merge( Entry *e, +#ifdef SLAPD_SCHEMA_NOT_COMPAT + AttributeDescription *desc, +#else const char *type, +#endif struct berval **vals ) { Attribute **a; diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 08b5d4d437..3c8452e097 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -11,8 +11,7 @@ LDAP_BEGIN_DECL #ifdef SLAPD_SCHEMA_NOT_COMPAT -LIBSLAPD_F( AttributeDescription * ) slap_ad_entry; -LIBSLAPD_F( AttributeDescription * ) slap_ad_children; +LIBSLAPD_F( struct slap_internal_schema ) slap_schema; LIBSLAPD_F (int) slap_str2ad LDAP_P(( const char *, @@ -117,14 +116,17 @@ LIBSLAPD_F (char *) attr_normalize LDAP_P(( char *s )); LIBSLAPD_F (int) attr_merge_fast LDAP_P(( Entry *e, const char *type, struct berval **vals, int nvals, int naddvals, int *maxvals, Attribute ***a )); -LIBSLAPD_F (int) attr_merge LDAP_P(( Entry *e, const char *type, - struct berval **vals )); #ifdef SLAPD_SCHEMA_NOT_COMPAT +LIBSLAPD_F (int) attr_merge LDAP_P(( Entry *e, + AttributeDescription *desc, + struct berval **vals )); LIBSLAPD_F (Attribute *) attrs_find LDAP_P(( Attribute *a, AttributeDescription *desc )); LIBSLAPD_F (Attribute *) attr_find LDAP_P(( Attribute *a, AttributeDescription *desc )); LIBSLAPD_F (int) attr_delete LDAP_P(( Attribute **attrs, AttributeDescription *desc )); #else +LIBSLAPD_F (int) attr_merge LDAP_P(( Entry *e, const char *type, + struct berval **vals )); LIBSLAPD_F (Attribute *) attr_find LDAP_P(( Attribute *a, const char *type )); LIBSLAPD_F (int) attr_delete LDAP_P(( Attribute **attrs, const char *type )); LIBSLAPD_F (int) attr_syntax LDAP_P(( const char *type )); diff --git a/servers/slapd/result.c b/servers/slapd/result.c index 65b5f3d9c1..67d3109acb 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -629,7 +629,7 @@ send_search_entry( int opattrs; #ifdef SLAPD_SCHEMA_NOT_COMPAT - AttributeDescription *entry = slap_ad_entry; + AttributeDescription *entry = slap_schema.si_ad_entry; #else static const char *entry = "entry"; #endif diff --git a/servers/slapd/root_dse.c b/servers/slapd/root_dse.c index 962d7f4a09..d0a884a157 100644 --- a/servers/slapd/root_dse.c +++ b/servers/slapd/root_dse.c @@ -41,7 +41,7 @@ root_dse_info( Connection *conn, Operation *op, char **attrs, int attrsonly ) for ( j = 0; backends[i].be_suffix[j] != NULL; j++ ) { val.bv_val = backends[i].be_suffix[j]; val.bv_len = strlen( val.bv_val ); - attr_merge( e, "namingContexts", vals ); + attr_merge( e, slap_schema.si_ad_namingContexts, vals ); } } @@ -51,13 +51,13 @@ root_dse_info( Connection *conn, Operation *op, char **attrs, int attrsonly ) for ( i=0; supportedControls[i] != NULL; i++ ) { val.bv_val = supportedControls[i]; val.bv_len = strlen( val.bv_val ); - attr_merge( e, "supportedControl", vals ); + attr_merge( e, slap_schema.si_ad_supportedControl, vals ); } /* supportedExtension */ for ( i=0; (val.bv_val = get_supported_extop(i)) != NULL; i++ ) { val.bv_len = strlen( val.bv_val ); - attr_merge( e, "supportedExtension", vals ); + attr_merge( e, slap_schema.si_ad_supportedExtension, vals ); } /* supportedLDAPVersion */ @@ -65,7 +65,7 @@ root_dse_info( Connection *conn, Operation *op, char **attrs, int attrsonly ) sprintf(buf,"%d",i); val.bv_val = buf; val.bv_len = strlen( val.bv_val ); - attr_merge( e, "supportedLDAPVersion", vals ); + attr_merge( e, slap_schema.si_ad_supportedLDAPVersion, vals ); } /* supportedSASLMechanism */ @@ -73,7 +73,7 @@ root_dse_info( Connection *conn, Operation *op, char **attrs, int attrsonly ) for ( i=0; supportedSASLMechanisms[i] != NULL; i++ ) { val.bv_val = supportedSASLMechanisms[i]; val.bv_len = strlen( val.bv_val ); - attr_merge( e, "supportedSASLMechanisms", vals ); + attr_merge( e, slap_schema.si_ad_supportedSASLMechanisms, vals ); } } @@ -81,21 +81,21 @@ root_dse_info( Connection *conn, Operation *op, char **attrs, int attrsonly ) /* supportedACIMechanisms */ for ( i=0; (val.bv_val = get_supported_acimech(i)) != NULL; i++ ) { val.bv_len = strlen( val.bv_val ); - attr_merge( e, "supportedACIMechanisms", vals ); + attr_merge( e, slap_schema.si_ad_supportedSASLMechanisms, vals ); } #endif if ( default_referral != NULL ) { - attr_merge( e, "ref", default_referral ); + attr_merge( e, slap_schema.si_ad_ref, default_referral ); } val.bv_val = "top"; val.bv_len = sizeof("top")-1; - attr_merge( e, "objectClass", vals ); + attr_merge( e, slap_schema.si_ad_objectClass, vals ); val.bv_val = "LDAProotDSE"; val.bv_len = sizeof("LDAProotDSE")-1; - attr_merge( e, "objectClass", vals ); + attr_merge( e, slap_schema.si_ad_objectClass, vals ); send_search_entry( &backends[0], conn, op, e, attrs, attrsonly, NULL ); diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c index 7b971379ea..6dd12ae5df 100644 --- a/servers/slapd/schema_init.c +++ b/servers/slapd/schema_init.c @@ -618,31 +618,69 @@ schema_init( void ) } #ifdef SLAPD_SCHEMA_NOT_COMPAT -AttributeDescription *slap_ad_entry = NULL; -AttributeDescription *slap_ad_children = NULL; +struct slap_internal_schema slap_schema; + +struct slap_schema_ad_map { + char *ssm_type; + size_t ssm_offset; +} ad_map[] = { + { "objectClass", + offsetof(struct slap_internal_schema, si_ad_objectClass) }, + + { "creatorsName", + offsetof(struct slap_internal_schema, si_ad_creatorsName) }, + { "createTimestamp", + offsetof(struct slap_internal_schema, si_ad_createTimestamp) }, + { "modifiersName", + offsetof(struct slap_internal_schema, si_ad_modifiersName) }, + { "modifyTimestamp", + offsetof(struct slap_internal_schema, si_ad_modifyTimestamp) }, + { "namingContexts", + offsetof(struct slap_internal_schema, si_ad_namingContexts) }, + { "supportedControl", + offsetof(struct slap_internal_schema, si_ad_supportedControl) }, + { "supportedExtension", + offsetof(struct slap_internal_schema, si_ad_supportedExtension) }, + { "supportedLDAPVersion", + offsetof(struct slap_internal_schema, si_ad_supportedLDAPVersion) }, + { "supportedSASLMechanisms", + offsetof(struct slap_internal_schema, si_ad_supportedSASLMechanisms) }, + + { "ref", + offsetof(struct slap_internal_schema, si_ad_ref) }, + + { "entry", + offsetof(struct slap_internal_schema, si_ad_entry) }, + { "children", + offsetof(struct slap_internal_schema, si_ad_children) }, + { NULL, NULL } +}; + #endif int schema_prep( void ) { #ifdef SLAPD_SCHEMA_NOT_COMPAT - int rc; + int i; char *text; #endif /* we should only be called once after schema_init() was called */ assert( schema_init_done == 1 ); #ifdef SLAPD_SCHEMA_NOT_COMPAT - rc = slap_str2ad( "entry", &slap_ad_entry, &text); - if( rc != LDAP_SUCCESS ) { - fprintf( stderr, "No attribute \"entry\" defined in schema\n" ); - return rc; - } + for( i=0; ad_map[i].ssm_type; i++ ) { + int rc = slap_str2ad( ad_map[i].ssm_type, + (AttributeDescription **) + &(((char *) &slap_schema)[ad_map[i].ssm_offset]), + &text); - rc = slap_str2ad( "children", &slap_ad_children, &text); - if( rc != LDAP_SUCCESS ) { - fprintf( stderr, "No attribute \"children\" defined in schema\n" ); - return rc; + if( rc != LDAP_SUCCESS ) { + fprintf( stderr, + "No attribute \"%s\" defined in schema\n", + ad_map[i].ssm_type ); + return rc; + } } #endif diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 76222e9233..6c0637a213 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -291,6 +291,46 @@ typedef struct slap_attr_desc { #define SLAP_DESC_BINARY 0x1U } AttributeDescription; +/* + * pointers to schema elements used internally + */ +struct slap_internal_schema { + /* objectClass attribute */ + AttributeDescription *si_ad_objectClass; + + /* operational attributes */ + AttributeDescription *si_ad_creatorsName; + AttributeDescription *si_ad_createTimestamp; + AttributeDescription *si_ad_modifiersName; + AttributeDescription *si_ad_modifyTimestamp; + AttributeDescription *si_ad_subschemaSubentry; + + /* root DSE attributes */ + AttributeDescription *si_ad_namingContexts; + AttributeDescription *si_ad_supportedControl; + AttributeDescription *si_ad_supportedExtension; + AttributeDescription *si_ad_supportedLDAPVersion; + AttributeDescription *si_ad_supportedSASLMechanisms; + + /* subschema subentry attributes */ + AttributeDescription *si_ad_objectClasses; + AttributeDescription *si_ad_attributeTypes; + AttributeDescription *si_ad_ldapSyntaxes; + AttributeDescription *si_ad_matchingRules; + AttributeDescription *si_ad_matchingRulesUse; + + /* Aliases & Referrals */ + AttributeDescription *si_ad_aliasedObjectName; + AttributeDescription *si_ad_ref; + + /* ACL Internals */ + AttributeDescription *si_ad_entry; + AttributeDescription *si_ad_children; + + /* Other */ + AttributeDescription *si_ad_userPassword; +}; + typedef struct slap_attr_assertion { AttributeDescription *aa_desc; struct berval *aa_value; -- 2.39.5