X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackglue.c;h=cd8a63d3546201cd0e65a3230777f0bcfbfab6a4;hb=25c672a844c7752634c59118b53e3e4b48445ccb;hp=d093521bd9358d83a678135521a6ca8dc7f7db93;hpb=727baf2fa526ff55d7df991f8b52e54b9cb06a68;p=openldap diff --git a/servers/slapd/backglue.c b/servers/slapd/backglue.c index d093521bd9..cd8a63d354 100644 --- a/servers/slapd/backglue.c +++ b/servers/slapd/backglue.c @@ -1,8 +1,17 @@ /* backglue.c - backend glue routines */ /* $OpenLDAP$ */ -/* - * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 2001-2004 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ /* @@ -29,6 +38,7 @@ #include +#include #include #define SLAPD_TOOLS @@ -36,11 +46,12 @@ typedef struct gluenode { BackendDB *be; - char *pdn; + struct berval pdn; } gluenode; typedef struct glueinfo { - BackendDB *be; + BackendInfo bi; + BackendDB bd; int nodes; gluenode n[1]; } glueinfo; @@ -48,6 +59,8 @@ typedef struct glueinfo { static int glueMode; static BackendDB *glueBack; +static slap_response glue_back_response; + /* Just like select_backend, but only for our backends */ static BackendDB * glue_back_select ( @@ -55,7 +68,7 @@ glue_back_select ( const char *dn ) { - glueinfo *gi = (glueinfo *) be->be_private; + glueinfo *gi = (glueinfo *) be->bd_info; struct berval bv; int i; @@ -63,7 +76,9 @@ glue_back_select ( bv.bv_val = (char *) dn; for (i = 0; inodes; i++) { - if (dn_issuffixbv (&bv, gi->n[i].be->be_nsuffix[0])) { + assert( gi->n[i].be->be_nsuffix ); + + if (dnIsSuffix(&bv, &gi->n[i].be->be_nsuffix[0])) { return gi->n[i].be; } } @@ -97,7 +112,7 @@ glue_back_close ( ) { static int glueClosed = 0; - int rc; + int rc = 0; if (glueClosed) return 0; @@ -114,7 +129,7 @@ glue_back_db_open ( BackendDB *be ) { - glueinfo *gi = (glueinfo *)be->be_private; + glueinfo *gi = (glueinfo *) be->bd_info; static int glueOpened = 0; int rc = 0; @@ -122,10 +137,10 @@ glue_back_db_open ( glueOpened = 1; - gi->be->be_acl = be->be_acl; + gi->bd.be_acl = be->be_acl; - if (gi->be->bd_info->bi_db_open) - rc = gi->be->bd_info->bi_db_open(gi->be); + if (gi->bd.bd_info->bi_db_open) + rc = gi->bd.bd_info->bi_db_open(&gi->bd); return rc; } @@ -135,7 +150,7 @@ glue_back_db_close ( BackendDB *be ) { - glueinfo *gi = (glueinfo *)be->be_private; + glueinfo *gi = (glueinfo *) be->bd_info; static int glueClosed = 0; if (glueClosed) return 0; @@ -143,160 +158,139 @@ glue_back_db_close ( glueClosed = 1; /* Close the master */ - if (gi->be->bd_info->bi_db_close) - gi->be->bd_info->bi_db_close( gi->be ); + if (gi->bd.bd_info->bi_db_close) + gi->bd.bd_info->bi_db_close( &gi->bd ); return 0; } -int +static int glue_back_db_destroy ( BackendDB *be ) { - glueinfo *gi = (glueinfo *)be->be_private; + glueinfo *gi = (glueinfo *) be->bd_info; - if (gi->be->bd_info->bi_db_destroy) - gi->be->bd_info->bi_db_destroy( gi->be ); - free (gi->be); + if (gi->bd.bd_info->bi_db_destroy) + gi->bd.bd_info->bi_db_destroy( &gi->bd ); free (gi); return 0; } typedef struct glue_state { int err; - int nentries; + int slimit; int matchlen; char *matched; int nrefs; - struct berval **refs; + BerVarray refs; } glue_state; -void -glue_back_response ( - Connection *conn, - Operation *op, - ber_tag_t tag, - ber_int_t msgid, - ber_int_t err, - const char *matched, - const char *text, - struct berval **ref, - const char *resoid, - struct berval *resdata, - struct berval *sasldata, - LDAPControl **ctrls -) +static int +glue_back_response ( Operation *op, SlapReply *rs ) { - 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; - if (gs->err == LDAP_SUCCESS && gs->matched) { - free (gs->matched); - gs->matchlen = 0; - } - if (gs->err != LDAP_SUCCESS && matched) { - int len; - len = strlen (matched); - if (len > gs->matchlen) { - if (gs->matched) - free (gs->matched); - gs->matched = ch_strdup (matched); - gs->matchlen = len; + switch(rs->sr_type) { + case REP_SEARCH: + if ( gs->slimit && rs->sr_nentries >= gs->slimit ) { + rs->sr_err = gs->err = LDAP_SIZELIMIT_EXCEEDED; + return -1; } - } - if (ref) { - int i, j, k; - struct berval **new; - - for (i=0; ref[i]; i++); - - j = gs->nrefs; - if (!j) { - new = ch_malloc ((i+1)*sizeof(struct berval *)); - } else { - new = ch_realloc(gs->refs, - (j+i+1)*sizeof(struct berval *)); + /* fallthru */ + case REP_SEARCHREF: + return SLAP_CB_CONTINUE; + + default: + if (rs->sr_err == LDAP_SUCCESS || + rs->sr_err == LDAP_SIZELIMIT_EXCEEDED || + rs->sr_err == LDAP_TIMELIMIT_EXCEEDED || + rs->sr_err == LDAP_ADMINLIMIT_EXCEEDED || + gs->err != LDAP_SUCCESS) + gs->err = rs->sr_err; + if (gs->err == LDAP_SUCCESS && gs->matched) { + ch_free (gs->matched); + gs->matched = NULL; + gs->matchlen = 0; } - for (k=0; kerr != LDAP_SUCCESS && rs->sr_matched) { + int len; + len = strlen (rs->sr_matched); + if (len > gs->matchlen) { + if (gs->matched) + ch_free (gs->matched); + gs->matched = ch_strdup (rs->sr_matched); + gs->matchlen = len; + } } - new[j] = NULL; - gs->nrefs = j; - gs->refs = new; - } -} + if (rs->sr_ref) { + int i, j, k; + BerVarray new; -void -glue_back_sresult ( - Connection *c, - Operation *op, - ber_int_t err, - const char *matched, - const char *text, - struct berval **refs, - LDAPControl **ctrls, - int nentries -) -{ - glue_state *gs = op->o_glue; + for (i=0; rs->sr_ref[i].bv_val; i++); - gs->nentries += nentries; - glue_back_response (c, op, 0, 0, err, matched, text, refs, - NULL, NULL, NULL, ctrls); + j = gs->nrefs; + if (!j) { + new = ch_malloc ((i+1)*sizeof(struct berval)); + } else { + new = ch_realloc(gs->refs, + (j+i+1)*sizeof(struct berval)); + } + for (k=0; ksr_ref[k] ); + } + new[j].bv_val = NULL; + gs->nrefs = j; + gs->refs = new; + } + } + return 0; } -int -glue_back_search ( - BackendDB *b0, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn, - int scope, - int deref, - int slimit, - int tlimit, - Filter *filter, - const char *filterstr, - char **attrs, - int attrsonly -) +static int +glue_back_search ( Operation *op, SlapReply *rs ) { - glueinfo *gi = (glueinfo *)b0->be_private; - BackendDB *be; - int i, rc, t2limit = 0, s2limit = 0; + BackendDB *b0 = op->o_bd; + glueinfo *gi = (glueinfo *) b0->bd_info; + int i; long stoptime = 0; - glue_state gs = {0}; - struct berval bv; + glue_state gs = {0, 0, 0, NULL, 0, NULL}; + slap_callback cb = { NULL, glue_back_response, NULL, NULL }; + int scope0, slimit0, tlimit0; + struct berval dn, ndn; + cb.sc_private = &gs; - if (tlimit) - stoptime = slap_get_time () + tlimit; + cb.sc_next = op->o_callback; - switch (scope) { + if (op->ors_tlimit) { + stoptime = slap_get_time () + op->ors_tlimit; + } + + switch (op->ors_scope) { case LDAP_SCOPE_BASE: - be = glue_back_select (b0, ndn); + op->o_bd = glue_back_select (b0, op->o_req_ndn.bv_val); - if (be && be->be_search) { - rc = be->be_search (be, conn, op, dn, ndn, scope, - deref, slimit, tlimit, filter, filterstr, - attrs, attrsonly); + if (op->o_bd && op->o_bd->be_search) { + rs->sr_err = op->o_bd->be_search( op, rs ); } else { - rc = LDAP_UNWILLING_TO_PERFORM; - send_ldap_result (conn, op, rc, NULL, - "No search target found", NULL, NULL); + send_ldap_error(op, rs, LDAP_UNWILLING_TO_PERFORM, + "No search target found"); } - return rc; + return rs->sr_err; 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; +#ifdef LDAP_SCOPE_SUBORDINATE + case LDAP_SCOPE_SUBORDINATE: /* FIXME */ +#endif + op->o_callback = &cb; + rs->sr_err = gs.err = LDAP_UNWILLING_TO_PERFORM; + scope0 = op->ors_scope; + slimit0 = gs.slimit = op->ors_slimit; + tlimit0 = op->ors_tlimit; + dn = op->o_req_dn; + ndn = op->o_req_ndn; /* * Execute in reverse order, most general first @@ -304,313 +298,94 @@ glue_back_search ( for (i = gi->nodes-1; i >= 0; i--) { if (!gi->n[i].be || !gi->n[i].be->be_search) continue; - if (tlimit) { - t2limit = stoptime - slap_get_time (); - if (t2limit <= 0) + if (tlimit0) { + op->ors_tlimit = stoptime - slap_get_time (); + if (op->ors_tlimit <= 0) { + rs->sr_err = gs.err = LDAP_TIMELIMIT_EXCEEDED; break; + } } - if (slimit) { - s2limit = slimit - gs.nentries; - if (s2limit <= 0) + if (slimit0) { + op->ors_slimit = slimit0 - rs->sr_nentries; + if (op->ors_slimit < 0) { + rs->sr_err = gs.err = LDAP_SIZELIMIT_EXCEEDED; break; + } } + rs->sr_err = 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; - goto done; + if (op->o_abandon) { + goto end_of_loop; } - be = gi->n[i].be; - if (scope == LDAP_SCOPE_ONELEVEL && - !strcmp (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, - s2limit, t2limit, filter, filterstr, - attrs, attrsonly); - } else if (scope == LDAP_SCOPE_SUBTREE && - dn_issuffixbv (be->be_nsuffix[0], &bv)) { - rc = be->be_search (be, conn, op, - be->be_suffix[0], - be->be_nsuffix[0]->bv_val, - 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, - s2limit, t2limit, filter, filterstr, - attrs, attrsonly); + op->o_bd = gi->n[i].be; + + assert( op->o_bd->be_suffix ); + assert( op->o_bd->be_nsuffix ); + + if (scope0 == LDAP_SCOPE_ONELEVEL && + dn_match(&gi->n[i].pdn, &ndn)) + { + op->ors_scope = LDAP_SCOPE_BASE; + op->o_req_dn = op->o_bd->be_suffix[0]; + op->o_req_ndn = op->o_bd->be_nsuffix[0]; + rs->sr_err = op->o_bd->be_search(op, rs); + + } else if (scope0 == LDAP_SCOPE_SUBTREE && + dnIsSuffix(&op->o_bd->be_nsuffix[0], &ndn)) + { + op->o_req_dn = op->o_bd->be_suffix[0]; + op->o_req_ndn = op->o_bd->be_nsuffix[0]; + rs->sr_err = op->o_bd->be_search( op, rs ); + + } else if (dnIsSuffix(&ndn, &op->o_bd->be_nsuffix[0])) { + rs->sr_err = op->o_bd->be_search( op, rs ); } - } - break; - } - op->o_sresult = NULL; - op->o_response = NULL; - op->o_glue = NULL; - - 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); - return rc; -} - -int -glue_back_bind ( - BackendDB *b0, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn, - int method, - struct berval *cred, - char **edn -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); - - if (be && be->be_bind) { - conn->c_authz_backend = be; - rc = be->be_bind (be, conn, op, dn, ndn, method, cred, edn); - } else { - rc = LDAP_UNWILLING_TO_PERFORM; - send_ldap_result (conn, op, rc, NULL, "No bind target found", - NULL, NULL); - } - return rc; -} - -int -glue_back_compare ( - BackendDB *b0, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn, - AttributeAssertion *ava -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); - - 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); - } - return rc; -} - -int -glue_back_modify ( - BackendDB *b0, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn, - Modifications *mod -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); - - 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); - } - return rc; -} - -int -glue_back_modrdn ( - BackendDB *b0, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn, - const char *newrdn, - int del, - const char *newsup -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); - - if (be && be->be_modrdn) { - rc = be->be_modrdn (be, conn, op, dn, ndn, newrdn, del, newsup); - } else { - rc = LDAP_UNWILLING_TO_PERFORM; - send_ldap_result (conn, op, rc, NULL, "No modrdn target found", - NULL, NULL); - } - return rc; -} -int -glue_back_add ( - BackendDB *b0, - Connection *conn, - Operation *op, - Entry *e -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, e->e_ndn); - - if (be && be->be_add) { - rc = be->be_add (be, conn, op, e); - } else { - rc = LDAP_UNWILLING_TO_PERFORM; - send_ldap_result (conn, op, rc, NULL, "No add target found", - NULL, NULL); - } - return rc; -} + switch ( gs.err ) { -int -glue_back_delete ( - BackendDB *b0, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); + /* + * 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:; + op->ors_scope = scope0; + op->ors_slimit = slimit0; + op->ors_tlimit = tlimit0; + op->o_req_dn = dn; + op->o_req_ndn = ndn; - if (be && be->be_delete) { - rc = be->be_delete (be, conn, op, dn, ndn); - } else { - rc = LDAP_UNWILLING_TO_PERFORM; - send_ldap_result (conn, op, rc, NULL, "No delete target found", - NULL, NULL); + break; } - return rc; -} - -int -glue_back_release_rw ( - BackendDB *b0, - Connection *conn, - Operation *op, - Entry *e, - int rw -) -{ - BackendDB *be; - int rc; + if ( !op->o_abandon ) { + op->o_callback = cb.sc_next; + rs->sr_err = gs.err; + rs->sr_matched = gs.matched; + rs->sr_ref = gs.refs; - be = glue_back_select (b0, e->e_ndn); - - if (be && be->be_release) { - rc = be->be_release (be, conn, op, e, rw); - } else { - entry_free (e); - rc = 0; + send_ldap_result( op, rs ); } - return rc; -} - -int -glue_back_group ( - BackendDB *b0, - Connection *conn, - Operation *op, - Entry *target, - const char *ndn, - const char *ondn, - ObjectClass *oc, - AttributeDescription * ad -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); - if (be && be->be_group) { - rc = be->be_group (be, conn, op, target, ndn, ondn, oc, ad); - } else { - rc = LDAP_UNWILLING_TO_PERFORM; - } - return rc; -} - -int -glue_back_attribute ( - BackendDB *b0, - Connection *conn, - Operation *op, - Entry *target, - const char *ndn, - AttributeDescription *ad, - struct berval ***vals -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); - - if (be && be->be_attribute) { - rc = be->be_attribute (be, conn, op, target, ndn, ad, vals); - } else { - rc = LDAP_UNWILLING_TO_PERFORM; - } - return rc; + op->o_bd = b0; + if (gs.matched) + free (gs.matched); + if (gs.refs) + ber_bvarray_free(gs.refs); + return rs->sr_err; } -int -glue_back_referrals ( - BackendDB *b0, - Connection *conn, - Operation *op, - const char *dn, - const char *ndn, - const char **text -) -{ - BackendDB *be; - int rc; - - be = glue_back_select (b0, ndn); - - if (be && be->be_chk_referrals) { - rc = be->be_chk_referrals (be, conn, op, dn, ndn, text); - } else { - rc = LDAP_SUCCESS;; - } - return rc; -} +static int glue_tool_entry_open ( BackendDB *b0, int mode @@ -626,7 +401,7 @@ glue_tool_entry_open ( return 0; } -int +static int glue_tool_entry_close ( BackendDB *b0 ) @@ -641,12 +416,12 @@ glue_tool_entry_close ( return rc; } -ID +static ID glue_tool_entry_first ( BackendDB *b0 ) { - glueinfo *gi = (glueinfo *) b0->be_private; + glueinfo *gi = (glueinfo *) b0->bd_info; int i; /* If we're starting from scratch, start at the most general */ @@ -660,33 +435,38 @@ glue_tool_entry_first ( } } - if (!glueBack || glueBack->be_entry_open (glueBack, glueMode) != 0) + if (!glueBack || !glueBack->be_entry_open || !glueBack->be_entry_first || + glueBack->be_entry_open (glueBack, glueMode) != 0) return NOID; return glueBack->be_entry_first (glueBack); } -ID +static ID glue_tool_entry_next ( BackendDB *b0 ) { - glueinfo *gi = (glueinfo *) b0->be_private; + glueinfo *gi = (glueinfo *) b0->bd_info; int i; ID rc; + if (!glueBack || !glueBack->be_entry_next) + return NOID; + rc = glueBack->be_entry_next (glueBack); /* If we ran out of entries in one database, move on to the next */ - if (rc == NOID) { - glueBack->be_entry_close (glueBack); + while (rc == NOID) { + if ( glueBack && glueBack->be_entry_close ) + glueBack->be_entry_close (glueBack); for (i=0; inodes; i++) { if (gi->n[i].be == glueBack) break; } if (i == 0) { glueBack = NULL; - rc = NOID; + break; } else { glueBack = gi->n[i-1].be; rc = glue_tool_entry_first (b0); @@ -695,19 +475,23 @@ glue_tool_entry_next ( return rc; } -Entry * +static Entry * glue_tool_entry_get ( BackendDB *b0, ID id ) { + if (!glueBack || !glueBack->be_entry_get) + return NULL; + 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; @@ -732,69 +516,72 @@ 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 ) { - if (!glueBack->be_entry_reindex) + if (!glueBack || !glueBack->be_entry_reindex) return -1; return glueBack->be_entry_reindex (glueBack, id); } -int +static int glue_tool_sync ( BackendDB *b0 ) { - glueinfo *gi = (glueinfo *) b0->be_private; + glueinfo *gi = (glueinfo *) b0->bd_info; 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; } -extern int num_subs; /* config.c */ - int glue_sub_init( ) { - int i, j, k; - int cont = num_subs; + int i, j; + 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 (SLAP_GLUE_SUBORDINATE ( b1 ) ) { /* The last database cannot be a subordinate of noone */ - if (i == nBackendDB - 1) - b1->be_glueflags ^= SLAP_GLUE_SUBORDINATE; + if (i == nBackendDB - 1) { + SLAP_DBFLAGS(b1) ^= SLAP_DBFLAG_GLUE_SUBORDINATE; + } continue; } gi = NULL; for (j = i-1, be=&backendDB[j]; j>=0; be--,j--) { - if (!(be->be_glueflags & SLAP_GLUE_SUBORDINATE)) + if ( ! SLAP_GLUE_SUBORDINATE( be ) ) { continue; + } /* We will only link it once */ - if (be->be_glueflags & SLAP_GLUE_LINKED) + if ( SLAP_GLUE_LINKED( be ) ) { continue; - if (!dn_issuffixbv(be->be_nsuffix[0], - b1->be_nsuffix[0])) + } + assert( be->be_nsuffix ); + assert( b1->be_nsuffix ); + if (!dnIsSuffix(&be->be_nsuffix[0], &b1->be_nsuffix[0])) { continue; + } cont--; - be->be_glueflags |= SLAP_GLUE_LINKED; + SLAP_DBFLAGS(be) |= SLAP_DBFLAG_GLUE_LINKED; if (gi == NULL) { /* We create a copy of the superior's be * structure, pointing to all of its original @@ -803,31 +590,19 @@ glue_sub_init( ) * is used whenever we have operations to pass * down to the real database. */ - b1->be_glueflags |= SLAP_GLUE_INSTANCE; + SLAP_DBFLAGS(b1) |= SLAP_DBFLAG_GLUE_INSTANCE; gi = (glueinfo *)ch_malloc(sizeof(glueinfo)); - gi->be = (BackendDB *)ch_malloc(sizeof(BackendDB) + sizeof(BackendInfo)); - bi = (BackendInfo *)(gi->be+1); - *gi->be = *b1; gi->nodes = 0; - *bi = *b1->bd_info; + gi->bd = *b1; + gi->bi = *b1->bd_info; + bi = (BackendInfo *)gi; bi->bi_open = glue_back_open; bi->bi_close = glue_back_close; bi->bi_db_open = glue_back_db_open; bi->bi_db_close = glue_back_db_close; bi->bi_db_destroy = glue_back_db_destroy; - bi->bi_op_bind = glue_back_bind; bi->bi_op_search = glue_back_search; - bi->bi_op_compare = glue_back_compare; - bi->bi_op_modify = glue_back_modify; - bi->bi_op_modrdn = glue_back_modrdn; - bi->bi_op_add = glue_back_add; - bi->bi_op_delete = glue_back_delete; - - bi->bi_entry_release_rw = glue_back_release_rw; - bi->bi_acl_group = glue_back_group; - bi->bi_acl_attribute = glue_back_attribute; - bi->bi_chk_referrals = glue_back_referrals; /* * hooks for slap tools @@ -840,26 +615,27 @@ glue_sub_init( ) bi->bi_tool_entry_put = glue_tool_entry_put; bi->bi_tool_entry_reindex = glue_tool_entry_reindex; bi->bi_tool_sync = glue_tool_sync; + /* FIXME : will support later */ + bi->bi_tool_dn2id_get = 0; + bi->bi_tool_id2entry_get = 0; + bi->bi_tool_entry_modify = 0; } else { gi = (glueinfo *)ch_realloc(gi, sizeof(glueinfo) + 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) { /* One more node for the master */ 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); + gi->n[gi->nodes].be = &gi->bd; + dnParent( &b1->be_nsuffix[0], &gi->n[gi->nodes].pdn ); gi->nodes++; - b1->be_private = gi; - b1->bd_info = bi; + b1->bd_info = (BackendInfo *)gi; } } /* If there are any unresolved subordinates left, something is wrong */