]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backglue.c
Changed be_issuffix and dnParent to struct bervals
[openldap] / servers / slapd / backglue.c
index d160ee570485ebd8aa5798d1edefdebaad5f85ea..c68c1708dd1f0907ed14477f6457c9cbc875a9e1 100644 (file)
@@ -1,7 +1,7 @@
 /* backglue.c - backend glue routines */
 /* $OpenLDAP$ */
 /*
- * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 2001-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -36,7 +36,7 @@
 
 typedef struct gluenode {
        BackendDB *be;
-       char *pdn;
+       struct berval pdn;
 } gluenode;
 
 typedef struct glueinfo {
@@ -63,7 +63,7 @@ glue_back_select (
        bv.bv_val = (char *) dn;
 
        for (i = 0; i<gi->nodes; i++) {
-               if (dn_issuffixbv (&bv, gi->n[i].be->be_nsuffix[0])) {
+               if (dnIsSuffix(&bv, gi->n[i].be->be_nsuffix[0])) {
                        return gi->n[i].be;
                }
        }
@@ -149,7 +149,7 @@ glue_back_db_close (
        return 0;
 }
 
-int
+static int
 glue_back_db_destroy (
        BackendDB *be
 )
@@ -169,10 +169,11 @@ typedef struct glue_state {
        int matchlen;
        char *matched;
        int nrefs;
-       struct berval **refs;
+       BerVarray refs;
+       slap_callback *prevcb;
 } glue_state;
 
-void
+static void
 glue_back_response (
        Connection *conn,
        Operation *op,
@@ -181,14 +182,14 @@ glue_back_response (
        ber_int_t err,
        const char *matched,
        const char *text,
-       struct berval **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,59 +209,84 @@ glue_back_response (
        }
        if (ref) {
                int i, j, k;
-               struct berval **new;
+               BerVarray new;
 
-               for (i=0; ref[i]; i++);
+               for (i=0; ref[i].bv_val; i++);
 
                j = gs->nrefs;
                if (!j) {
-                       new = ch_malloc ((i+1)*sizeof(struct berval *));
+                       new = ch_malloc ((i+1)*sizeof(struct berval));
                } else {
                        new = ch_realloc(gs->refs,
-                               (j+i+1)*sizeof(struct berval *));
+                               (j+i+1)*sizeof(struct berval));
                }
                for (k=0; k<i; j++,k++) {
-                       new[j] = ber_bvdup(ref[k]);
+                       ber_dupbv( &new[j], &ref[k] );
                }
-               new[j] = NULL;
+               new[j].bv_val = NULL;
                gs->nrefs = j;
                gs->refs = new;
        }
 }
 
-void
+static void
 glue_back_sresult (
        Connection *c,
        Operation *op,
        ber_int_t err,
        const char *matched,
        const char *text,
-       struct berval **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);
 }
 
-int
+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,
        Connection *conn,
        Operation *op,
-       const char *dn,
-       const char *ndn,
+       struct berval *dn,
+       struct berval *ndn,
        int scope,
        int deref,
        int slimit,
        int tlimit,
        Filter *filter,
-       const char *filterstr,
-       char **attrs,
+       struct berval *filterstr,
+       AttributeName *attrs,
        int attrsonly
 )
 {
@@ -268,16 +294,20 @@ 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)
+       if (tlimit) {
                stoptime = slap_get_time () + tlimit;
+       }
 
        switch (scope) {
        case LDAP_SCOPE_BASE:
-               be = glue_back_select (b0, ndn);
+               be = glue_back_select (b0, ndn->bv_val);
 
                if (be && be->be_search) {
                        rc = be->be_search (be, conn, op, dn, ndn, scope,
@@ -292,11 +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;
-               bv.bv_len = strlen(ndn);
-               bv.bv_val = (char *) ndn;
+               op->o_callback = &cb;
 
                /*
                 * Execute in reverse order, most general first 
@@ -326,60 +352,59 @@ glue_back_search (
                        }
                        be = gi->n[i].be;
                        if (scope == LDAP_SCOPE_ONELEVEL && 
-                               !strcmp (gi->n[i].pdn, ndn)) {
+                               dn_match(&gi->n[i].pdn, ndn)) {
                                rc = be->be_search (be, conn, op,
-                                                   be->be_suffix[0],
-                                                   be->be_nsuffix[0]->bv_val,
-                                                   LDAP_SCOPE_BASE, deref,
+                                       be->be_suffix[0], be->be_nsuffix[0],
+                                       LDAP_SCOPE_BASE, deref,
                                        s2limit, t2limit, filter, filterstr,
-                                                   attrs, attrsonly);
+                                       attrs, attrsonly);
+
                        } else if (scope == LDAP_SCOPE_SUBTREE &&
-                               dn_issuffixbv (be->be_nsuffix[0], &bv)) {
+                               dnIsSuffix(be->be_nsuffix[0], ndn)) {
                                rc = be->be_search (be, conn, op,
-                                                   be->be_suffix[0],
-                                                   be->be_nsuffix[0]->bv_val,
-                                                   scope, deref,
+                                       be->be_suffix[0], be->be_nsuffix[0],
+                                       scope, deref,
                                        s2limit, t2limit, filter, filterstr,
-                                                   attrs, attrsonly);
-                       } else if (dn_issuffixbv (&bv, be->be_nsuffix[0])) {
-                               rc = be->be_search (be, conn, op,
-                                                   dn, ndn, scope, deref,
+                                       attrs, attrsonly);
+
+                       } else if (dnIsSuffix(&bv, be->be_nsuffix[0])) {
+                               rc = be->be_search (be, conn, op, dn, ndn,
+                                       scope, deref,
                                        s2limit, t2limit, filter, filterstr,
-                                                   attrs, attrsonly);
+                                       attrs, attrsonly);
                        }
                }
                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);
 
-       send_search_result (conn, op, gs.err, gs.matched, NULL, gs.refs,
-                           NULL, gs.nentries);
 done:
        if (gs.matched)
                free (gs.matched);
        if (gs.refs)
-               ber_bvecfree(gs.refs);
+               ber_bvarray_free(gs.refs);
        return rc;
 }
 
-int
+static int
 glue_back_bind (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
-       const char *dn,
-       const char *ndn,
+       struct berval *dn,
+       struct berval *ndn,
        int method,
        struct berval *cred,
-       char **edn
+       struct berval *edn
 )
 {
        BackendDB *be;
        int rc;
  
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_bind) {
                conn->c_authz_backend = be;
@@ -392,84 +417,87 @@ glue_back_bind (
        return rc;
 }
 
-int
+static int
 glue_back_compare (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
-       const char *dn,
-       const char *ndn,
+       struct berval *dn,
+       struct berval *ndn,
        AttributeAssertion *ava
 )
 {
        BackendDB *be;
        int rc;
 
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_compare) {
                rc = be->be_compare (be, conn, op, dn, ndn, ava);
        } else {
                rc = LDAP_UNWILLING_TO_PERFORM;
                send_ldap_result (conn, op, rc, NULL, "No compare target found",
-                                 NULL, NULL);
+                       NULL, NULL);
        }
        return rc;
 }
 
-int
+static int
 glue_back_modify (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
-       const char *dn,
-       const char *ndn,
+       struct berval *dn,
+       struct berval *ndn,
        Modifications *mod
 )
 {
        BackendDB *be;
        int rc;
 
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_modify) {
                rc = be->be_modify (be, conn, op, dn, ndn, mod);
        } else {
                rc = LDAP_UNWILLING_TO_PERFORM;
-               send_ldap_result (conn, op, rc, NULL, "No modify target found",
-                                 NULL, NULL);
+               send_ldap_result (conn, op, rc, NULL,
+                       "No modify target found", NULL, NULL);
        }
        return rc;
 }
 
-int
+static int
 glue_back_modrdn (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
-       const char *dn,
-       const char *ndn,
-       const char *newrdn,
+       struct berval *dn,
+       struct berval *ndn,
+       struct berval *newrdn,
+       struct berval *nnewrdn,
        int del,
-       const char *newsup
+       struct berval *newsup,
+       struct berval *nnewsup
 )
 {
        BackendDB *be;
        int rc;
 
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_modrdn) {
-               rc = be->be_modrdn (be, conn, op, dn, ndn, newrdn, del, newsup);
+               rc = be->be_modrdn (be, conn, op, dn, ndn,
+                       newrdn, nnewrdn, del, newsup, nnewsup );
        } else {
                rc = LDAP_UNWILLING_TO_PERFORM;
-               send_ldap_result (conn, op, rc, NULL, "No modrdn target found",
-                                 NULL, NULL);
+               send_ldap_result (conn, op, rc, NULL,
+                       "No modrdn target found", NULL, NULL);
        }
        return rc;
 }
 
-int
+static int
 glue_back_add (
        BackendDB *b0,
        Connection *conn,
@@ -492,19 +520,19 @@ glue_back_add (
        return rc;
 }
 
-int
+static int
 glue_back_delete (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
-       const char *dn,
-       const char *ndn
+       struct berval *dn,
+       struct berval *ndn
 )
 {
        BackendDB *be;
        int rc;
 
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_delete) {
                rc = be->be_delete (be, conn, op, dn, ndn);
@@ -516,7 +544,7 @@ glue_back_delete (
        return rc;
 }
 
-int
+static int
 glue_back_release_rw (
        BackendDB *b0,
        Connection *conn,
@@ -539,14 +567,14 @@ glue_back_release_rw (
        return rc;
 }
 
-int
+static int
 glue_back_group (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
        Entry *target,
-       const char *ndn,
-       const char *ondn,
+       struct berval *ndn,
+       struct berval *ondn,
        ObjectClass *oc,
        AttributeDescription * ad
 )
@@ -554,7 +582,7 @@ glue_back_group (
        BackendDB *be;
        int rc;
 
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_group) {
                rc = be->be_group (be, conn, op, target, ndn, ondn, oc, ad);
@@ -564,21 +592,21 @@ glue_back_group (
        return rc;
 }
 
-int
+static int
 glue_back_attribute (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
        Entry *target,
-       const char *ndn,
+       struct berval *ndn,
        AttributeDescription *ad,
-       struct berval ***vals
+       BerVarray *vals
 )
 {
        BackendDB *be;
        int rc;
 
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_attribute) {
                rc = be->be_attribute (be, conn, op, target, ndn, ad, vals);
@@ -588,20 +616,20 @@ glue_back_attribute (
        return rc;
 }
 
-int
+static int
 glue_back_referrals (
        BackendDB *b0,
        Connection *conn,
        Operation *op,
-       const char *dn,
-       const char *ndn,
+       struct berval *dn,
+       struct berval *ndn,
        const char **text
 )
 {
        BackendDB *be;
        int rc;
 
-       be = glue_back_select (b0, ndn);
+       be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_chk_referrals) {
                rc = be->be_chk_referrals (be, conn, op, dn, ndn, text);
@@ -611,6 +639,7 @@ glue_back_referrals (
        return rc;
 }
 
+static int
 glue_tool_entry_open (
        BackendDB *b0,
        int mode
@@ -626,7 +655,7 @@ glue_tool_entry_open (
        return 0;
 }
 
-int
+static int
 glue_tool_entry_close (
        BackendDB *b0
 )
@@ -641,7 +670,7 @@ glue_tool_entry_close (
        return rc;
 }
 
-ID
+static ID
 glue_tool_entry_first (
        BackendDB *b0
 )
@@ -666,7 +695,7 @@ glue_tool_entry_first (
        return glueBack->be_entry_first (glueBack);
 }
 
-ID
+static ID
 glue_tool_entry_next (
        BackendDB *b0
 )
@@ -698,7 +727,7 @@ glue_tool_entry_next (
        return rc;
 }
 
-Entry *
+static Entry *
 glue_tool_entry_get (
        BackendDB *b0,
        ID id
@@ -710,10 +739,11 @@ glue_tool_entry_get (
        return glueBack->be_entry_get (glueBack, id);
 }
 
-ID
+static ID
 glue_tool_entry_put (
        BackendDB *b0,
-       Entry *e
+       Entry *e,
+       struct berval *text
 )
 {
        BackendDB *be;
@@ -738,10 +768,10 @@ glue_tool_entry_put (
                        return NOID;
        }
        glueBack = be;
-       return be->be_entry_put (be, e);
+       return be->be_entry_put (be, e, text);
 }
 
-int
+static int
 glue_tool_entry_reindex (
        BackendDB *b0,
        ID id
@@ -753,7 +783,7 @@ glue_tool_entry_reindex (
        return glueBack->be_entry_reindex (glueBack, id);
 }
 
-int
+static int
 glue_tool_sync (
        BackendDB *b0
 )
@@ -762,45 +792,47 @@ glue_tool_sync (
        int i;
 
        /* just sync everyone */
