X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackglue.c;h=b2665549b07810dccf4057f2985b9b8d419a6c56;hb=6e9c21cff8fc740dc6ed21c6f64d9a8899a33401;hp=8062fd42c7e9081932d2bae81ae4cb9f5ceb967a;hpb=2dd27b0786c511623c37a48f5935fb639cdc80dc;p=openldap diff --git a/servers/slapd/backglue.c b/servers/slapd/backglue.c index 8062fd42c7..b2665549b0 100644 --- a/servers/slapd/backglue.c +++ b/servers/slapd/backglue.c @@ -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; inodes; i++) { - if (dnIsSuffix(&bv, gi->n[i].be->be_nsuffix[0])) { + if (dnIsSuffix(&bv, &gi->n[i].be->be_nsuffix[0])) { return gi->n[i].be; } } @@ -97,7 +97,7 @@ glue_back_close ( ) { static int glueClosed = 0; - int rc; + int rc = 0; if (glueClosed) return 0; @@ -169,7 +169,8 @@ typedef struct glue_state { int matchlen; char *matched; int nrefs; - struct berval **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, - 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,21 +209,21 @@ 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; knrefs = j; gs->refs = new; } @@ -235,49 +236,81 @@ glue_back_sresult ( 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); } +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 ) { glueinfo *gi = (glueinfo *)b0->be_private; BackendDB *be; - int i, rc, t2limit = 0, s2limit = 0; + int i, rc = 0, t2limit = 0, s2limit = 0; long stoptime = 0; glue_state gs = {0}; - struct berval bv; + slap_callback cb; + cb.sc_response = glue_back_response; + cb.sc_sresult = glue_back_sresult; + cb.sc_sendentry = glue_back_sendentry; + cb.sc_private = &gs; - if (tlimit) + gs.prevcb = op->o_callback; + + 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 +325,8 @@ 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; + rc = gs.err = LDAP_UNWILLING_TO_PERFORM; /* * Execute in reverse order, most general first @@ -306,61 +336,61 @@ glue_back_search ( continue; if (tlimit) { t2limit = stoptime - slap_get_time (); - if (t2limit <= 0) + if (t2limit <= 0) { + rc = gs.err = LDAP_TIMELIMIT_EXCEEDED; break; + } } if (slimit) { s2limit = slimit - gs.nentries; - if (s2limit <= 0) + if (s2limit <= 0) { + rc = gs.err = LDAP_SIZELIMIT_EXCEEDED; break; + } } + rc = 0; /* * check for abandon */ - ldap_pvt_thread_mutex_lock (&op->o_abandonmutex); - rc = op->o_abandon; - ldap_pvt_thread_mutex_unlock (&op->o_abandonmutex); - if (rc) { - rc = 0; + if (op->o_abandon) { goto done; } 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]->bv_val, - 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 && - dnIsSuffix(be->be_nsuffix[0], &bv)) { + dnIsSuffix(&be->be_nsuffix[0], ndn)) { rc = be->be_search (be, conn, op, - be->be_suffix[0]->bv_val, - 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 (dnIsSuffix(&bv, be->be_nsuffix[0])) { - rc = be->be_search (be, conn, op, - dn, ndn, scope, deref, + attrs, attrsonly); + + } else if (dnIsSuffix(ndn, &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; } @@ -369,21 +399,28 @@ 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; rc = be->be_bind (be, conn, op, dn, ndn, method, cred, edn); + + if( rc == LDAP_SUCCESS ) { + ldap_pvt_thread_mutex_lock( &conn->c_mutex ); + if( conn->c_authz_backend == NULL ) { + conn->c_authz_backend = be; + } + ldap_pvt_thread_mutex_unlock( &conn->c_mutex ); + } } else { rc = LDAP_UNWILLING_TO_PERFORM; send_ldap_result (conn, op, rc, NULL, "No bind target found", @@ -397,22 +434,22 @@ 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; } @@ -422,22 +459,22 @@ 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; } @@ -447,24 +484,27 @@ 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; } @@ -497,14 +537,14 @@ 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); @@ -545,8 +585,8 @@ glue_back_group ( Connection *conn, Operation *op, Entry *target, - const char *ndn, - const char *ondn, + struct berval *ndn, + struct berval *ondn, ObjectClass *oc, AttributeDescription * ad ) @@ -554,7 +594,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); @@ -570,15 +610,15 @@ glue_back_attribute ( 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); @@ -593,15 +633,15 @@ 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); @@ -714,7 +754,8 @@ glue_tool_entry_get ( static ID glue_tool_entry_put ( BackendDB *b0, - Entry *e + Entry *e, + struct berval *text ) { BackendDB *be; @@ -739,7 +780,7 @@ glue_tool_entry_put ( return NOID; } glueBack = be; - return be->be_entry_put (be, e); + return be->be_entry_put (be, e, text); } static int @@ -763,7 +804,7 @@ glue_tool_sync ( int i; /* just sync everyone */ - for (i = 0; b0->be_nsuffix[i]; i++) + for (i = 0; inodes; i++) if (gi->n[i].be->be_sync) gi->n[i].be->be_sync (gi->n[i].be); return 0; @@ -773,33 +814,36 @@ int glue_sub_init( ) { int i, j; - int cont = num_subs; + int cont = num_subordinates; BackendDB *b1, *be; - BackendInfo *bi; + BackendInfo *bi = NULL; glueinfo *gi; /* 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 (!dnIsSuffix(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 @@ -808,9 +852,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; @@ -851,8 +896,7 @@ glue_sub_init( ) gi->nodes * sizeof(gluenode)); } gi->n[gi->nodes].be = be; - gi->n[gi->nodes].pdn = dn_parent(NULL, - be->be_nsuffix[0]->bv_val); + dnParent( &be->be_nsuffix[0], &gi->n[gi->nodes].pdn ); gi->nodes++; } if (gi) { @@ -860,8 +904,7 @@ 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, - b1->be_nsuffix[0]->bv_val); + dnParent( &b1->be_nsuffix[0], &gi->n[gi->nodes].pdn ); gi->nodes++; b1->be_private = gi; b1->bd_info = bi;