allow modules to register callbacks for dynamic data in root DSE

This commit is contained in:
Pierangelo Masarati 2006-01-02 08:57:56 +00:00
parent fc358465d7
commit 8e7e8c4d04
4 changed files with 80 additions and 0 deletions

View File

@ -899,6 +899,7 @@ destroy:
extops_kill();
supported_feature_destroy();
entry_info_destroy();
stop:
#ifdef HAVE_NT_EVENT_LOG

View File

@ -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
*/

View File

@ -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;
}

View File

@ -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