]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backglue.c
cleanup bind
[openldap] / servers / slapd / backglue.c
index ba40849723551d25b52ff47dcd0cf1175f40d6d0..4db1e9f40a476d249dc763bef6c7d3e569952e3d 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <stdio.h>
 
+#include <ac/string.h>
 #include <ac/socket.h>
 
 #define SLAPD_TOOLS
@@ -274,6 +275,31 @@ glue_back_sendentry (
        return rc;
 }
 
+static int
+glue_back_sendreference (
+       BackendDB *be,
+       Connection *c,
+       Operation *op,
+       Entry *e,
+       BerVarray bv,
+       LDAPControl **ctrls,
+       BerVarray *v2
+)
+{
+       slap_callback *tmp = op->o_callback;
+       glue_state *gs = tmp->sc_private;
+       int rc;
+
+       op->o_callback = gs->prevcb;
+       if (op->o_callback && op->o_callback->sc_sendreference) {
+               rc = op->o_callback->sc_sendreference( be, c, op, e, bv, ctrls, v2 );
+       } else {
+               rc = send_search_reference( be, c, op, e, bv, ctrls, v2 );
+       }
+       op->o_callback = tmp;
+       return rc;
+}
+
 static int
 glue_back_search (
        BackendDB *b0,
@@ -295,7 +321,7 @@ glue_back_search (
        BackendDB *be;
        int i, rc = 0, t2limit = 0, s2limit = 0;
        long stoptime = 0;
-       glue_state gs = {0};
+       glue_state gs = {0, 0, 0, NULL, 0, NULL, NULL};
        slap_callback cb;
 
        cb.sc_response = glue_back_response;
@@ -379,7 +405,23 @@ glue_back_search (
                                        s2limit, t2limit, filter, filterstr,
                                        attrs, attrsonly);
                        }
+
+                       switch ( gs.err ) {
+
+                       /*
+                        * Add errors that should result in dropping
+                        * the search
+                        */
+                       case LDAP_SIZELIMIT_EXCEEDED:
+                       case LDAP_TIMELIMIT_EXCEEDED:
+                       case LDAP_ADMINLIMIT_EXCEEDED:
+                               goto end_of_loop;
+                       
+                       default:
+                               break;
+                       }
                }
+end_of_loop:;
                break;
        }
        op->o_callback = gs.prevcb;
@@ -568,7 +610,7 @@ glue_sub_init( )
         * backends and connect them to their superior.
         */
        for (i = nBackendDB - 1, b1=&backendDB[i]; cont && i>=0; b1--,i--) {
-               if (b1->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE) {
+               if (SLAP_GLUE_SUBORDINATE ( b1 ) ) {
                        /* The last database cannot be a subordinate of noone */
                        if (i == nBackendDB - 1) {
                                b1->be_flags ^= SLAP_BFLAG_GLUE_SUBORDINATE;
@@ -577,11 +619,11 @@ glue_sub_init( )
                }
                gi = NULL;
                for (j = i-1, be=&backendDB[j]; j>=0; be--,j--) {
-                       if (!(be->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE)) {
+                       if ( ! SLAP_GLUE_SUBORDINATE( be ) ) {
                                continue;
                        }
                        /* We will only link it once */
-                       if (be->be_flags & SLAP_BFLAG_GLUE_LINKED) {
+                       if ( SLAP_GLUE_LINKED( be ) ) {
                                continue;
                        }
                        if (!dnIsSuffix(&be->be_nsuffix[0], &b1->be_nsuffix[0])) {