X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Finit.c;h=dc6975ab344d79eff3401ed9ef8346a0ae7b56c4;hb=45d87c22a95dc0c2455de3df776c689966d0f02f;hp=00edb2f56117be2705f8e48c161b74667e1e3154;hpb=d34473cdba9d733d43c64d6781041cce04b93d0d;p=openldap diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 00edb2f561..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. * @@ -291,7 +291,7 @@ typedef struct entry_limbo_t { 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; @@ -321,13 +321,6 @@ monitor_back_register_overlay_info( return -1; } -int -monitor_back_register_overlay( - BackendDB *be ) -{ - return -1; -} - int monitor_back_register_backend_limbo( BackendInfo *bi ) @@ -337,7 +330,8 @@ monitor_back_register_backend_limbo( int monitor_back_register_database_limbo( - BackendDB *be ) + BackendDB *be, + struct berval *ndn_out ) { entry_limbo_t **elpp, el = { 0 }; monitor_info_t *mi; @@ -355,9 +349,10 @@ monitor_back_register_database_limbo( el.el_type = LIMBO_DATABASE; - el.el_be = be; + el.el_be = be->bd_self; + el.el_ndn = ndn_out; - for ( elpp = (entry_limbo_t **)&mi->mi_entry_limbo; + for ( elpp = &mi->mi_entry_limbo; *elpp; elpp = &(*elpp)->el_next ) /* go to last */; @@ -379,9 +374,41 @@ monitor_back_register_overlay_info_limbo( int monitor_back_register_overlay_limbo( - BackendDB *be ) + BackendDB *be, + struct slap_overinst *on, + struct berval *ndn_out ) { - return -1; + 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 @@ -529,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 */; @@ -743,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 */; @@ -866,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 ); @@ -1062,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); } @@ -1076,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 */; @@ -1102,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; } } @@ -1189,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 ) { @@ -1203,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 ); @@ -1320,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 ) { @@ -1337,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 ); @@ -1501,7 +1529,7 @@ monitor_back_unregister_entry_attrs( } 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 ) { @@ -1517,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 ); @@ -1897,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 } }; @@ -2027,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; @@ -2050,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 ), @@ -2064,8 +2104,9 @@ monitor_back_db_init( * database monitor can be defined once only */ if ( be_monitor != NULL ) { - Debug( LDAP_DEBUG_ANY, - "only one monitor database is allowed\n", 0, 0, 0 ); + if (c) { + snprintf(c->msg, sizeof(c->msg),"only one monitor database allowed"); + } return( -1 ); } be_monitor = be; @@ -2099,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; @@ -2108,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; @@ -2311,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; @@ -2321,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; @@ -2350,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, @@ -2360,7 +2438,7 @@ 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, @@ -2372,7 +2450,7 @@ monitor_back_db_open( break; case LIMBO_DATABASE: - rc = monitor_back_register_database( el->el_be ); + rc = monitor_back_register_database( el->el_be, el->el_ndn ); break; case LIMBO_OVERLAY_INFO: @@ -2380,38 +2458,16 @@ monitor_back_db_open( break; case LIMBO_OVERLAY: - rc = monitor_back_register_overlay( el->el_be ); + 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 */ @@ -2459,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; @@ -2489,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 );