]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backglue.c
Changed be_issuffix and dnParent to struct bervals
[openldap] / servers / slapd / backglue.c
index 79f20b8f27ad67abdad5b15e51f0e241d9a6b0cb..c68c1708dd1f0907ed14477f6457c9cbc875a9e1 100644 (file)
@@ -36,7 +36,7 @@
 
 typedef struct gluenode {
        BackendDB *be;
-       char *pdn;
+       struct berval pdn;
 } gluenode;
 
 typedef struct glueinfo {
@@ -169,7 +169,8 @@ typedef struct glue_state {
        int matchlen;
        char *matched;
        int nrefs;
-       BVarray refs;
+       BerVarray refs;
+       slap_callback *prevcb;
 } glue_state;
 
 static void
@@ -181,14 +182,14 @@ glue_back_response (
        ber_int_t err,
        const char *matched,
        const char *text,
-       BVarray ref,
+       BerVarray ref,
        const char *resoid,
        struct berval *resdata,
        struct berval *sasldata,
        LDAPControl **ctrls
 )
 {
-       glue_state *gs = op->o_glue;
+       glue_state *gs = op->o_callback->sc_private;
 
        if (err == LDAP_SUCCESS || gs->err != LDAP_SUCCESS)
                gs->err = err;
@@ -208,7 +209,7 @@ glue_back_response (
        }
        if (ref) {
                int i, j, k;
-               BVarray new;
+               BerVarray new;
 
                for (i=0; ref[i].bv_val; i++);
 
@@ -235,18 +236,43 @@ glue_back_sresult (
        ber_int_t err,
        const char *matched,
        const char *text,
-       BVarray refs,
+       BerVarray refs,
        LDAPControl **ctrls,
        int nentries
 )
 {
-       glue_state *gs = op->o_glue;
+       glue_state *gs = op->o_callback->sc_private;
 
        gs->nentries += nentries;
        glue_back_response (c, op, 0, 0, err, matched, text, refs,
                            NULL, NULL, NULL, ctrls);
 }
 
+static int
+glue_back_sendentry (
+       BackendDB *be,
+       Connection *c,
+       Operation *op,
+       Entry *e,
+       AttributeName *an,
+       int ao,
+       LDAPControl **ctrls
+)
+{
+       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_sendentry) {
+               rc = op->o_callback->sc_sendentry(be, c, op, e, an, ao, ctrls);
+       } else {
+               rc = send_search_entry(be, c, op, e, an, ao, ctrls);
+       }
+       op->o_callback = tmp;
+       return rc;
+}
+
 static int
 glue_back_search (
        BackendDB *b0,
@@ -268,9 +294,12 @@ glue_back_search (
        BackendDB *be;
        int i, rc, t2limit = 0, s2limit = 0;
        long stoptime = 0;
-       glue_state gs = {0};
        struct berval bv;
+       glue_state gs = {0};
+       slap_callback cb = {glue_back_response, glue_back_sresult, 
+               glue_back_sendentry, &gs};
 
+       gs.prevcb = op->o_callback;
 
        if (tlimit) {
                stoptime = slap_get_time () + tlimit;
@@ -293,9 +322,7 @@ glue_back_search (
 
        case LDAP_SCOPE_ONELEVEL:
        case LDAP_SCOPE_SUBTREE:
-               op->o_glue = &gs;
-               op->o_sresult = glue_back_sresult;
-               op->o_response = glue_back_response;
+               op->o_callback = &cb;
 
                /*
                 * Execute in reverse order, most general first 
@@ -325,7 +352,7 @@ glue_back_search (
                        }
                        be = gi->n[i].be;
                        if (scope == LDAP_SCOPE_ONELEVEL && 
-                               !strcmp (gi->n[i].pdn, ndn->bv_val)) {
+                               dn_match(&gi->n[i].pdn, ndn)) {
                                rc = be->be_search (be, conn, op,
                                        be->be_suffix[0], be->be_nsuffix[0],
                                        LDAP_SCOPE_BASE, deref,
@@ -349,9 +376,7 @@ glue_back_search (
                }
                break;
        }
-       op->o_sresult = NULL;
-       op->o_response = NULL;
-       op->o_glue = NULL;
+       op->o_callback = gs.prevcb;
 
        send_search_result (conn, op, gs.err, gs.matched, NULL,
                gs.refs, NULL, gs.nentries);
@@ -360,7 +385,7 @@ done:
        if (gs.matched)
                free (gs.matched);
        if (gs.refs)
-               bvarray_free(gs.refs);
+               ber_bvarray_free(gs.refs);
        return rc;
 }
 
@@ -575,7 +600,7 @@ glue_back_attribute (
        Entry *target,
        struct berval *ndn,
        AttributeDescription *ad,
-       BVarray *vals
+       BerVarray *vals
 )
 {
        BackendDB *be;
@@ -781,6 +806,7 @@ glue_sub_init( )
        BackendDB *b1, *be;
        BackendInfo *bi;
        glueinfo *gi;
+       struct berval bv;
 
        /* While there are subordinate backends, search backwards through the
         * backends and connect them to their superior.
@@ -859,8 +885,14 @@ glue_sub_init( )
                                        gi->nodes * sizeof(gluenode));
                        }
                        gi->n[gi->nodes].be = be;
-                       gi->n[gi->nodes].pdn = dn_parent(NULL,
+                       if ( dnParent( be->be_nsuffix[0]->bv_val, 
+                                       (const char **)&bv.bv_val ) 
+                                       != LDAP_SUCCESS ) {
+                               return -1;
+                       }
+                       bv.bv_len = be->be_nsuffix[0]->bv_len - (bv.bv_val -
                                be->be_nsuffix[0]->bv_val);
+                       gi->n[gi->nodes].pdn = bv;
                        gi->nodes++;
                }
                if (gi) {
@@ -868,8 +900,14 @@ glue_sub_init( )
                        gi = (glueinfo *)ch_realloc(gi,
                                sizeof(glueinfo) + gi->nodes * sizeof(gluenode));
                        gi->n[gi->nodes].be = gi->be;
-                       gi->n[gi->nodes].pdn = dn_parent(NULL,
+                       if ( dnParent( b1->be_nsuffix[0]->bv_val, 
+                                       (const char **)&bv.bv_val ) 
+                                       != LDAP_SUCCESS ) {
+                               return -1;
+                       }
+                       bv.bv_len = b1->be_nsuffix[0]->bv_len - (bv.bv_val -
                                b1->be_nsuffix[0]->bv_val);
+                       gi->n[gi->nodes].pdn = bv;
                        gi->nodes++;
                        b1->be_private = gi;
                        b1->bd_info = bi;