-       for (i = 0; b0->be_nsuffix[i]; i++)
+       for (i = 0; i<gi->nodes; i++)
                if (gi->n[i].be->be_sync)
                        gi->n[i].be->be_sync (gi->n[i].be);
        return 0;
 }
 
-extern int num_subs;   /* config.c */
-
 int
 glue_sub_init( )
 {
        int i, j;
-       int cont = num_subs;
+       int cont = num_subordinates;
        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.
         */
        for (i = nBackendDB - 1, b1=&backendDB[i]; cont && i>=0; b1--,i--) {
-               if (b1->be_glueflags & SLAP_GLUE_SUBORDINATE) {
+               if (b1->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE) {
                        /* The last database cannot be a subordinate of noone */
-                       if (i == nBackendDB - 1)
-                               b1->be_glueflags ^= SLAP_GLUE_SUBORDINATE;
+                       if (i == nBackendDB - 1) {
+                               b1->be_flags ^= SLAP_BFLAG_GLUE_SUBORDINATE;
+                       }
                        continue;
                }
                gi = NULL;
                for (j = i-1, be=&backendDB[j]; j>=0; be--,j--) {
-                       if (!(be->be_glueflags & SLAP_GLUE_SUBORDINATE))
+                       if (!(be->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE)) {
                                continue;
+                       }
                        /* We will only link it once */
-                       if (be->be_glueflags & SLAP_GLUE_LINKED)
+                       if (be->be_flags & SLAP_BFLAG_GLUE_LINKED) {
                                continue;
-                       if (!dn_issuffixbv(be->be_nsuffix[0],
-                               b1->be_nsuffix[0]))
+                       }
+                       if (!dnIsSuffix(be->be_nsuffix[0], b1->be_nsuffix[0])) {
                                continue;
+                       }
                        cont--;
-                       be->be_glueflags |= SLAP_GLUE_LINKED;
+                       be->be_flags |= SLAP_BFLAG_GLUE_LINKED;
                        if (gi == NULL) {
                                /* We create a copy of the superior's be
                                 * structure, pointing to all of its original
@@ -809,9 +841,10 @@ glue_sub_init( )
                                 * is used whenever we have operations to pass
                                 * down to the real database.
                                 */
-                               b1->be_glueflags |= SLAP_GLUE_INSTANCE;
+                               b1->be_flags |= SLAP_BFLAG_GLUE_INSTANCE;
                                gi = (glueinfo *)ch_malloc(sizeof(glueinfo));
-                               gi->be = (BackendDB *)ch_malloc(sizeof(BackendDB) + sizeof(BackendInfo));
+                               gi->be = (BackendDB *)ch_malloc(
+                                       sizeof(BackendDB) + sizeof(BackendInfo));
                                bi = (BackendInfo *)(gi->be+1);
                                *gi->be = *b1;
                                gi->nodes = 0;
@@ -852,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) {
@@ -861,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;