X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Finit.c;h=1f82cfa9a411442d9ff3a961f397f33f8240b6e1;hb=5ebb7ee175e3a167def5b2b55784642ea9a277a6;hp=4b32e124b00957590720412c2845bb5449f5e7b6;hpb=80d74dc2cd31931dae1d630bfb468278bd64049e;p=openldap diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 4b32e124b0..1f82cfa9a4 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2001-2006 The OpenLDAP Foundation. + * Copyright 2001-2008 The OpenLDAP Foundation. * Portions Copyright 2001-2003 Pierangelo Masarati. * All rights reserved. * @@ -52,6 +52,10 @@ static const monitor_extra_t monitor_extra = { monitor_back_get_subsys_by_dn, monitor_back_register_subsys, + monitor_back_register_backend, + monitor_back_register_database, + monitor_back_register_overlay_info, + monitor_back_register_overlay, monitor_back_register_entry, monitor_back_register_entry_parent, monitor_back_register_entry_attrs, @@ -221,6 +225,12 @@ static struct monitor_subsys_t known_monitor_subsys[] = { }, { NULL } }; +int +monitor_subsys_is_opened( void ) +{ + return monitor_subsys_opened; +} + int monitor_back_register_subsys( monitor_subsys_t *ms ) @@ -245,7 +255,7 @@ monitor_back_register_subsys( /* if a subsystem is registered __AFTER__ subsystem * initialization (depending on the sequence the databases * are listed in slapd.conf), init it */ - if ( monitor_subsys_opened ) { + if ( monitor_subsys_is_opened() ) { /* FIXME: this should only be possible * if be_monitor is already initialized */ @@ -265,14 +275,23 @@ enum { LIMBO_ENTRY, LIMBO_ENTRY_PARENT, LIMBO_ATTRS, - LIMBO_CB + LIMBO_CB, + LIMBO_BACKEND, + LIMBO_DATABASE, + LIMBO_OVERLAY_INFO, + LIMBO_OVERLAY, + + LIMBO_LAST }; typedef struct entry_limbo_t { int el_type; + BackendInfo *el_bi; + BackendDB *el_be; + slap_overinst *el_on; Entry *el_e; Attribute *el_a; - struct berval el_ndn; + struct berval *el_ndn; struct berval el_nbase; int el_scope; struct berval el_filter; @@ -288,6 +307,85 @@ monitor_back_is_configured( void ) return be_monitor != NULL; } +int +monitor_back_register_backend( + BackendInfo *bi ) +{ + return -1; +} + +int +monitor_back_register_overlay_info( + slap_overinst *on ) +{ + return -1; +} + +int +monitor_back_register_overlay( + BackendDB *be ) +{ + return -1; +} + +int +monitor_back_register_backend_limbo( + BackendInfo *bi ) +{ + return -1; +} + +int +monitor_back_register_database_limbo( + BackendDB *be, + struct berval *ndn ) +{ + entry_limbo_t **elpp, el = { 0 }; + monitor_info_t *mi; + + if ( be_monitor == NULL ) { + Debug( LDAP_DEBUG_ANY, + "monitor_back_register_database_limbo: " + "monitor database not configured.\n", + 0, 0, 0 ); + return -1; + } + + mi = ( monitor_info_t * )be_monitor->be_private; + + + el.el_type = LIMBO_DATABASE; + + el.el_be = be; + el.el_ndn = ndn; + + for ( elpp = &mi->mi_entry_limbo; + *elpp; + elpp = &(*elpp)->el_next ) + /* go to last */; + + *elpp = (entry_limbo_t *)ch_malloc( sizeof( entry_limbo_t ) ); + + el.el_next = NULL; + **elpp = el; + + return 0; +} + +int +monitor_back_register_overlay_info_limbo( + slap_overinst *on ) +{ + return -1; +} + +int +monitor_back_register_overlay_limbo( + BackendDB *be ) +{ + return -1; +} + int monitor_back_register_entry( Entry *e, @@ -311,7 +409,7 @@ monitor_back_register_entry( assert( e != NULL ); assert( e->e_private == NULL ); - if ( monitor_subsys_opened ) { + if ( monitor_subsys_is_opened() ) { Entry *e_parent = NULL, *e_new = NULL, **ep = NULL; @@ -433,7 +531,7 @@ done:; el.el_mss = mss; el.el_flags = flags; - for ( elpp = (entry_limbo_t **)&mi->mi_entry_limbo; + for ( elpp = &mi->mi_entry_limbo; *elpp; elpp = &(*elpp)->el_next ) /* go to last */; @@ -490,7 +588,7 @@ monitor_back_register_entry_parent( return -1; } - if ( monitor_subsys_opened ) { + if ( monitor_subsys_is_opened() ) { Entry *e_parent = NULL, *e_new = NULL, **ep = NULL; @@ -647,7 +745,7 @@ done:; el.el_mss = mss; el.el_flags = flags; - for ( elpp = (entry_limbo_t **)&mi->mi_entry_limbo; + for ( elpp = &mi->mi_entry_limbo; *elpp; elpp = &(*elpp)->el_next ) /* go to last */; @@ -706,6 +804,7 @@ monitor_search2ndn( Connection conn = { 0 }; OperationBuffer opbuf; Operation *op; + void *thrctx; SlapReply rs = { 0 }; slap_callback cb = { NULL, monitor_search2ndn_cb, NULL, NULL }; int rc; @@ -716,15 +815,14 @@ monitor_search2ndn( return -1; } - op = (Operation *) &opbuf; - connection_fake_init( &conn, op, &conn ); + thrctx = ldap_pvt_thread_pool_context(); + connection_fake_init( &conn, &opbuf, thrctx ); + op = &opbuf.ob_op; op->o_tag = LDAP_REQ_SEARCH; /* use global malloc for now */ if ( op->o_tmpmemctx ) { - /* FIXME: connection_fake_init() calls slap_sl_mem_create, so we destroy it for now */ - slap_sl_mem_destroy( NULL, op->o_tmpmemctx ); op->o_tmpmemctx = NULL; } op->o_tmpmfuncs = &ch_mfuncs; @@ -858,7 +956,7 @@ monitor_back_register_entry_attrs( return -1; } - if ( monitor_subsys_opened ) { + if ( monitor_subsys_is_opened() ) { Entry *e = NULL; Attribute **atp = NULL; monitor_entry_t *mp = NULL; @@ -966,9 +1064,7 @@ done:; entry_limbo_t **elpp, el = { 0 }; el.el_type = LIMBO_ATTRS; - if ( !BER_BVISNULL( &ndn ) ) { - ber_dupbv( &el.el_ndn, &ndn ); - } + el.el_ndn = ndn_in; if ( !BER_BVISNULL( nbase ) ) { ber_dupbv( &el.el_nbase, nbase); } @@ -980,7 +1076,7 @@ done:; el.el_a = attrs_dup( a ); el.el_cb = cb; - for ( elpp = (entry_limbo_t **)&mi->mi_entry_limbo; + for ( elpp = &mi->mi_entry_limbo; *elpp; elpp = &(*elpp)->el_next ) /* go to last */; @@ -992,7 +1088,6 @@ done:; return -1; } -done_limbo:; if ( *elpp != NULL ) { el.el_next = NULL; **elpp = el; @@ -1007,9 +1102,6 @@ done_limbo:; if ( !BER_BVISNULL( &el.el_nbase ) ) { ch_free( &el.el_nbase.bv_val ); } - if ( !BER_BVISNULL( &el.el_ndn ) ) { - ch_free( el.el_ndn.bv_val ); - } return -1; } } @@ -1059,7 +1151,7 @@ monitor_back_unregister_entry( assert( mi != NULL ); - if ( monitor_subsys_opened ) { + if ( monitor_subsys_is_opened() ) { Entry *e = NULL; monitor_entry_t *mp = NULL; monitor_callback_t *cb = NULL; @@ -1080,7 +1172,7 @@ monitor_back_unregister_entry( monitor_callback_t *next = cb->mc_next; if ( cb->mc_free ) { - (void)cb->mc_free( e, cb->mc_private ); + (void)cb->mc_free( e, &cb->mc_private ); } ch_free( cb ); @@ -1094,7 +1186,7 @@ monitor_back_unregister_entry( } else { entry_limbo_t **elpp; - for ( elpp = (entry_limbo_t **)&mi->mi_entry_limbo; + for ( elpp = &mi->mi_entry_limbo; *elpp; elpp = &(*elpp)->el_next ) { @@ -1108,6 +1200,9 @@ monitor_back_unregister_entry( for ( cb = elp->el_cb; cb; cb = next ) { /* FIXME: call callbacks? */ next = cb->mc_next; + if ( cb->mc_dispose ) { + cb->mc_dispose( &cb->mc_private ); + } ch_free( cb ); } assert( elp->el_e != NULL ); @@ -1172,7 +1267,7 @@ monitor_back_unregister_entry_parent( return -1; } - if ( monitor_subsys_opened ) { + if ( monitor_subsys_is_opened() ) { Entry *e = NULL; monitor_entry_t *mp = NULL; @@ -1208,7 +1303,7 @@ monitor_back_unregister_entry_parent( for ( cbp = &mp->mp_cb; *cbp != NULL; cbp = &(*cbp)->mc_next ) { if ( *cbp == target_cb ) { if ( (*cbp)->mc_free ) { - (void)(*cbp)->mc_free( e, (*cbp)->mc_private ); + (void)(*cbp)->mc_free( e, &(*cbp)->mc_private ); } *cbp = (*cbp)->mc_next; ch_free( target_cb ); @@ -1225,7 +1320,7 @@ monitor_back_unregister_entry_parent( } else { entry_limbo_t **elpp; - for ( elpp = (entry_limbo_t **)&mi->mi_entry_limbo; + for ( elpp = &mi->mi_entry_limbo; *elpp; elpp = &(*elpp)->el_next ) { @@ -1242,6 +1337,9 @@ monitor_back_unregister_entry_parent( for ( cb = elp->el_cb; cb; cb = next ) { /* FIXME: call callbacks? */ next = cb->mc_next; + if ( cb->mc_dispose ) { + cb->mc_dispose( &cb->mc_private ); + } ch_free( cb ); } assert( elp->el_e != NULL ); @@ -1327,7 +1425,7 @@ monitor_back_unregister_entry_attrs( return -1; } - if ( monitor_subsys_opened ) { + if ( monitor_subsys_is_opened() ) { Entry *e = NULL; monitor_entry_t *mp = NULL; int freeit = 0; @@ -1370,7 +1468,7 @@ monitor_back_unregister_entry_attrs( for ( cbp = &mp->mp_cb; *cbp != NULL; cbp = &(*cbp)->mc_next ) { if ( *cbp == target_cb ) { if ( (*cbp)->mc_free ) { - (void)(*cbp)->mc_free( e, (*cbp)->mc_private ); + (void)(*cbp)->mc_free( e, &(*cbp)->mc_private ); } *cbp = (*cbp)->mc_next; ch_free( target_cb ); @@ -1401,14 +1499,12 @@ monitor_back_unregister_entry_attrs( ber_memfree( ndn.bv_val ); } - if ( e ) { - monitor_cache_release( mi, e ); - } + monitor_cache_release( mi, e ); } else { entry_limbo_t **elpp; - for ( elpp = (entry_limbo_t **)&mi->mi_entry_limbo; + for ( elpp = &mi->mi_entry_limbo; *elpp; elpp = &(*elpp)->el_next ) { @@ -1424,6 +1520,9 @@ monitor_back_unregister_entry_attrs( for ( cb = elp->el_cb; cb; cb = next ) { /* FIXME: call callbacks? */ next = cb->mc_next; + if ( cb->mc_dispose ) { + cb->mc_dispose( &cb->mc_private ); + } ch_free( cb ); } assert( elp->el_e == NULL ); @@ -1837,7 +1936,6 @@ monitor_back_initialize( }; int i, rc; - const char *text; monitor_info_t *mi = &monitor_info; ConfigArgs c; char *argv[ 3 ]; @@ -1935,7 +2033,6 @@ monitor_back_initialize( bi->bi_tool_entry_reindex = 0; bi->bi_tool_sync = 0; bi->bi_tool_dn2id_get = 0; - bi->bi_tool_id2entry_get = 0; bi->bi_tool_entry_modify = 0; bi->bi_connection_init = 0; @@ -1958,7 +2055,8 @@ monitor_back_initialize( int monitor_back_db_init( - BackendDB *be ) + BackendDB *be, + ConfigReply *c) { int rc; struct berval dn = BER_BVC( SLAPD_MONITOR_DN ), @@ -1969,23 +2067,24 @@ monitor_back_db_init( monitor_subsys_t *ms; /* - * register subsys + * database monitor can be defined once only */ - for ( ms = known_monitor_subsys; ms->mss_name != NULL; ms++ ) { - if ( monitor_back_register_subsys( ms ) ) { - return -1; + if ( be_monitor != NULL ) { + if (c) { + snprintf(c->msg, sizeof(c->msg),"only one monitor database allowed"); } + return( -1 ); } + be_monitor = be; /* - * database monitor can be defined once only + * register subsys */ - if ( be_monitor != NULL ) { - Debug( LDAP_DEBUG_ANY, - "only one monitor database is allowed\n", 0, 0, 0 ); - return( -1 ); + for ( ms = known_monitor_subsys; ms->mss_name != NULL; ms++ ) { + if ( monitor_back_register_subsys( ms ) ) { + return -1; + } } - be_monitor = be; /* indicate system schema supported */ SLAP_BFLAGS(be) |= SLAP_BFLAG_MONITOR; @@ -2007,7 +2106,7 @@ monitor_back_db_init( be->be_private = &monitor_info; - be2 = select_backend( &ndn, 0, 0 ); + be2 = select_backend( &ndn, 0 ); if ( be2 != be ) { char *type = be2->bd_info->bi_type; @@ -2016,19 +2115,57 @@ monitor_back_db_init( type = oi->oi_orig->bi_type; } - Debug( LDAP_DEBUG_ANY, - "\"monitor\" database serving namingContext \"%s\" " - "is hidden by \"%s\" database serving namingContext \"%s\".\n", - pdn.bv_val, type, be2->be_nsuffix[ 0 ].bv_val ); + if (c) { + snprintf(c->msg, sizeof(c->msg), + "\"monitor\" database serving namingContext \"%s\" " + "is hidden by \"%s\" database serving namingContext \"%s\".\n", + pdn.bv_val, type, be2->be_nsuffix[ 0 ].bv_val ); + } return -1; } return 0; } +static void +monitor_back_destroy_limbo_entry( + entry_limbo_t *el, + int dispose ) +{ + if ( el->el_e ) { + entry_free( el->el_e ); + } + if ( el->el_a ) { + attrs_free( el->el_a ); + } + if ( !BER_BVISNULL( &el->el_nbase ) ) { + ber_memfree( el->el_nbase.bv_val ); + } + if ( !BER_BVISNULL( &el->el_filter ) ) { + ber_memfree( el->el_filter.bv_val ); + } + + /* NOTE: callbacks are not copied; so only free them + * if disposing of */ + if ( el->el_cb && dispose != 0 ) { + monitor_callback_t *next; + + for ( ; el->el_cb; el->el_cb = next ) { + next = el->el_cb->mc_next; + if ( el->el_cb->mc_dispose ) { + el->el_cb->mc_dispose( &el->el_cb->mc_private ); + } + ch_free( el->el_cb ); + } + } + + ch_free( el ); +} + int monitor_back_db_open( - BackendDB *be ) + BackendDB *be, + ConfigReply *cr) { monitor_info_t *mi = (monitor_info_t *)be->be_private; struct monitor_subsys_t **ms; @@ -2048,6 +2185,8 @@ monitor_back_db_open( " attributes, which must be explicitly requested."), BER_BVNULL }; + int retcode = 0; + assert( be_monitor != NULL ); if ( be != be_monitor ) { be_monitor = be; @@ -2227,14 +2366,15 @@ monitor_back_db_open( monitor_subsys_opened = 1; if ( mi->mi_entry_limbo ) { - entry_limbo_t *el = (entry_limbo_t *)mi->mi_entry_limbo; + entry_limbo_t *el = mi->mi_entry_limbo; for ( ; el; ) { entry_limbo_t *tmp; + int rc; switch ( el->el_type ) { case LIMBO_ENTRY: - monitor_back_register_entry( + rc = monitor_back_register_entry( el->el_e, el->el_cb, el->el_mss, @@ -2242,7 +2382,7 @@ monitor_back_db_open( break; case LIMBO_ENTRY_PARENT: - monitor_back_register_entry_parent( + rc = monitor_back_register_entry_parent( el->el_e, el->el_cb, el->el_mss, @@ -2254,8 +2394,8 @@ monitor_back_db_open( case LIMBO_ATTRS: - monitor_back_register_entry_attrs( - &el->el_ndn, + rc = monitor_back_register_entry_attrs( + el->el_ndn, el->el_a, el->el_cb, &el->el_nbase, @@ -2264,43 +2404,48 @@ monitor_back_db_open( break; case LIMBO_CB: - monitor_back_register_entry_callback( - &el->el_ndn, + rc = monitor_back_register_entry_callback( + el->el_ndn, el->el_cb, &el->el_nbase, el->el_scope, &el->el_filter ); break; + case LIMBO_BACKEND: + rc = monitor_back_register_backend( el->el_bi ); + break; + + case LIMBO_DATABASE: + rc = monitor_back_register_database( el->el_be, el->el_ndn ); + break; + + case LIMBO_OVERLAY_INFO: + rc = monitor_back_register_overlay_info( el->el_on ); + break; + + case LIMBO_OVERLAY: + rc = monitor_back_register_overlay( el->el_be ); + break; + default: assert( 0 ); } - if ( el->el_e ) { - entry_free( el->el_e ); - } - if ( el->el_a ) { - attrs_free( el->el_a ); - } - if ( !BER_BVISNULL( &el->el_ndn ) ) { - ber_memfree( el->el_ndn.bv_val ); - } - if ( !BER_BVISNULL( &el->el_nbase ) ) { - ber_memfree( el->el_nbase.bv_val ); - } - if ( !BER_BVISNULL( &el->el_filter ) ) { - ber_memfree( el->el_filter.bv_val ); - } - tmp = el; el = el->el_next; - ch_free( tmp ); + monitor_back_destroy_limbo_entry( tmp, rc ); + + if ( rc != 0 ) { + /* try all, but report error at end */ + retcode = 1; + } } mi->mi_entry_limbo = NULL; } - return( 0 ); + return retcode; } int @@ -2337,7 +2482,8 @@ monitor_back_db_config( int monitor_back_db_destroy( - BackendDB *be ) + BackendDB *be, + ConfigReply *cr) { monitor_info_t *mi = ( monitor_info_t * )be->be_private; @@ -2367,6 +2513,16 @@ monitor_back_db_destroy( ch_free( monitor_subsys ); } + + if ( mi->mi_entry_limbo ) { + entry_limbo_t *el = mi->mi_entry_limbo; + + for ( ; el; ) { + entry_limbo_t *tmp = el; + el = el->el_next; + monitor_back_destroy_limbo_entry( tmp, 1 ); + } + } ldap_pvt_thread_mutex_destroy( &monitor_info.mi_cache_mutex );