From 8e7e8c4d04b4dcf1422561a567d589951692fe6e Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Mon, 2 Jan 2006 08:57:56 +0000 Subject: [PATCH] allow modules to register callbacks for dynamic data in root DSE --- servers/slapd/main.c | 1 + servers/slapd/proto-slap.h | 4 +++ servers/slapd/root_dse.c | 73 ++++++++++++++++++++++++++++++++++++++ servers/slapd/slap.h | 2 ++ 4 files changed, 80 insertions(+) diff --git a/servers/slapd/main.c b/servers/slapd/main.c index 7295ad853d..89e6a98d79 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -899,6 +899,7 @@ destroy: extops_kill(); supported_feature_destroy(); + entry_info_destroy(); stop: #ifdef HAVE_NT_EVENT_LOG diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 1add952aac..8e865675d5 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1367,6 +1367,10 @@ LDAP_SLAPD_F (int) slap_discover_feature LDAP_P(( LDAP_SLAPD_F (int) supported_feature_load LDAP_P(( struct berval *f )); LDAP_SLAPD_F (int) supported_feature_destroy LDAP_P(( void )); +LDAP_SLAPD_F (int) entry_info_register LDAP_P(( SLAP_ENTRY_INFO_FN func, void *arg )); +LDAP_SLAPD_F (int) entry_info_unregister LDAP_P(( SLAP_ENTRY_INFO_FN func, void *arg )); +LDAP_SLAPD_F (void) entry_info_destroy LDAP_P(( void )); + /* * sasl.c */ diff --git a/servers/slapd/root_dse.c b/servers/slapd/root_dse.c index a166feea9c..a678bb2511 100644 --- a/servers/slapd/root_dse.c +++ b/servers/slapd/root_dse.c @@ -44,6 +44,70 @@ static struct berval *supportedFeatures; static Entry *usr_attr = NULL; +/* + * allow modules to register functions that muck with the root DSE entry + */ + +typedef struct entry_info_t { + SLAP_ENTRY_INFO_FN func; + void *arg; + struct entry_info_t *next; +} entry_info_t; + +static entry_info_t *extra_info; + +int +entry_info_register( SLAP_ENTRY_INFO_FN func, void *arg ) +{ + entry_info_t *ei = ch_calloc( 1, sizeof( entry_info_t ) ); + + ei->func = func; + ei->arg = arg; + + ei->next = extra_info; + extra_info = ei; + + return 0; +} + +int +entry_info_unregister( SLAP_ENTRY_INFO_FN func, void *arg ) +{ + entry_info_t **eip; + + for ( eip = &extra_info; *eip != NULL; eip = &(*eip)->next ) { + if ( (*eip)->func == func && (*eip)->arg == arg ) { + entry_info_t *ei = *eip; + + *eip = ei->next; + + ch_free( ei ); + + return 0; + } + } + + return -1; +} + +void +entry_info_destroy( void ) +{ + entry_info_t **eip; + + for ( eip = &extra_info; *eip != NULL; ) { + entry_info_t *ei = *eip; + + eip = &(*eip)->next; + + ch_free( ei ); + } +} + +/* + * Allow modules to register supported features + */ + static int supported_feature_init( void ) { @@ -169,6 +233,7 @@ root_dse_info( e->e_private = NULL; + /* FIXME: is this really needed? */ BER_BVSTR( &val, "top" ); if( attr_merge_one( e, ad_objectClass, &val, NULL ) ) { return LDAP_OTHER; @@ -296,6 +361,14 @@ root_dse_info( } } + if ( extra_info ) { + entry_info_t *ei = extra_info; + + for ( ; ei; ei = ei->next ) { + ei->func( ei->arg, e ); + } + } + *entry = e; return LDAP_SUCCESS; } diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index c83c35b484..6a121d4d6e 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2858,6 +2858,8 @@ typedef int (SLAP_CTRL_PARSE_FN) LDAP_P(( SlapReply *rs, LDAPControl *ctrl )); +typedef int (*SLAP_ENTRY_INFO_FN) LDAP_P(( void *arg, Entry *e )); + #define SLAP_SLAB_SIZE (1024*1024) #define SLAP_SLAB_STACK 1 #define SLAP_SLAB_SOBLOCK 64 -- 2.39.5