From 2bfe79fe884565801600e309d1fcbefa41fb0f4b Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 13 Sep 2006 11:38:51 +0000 Subject: [PATCH] Add BackendInfo.bi_extra for backend custom APIs Use bi_extra for back-monitor entry points. Backends should never directly reference each other's symbols. --- servers/slapd/back-bdb/init.c | 8 ---- servers/slapd/back-bdb/monitor.c | 48 +++++++++++++---------- servers/slapd/back-monitor/back-monitor.h | 27 +++++++++++++ servers/slapd/back-monitor/init.c | 19 +++++++++ servers/slapd/slap.h | 3 +- 5 files changed, 76 insertions(+), 29 deletions(-) diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index 7b85509c7b..d4d8b4e9a3 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -675,14 +675,6 @@ bdb_back_initialize( bi->bi_connection_init = 0; bi->bi_connection_destroy = 0; - /* - * initialize monitor stuff - */ - rc = bdb_monitor_initialize(); - if ( rc ) { - return rc; - } - rc = bdb_back_init_cf( bi ); return rc; diff --git a/servers/slapd/back-bdb/monitor.c b/servers/slapd/back-bdb/monitor.c index 2dc0c93dd4..fac8ce307b 100644 --- a/servers/slapd/back-bdb/monitor.c +++ b/servers/slapd/back-bdb/monitor.c @@ -25,8 +25,6 @@ #include "lutil.h" #include "back-bdb.h" -#ifdef SLAPD_MONITOR - #include "../back-monitor/back-monitor.h" static ObjectClass *oc_olmBDBDatabase; @@ -200,22 +198,23 @@ bdb_monitor_free( return SLAP_CB_CONTINUE; } -#endif /* SLAPD_MONITOR */ - /* * call from within bdb_initialize() */ int bdb_monitor_initialize( void ) { -#ifdef SLAPD_MONITOR int i, code; const char *err; + BackendInfo *bi; static int bdb_monitor_initialized = 0; - /* register schema here; if compiled as dynamic object, - * must be loaded __after__ back_monitor.la */ + bi = backend_info("monitor"); + if ( !bi ) + return -1; + + /* register schema here */ if ( bdb_monitor_initialized++ ) { return 0; @@ -322,7 +321,6 @@ done_oc:; ldap_memfree( oc ); } -#endif /* SLAPD_MONITOR */ return 0; } @@ -333,9 +331,9 @@ done_oc:; int bdb_monitor_init( BackendDB *be ) { -#ifdef SLAPD_MONITOR - SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_MONITORING; -#endif /* SLAPD_MONITOR */ + if ( bdb_monitor_initialize() == LDAP_SUCCESS ) { + SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_MONITORING; + } return 0; } @@ -346,20 +344,29 @@ bdb_monitor_init( BackendDB *be ) int bdb_monitor_open( BackendDB *be ) { -#ifdef SLAPD_MONITOR struct bdb_info *bdb = (struct bdb_info *) be->be_private; Attribute *a, *next; monitor_callback_t *cb = NULL; struct berval suffix, *filter, *base; char *ptr; int rc = 0; + monitor_extra_t *mbe; if ( !SLAP_DBMONITORING( be ) ) { return 0; } + { + BackendInfo *mi = backend_info( "monitor" ); + if ( !mi || !mi->bi_extra ) { + SLAP_DBFLAGS( be ) ^= SLAP_DBFLAG_MONITORING; + return 0; + } + mbe = mi->bi_extra; + } + /* don't bother if monitor is not configured */ - if ( !monitor_back_is_configured() ) { + if ( !mbe->is_configured() ) { static int warning = 0; if ( warning++ == 0 ) { @@ -490,7 +497,7 @@ bdb_monitor_open( BackendDB *be ) cb->mc_free = bdb_monitor_free; cb->mc_private = (void *)bdb; - rc = monitor_back_register_entry_attrs( NULL, a, cb, + rc = mbe->register_entry_attrs( NULL, a, cb, base, LDAP_SCOPE_SUBORDINATE, filter ); cleanup:; @@ -521,9 +528,6 @@ cleanup:; } return rc; -#else /* !SLAPD_MONITOR */ - return 0; -#endif /* SLAPD_MONITOR */ } /* @@ -532,11 +536,16 @@ cleanup:; int bdb_monitor_close( BackendDB *be ) { -#ifdef SLAPD_MONITOR struct bdb_info *bdb = (struct bdb_info *) be->be_private; if ( !BER_BVISNULL( &bdb->bi_monitor.bdm_filter ) ) { - monitor_back_unregister_entry_callback( NULL, + BackendInfo *mi = backend_info( "monitor" ); + monitor_extra_t *mbe; + + if ( !mi || !mi->bi_extra ) + return 0; + mbe = mi->bi_extra; + mbe->unregister_entry_callback( NULL, (monitor_callback_t *)bdb->bi_monitor.bdm_cb, &bdb->bi_monitor.bdm_nbase, bdb->bi_monitor.bdm_scope, @@ -548,7 +557,6 @@ bdb_monitor_close( BackendDB *be ) memset( &bdb->bi_monitor, 0, sizeof( bdb->bi_monitor ) ); } -#endif /* SLAPD_MONITOR */ return 0; } diff --git a/servers/slapd/back-monitor/back-monitor.h b/servers/slapd/back-monitor/back-monitor.h index 058dceca16..905bcf73ff 100644 --- a/servers/slapd/back-monitor/back-monitor.h +++ b/servers/slapd/back-monitor/back-monitor.h @@ -268,6 +268,33 @@ extern BackendDB *be_monitor; /* increase this bufsize if entries in string form get too big */ #define BACKMONITOR_BUFSIZE 8192 +typedef int (monitor_cbfunc)( struct berval *ndn, monitor_callback_t *cb, + struct berval *base, int scope, struct berval *filter ); + +typedef int (monitor_cbafunc)( struct berval *ndn, Attribute *a, + monitor_callback_t *cb, + struct berval *base, int scope, struct berval *filter ); + +typedef struct monitor_extra_t { + int (*is_configured)(void); + monitor_subsys_t * (*get_subsys)( const char *name ); + monitor_subsys_t * (*get_subsys_by_dn)( struct berval *ndn, int sub ); + + int (*register_subsys)( monitor_subsys_t *ms ); + int (*register_entry)( Entry *e, monitor_callback_t *cb, + monitor_subsys_t *ms, unsigned long flags ); + int (*register_entry_parent)( Entry *e, monitor_callback_t *cb, + monitor_subsys_t *ms, unsigned long flags, + struct berval *base, int scope, struct berval *filter ); + monitor_cbafunc *register_entry_attrs; + monitor_cbfunc *register_entry_callback; + + int (*unregister_entry)( struct berval *ndn ); + monitor_cbfunc *unregister_entry_parent; + monitor_cbafunc *unregister_entry_attrs; + monitor_cbfunc *unregister_entry_callback; +} monitor_extra_t; + LDAP_END_DECL #include "proto-back-monitor.h" diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 3f6bb03dbc..5e1ded3184 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -44,6 +44,23 @@ BackendDB *be_monitor; static struct monitor_subsys_t **monitor_subsys; static int monitor_subsys_opened; static monitor_info_t monitor_info; +static const monitor_extra_t monitor_extra = { + monitor_back_is_configured, + monitor_back_get_subsys, + monitor_back_get_subsys_by_dn, + + monitor_back_register_subsys, + monitor_back_register_entry, + monitor_back_register_entry_parent, + monitor_back_register_entry_attrs, + monitor_back_register_entry_callback, + + monitor_back_unregister_entry, + monitor_back_unregister_entry_parent, + monitor_back_unregister_entry_attrs, + monitor_back_unregister_entry_callback +}; + /* * subsystem data @@ -1978,6 +1995,8 @@ monitor_back_initialize( bi->bi_connection_init = 0; bi->bi_connection_destroy = 0; + bi->bi_extra = (void *)&monitor_extra; + /* * configuration objectClasses (fake) */ diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 0bf61525d0..dc28fc8c8f 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2193,7 +2193,8 @@ struct slap_backend_info { unsigned int bi_nDB; /* number of databases of this type */ struct ConfigOCs *bi_cf_ocs; char **bi_obsolete_names; - void *bi_private; /* anything the backend type needs */ + void *bi_extra; /* backend type-specific APIs */ + void *bi_private; /* backend type-specific config data */ LDAP_STAILQ_ENTRY(slap_backend_info) bi_next ; }; -- 2.39.5