#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 ) ) {
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 ];
"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: "
": %s "
": %s "
": %s\n"
+#endif /* MONITOR_LEGACY_CONN */
"%s: %lu\n"
"%s: %ld\n"
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,
buf2,
buf3,
+#endif /* MONITOR_LEGACY_CONN */
mi->mi_ad_monitorConnectionNumber->ad_cname.bv_val,
c->c_connid,
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,
- c->c_peer_domain.bv_val,
+ BER_BVISNULL( &c->c_peer_domain ) ? "unknown" : c->c_peer_domain.bv_val,
mi->mi_ad_monitorConnectionLocalAddress->ad_cname.bv_val,
- c->c_peer_name.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,
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 {
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;