]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
silence warning
[openldap] / servers / slapd / result.c
index 5d8ef0485d5f43425a7ff3faa6fbe0a99ae3b543..5079bd11a34397db00845f3f281f62676a713e68 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2010 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -134,6 +134,38 @@ slap_req2res( ber_tag_t tag )
 
 /* SlapReply debugging, prodo-slap.h overrides it in OpenLDAP releases */
 #if defined(LDAP_TEST) || (defined(USE_RS_ASSERT) && (USE_RS_ASSERT))
+
+int rs_suppress_assert = 0;
+
+/* RS_ASSERT() helper function */
+void rs_assert_(const char*file, unsigned line, const char*fn, const char*cond)
+{
+       int no_assert = rs_suppress_assert, save_errno = errno;
+       const char *s;
+
+       if ( no_assert >= 0 ) {
+               if ( no_assert == 0 && (s = getenv( "NO_RS_ASSERT" )) && *s ) {
+                       no_assert = rs_suppress_assert = atoi( s );
+               }
+               if ( no_assert > 0 ) {
+                       errno = save_errno;
+                       return;
+               }
+       }
+
+#ifdef rs_assert_      /* proto-slap.h #defined away the fn parameter */
+       fprintf( stderr,"%s:%u: "  "RS_ASSERT(%s) failed.\n", file,line,cond );
+#else
+       fprintf( stderr,"%s:%u: %s: RS_ASSERT(%s) failed.\n", file,line,fn,cond );
+#endif
+       fflush( stderr );
+
+       errno = save_errno;
+       /* $NO_RS_ASSERT > 0: ignore rs_asserts, 0: abort, < 0: just warn */
+       if ( !no_assert /* from $NO_RS_ASSERT */ ) abort();
+}
+
+/* SlapReply is consistent */
 void
 (rs_assert_ok)( const SlapReply *rs )
 {
@@ -161,6 +193,8 @@ void
 #endif
 #endif
 }
+
+/* Ready for calling a new backend operation */
 void
 (rs_assert_ready)( const SlapReply *rs )
 {
@@ -178,6 +212,8 @@ void
        RS_ASSERT( !(rs->sr_flags & REP_ENTRY_MASK) );
 #endif
 }
+
+/* Backend operation done */
 void
 (rs_assert_done)( const SlapReply *rs )
 {
@@ -188,6 +224,7 @@ void
        RS_ASSERT( !(rs->sr_flags & REP_ENTRY_MUSTFLUSH) );
 #endif
 }
+
 #endif /* LDAP_TEST || USE_RS_ASSERT */
 
 /* Reset a used SlapReply whose contents has been flushed (freed/released) */
@@ -231,7 +268,7 @@ rs_replace_entry( Operation *op, SlapReply *rs, slap_overinst *on, Entry *e )
  * Return nonzero if rs->sr_entry was replaced.
  */
 int
-rs_ensure_entry_modifiable( Operation *op, SlapReply *rs, slap_overinst *on )
+rs_entry2modifiable( Operation *op, SlapReply *rs, slap_overinst *on )
 {
        if ( rs->sr_flags & REP_ENTRY_MODIFIABLE ) {
                rs_assert_ok( rs );
@@ -728,6 +765,10 @@ send_ldap_disconnect( Operation    *op, SlapReply *rs )
                rs->sr_err, rs->sr_text ? rs->sr_text : "", NULL );
        assert( LDAP_UNSOLICITED_ERROR( rs->sr_err ) );
 
+       /* TODO: Flush the entry if sr_type == REP_SEARCH/REP_SEARCHREF? */
+       RS_ASSERT( !(rs->sr_flags & REP_ENTRY_MASK) );
+       rs->sr_flags &= ~REP_ENTRY_MASK;        /* paranoia */
+
        rs->sr_type = REP_EXTENDED;
        rs->sr_rspdata = NULL;
 
@@ -833,6 +874,9 @@ send_ldap_sasl( Operation *op, SlapReply *rs )
                rs->sr_err,
                rs->sr_sasldata ? (long) rs->sr_sasldata->bv_len : -1, NULL );
 
+       RS_ASSERT( !(rs->sr_flags & REP_ENTRY_MASK) );
+       rs->sr_flags &= ~REP_ENTRY_MASK;        /* paranoia */
+
        rs->sr_type = REP_SASL;
        rs->sr_tag = slap_req2res( op->o_tag );
        rs->sr_msgid = (rs->sr_tag != LBER_SEQUENCE) ? op->o_msgid : 0;
@@ -854,6 +898,9 @@ slap_send_ldap_extended( Operation *op, SlapReply *rs )
                rs->sr_rspoid ? rs->sr_rspoid : "",
                rs->sr_rspdata != NULL ? rs->sr_rspdata->bv_len : 0 );
 
+       RS_ASSERT( !(rs->sr_flags & REP_ENTRY_MASK) );
+       rs->sr_flags &= ~REP_ENTRY_MASK;        /* paranoia */
+
        rs->sr_type = REP_EXTENDED;
        rs->sr_tag = slap_req2res( op->o_tag );
        rs->sr_msgid = (rs->sr_tag != LBER_SEQUENCE) ? op->o_msgid : 0;
@@ -875,6 +922,9 @@ slap_send_ldap_intermediate( Operation *op, SlapReply *rs )
                rs->sr_rspoid ? rs->sr_rspoid : "",
                rs->sr_rspdata != NULL ? rs->sr_rspdata->bv_len : 0 );
 
+       RS_ASSERT( !(rs->sr_flags & REP_ENTRY_MASK) );
+       rs->sr_flags &= ~REP_ENTRY_MASK;        /* paranoia */
+
        rs->sr_type = REP_INTERMEDIATE;
        rs->sr_tag = LDAP_RES_INTERMEDIATE;
        rs->sr_msgid = op->o_msgid;
@@ -992,7 +1042,8 @@ slap_send_search_entry( Operation *op, SlapReply *rs )
 #endif
        if ( op->o_res_ber ) {
                /* read back control */
-           rc = ber_printf( ber, "{O{" /*}}*/, &rs->sr_entry->e_name );
+           rc = ber_printf( ber, "t{O{" /*}}*/,
+                       LDAP_RES_SEARCH_ENTRY, &rs->sr_entry->e_name );
        } else {
            rc = ber_printf( ber, "{it{O{" /*}}}*/, op->o_msgid,
                        LDAP_RES_SEARCH_ENTRY, &rs->sr_entry->e_name );
@@ -1391,18 +1442,13 @@ error_return:;
                slap_sl_free( e_flags, op->o_tmpmemctx );
        }
 
+       /* FIXME: Can break if rs now contains an extended response */
        if ( rs->sr_operational_attrs ) {
                attrs_free( rs->sr_operational_attrs );
                rs->sr_operational_attrs = NULL;
        }
        rs->sr_attr_flags = SLAP_ATTRS_UNDEFINED;
 
-       /* FIXME: I think rs->sr_type should be explicitly set to
-        * REP_SEARCH here. That's what it was when we entered this
-        * function. send_ldap_error may have changed it, but we
-        * should set it back so that the cleanup functions know
-        * what they're doing.
-        */
        if ( op->o_tag == LDAP_REQ_SEARCH && rs->sr_type == REP_SEARCH ) {
                rs_flush_entry( op, rs, NULL );
        } else {
@@ -1699,6 +1745,7 @@ int slap_read_controls(
        myop.o_res_ber = ber;
        myop.o_callback = NULL;
        myop.ors_slimit = 1;
+       myop.ors_attrsonly = 0;
 
        rc = slap_send_search_entry( &myop, rs );
        if( rc ) return rc;