]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/search.c
allow pretty time form in quarantine string
[openldap] / servers / slapd / back-ldap / search.c
index 5290dc9b16ee20d5fb8d1aa5b03f5e15ba343d51..eed46629d365cedddd7e5f4c3efeb0b9174e638d 100644 (file)
@@ -75,7 +75,7 @@ ldap_back_munge_filter(
 
                if ( strncmp( ptr, bv_true.bv_val, bv_true.bv_len ) == 0 ) {
                        oldbv = &bv_true;
-                       if ( li->li_flags & LDAP_BACK_F_SUPPORT_T_F ) {
+                       if ( LDAP_BACK_T_F( li ) ) {
                                newbv = &bv_t;
 
                        } else {
@@ -85,7 +85,7 @@ ldap_back_munge_filter(
                } else if ( strncmp( ptr, bv_false.bv_val, bv_false.bv_len ) == 0 )
                {
                        oldbv = &bv_false;
-                       if ( li->li_flags & LDAP_BACK_F_SUPPORT_T_F ) {
+                       if ( LDAP_BACK_T_F( li ) ) {
                                newbv = &bv_f;
 
                        } else {
@@ -141,6 +141,8 @@ ldap_back_search(
                Operation       *op,
                SlapReply       *rs )
 {
+       ldapinfo_t      *li = (ldapinfo_t *) op->o_bd->be_private;
+
        ldapconn_t      *lc;
        struct timeval  tv;
        time_t          stoptime = (time_t)-1;
@@ -153,7 +155,7 @@ ldap_back_search(
        int             i;
        char            **attrs = NULL;
        int             freetext = 0;
-       int             do_retry = 1;
+       int             do_retry = 1, dont_retry = 0;
        LDAPControl     **ctrls = NULL;
        /* FIXME: shouldn't this be null? */
        const char      *save_matched = rs->sr_matched;
@@ -209,7 +211,7 @@ ldap_back_search(
        /* deal with <draft-zeilenga-ldap-t-f> filters */
        filter = op->ors_filterstr;
 retry:
-       rs->sr_err = ldap_search_ext( lc->lc_ld, op->o_req_ndn.bv_val,
+       rs->sr_err = ldap_search_ext( lc->lc_ld, op->o_req_dn.bv_val,
                        op->ors_scope, filter.bv_val,
                        attrs, op->ors_attrsonly, ctrls, NULL,
                        tv.tv_sec ? &tv : NULL,
@@ -224,14 +226,13 @@ retry:
                                        goto retry;
                                }
                        }
+
                        if ( lc == NULL ) {
                                /* reset by ldap_back_retry ... */
                                rs->sr_err = slap_map_api2result( rs );
 
                        } else {
                                rc = ldap_back_op_result( lc, op, rs, msgid, 0, LDAP_BACK_DONTSEND );
-                               ldap_back_freeconn( op, lc, 0 );
-                               lc = NULL;
                        }
                                
                        goto finish;
@@ -265,7 +266,7 @@ retry:
                        if ( rc > 0 ) {
                                ldap_msgfree( res );
                        }
-                       ldap_abandon_ext( lc->lc_ld, msgid, NULL, NULL );
+                       (void)ldap_back_cancel( lc, op, rs, msgid, LDAP_BACK_DONTSEND );
                        rc = SLAPD_ABANDON;
                        goto finish;
                }
@@ -278,12 +279,19 @@ retry:
                        if ( op->ors_tlimit != SLAP_NO_LIMIT
                                        && slap_get_time() > stoptime )
                        {
-                               ldap_abandon_ext( lc->lc_ld, msgid, NULL, NULL );
+                               (void)ldap_back_cancel( lc, op, rs, msgid, LDAP_BACK_DONTSEND );
                                rc = rs->sr_err = LDAP_TIMELIMIT_EXCEEDED;
                                goto finish;
                        }
+                       continue;
+
+               } else {
+                       /* don't retry any more */
+                       dont_retry = 1;
+               }
+
 
-               } else if ( rc == LDAP_RES_SEARCH_ENTRY ) {
+               if ( rc == LDAP_RES_SEARCH_ENTRY ) {
                        Entry           ent = { 0 };
                        struct berval   bdn = BER_BVNULL;
 
@@ -296,6 +304,7 @@ retry:
                                rs->sr_attrs = op->ors_attrs;
                                rs->sr_operational_attrs = NULL;
                                rs->sr_flags = 0;
+                               rs->sr_err = LDAP_SUCCESS;
                                rc = rs->sr_err = send_search_entry( op, rs );
                                if ( !BER_BVISNULL( &ent.e_name ) ) {
                                        assert( ent.e_name.bv_val != bdn.bv_val );
@@ -313,7 +322,7 @@ retry:
                                if ( rc == LDAP_UNAVAILABLE ) {
                                        rc = rs->sr_err = LDAP_OTHER;
                                } else {
-                                       ldap_abandon_ext( lc->lc_ld, msgid, NULL, NULL );
+                                       (void)ldap_back_cancel( lc, op, rs, msgid, LDAP_BACK_DONTSEND );
                                }
                                goto finish;
                        }
@@ -337,7 +346,8 @@ retry:
                                        /* NO OP */ ;
 
                                /* FIXME: there MUST be at least one */
-                               rs->sr_ref = ch_malloc( ( cnt + 1 ) * sizeof( struct berval ) );
+                               rs->sr_ref = op->o_tmpalloc( ( cnt + 1 ) * sizeof( struct berval ),
+                                       op->o_tmpmemctx );
 
                                for ( cnt = 0; references[ cnt ]; cnt++ ) {
                                        ber_str2bv( references[ cnt ], 0, 0, &rs->sr_ref[ cnt ] );
@@ -358,7 +368,7 @@ retry:
                        /* cleanup */
                        if ( references ) {
                                ber_memvfree( (void **)references );
-                               ch_free( rs->sr_ref );
+                               op->o_tmpfree( rs->sr_ref, op->o_tmpmemctx );
                                rs->sr_ref = NULL;
                        }
 
@@ -368,16 +378,19 @@ retry:
                        }
 
                } else {
-                       char            **references = NULL;
+                       char            **references = NULL, *err = NULL;
 
                        rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err,
-                                       &match.bv_val, (char **)&rs->sr_text,
+                                       &match.bv_val, &err,
                                        &references, &rs->sr_ctrls, 1 );
-                       freetext = 1;
                        if ( rc != LDAP_SUCCESS ) {
                                rs->sr_err = rc;
                        }
                        rs->sr_err = slap_map_api2result( rs );
+                       if ( err ) {
+                               rs->sr_text = err;
+                               freetext = 1;
+                       }
 
                        if ( references && references[ 0 ] && references[ 0 ][ 0 ] ) {
                                int     cnt;
@@ -395,7 +408,8 @@ retry:
                                for ( cnt = 0; references[ cnt ]; cnt++ )
                                        /* NO OP */ ;
                                
-                               rs->sr_ref = ch_malloc( ( cnt + 1 ) * sizeof( struct berval ) );
+                               rs->sr_ref = op->o_tmpalloc( ( cnt + 1 ) * sizeof( struct berval ),
+                                       op->o_tmpmemctx );
 
                                for ( cnt = 0; references[ cnt ]; cnt++ ) {
                                        /* duplicating ...*/
@@ -405,22 +419,10 @@ retry:
                        }
 
                        if ( match.bv_val != NULL ) {
-#ifndef LDAP_NULL_IS_NULL
-                               if ( match.bv_val[ 0 ] == '\0' ) {
-                                       LDAP_FREE( match.bv_val );
-                                       BER_BVZERO( &match );
-                               } else
-#endif /* LDAP_NULL_IS_NULL */
                                {
                                        match.bv_len = strlen( match.bv_val );
                                }
                        }
-#ifndef LDAP_NULL_IS_NULL
-                       if ( rs->sr_text != NULL && rs->sr_text[ 0 ] == '\0' ) {
-                               LDAP_FREE( (char *)rs->sr_text );
-                               rs->sr_text = NULL;
-                       }
-#endif /* LDAP_NULL_IS_NULL */
 
                        /* cleanup */
                        if ( references ) {
@@ -432,10 +434,10 @@ retry:
                }
        }
 
-       if ( rc == -1 ) {
+       if ( rc == -1 && dont_retry == 0 ) {
                if ( do_retry ) {
                        do_retry = 0;
-                       if ( ldap_back_retry( &lc, op, rs, LDAP_BACK_SENDERR ) ) {
+                       if ( ldap_back_retry( &lc, op, rs, LDAP_BACK_DONTSEND ) ) {
                                goto retry;
                        }
                }
@@ -464,6 +466,10 @@ retry:
        }
 
 finish:;
+       if ( LDAP_BACK_QUARANTINE( li ) ) {
+               ldap_back_quarantine( op, rs, 1 );
+       }
+
        if ( rc != SLAPD_ABANDON ) {
                send_ldap_result( op, rs );
        }
@@ -497,7 +503,7 @@ finish:;
        }
 
        if ( rs->sr_ref ) {
-               ber_bvarray_free( rs->sr_ref );
+               ber_bvarray_free_x( rs->sr_ref, op->o_tmpmemctx );
                rs->sr_ref = NULL;
        }