]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/search.c
document option '-F'
[openldap] / servers / slapd / back-ldap / search.c
index a2ad8a5df618b889c9e36791e71f37398405da44..edd5bba22de4b49be8dae0e7f1a6703e421fed93 100644 (file)
@@ -56,7 +56,6 @@ ldap_back_search(
        int             i;
        char            **attrs = NULL;
        int             dontfreetext = 0;
-       int             freeconn = 0;
        int             do_retry = 1;
        LDAPControl     **ctrls = NULL;
 
@@ -120,12 +119,18 @@ retry:
 
        if ( rs->sr_err != LDAP_SUCCESS ) {
 fail:;
-               rc = ldap_back_op_result( lc, op, rs, msgid, LDAP_BACK_SENDERR );
-               if ( freeconn ) {
+               if ( rs->sr_err == LDAP_SERVER_DOWN ) {
+                       if ( do_retry ) {
+                               do_retry = 0;
+                               if ( ldap_back_retry( lc, op, rs, LDAP_BACK_DONTSEND ) ) {
+                                       goto retry;
+                               }
+                       }
+                       rc = ldap_back_op_result( lc, op, rs, msgid, LDAP_BACK_DONTSEND );
                        ldap_back_freeconn( op, lc );
                        lc = NULL;
+                       goto finish;
                }
-               goto finish;
        }
 
        /* We pull apart the ber result, stuff it into a slapd entry, and
@@ -138,7 +143,7 @@ fail:;
                /* check for abandon */
                if ( op->o_abandon ) {
                        ldap_abandon_ext( lc->lc_ld, msgid, NULL, NULL );
-                       rc = 0;
+                       rc = SLAPD_ABANDON;
                        goto finish;
                }
 
@@ -274,9 +279,7 @@ fail:;
                                goto retry;
                        }
                }
-               /* FIXME: invalidate the connection? */
                rs->sr_err = LDAP_SERVER_DOWN;
-               freeconn = 1;
                goto fail;
        }
 
@@ -291,7 +294,9 @@ fail:;
        }
 
 finish:;
-       send_ldap_result( op, rs );
+       if ( rc != SLAPD_ABANDON ) {
+               send_ldap_result( op, rs );
+       }
 
        (void)ldap_back_proxy_authz_ctrl_free( op, &ctrls );