/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
return SLAP_CB_CONTINUE;
}
-int slap_replog_cb( Operation *op, SlapReply *rs )
-{
- if ( rs->sr_err == LDAP_SUCCESS ) {
- replog( op );
- }
- return SLAP_CB_CONTINUE;
-}
-
static char *v2ref( BerVarray ref, const char *text )
{
size_t len = 0, i = 0;
/* write the pdu */
while( 1 ) {
int err;
- ber_socket_t sd;
if ( connection_state_closing( conn ) ) {
ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
break;
}
- err = errno;
+ err = sock_errno();
/*
* we got an error. if it's ewouldblock, we need to
/* wait for socket to be write-ready */
conn->c_writewaiter = 1;
- ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd );
- slapd_set_write( sd, 1 );
+ slapd_set_write( conn->c_sd, 1 );
ldap_pvt_thread_cond_wait( &conn->c_write_cv, &conn->c_mutex );
conn->c_writewaiter = 0;
if( rc == -1 ) return rc;
}
-#ifdef LDAP_DEVEL
+#ifdef SLAP_CONTROL_X_SORTEDRESULTS
/* this is a hack to avoid having to modify op->s_ctrls */
if( o->o_sortedresults ) {
BerElementBuffer berbuf;
{
int rc;
-#ifdef LDAP_DEVEL
slap_callback *sc = op->o_callback, **scp;
rc = SLAP_CB_CONTINUE;
}
op->o_callback = sc;
-#else /* ! LDAP_DEVEL */
- slap_callback *sc = op->o_callback, **sc_prev = &sc, *sc_next;
-
- rc = SLAP_CB_CONTINUE;
- for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
- sc_next = op->o_callback->sc_next;
- if ( op->o_callback->sc_response ) {
- slap_callback *sc2 = op->o_callback;
- rc = op->o_callback->sc_response( op, rs );
- if ( op->o_callback != sc2 ) {
- *sc_prev = op->o_callback;
- }
- if ( rc != SLAP_CB_CONTINUE || !op->o_callback ) break;
- if ( op->o_callback != sc2 ) continue;
- }
- sc_prev = &op->o_callback->sc_next;
- }
-
- op->o_callback = sc;
-#endif /* ! LDAP_DEVEL */
-
return rc;
}
Operation *op,
SlapReply *rs )
{
-#ifdef LDAP_DEVEL
slap_callback *sc = op->o_callback, **scp;
for ( scp = ≻ *scp; ) {
}
op->o_callback = sc;
-#else /* ! LDAP_DEVEL */
- slap_callback *sc = op->o_callback, **sc_prev = &sc, *sc_next;
-
- for ( sc_next = op->o_callback; sc_next; op->o_callback = sc_next) {
- sc_next = op->o_callback->sc_next;
- if ( op->o_callback->sc_cleanup ) {
- slap_callback *sc2 = op->o_callback;
- (void)op->o_callback->sc_cleanup( op, rs );
- if ( op->o_callback != sc2 ) {
- *sc_prev = op->o_callback;
- }
- if ( !op->o_callback ) break;
- if ( op->o_callback != sc2 ) continue;
- }
- sc_prev = &op->o_callback->sc_next;
- }
-
- op->o_callback = sc;
-#endif /* ! LDAP_DEVEL */
-
return LDAP_SUCCESS;
}
goto cleanup;
}
- ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex );
- ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 );
- ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes );
- ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex );
+ ldap_pvt_thread_mutex_lock( &op->o_counters->sc_mutex );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_pdu, 1 );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_bytes, (unsigned long)bytes );
+ ldap_pvt_thread_mutex_unlock( &op->o_counters->sc_mutex );
cleanup:;
/* Tell caller that we did this for real, as opposed to being
} else {
rs->sr_rspoid = LDAP_NOTICE_DISCONNECT;
rs->sr_tag = LDAP_RES_EXTENDED;
- rs->sr_msgid = 0;
+ rs->sr_msgid = LDAP_RES_UNSOLICITED;
}
if ( send_ldap_response( op, rs ) == SLAP_CB_CONTINUE ) {
return LDAP_SIZELIMIT_EXCEEDED;
}
+ /* Every 64 entries, check for thread pool pause */
+ if ( ( ( rs->sr_nentries & 0x3f ) == 0x3f ) &&
+ ldap_pvt_thread_pool_query( &connection_pool,
+ LDAP_PVT_THREAD_POOL_PARAM_PAUSING, &i ) == 0 && i )
+ {
+ return LDAP_BUSY;
+ }
+
rs->sr_type = REP_SEARCH;
/* eventually will loop through generated operational attribute types
} else {
/* specific attrs requested */
if ( is_at_operational( desc->ad_type ) ) {
- if ( !SLAP_OPATTRS( rs->sr_attr_flags ) &&
- !ad_inlist( desc, rs->sr_attrs ) )
- {
- continue;
+ /* if not explicitly requested */
+ if ( !ad_inlist( desc, rs->sr_attrs )) {
+ /* if not all op attrs requested, skip */
+ if ( !SLAP_OPATTRS( rs->sr_attr_flags ))
+ continue;
+ /* if DSA-specific and replicating, skip */
+ if ( op->o_sync != SLAP_CONTROL_NONE &&
+ desc->ad_type->sat_usage == LDAP_SCHEMA_DSA_OPERATION )
+ continue;
}
-
} else {
if ( !userattrs && !ad_inlist( desc, rs->sr_attrs ) ) {
continue;
}
rs->sr_nentries++;
- ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex );
- ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes );
- ldap_pvt_mp_add_ulong( slap_counters.sc_entries, 1 );
- ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 );
- ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex );
+ ldap_pvt_thread_mutex_lock( &op->o_counters->sc_mutex );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_bytes, (unsigned long)bytes );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_entries, 1 );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_pdu, 1 );
+ ldap_pvt_thread_mutex_unlock( &op->o_counters->sc_mutex );
}
Statslog( LDAP_DEBUG_STATS2, "%s ENTRY dn=\"%s\"\n",
bytes = send_ldap_ber( op->o_conn, ber );
ber_free_buf( ber );
- ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex );
- ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes );
- ldap_pvt_mp_add_ulong( slap_counters.sc_refs, 1 );
- ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 );
- ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex );
+ if ( bytes < 0 ) {
+ rc = LDAP_UNAVAILABLE;
+ } else {
+ ldap_pvt_thread_mutex_lock( &op->o_counters->sc_mutex );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_bytes, (unsigned long)bytes );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_refs, 1 );
+ ldap_pvt_mp_add_ulong( op->o_counters->sc_pdu, 1 );
+ ldap_pvt_thread_mutex_unlock( &op->o_counters->sc_mutex );
+ }
#ifdef LDAP_CONNECTIONLESS
}
#endif
op->o_preread_attrs : op->o_postread_attrs;
bv.bv_len = entry_flatsize( rs->sr_entry, 0 );
- bv.bv_val = op->o_tmpalloc(bv.bv_len, op->o_tmpmemctx );
+ bv.bv_val = op->o_tmpalloc( bv.bv_len, op->o_tmpmemctx );
ber_init2( ber, &bv, LBER_USE_DER );
ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
/* create new operation */
myop = *op;
- myop.o_bd = NULL;
+ /* FIXME: o_bd needed for ACL */
+ myop.o_bd = op->o_bd;
myop.o_res_ber = ber;
myop.o_callback = NULL;
myop.ors_slimit = 1;