/* $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.
*
#include "lutil.h"
#include "back-monitor.h"
+#ifndef LDAP_DEVEL
+#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;
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 ) ) {
}
BER_BVSTR( &bv, "0" );
- attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
+ attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
mp = monitor_entrypriv_create();
if ( mp == NULL ) {
}
BER_BVSTR( &bv, "0" );
- attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
+ attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
mp = monitor_entrypriv_create();
if ( mp == NULL ) {
return( 0 );
}
-int
+static int
monitor_subsys_conn_update(
Operation *op,
- Entry *e
-)
+ SlapReply *rs,
+ Entry *e )
{
monitor_info_t *mi = ( monitor_info_t * )op->o_bd->be_private;
current_bv = BER_BVC( "cn=current" );
struct berval rdn;
- assert( mi );
- assert( e );
+ assert( mi != NULL );
+ assert( e != NULL );
dnRdn( &e->e_nname, &rdn );
/* FIXME: touch modifyTimestamp? */
}
- return( 0 );
+ return SLAP_CB_CONTINUE;
}
static int
monitor_info_t *mi,
Connection *c,
Entry **ep,
- monitor_subsys_t *ms
-)
+ monitor_subsys_t *ms )
{
monitor_entry_t *mp;
- struct tm *ltm;
- char buf[ BACKMONITOR_BUFSIZE ];
- char buf2[ LDAP_LUTIL_GENTIME_BUFSIZE ];
- char buf3[ LDAP_LUTIL_GENTIME_BUFSIZE ];
-
- struct berval bv;
+ struct tm *ltm;
+ char buf[ BACKMONITOR_BUFSIZE ];
+ char buf2[ LDAP_LUTIL_GENTIME_BUFSIZE ];
+ char buf3[ LDAP_LUTIL_GENTIME_BUFSIZE ];
- Entry *e;
+ Entry *e;
struct tm *ctm;
char ctmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
#endif
+#ifndef HAVE_GMTIME_R
+ ldap_pvt_thread_mutex_lock( &gmtime_mutex );
+#endif
+
+#ifdef HAVE_GMTIME_R
+ ltm = gmtime_r( &c->c_starttime, &tm_buf );
+#else
+ ltm = gmtime( &c->c_starttime );
+#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 );
+#endif
+ lutil_gentime( buf3, sizeof( buf3 ), ltm );
+
+#ifndef HAVE_GMTIME_R
+ ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
+#endif /* HAVE_GMTIME_R */
+
snprintf( buf, sizeof( buf ),
"dn: cn=Connection %ld,%s\n"
"objectClass: %s\n"
"structuralObjectClass: %s\n"
"cn: Connection %ld\n"
+
+#ifdef MONITOR_LEGACY_CONN
+ /* NOTE: this will disappear, as the exploded data
+ * has been moved to dedicated attributes */
+ "%s: "
+ "%ld "
+ ": %ld "
+ ": %ld/%ld/%ld/%ld "
+ ": %ld/%ld/%ld "
+ ": %s%s%s%s%s%s "
+ ": %s "
+ ": %s "
+ ": %s "
+ ": %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"
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,
+ c->c_connid,
+ (long) c->c_protocol,
+ c->c_n_ops_received, c->c_n_ops_executing,
+ c->c_n_ops_pending, c->c_n_ops_completed,
+
+ /* add low-level counters here */
+ c->c_n_get, c->c_n_read, c->c_n_write,
+
+ 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" : "",
+
+ c->c_dn.bv_len ? c->c_dn.bv_val : SLAPD_ANONYMOUS,
+
+ c->c_listener_url.bv_val,
+ c->c_peer_domain.bv_val,
+ c->c_peer_name.bv_val,
+ c->c_sock_name.bv_val,
+
+ buf2,
+ buf3,
+#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,
+ 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,
+
+ /* NOTE: client connections leave the c_peer_* fields NULL */
+ mi->mi_ad_monitorConnectionListener->ad_cname.bv_val,
+ c->c_listener_url.bv_val,
+ mi->mi_ad_monitorConnectionPeerDomain->ad_cname.bv_val,
+ BER_BVISNULL( &c->c_peer_domain ) ? "unknown" : c->c_peer_domain.bv_val,
+ mi->mi_ad_monitorConnectionLocalAddress->ad_cname.bv_val,
+ BER_BVISNULL( &c->c_peer_name ) ? "unknown" : c->c_peer_name.bv_val,
+ mi->mi_ad_monitorConnectionPeerAddress->ad_cname.bv_val,
+ c->c_sock_name.bv_val,
+
+ mi->mi_ad_monitorConnectionStartTime->ad_cname.bv_val,
+ buf2,
+ mi->mi_ad_monitorConnectionActivityTime->ad_cname.bv_val,
+ buf3,
+
mi->mi_creatorsName.bv_val,
mi->mi_creatorsName.bv_val,
ctmbuf,
return( -1 );
}
-#ifndef HAVE_GMTIME_R
- ldap_pvt_thread_mutex_lock( &gmtime_mutex );
-#endif
-
-#ifdef HAVE_GMTIME_R
- ltm = gmtime_r( &c->c_starttime, &tm_buf );
-#else
- ltm = gmtime( &c->c_starttime );
-#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 );
-#endif
- lutil_gentime( buf3, sizeof( buf3 ), ltm );
-
-#ifndef HAVE_GMTIME_R
- ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
-#endif /* HAVE_GMTIME_R */
-
- /* monitored info */
- sprintf( buf,
- "%ld "
- ": %ld "
- ": %ld/%ld/%ld/%ld "
- ": %ld/%ld/%ld "
- ": %s%s%s%s%s%s "
- ": %s "
- ": %s "
- ": %s "
- ": %s "
- ": %s "
- ": %s "
- ": %s",
- c->c_connid,
- (long) c->c_protocol,
- c->c_n_ops_received, c->c_n_ops_executing,
- c->c_n_ops_pending, c->c_n_ops_completed,
-
- /* add low-level counters here */
- c->c_n_get, c->c_n_read, c->c_n_write,
-
- 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" : "",
-
- c->c_dn.bv_len ? c->c_dn.bv_val : SLAPD_ANONYMOUS,
-
- c->c_listener_url.bv_val,
- c->c_peer_domain.bv_val,
- c->c_peer_name.bv_val,
- c->c_sock_name.bv_val,
-
- buf2,
- buf3
- );
-
- bv.bv_val = buf;
- bv.bv_len = strlen( buf );
- attr_merge_one( e, mi->mi_ad_monitoredInfo, &bv, NULL );
-
- /* connection number */
- snprintf( buf, sizeof( buf ), "%ld", c->c_connid );
- bv.bv_val = buf;
- bv.bv_len = strlen( buf );
- attr_merge_one( e, mi->mi_ad_monitorConnectionNumber, &bv, NULL );
-
- /* authz DN */
- attr_merge_one( e, mi->mi_ad_monitorConnectionAuthzDN,
- &c->c_dn, &c->c_ndn );
-
- /* local address */
- attr_merge_one( e, mi->mi_ad_monitorConnectionLocalAddress,
- &c->c_sock_name, NULL );
-
- /* peer address */
- attr_merge_one( e, mi->mi_ad_monitorConnectionPeerAddress,
- &c->c_peer_name, NULL );
-
mp = monitor_entrypriv_create();
if ( mp == NULL ) {
- return -1;
+ return LDAP_OTHER;
}
e->e_private = ( void * )mp;
mp->mp_info = ms;
*ep = e;
- return( 0 );
+ 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;
Connection *c;
int connindex;
monitor_entry_t *mp;
- int rc = 0;
+ int rc = SLAP_CB_CONTINUE;
monitor_subsys_t *ms;
assert( mi != NULL );
/* 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;
e_tmp = e;
}
- rc = -1;
+ rc = rs->sr_err = LDAP_OTHER;
break;
}
mp = ( monitor_entry_t * )e->e_private;
mp->mp_next = e_tmp;
e_tmp = e;
}
- connection_done(c);
+ connection_done( c );
*ep = e;
} else {
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 ",
connid = strtol( &ndn->bv_val[ nconn_bv.bv_len ], &next, 10 );
if ( next[ 0 ] != ',' ) {
- return -1;
+ return ( rs->sr_err = LDAP_OTHER );
}
for ( c = connection_first( &connindex );
c != NULL;
- c = connection_next( c, &connindex )) {
+ c = connection_next( c, &connindex ) )
+ {
if ( c->c_connid == connid ) {
- if ( conn_create( mi, c, ep, ms ) || *ep == NULL ) {
- rc = -1;
+ rc = conn_create( mi, c, ep, ms );
+ if ( rc != SLAP_CB_CONTINUE ) {
+ rs->sr_err = rc;
+
+ } else if ( *ep == NULL ) {
+ rc = rs->sr_err = LDAP_OTHER;
}
break;
}
}
- connection_done(c);
+ connection_done( c );
}
return rc;