]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
fix dirsep's in DN (ITS#5172)
[openldap] / servers / slapd / result.c
index c6ec83615941993bf1cfbc168d37c9b6d677bdc5..c3e3861590b8ac4e02d05487795e89fe5939d0dd 100644 (file)
@@ -2,7 +2,7 @@
 /* $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
@@ -54,14 +54,6 @@ int slap_freeself_cb( Operation *op, SlapReply *rs )
        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;
@@ -170,7 +162,7 @@ static long send_ldap_ber(
                        break;
                }
 
-               err = errno;
+               err = sock_errno();
 
                /*
                 * we got an error.  if it's ewouldblock, we need to
@@ -247,7 +239,7 @@ send_ldap_controls( Operation *o, BerElement *ber, LDAPControl **c )
                if( rc == -1 ) return rc;
        }
 
-#ifdef SLAP_SORTED_RESULTS
+#ifdef SLAP_CONTROL_X_SORTEDRESULTS
        /* this is a hack to avoid having to modify op->s_ctrls */
        if( o->o_sortedresults ) {
                BerElementBuffer berbuf;
@@ -570,7 +562,7 @@ send_ldap_disconnect( Operation     *op, SlapReply *rs )
        } 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 ) {
@@ -751,6 +743,13 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
                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
@@ -1359,11 +1358,15 @@ slap_send_search_reference( Operation *op, SlapReply *rs )
        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( &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 );
+       }
 #ifdef LDAP_CONNECTIONLESS
        }
 #endif
@@ -1501,14 +1504,15 @@ int slap_read_controls(
                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;