]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-monitor/init.c
Add validation.
[openldap] / servers / slapd / back-monitor / init.c
index 1f4e848fc2ff77727abb1d740486551e9c4cf72d..94ab4b675856db93e490f9e4c79fcda392f21731 100644 (file)
@@ -1,12 +1,9 @@
 /* init.c - initialize monitor backend */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /*
- * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- * 
  * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
  * 
  * This work has beed deveolped for the OpenLDAP Foundation 
@@ -46,6 +43,7 @@
  * used by many functions to add description to entries
  */
 AttributeDescription *monitor_ad_desc = NULL;
+BackendDB *be_monitor = NULL;
 
 /*
  * subsystem data
@@ -53,15 +51,15 @@ AttributeDescription *monitor_ad_desc = NULL;
 struct monitorsubsys monitor_subsys[] = {
        { 
                SLAPD_MONITOR_LISTENER, SLAPD_MONITOR_LISTENER_NAME,    
-               NULL, NULL, NULL,
-               MONITOR_F_NONE,
-               NULL,   /* init */
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
+               MONITOR_F_PERSISTENT_CH,
+               monitor_subsys_listener_init,
                NULL,   /* update */
                NULL,   /* create */
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_DATABASE, SLAPD_MONITOR_DATABASE_NAME,    
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_PERSISTENT_CH,
                monitor_subsys_database_init,
                NULL,   /* update */
@@ -69,7 +67,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_BACKEND, SLAPD_MONITOR_BACKEND_NAME, 
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_PERSISTENT_CH,
                monitor_subsys_backend_init,
                NULL,   /* update */
@@ -77,7 +75,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_THREAD, SLAPD_MONITOR_THREAD_NAME,        
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_NONE,
                monitor_subsys_thread_init,
                monitor_subsys_thread_update,
@@ -85,7 +83,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_SASL, SLAPD_MONITOR_SASL_NAME,    
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_NONE,
                NULL,   /* init */
                NULL,   /* update */
@@ -93,7 +91,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_TLS, SLAPD_MONITOR_TLS_NAME,
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_NONE,
                NULL,   /* init */
                NULL,   /* update */
@@ -101,7 +99,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_CONN, SLAPD_MONITOR_CONN_NAME,
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_VOLATILE_CH,
                monitor_subsys_conn_init,
                monitor_subsys_conn_update,
@@ -109,7 +107,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_READW, SLAPD_MONITOR_READW_NAME,
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_NONE,
                NULL,   /* init */
                monitor_subsys_readw_update,
@@ -117,7 +115,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_WRITEW, SLAPD_MONITOR_WRITEW_NAME,
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_NONE,
                NULL,   /* init */
                monitor_subsys_writew_update,
@@ -125,7 +123,7 @@ struct monitorsubsys monitor_subsys[] = {
                NULL    /* modify */
                }, { 
                SLAPD_MONITOR_LOG, SLAPD_MONITOR_LOG_NAME,
-               NULL, NULL, NULL,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
                MONITOR_F_NONE,
                monitor_subsys_log_init,
                NULL,   /* update */
@@ -133,20 +131,28 @@ struct monitorsubsys monitor_subsys[] = {
                monitor_subsys_log_modify
                }, { 
                SLAPD_MONITOR_OPS, SLAPD_MONITOR_OPS_NAME,
-               NULL, NULL, NULL,
-               MONITOR_F_NONE,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
+               MONITOR_F_PERSISTENT_CH,
                monitor_subsys_ops_init,
                monitor_subsys_ops_update,
                NULL,   /* create */
                NULL,   /* modify */
                }, { 
                SLAPD_MONITOR_SENT, SLAPD_MONITOR_SENT_NAME,
-               NULL, NULL, NULL,
-               MONITOR_F_NONE,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
+               MONITOR_F_PERSISTENT_CH,
                monitor_subsys_sent_init,
                monitor_subsys_sent_update,
                NULL,   /* create */
                NULL,   /* modify */
+               }, { 
+               SLAPD_MONITOR_TIME, SLAPD_MONITOR_TIME_NAME,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
+               MONITOR_F_PERSISTENT_CH,
+               monitor_subsys_time_init,
+               monitor_subsys_time_update,
+               NULL,   /* create */
+               NULL,   /* modify */
        }, { -1, NULL }
 };
 
