]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-monitor/conn.c
fix previous commit
[openldap] / servers / slapd / back-monitor / conn.c
index 670b015aecd20a160ee6bf8ab2c1f5f16d6aac6f..24c68396eb5896fe1b71b5c8656f22836f19a505 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2001-2005 The OpenLDAP Foundation.
+ * Copyright 2001-2006 The OpenLDAP Foundation.
  * Portions Copyright 2001-2003 Pierangelo Masarati.
  * All rights reserved.
  *
 #define MONITOR_LEGACY_CONN
 #endif
 
+static int
+monitor_subsys_conn_update(
+       Operation               *op,
+       SlapReply               *rs,
+       Entry                   *e );
+
+static int 
+monitor_subsys_conn_create( 
+       Operation               *op,
+       SlapReply               *rs,
+       struct berval           *ndn,
+       Entry                   *e_parent,
+       Entry                   **ep );
+
 int
 monitor_subsys_conn_init(
        BackendDB               *be,
-       monitor_subsys_t        *ms
-)
+       monitor_subsys_t        *ms )
 {
        monitor_info_t  *mi;
        Entry           *e, **ep, *e_conn;
@@ -46,6 +59,9 @@ monitor_subsys_conn_init(
 
        assert( be != NULL );
 
+       ms->mss_update = monitor_subsys_conn_update;
+       ms->mss_create = monitor_subsys_conn_create;
+
        mi = ( monitor_info_t * )be->be_private;
 
        if ( monitor_cache_get( mi, &ms->mss_ndn, &e_conn ) ) {
@@ -63,24 +79,10 @@ monitor_subsys_conn_init(
        /*
         * Total conns
         */
-       snprintf( buf, sizeof( buf ),
-               "dn: cn=Total,%s\n"
-               "objectClass: %s\n"
-               "structuralObjectClass: %s\n"
-               "cn: Total\n"
-               "creatorsName: %s\n"
-               "modifiersName: %s\n"
-               "createTimestamp: %s\n"
-               "modifyTimestamp: %s\n",
-               ms->mss_dn.bv_val,
-               mi->mi_oc_monitorCounterObject->soc_cname.bv_val,
-               mi->mi_oc_monitorCounterObject->soc_cname.bv_val,
-               mi->mi_creatorsName.bv_val,
-               mi->mi_creatorsName.bv_val,
-               mi->mi_startTime.bv_val,
-               mi->mi_startTime.bv_val );
+       BER_BVSTR( &bv, "cn=Total" );
+       e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv,
+               mi->mi_oc_monitorCounterObject, mi, NULL, NULL );
        
-       e = str2entry( buf );
        if ( e == NULL ) {
                Debug( LDAP_DEBUG_ANY,
                        "monitor_subsys_conn_init: "
@@ -116,24 +118,10 @@ monitor_subsys_conn_init(
        /*
         * Current conns
         */
-       snprintf( buf, sizeof( buf ),
-               "dn: cn=Current,%s\n"
-               "objectClass: %s\n"
-               "structuralObjectClass: %s\n"
-               "cn: Current\n"
-               "creatorsName: %s\n"
-               "modifiersName: %s\n"
-               "createTimestamp: %s\n"
-               "modifyTimestamp: %s\n",
-               ms->mss_dn.bv_val,
-               mi->mi_oc_monitorCounterObject->soc_cname.bv_val,
-               mi->mi_oc_monitorCounterObject->soc_cname.bv_val,
-               mi->mi_creatorsName.bv_val,
-               mi->mi_creatorsName.bv_val,
-               mi->mi_startTime.bv_val,
-               mi->mi_startTime.bv_val );
-       
-       e = str2entry( buf );
+       BER_BVSTR( &bv, "cn=Current" );
+       e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv,
+               mi->mi_oc_monitorCounterObject, mi, NULL, NULL );
+
        if ( e == NULL ) {
                Debug( LDAP_DEBUG_ANY,
                        "monitor_subsys_conn_init: "
@@ -171,12 +159,11 @@ monitor_subsys_conn_init(
        return( 0 );
 }
 
-int
+static int
 monitor_subsys_conn_update(
        Operation               *op,
        SlapReply               *rs,
-       Entry                   *e
-)
+       Entry                   *e )
 {
        monitor_info_t  *mi = ( monitor_info_t * )op->o_bd->be_private;
 
@@ -185,8 +172,8 @@ monitor_subsys_conn_update(
                                current_bv = BER_BVC( "cn=current" );
        struct berval           rdn;
 
-       assert( mi );
-       assert( e );
+       assert( mi != NULL );
+       assert( e != NULL );
 
        dnRdn( &e->e_nname, &rdn );
        
@@ -234,21 +221,23 @@ conn_create(
        monitor_info_t          *mi,
        Connection              *c,
        Entry                   **ep,
-       monitor_subsys_t        *ms
-)
+       monitor_subsys_t        *ms )
 {
        monitor_entry_t *mp;
-       struct tm       *ltm;
+       struct tm       *tm;
        char            buf[ BACKMONITOR_BUFSIZE ];
        char            buf2[ LDAP_LUTIL_GENTIME_BUFSIZE ];
        char            buf3[ LDAP_LUTIL_GENTIME_BUFSIZE ];
 
+       struct berval bv, ctmbv, mtmbv, bv2, bv3;
+       struct berval bv_unknown= BER_BVC("unknown");
+
        Entry           *e;
 
-       struct tm       *ctm;
+#ifdef HACK_LOCAL_TIME
        char            ctmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
-       struct tm       *mtm;
        char            mtmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
+#endif
 #ifdef HAVE_GMTIME_R
        struct tm       tm_buf;
 #endif /* HAVE_GMTIME_R */
@@ -259,67 +248,69 @@ conn_create(
 #ifndef HAVE_GMTIME_R
        ldap_pvt_thread_mutex_lock( &gmtime_mutex );
 #endif
+
+#ifdef HAVE_GMTIME_R
+       tm = gmtime_r( &c->c_starttime, &tm_buf );
+#else
+       tm = gmtime( &c->c_starttime );
+#endif
+       bv2.bv_len = lutil_gentime( buf2, sizeof( buf2 ), tm );
+       bv2.bv_val = buf2;
 #ifdef HACK_LOCAL_TIME
 # ifdef HAVE_LOCALTIME_R
-       ctm = localtime_r( &c->c_starttime, &tm_buf );
-       lutil_localtime( ctmbuf, sizeof( ctmbuf ), ctm, -timezone );
-       mtm = localtime_r( &c->c_activitytime, &tm_buf );
-       lutil_localtime( mtmbuf, sizeof( mtmbuf ), mtm, -timezone );
+       tm = localtime_r( &c->c_starttime, &tm_buf );
 # else
-       ctm = localtime( &c->c_starttime );
-       lutil_localtime( ctmbuf, sizeof( ctmbuf ), ctm, -timezone );
-       mtm = localtime( &c->c_activitytime );
-       lutil_localtime( mtmbuf, sizeof( mtmbuf ), mtm, -timezone );
-# endif /* HAVE_LOCALTIME_R */
+       tm = localtime( &c->c_starttime );
+# endif
+       ctmbv.bv_len = lutil_localtime( ctmbuf, sizeof( ctmbuf ), tm, -timezone );
+       ctmbv.bv_val = ctmbuf;
 #else /* !HACK_LOCAL_TIME */
-# ifdef HAVE_GMTIME_R
-       ctm = gmtime_r( &c->c_starttime, &tm_buf );
-       lutil_gentime( ctmbuf, sizeof( ctmbuf ), ctm );
-       mtm = gmtime_r( &c->c_activitytime, &tm_buf );
-       lutil_gentime( mtmbuf, sizeof( mtmbuf ), mtm );
-# else
-       ctm = gmtime( &c->c_starttime );
-       lutil_gentime( ctmbuf, sizeof( ctmbuf ), ctm );
-       mtm = gmtime( &c->c_activitytime );
-       lutil_gentime( mtmbuf, sizeof( mtmbuf ), mtm );
-# endif /* HAVE_GMTIME_R */
-#endif /* !HACK_LOCAL_TIME */
-#ifndef HAVE_GMTIME_R
-       ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
-#endif
-
-#ifndef HAVE_GMTIME_R
-       ldap_pvt_thread_mutex_lock( &gmtime_mutex );
+       ctmbv = bv2;
 #endif
 
 #ifdef HAVE_GMTIME_R
-       ltm = gmtime_r( &c->c_starttime, &tm_buf );
+       tm = gmtime_r( &c->c_activitytime, &tm_buf );
 #else
-       ltm = gmtime( &c->c_starttime );
+       tm = gmtime( &c->c_activitytime );
 #endif
-       lutil_gentime( buf2, sizeof( buf2 ), ltm );
-
-#ifdef HAVE_GMTIME_R
-       ltm = gmtime_r( &c->c_activitytime, &tm_buf );
-#else
-       ltm = gmtime( &c->c_activitytime );
+       bv3.bv_len = lutil_gentime( buf3, sizeof( buf3 ), tm );
+       bv3.bv_val = buf3;
+#ifdef HACK_LOCAL_TIME
+# ifdef HAVE_LOCALTIME_R
+       tm = localtime_r( &c->c_activitytime, &tm_buf );
+# else
+       tm = localtime( &c->c_activitytime );
+# endif /* HAVE_LOCALTIME_R */
+       mtmbv.bv_len = lutil_localtime( mtmbuf, sizeof( mtmbuf ), tm, -timezone );
+       mtmbv.bv_val = mtmbuf;
+#else /* !HACK_LOCAL_TIME */
+       mtmbv = bv3;
 #endif
-       lutil_gentime( buf3, sizeof( buf3 ), ltm );
 
 #ifndef HAVE_GMTIME_R
        ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
-#endif /* HAVE_GMTIME_R */
+#endif
 
-       snprintf( buf, sizeof( buf ),
-               "dn: cn=Connection %ld,%s\n"
-               "objectClass: %s\n"
-               "structuralObjectClass: %s\n"
-               "cn: Connection %ld\n"
+       bv.bv_len = snprintf( buf, sizeof( buf ),
+               "cn=Connection %ld", c->c_connid );
+       bv.bv_val = buf;
+       e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, 
+               mi->mi_oc_monitorConnection, mi, &ctmbv, &mtmbv );
+
+       if ( e == NULL) {
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_conn_create: "
+                       "unable to create entry "
+                       "\"cn=Connection %ld,%s\"\n",
+                       c->c_connid, 
+                       ms->mss_dn.bv_val, 0 );
+               return( -1 );
+       }
 
 #ifdef MONITOR_LEGACY_CONN
-               /* NOTE: this will disappear, as the exploded data
-                * has been moved to dedicated attributes */
-               "%s: "
+       /* NOTE: this will disappear, as the exploded data
+        * has been moved to dedicated attributes */
+       bv.bv_len = snprintf( buf, sizeof( buf ),
                        "%ld "
                        ": %ld "
                        ": %ld/%ld/%ld/%ld "
@@ -331,44 +322,7 @@ conn_create(
                        ": %s "
                        ": %s "
                        ": %s "
-                       ": %s\n"
-#endif /* MONITOR_LEGACY_CONN */
-
-               "%s: %lu\n"
-               "%s: %ld\n"
-
-               "%s: %ld\n"
-               "%s: %ld\n"
-               "%s: %ld\n"
-               "%s: %ld\n"
-
-               "%s: %ld\n"
-               "%s: %ld\n"
-               "%s: %ld\n"
-
-               "%s: %s%s%s%s%s%s\n"
-
-               "%s: %s\n"
-
-               "%s: %s\n"
-               "%s: %s\n"
-               "%s: %s\n"
-               "%s: %s\n"
-
-               "%s: %s\n"
-               "%s: %s\n"
-
-               "creatorsName: %s\n"
-               "modifiersName: %s\n"
-               "createTimestamp: %s\n"
-               "modifyTimestamp: %s\n",
-               c->c_connid, ms->mss_dn.bv_val,
-               mi->mi_oc_monitorConnection->soc_cname.bv_val,
-               mi->mi_oc_monitorConnection->soc_cname.bv_val,
-               c->c_connid,
-
-#ifdef MONITOR_LEGACY_CONN
-               mi->mi_ad_monitoredInfo->ad_cname.bv_val,
+                       ": %s",
                        c->c_connid,
                        (long) c->c_protocol,
                        c->c_n_ops_received, c->c_n_ops_executing,
@@ -392,71 +346,67 @@ conn_create(
                        c->c_sock_name.bv_val,
                        
                        buf2,
-                       buf3,
+                       buf3 );
+       attr_merge_one( e, mi->mi_ad_monitoredInfo, &bv, NULL );
 #endif /* MONITOR_LEGACY_CONN */
 
-               mi->mi_ad_monitorConnectionNumber->ad_cname.bv_val,
-                       c->c_connid,
-               mi->mi_ad_monitorConnectionProtocol->ad_cname.bv_val,
-                       (long)c->c_protocol,
-
-               mi->mi_ad_monitorConnectionOpsReceived->ad_cname.bv_val,
-                       c->c_n_ops_received,
-               mi->mi_ad_monitorConnectionOpsExecuting->ad_cname.bv_val,
-                       c->c_n_ops_executing,
-               mi->mi_ad_monitorConnectionOpsPending->ad_cname.bv_val,
-                       c->c_n_ops_pending,
-               mi->mi_ad_monitorConnectionOpsCompleted->ad_cname.bv_val,
-                       c->c_n_ops_completed,
-
-               mi->mi_ad_monitorConnectionGet->ad_cname.bv_val,
-                       c->c_n_get,
-               mi->mi_ad_monitorConnectionRead->ad_cname.bv_val,
-                       c->c_n_read,
-               mi->mi_ad_monitorConnectionWrite->ad_cname.bv_val,
-                       c->c_n_write,
-
-               mi->mi_ad_monitorConnectionMask->ad_cname.bv_val,
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%lu", c->c_connid );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionNumber, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_protocol );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionProtocol, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_received );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionOpsReceived, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_executing );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionOpsExecuting, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_pending );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionOpsPending, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_completed );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionOpsCompleted, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_get );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionGet, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_read );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionRead, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_write );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionWrite, &bv, NULL );
+
+       bv.bv_len = snprintf( buf, sizeof( buf ), "%s%s%s%s%s%s",
                        c->c_currentber ? "r" : "",
                        c->c_writewaiter ? "w" : "",
                        LDAP_STAILQ_EMPTY( &c->c_ops ) ? "" : "x",
                        LDAP_STAILQ_EMPTY( &c->c_pending_ops ) ? "" : "p",
                        connection_state2str( c->c_conn_state ),
-                       c->c_sasl_bind_in_progress ? "S" : "",
-               
-               mi->mi_ad_monitorConnectionAuthzDN->ad_cname.bv_val,
-                       c->c_dn.bv_len ? c->c_dn.bv_val : SLAPD_ANONYMOUS,
+                       c->c_sasl_bind_in_progress ? "S" : "" );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionMask, &bv, NULL );
 
-               mi->mi_ad_monitorConnectionListener->ad_cname.bv_val,
-                       c->c_listener_url.bv_val,
-               mi->mi_ad_monitorConnectionPeerDomain->ad_cname.bv_val,
-                       c->c_peer_domain.bv_val,
-               mi->mi_ad_monitorConnectionLocalAddress->ad_cname.bv_val,
-                       c->c_peer_name.bv_val,
-               mi->mi_ad_monitorConnectionPeerAddress->ad_cname.bv_val,
-                       c->c_sock_name.bv_val,
+       attr_merge_one( e, mi->mi_ad_monitorConnectionAuthzDN,
+               &c->c_dn, &c->c_ndn );
 
-               mi->mi_ad_monitorConnectionStartTime->ad_cname.bv_val,
-                       buf2,
-               mi->mi_ad_monitorConnectionActivityTime->ad_cname.bv_val,
-                       buf3,
+       /* NOTE: client connections leave the c_peer_* fields NULL */
+       attr_merge_one( e, mi->mi_ad_monitorConnectionListener,
+               &c->c_listener_url, NULL );
 
-               mi->mi_creatorsName.bv_val,
-               mi->mi_creatorsName.bv_val,
-               ctmbuf,
-               mtmbuf );
-               
-       e = str2entry( buf );
+       attr_merge_one( e, mi->mi_ad_monitorConnectionPeerDomain,
+               BER_BVISNULL( &c->c_peer_domain ) ? &bv_unknown : &c->c_peer_domain,
+               NULL );
 
-       if ( e == NULL) {
-               Debug( LDAP_DEBUG_ANY,
-                       "monitor_subsys_conn_create: "
-                       "unable to create entry "
-                       "\"cn=Connection %ld,%s\" entry\n",
-                       c->c_connid, 
-                       ms->mss_dn.bv_val, 0 );
-               return( -1 );
-       }
+       attr_merge_one( e, mi->mi_ad_monitorConnectionPeerAddress,
+               BER_BVISNULL( &c->c_peer_name ) ? &bv_unknown : &c->c_peer_name,
+               NULL );
+
+       attr_merge_one( e, mi->mi_ad_monitorConnectionLocalAddress,
+               &c->c_sock_name, NULL );
+
+       attr_merge_one( e, mi->mi_ad_monitorConnectionStartTime, &bv2, NULL );
+
+       attr_merge_one( e, mi->mi_ad_monitorConnectionActivityTime, &bv3, NULL );
 
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
@@ -471,14 +421,13 @@ conn_create(
        return SLAP_CB_CONTINUE;
 }
 
-int 
+static int 
 monitor_subsys_conn_create( 
        Operation               *op,
        SlapReply               *rs,
        struct berval           *ndn,
        Entry                   *e_parent,
-       Entry                   **ep
-)
+       Entry                   **ep )
 {
        monitor_info_t  *mi = ( monitor_info_t * )op->o_bd->be_private;
 
@@ -503,9 +452,11 @@ monitor_subsys_conn_create(
                /* create all the children of e_parent */
                for ( c = connection_first( &connindex );
                                c != NULL;
-                               c = connection_next( c, &connindex ))
+                               c = connection_next( c, &connindex ) )
                {
-                       if ( conn_create( mi, c, &e, ms ) || e == NULL ) {
+                       if ( conn_create( mi, c, &e, ms ) != SLAP_CB_CONTINUE
+                                       || e == NULL )
+                       {
                                for ( ; e_tmp != NULL; ) {
                                        mp = ( monitor_entry_t * )e_tmp->e_private;
                                        e = mp->mp_next;
@@ -523,7 +474,7 @@ monitor_subsys_conn_create(
                        mp->mp_next = e_tmp;
                        e_tmp = e;
                }
-               connection_done(c);
+               connection_done( c );
                *ep = e;
 
        } else {
@@ -531,6 +482,7 @@ monitor_subsys_conn_create(
                char                    *next = NULL;
                static struct berval    nconn_bv = BER_BVC( "cn=connection " );
 
+               rc = LDAP_NO_SUCH_OBJECT;
               
                /* create exactly the required entry;
                 * the normalized DN must start with "cn=connection ",