/* backglue.c - backend glue routines */
/* $OpenLDAP$ */
/*
- * Copyright 2001-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 2001-2003 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
#include <stdio.h>
+#include <ac/string.h>
#include <ac/socket.h>
#define SLAPD_TOOLS
} gluenode;
typedef struct glueinfo {
- BackendDB *be;
+ BackendInfo bi;
+ BackendDB bd;
int nodes;
gluenode n[1];
} glueinfo;
const char *dn
)
{
- glueinfo *gi = *(glueinfo **) (be->bd_info+1);
+ glueinfo *gi = (glueinfo *) be->bd_info;
struct berval bv;
int i;
BackendDB *be
)
{
- glueinfo *gi = *(glueinfo **) (be->bd_info+1);
+ glueinfo *gi = (glueinfo *) be->bd_info;
static int glueOpened = 0;
int rc = 0;
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;
}
BackendDB *be
)
{
- glueinfo *gi = *(glueinfo **) (be->bd_info+1);
+ glueinfo *gi = (glueinfo *) be->bd_info;
static int glueClosed = 0;
if (glueClosed) return 0;
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;
}
BackendDB *be
)
{
- glueinfo *gi = *(glueinfo **) (be->bd_info+1);
+ 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;
}
gs->err = err;
if (gs->err == LDAP_SUCCESS && gs->matched) {
free (gs->matched);
+ gs->matched = NULL;
gs->matchlen = 0;
}
if (gs->err != LDAP_SUCCESS && matched) {
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,
int attrsonly
)
{
- glueinfo *gi = *(glueinfo **) (b0->bd_info+1);
+ glueinfo *gi = (glueinfo *) b0->bd_info;
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;
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;
BackendDB *b0
)
{
- glueinfo *gi = *(glueinfo **) (b0->bd_info+1);
+ glueinfo *gi = (glueinfo *) b0->bd_info;
int i;
/* If we're starting from scratch, start at the most general */
BackendDB *b0
)
{
- glueinfo *gi = *(glueinfo **) (b0->bd_info+1);
+ glueinfo *gi = (glueinfo *) b0->bd_info;
int i;
ID rc;
BackendDB *b0
)
{
- glueinfo *gi = *(glueinfo **) (b0->bd_info+1);
+ glueinfo *gi = (glueinfo *) b0->bd_info;
int i;
/* just sync everyone */
* 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;
}
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])) {
*/
b1->be_flags |= SLAP_BFLAG_GLUE_INSTANCE;
gi = (glueinfo *)ch_malloc(sizeof(glueinfo));
-
- /* Space for a copy of the backend, our
- * own backendInfo structure, and a pointer
- * to our glueinfo
- */
- gi->be = (BackendDB *)ch_malloc(
- sizeof(BackendDB) + sizeof(BackendInfo) +
- sizeof(glueinfo *) );
- 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;
/* 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].be = &gi->bd;
dnParent( &b1->be_nsuffix[0], &gi->n[gi->nodes].pdn );
gi->nodes++;
b1->bd_info = bi;
- /* Save a pointer to our private info. Don't use
- * be_private or bi_private, to avoid having to fix
- * that up before calling the real backend.
- */
- *(glueinfo **)(bi+1) = gi;
}
}
/* If there are any unresolved subordinates left, something is wrong */