@@ -222,14 +228,12 @@ monitor_back_db_init(
        char                    buf[1024], *end_of_line;
        struct berval           dn, *ndn;
        const char              *text;
-       struct berval           val, *bv[2] = { &val, NULL };
+       struct berval           bv[2];
 
        /*
         * database monitor can be defined once only
         */
-       static int              monitor_defined = 0;
-
-       if ( monitor_defined ) {
+       if ( be_monitor ) {
 #ifdef NEW_LOGGING
                LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
                        "only one monitor backend is allowed\n" ));
@@ -240,7 +244,10 @@ monitor_back_db_init(
 #endif
                return( -1 );
        }
-       monitor_defined++;
+       be_monitor = be;
+
+       /* indicate system schema supported */
+       be->be_flags |= SLAP_BFLAG_MONITOR;
 
        ndn = NULL;
        dn.bv_val = SLAPD_MONITOR_DN;
@@ -259,7 +266,7 @@ monitor_back_db_init(
                return -1;
        }
 
-       ber_bvecadd( &be->be_suffix, ber_bvdup( &dn ) );
+       ber_bvecadd( &be->be_suffix, ber_dupbv( NULL, &dn ) );
        ber_bvecadd( &be->be_nsuffix, ndn );
 
        mi = ( struct monitorinfo * )ch_calloc( sizeof( struct monitorinfo ), 1 );
@@ -306,8 +313,8 @@ monitor_back_db_init(
                }
 
                dn.bv_len += sizeof( SLAPD_MONITOR_DN ); /* 1 for the , */
-               dn.bv_val = ch_calloc( sizeof( char ), dn.bv_len + 1 );
-               strcpy( dn.bv_val , monitor_subsys[ i ].mss_rdn->bv_val );
+               dn.bv_val = ch_malloc( dn.bv_len + 1 );
+               strcpy( dn.bv_val , monitor_subsys[ i ].mss_rdn.bv_val );
                strcat( dn.bv_val, "," SLAPD_MONITOR_DN );
                rc = dnPrettyNormal( NULL, &dn, &monitor_subsys[ i ].mss_dn,
                        &monitor_subsys[ i ].mss_ndn );
@@ -327,15 +334,9 @@ monitor_back_db_init(
 
                snprintf( buf, sizeof( buf ),
                                "dn: %s\n"
-                               "objectClass: top\n"
-                               "objectClass: LDAPsubEntry\n"
-#ifdef SLAPD_MONITORSUBENTRY
-                               "objectClass: monitorSubEntry\n"
-#else /* !SLAPD_MONITORSUBENTRY */
-                               "objectClass: extensibleObject\n"
-#endif /* !SLAPD_MONITORSUBENTRY */
+                               SLAPD_MONITOR_OBJECTCLASSES 
                                "cn: %s\n",
-                               monitor_subsys[ i ].mss_dn->bv_val,
+                               monitor_subsys[ i ].mss_dn.bv_val,
                                monitor_subsys[ i ].mss_name );
                
                e = str2entry( buf );
@@ -344,11 +345,11 @@ monitor_back_db_init(
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
                                "unable to create '%s' entry\n", 
-                               monitor_subsys[ i ].mss_dn->bv_val ));
+                               monitor_subsys[ i ].mss_dn.bv_val ));
 #else
                        Debug( LDAP_DEBUG_ANY,
                                "unable to create '%s' entry\n", 
-                               monitor_subsys[ i ].mss_dn->bv_val, 0, 0 );
+                               monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
 #endif
                        return( -1 );
                }
@@ -364,11 +365,11 @@ monitor_back_db_init(
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
                                "unable to add entry '%s' to cache\n",
-                               monitor_subsys[ i ].mss_dn->bv_val ));
+                               monitor_subsys[ i ].mss_dn.bv_val ));
 #else
                        Debug( LDAP_DEBUG_ANY,
                                "unable to add entry '%s' to cache\n",
-                               monitor_subsys[ i ].mss_dn->bv_val, 0, 0 );
+                               monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
 #endif
                        return -1;
                }
@@ -382,12 +383,9 @@ monitor_back_db_init(
        snprintf( buf, sizeof( buf ), 
                        "dn: " SLAPD_MONITOR_DN "\n"
                        "objectClass: top\n"
-                       "objectClass: LDAPsubEntry\n"
-#ifdef SLAPD_MONITORSUBENTRY
-                       "objectClass: monitorSubEntry\n"
-#else /* !SLAPD_MONITORSUBENTRY */
+                       "objectClass: monitor\n"
                        "objectClass: extensibleObject\n"
-#endif /* !SLAPD_MONITORSUBENTRY */
+                       "structuralObjectClass: monitor\n"
                        "cn: Monitor" );
 
        e = str2entry( buf );
@@ -403,12 +401,13 @@ monitor_back_db_init(
 #endif
                return( -1 );
        }
-       val.bv_val = (char *) Versionstr;
+       bv[1].bv_val = NULL;
+       bv[0].bv_val = (char *) Versionstr;
        end_of_line = strchr( Versionstr, '\n' );
        if ( end_of_line ) {
-               val.bv_len = end_of_line - Versionstr;
+               bv[0].bv_len = end_of_line - Versionstr;
        } else {
-               val.bv_len = strlen( Versionstr );
+               bv[0].bv_len = strlen( Versionstr );
        }
        if ( attr_merge( e, monitor_ad_desc, bv ) ) {
 #ifdef NEW_LOGGING