mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-13 14:27:59 +08:00
allow modules to register callbacks for dynamic data in root DSE
This commit is contained in:
parent
fc358465d7
commit
8e7e8c4d04
@ -899,6 +899,7 @@ destroy:
|
||||
extops_kill();
|
||||
|
||||
supported_feature_destroy();
|
||||
entry_info_destroy();
|
||||
|
||||
stop:
|
||||
#ifdef HAVE_NT_EVENT_LOG
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user