]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-monitor/init.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / servers / slapd / back-monitor / init.c
index c2b0b7ef23626d1479c011362d8a31c2b5ac0451..2b836820ec643b5abf89796ad8227bf217d15162 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2001-2011 The OpenLDAP Foundation.
+ * Copyright 2001-2012 The OpenLDAP Foundation.
  * Portions Copyright 2001-2003 Pierangelo Masarati.
  * All rights reserved.
  *
@@ -64,7 +64,11 @@ static const monitor_extra_t monitor_extra = {
        monitor_back_unregister_entry,
        monitor_back_unregister_entry_parent,
        monitor_back_unregister_entry_attrs,
-       monitor_back_unregister_entry_callback
+       monitor_back_unregister_entry_callback,
+
+       monitor_back_entry_stub,
+       monitor_back_entrypriv_create,
+       monitor_back_register_subsys_late
 };
        
 
@@ -280,6 +284,7 @@ enum {
        LIMBO_DATABASE,
        LIMBO_OVERLAY_INFO,
        LIMBO_OVERLAY,
+       LIMBO_SUBSYS,
 
        LIMBO_LAST
 };
@@ -307,6 +312,46 @@ monitor_back_is_configured( void )
        return be_monitor != NULL;
 }
 
+int
+monitor_back_register_subsys_late(
+       monitor_subsys_t        *ms )
+{
+       entry_limbo_t   **elpp, el = { 0 };
+       monitor_info_t  *mi;
+
+       if ( be_monitor == NULL ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_back_register_subsys_late: "
+                       "monitor database not configured.\n",
+                       0, 0, 0 );
+               return -1;
+       }
+
+       /* everyting is ready, can register already */
+       if ( monitor_subsys_is_opened() ) {
+               return monitor_back_register_subsys( ms );
+       }
+
+       mi = ( monitor_info_t * )be_monitor->be_private;
+
+
+       el.el_type = LIMBO_SUBSYS;
+
+       el.el_mss = ms;
+
+       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_backend(
        BackendInfo             *bi )
@@ -941,6 +986,10 @@ monitor_back_register_entry_attrs(
        monitor_info_t  *mi;
        struct berval   ndn = BER_BVNULL;
        char            *fname = ( a == NULL ? "callback" : "attrs" );
+       struct berval   empty_bv = BER_BVC("");
+
+       if ( nbase == NULL ) nbase = &empty_bv;
+       if ( filter == NULL ) filter = &empty_bv;
 
        if ( be_monitor == NULL ) {
                char            buf[ SLAP_TEXT_BUFLEN ];
@@ -2237,7 +2286,7 @@ monitor_back_db_open(
        /*
         * creates the "cn=Monitor" entry 
         */
-       e = monitor_entry_stub( NULL, NULL, &rdn, mi->mi_oc_monitorServer, mi,
+       e = monitor_entry_stub( NULL, NULL, &rdn, mi->mi_oc_monitorServer,
                NULL, NULL );
 
        if ( e == NULL) {
@@ -2318,7 +2367,7 @@ monitor_back_db_open(
                }
 
                e = monitor_entry_stub( &root->e_name, &root->e_nname,
-                       &monitor_subsys[ i ]->mss_rdn, mi->mi_oc_monitorContainer, mi,
+                       &monitor_subsys[ i ]->mss_rdn, mi->mi_oc_monitorContainer,
                        NULL, NULL );
 
                if ( e == NULL) {
@@ -2433,6 +2482,10 @@ monitor_back_db_open(
                                rc = monitor_back_register_overlay( el->el_be, el->el_on, el->el_ndn );
                                break;
 
+                       case LIMBO_SUBSYS:
+                               rc = monitor_back_register_subsys( el->el_mss );
+                               break;
+
                        default:
                                assert( 0 );
                        }