X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Finit.c;h=dc6975ab344d79eff3401ed9ef8346a0ae7b56c4;hb=45d87c22a95dc0c2455de3df776c689966d0f02f;hp=ed29b9de619c3e6e75f6bf65081ba447309948a2;hpb=da6d9eb0463255782f3fa70c61fd958d94c048cf;p=openldap diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index ed29b9de61..dc6975ab34 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-2007 The OpenLDAP Foundation. + * Copyright 2001-2009 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,110 @@ 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_backend_limbo( + BackendInfo *bi ) +{ + return -1; +} + +int +monitor_back_register_database_limbo( + BackendDB *be, + struct berval *ndn_out ) +{ + 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->bd_self; + el.el_ndn = ndn_out; + + 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, + struct slap_overinst *on, + struct berval *ndn_out ) +{ + entry_limbo_t **elpp, el = { 0 }; + monitor_info_t *mi; + + if ( be_monitor == NULL ) { + Debug( LDAP_DEBUG_ANY, + "monitor_back_register_overlay_limbo: " + "monitor database not configured.\n", + 0, 0, 0 ); + return -1; + } + + mi = ( monitor_info_t * )be_monitor->be_private; + + + el.el_type = LIMBO_OVERLAY; + + el.el_be = be->bd_self; + el.el_on = on; + el.el_ndn = ndn_out; + + 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_entry( Entry *e, @@ -311,7 +434,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 +556,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 +613,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 +770,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 +829,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 +840,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; @@ -770,7 +893,7 @@ monitor_search2ndn( cleanup:; if ( op->ors_filter != NULL ) { - filter_free_x( op, op->ors_filter ); + filter_free_x( op, op->ors_filter, 1 ); } if ( !BER_BVISNULL( &op->ors_filterstr ) ) { op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx ); @@ -858,7 +981,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 +1089,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 +1101,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 */; @@ -1006,9 +1127,6 @@ done:; 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; } } @@ -1058,7 +1176,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; @@ -1093,7 +1211,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 ) { @@ -1107,6 +1225,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 ); @@ -1171,7 +1292,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; @@ -1224,7 +1345,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 ) { @@ -1241,6 +1362,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 ); @@ -1326,7 +1450,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; @@ -1400,14 +1524,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 ) { @@ -1423,6 +1545,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 ); @@ -1803,6 +1928,15 @@ monitor_back_initialize( "SINGLE-VALUE " "USAGE dSAOperation )", SLAP_AT_HIDE, offsetof(monitor_info_t, mi_ad_monitorRuntimeConfig) }, + { "( 1.3.6.1.4.1.4203.666.1.55.30 " + "NAME 'monitorSuperiorDN' " + "DESC 'monitor superior DN' " + /* "SUP distinguishedName " */ + "EQUALITY distinguishedNameMatch " + "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 " + "NO-USER-MODIFICATION " + "USAGE dSAOperation )", SLAP_AT_FINAL|SLAP_AT_HIDE, + offsetof(monitor_info_t, mi_ad_monitorSuperiorDN) }, { NULL, 0, -1 } }; @@ -1933,7 +2067,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; @@ -1956,7 +2089,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 ), @@ -1967,23 +2101,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; @@ -2005,7 +2140,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; @@ -2014,19 +2149,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; @@ -2046,6 +2219,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; @@ -2215,8 +2390,7 @@ monitor_back_db_open( * opens the monitor backend subsystems */ for ( ms = monitor_subsys; ms[ 0 ] != NULL; ms++ ) { - if ( ms[ 0 ]->mss_open && ( *ms[ 0 ]->mss_open )( be, ms[ 0 ] ) ) - { + if ( ms[ 0 ]->mss_open && ms[ 0 ]->mss_open( be, ms[ 0 ] ) ) { return( -1 ); } ms[ 0 ]->mss_flags |= MONITOR_F_OPENED; @@ -2225,7 +2399,7 @@ 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; @@ -2254,7 +2428,7 @@ monitor_back_db_open( case LIMBO_ATTRS: rc = monitor_back_register_entry_attrs( - &el->el_ndn, + el->el_ndn, el->el_a, el->el_cb, &el->el_nbase, @@ -2264,48 +2438,47 @@ monitor_back_db_open( case LIMBO_CB: rc = monitor_back_register_entry_callback( - &el->el_ndn, + 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, el->el_on, el->el_ndn ); + 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 ); - } - if ( el->el_cb && rc != 0 ) { - if ( el->el_cb->mc_dispose ) { - el->el_cb->mc_dispose( &el->el_cb->mc_private ); - } - ch_free( el->el_cb ); - } - 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 @@ -2342,7 +2515,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; @@ -2372,6 +2546,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 );